diff --git a/.editorconfig b/.editorconfig index 57a5b2fb5e..84f2d090b1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,16 +4,20 @@ root = true [{*.patch,syntax_test_*}] trim_trailing_whitespace = false -[{*.c,*.cpp,*.h,*.ino}] -charset = utf-8 - -[{*.c,*.cpp,*.h,*.ino,Makefile}] +[{*.c,*.cpp,*.h,*.ino,*.py,Makefile}] trim_trailing_whitespace = true insert_final_newline = true end_of_line = lf + +[{*.c,*.cpp,*.h,*.ino}] +charset = utf-8 indent_style = space indent_size = 2 +[{Makefile}] +indent_style = tab +indent_size = 2 + [{*.py}] indent_style = space indent_size = 4 diff --git a/.github/workflows/bump-date.yml b/.github/workflows/bump-date.yml index 482fbbbb40..a08eeea561 100644 --- a/.github/workflows/bump-date.yml +++ b/.github/workflows/bump-date.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Check out bugfix-2.0.x - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: bugfix-2.0.x @@ -39,7 +39,7 @@ jobs: exit 0 - name: Check out bugfix-2.1.x - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: bugfix-2.1.x diff --git a/.github/workflows/clean-closed.yml b/.github/workflows/clean-closed.yml index befec4498f..2eab285aee 100644 --- a/.github/workflows/clean-closed.yml +++ b/.github/workflows/clean-closed.yml @@ -31,7 +31,7 @@ jobs: - "Needs: Work" steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Remove Labels uses: actions-ecosystem/action-remove-labels@v1 with: diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 173631e5e5..7ebbcd0066 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -33,91 +33,110 @@ jobs: strategy: matrix: test-platform: - # Base Environments - - DUE - - DUE_archim - - esp32 + # Native - linux_native + + # AVR - mega2560 - - at90usb1286_dfu - - teensy31 - - teensy35 - - teensy41 - - SAMD21_minitronics20 - - SAMD51_grandcentral_m4 - - PANDA_PI_V29 - - # Extended AVR Environments - - - FYSETC_F6 - mega1280 + - at90usb1286_dfu + + # AVR Extended + - FYSETC_F6 + - melzi_optiboot - rambo - sanguino1284p - sanguino644p - - melzi_optiboot - # STM32F1 (Maple) Environments + # SAM3X8E + - DUE + - DUE_archim - #- STM32F103RC_btt_maple - - STM32F103RC_btt_USB_maple - - STM32F103RC_fysetc_maple - - STM32F103RC_meeb_maple - - jgaurora_a5s_a1_maple - - STM32F103VE_longer_maple - #- mks_robin_maple - - mks_robin_lite_maple - - mks_robin_pro_maple - #- mks_robin_nano_v1v2_maple - #- STM32F103RE_creality_maple - - STM32F103VE_ZM3E4V2_USB_maple + # SAMD21 + - SAMD51_grandcentral_m4 + - SAMD21_minitronics20 - # STM32 (ST) Environments + # ESP32 + - esp32 + - mks_tinybee + # Teensy 2 + #- at90usb1286_cdc + + # Teensy MK20DX256 + - teensy31 + + # Teensy MK64FX512, MK66FX1M0 + - teensy35 + + # Teensy IMXRT1062DVx6A + - teensy41 + + # STM32F0 + - malyan_M300 + - STM32F070CB_malyan + - STM32F070RB_malyan + + # STM32F1 + - chitu_f103 + - mks_robin + - mks_robin_nano_v1v2 + - PANDA_PI_V29 - STM32F103RC_btt - #- STM32F103RC_btt_USB + - STM32F103RC_fysetc - STM32F103RE_btt - STM32F103RE_btt_USB - STM32F103RE_creality - - STM32F401RC_creality - STM32F103VE_longer - - STM32F407VE_black - - BIGTREE_BTT002 - - BIGTREE_SKR_PRO - - BIGTREE_GTR_V1_0 - - mks_robin - - ARMED - - FYSETC_S6 - - STM32F070CB_malyan - - STM32F070RB_malyan - - malyan_M300 - - FLYF407ZG - - rumba32 - - LERDGEX - - LERDGEK - - mks_robin_nano_v1v2 - #- mks_robin_nano_v1v2_usbmod + #- mks_robin_mini #- mks_robin_nano_v1_3_f4_usbmod + #- mks_robin_nano_v1v2_usbmod + #- STM32F103CB_malyan + #- STM32F103RC_btt_USB + #- STM32F103RE + + # STM32F4 + - ARMED + - BIGTREE_BTT002 + - BIGTREE_GTR_V1_0 + - BIGTREE_SKR_PRO + - FLYF407ZG + - FYSETC_S6 + - LERDGEK + - LERDGEX + - mks_robin_pro2 + - Opulo_Lumen_REV3 + - rumba32 + - STM32F401RC_creality + - STM32F407VE_black + - I3DBEEZ9_V1 + + # STM32F7 - NUCLEO_F767ZI - REMRAM_V1 + + # STM32H7 - BTT_SKR_SE_BX - - chitu_f103 - - Opulo_Lumen_REV3 - # ESP32 environments - - mks_tinybee - - # Put lengthy tests last + # STM32F1 (Maple) + - jgaurora_a5s_a1_maple + - mks_robin_lite_maple + - mks_robin_pro_maple + - STM32F103RC_btt_USB_maple + - STM32F103RC_fysetc_maple + - STM32F103RC_meeb_maple + - STM32F103VE_longer_maple + - STM32F103VE_ZM3E4V2_USB_maple + #- mks_robin_maple + #- mks_robin_nano_v1v2_maple + #- STM32F103RC_btt_maple + #- STM32F103RE_creality_maple + # LPC176x - Lengthy tests - LPC1768 - LPC1769 - # Non-working environment tests - #- at90usb1286_cdc - #- STM32F103CB_malyan - #- STM32F103RE - #- mks_robin_mini - steps: - name: Check out the PR diff --git a/.gitignore b/.gitignore index a7f8a091aa..fcdeb5e521 100755 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,8 @@ bdf2u8g.exe genpages.exe marlin_config.json mczip.h +language*.csv +csv-out/ *.gen *.sublime-workspace @@ -130,7 +132,9 @@ spi_flash.bin fs.img # CMake +buildroot/share/cmake/* CMakeLists.txt +!buildroot/share/cmake/CMakeLists.txt src/CMakeLists.txt CMakeListsPrivate.txt build/ diff --git a/Makefile b/Makefile index 2a18c0b4e8..cfe0b77226 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ help: tests-single-ci: export GIT_RESET_HARD=true - $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) + $(MAKE) tests-single-local TEST_TARGET=$(TEST_TARGET) PLATFORMIO_BUILD_FLAGS=-DGITHUB_ACTION .PHONY: tests-single-ci tests-single-local: diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6e2f409613..b573d2d9ec 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -222,24 +222,6 @@ //#define SINGLENOZZLE_STANDBY_FAN #endif -// @section multi-material - -/** - * 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) - * 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. - * :["PRUSA_MMU1", "PRUSA_MMU2", "PRUSA_MMU2S", "EXTENDABLE_EMU_MMU2", "EXTENDABLE_EMU_MMU2S"] - */ -//#define MMU_MODEL PRUSA_MMU2 - // A dual extruder that uses a single stepper motor //#define SWITCHING_EXTRUDER #if ENABLED(SWITCHING_EXTRUDER) @@ -284,7 +266,7 @@ */ //#define MAGNETIC_PARKING_EXTRUDER -#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) +#if ANY(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder @@ -382,6 +364,24 @@ //#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle //#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle +// @section multi-material + +/** + * 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) + * 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. + * :["PRUSA_MMU1", "PRUSA_MMU2", "PRUSA_MMU2S", "EXTENDABLE_EMU_MMU2", "EXTENDABLE_EMU_MMU2S"] + */ +//#define MMU_MODEL PRUSA_MMU2 + // @section psu control /** @@ -419,7 +419,7 @@ #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 - #if EITHER(AUTO_POWER_CONTROL, POWER_OFF_WAIT_FOR_COOLDOWN) + #if ANY(AUTO_POWER_CONTROL, POWER_OFF_WAIT_FOR_COOLDOWN) //#define AUTO_POWER_E_TEMP 50 // (°C) PSU on if any extruder is over this temperature //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) PSU on if the chamber is over this temperature //#define AUTO_POWER_COOLER_TEMP 26 // (°C) PSU on if the cooler is over this temperature @@ -432,78 +432,68 @@ // @section temperature /** - * --NORMAL IS 4.7kΩ PULLUP!-- 1kΩ pullup can be used on hotend sensor, using correct resistor and table + * Temperature Sensors: * - * Temperature sensors available: - * - * SPI RTD/Thermocouple Boards - IMPORTANT: Read the NOTE below! - * ------- - * -5 : MAX31865 with Pt100/Pt1000, 2, 3, or 4-wire (only for sensors 0-1) - * NOTE: You must uncomment/set the MAX31865_*_OHMS_n defines below. - * -3 : MAX31855 with Thermocouple, -200°C to +700°C (only for sensors 0-1) - * -2 : MAX6675 with Thermocouple, 0°C to +700°C (only for sensors 0-1) - * - * NOTE: Ensure TEMP_n_CS_PIN is set in your pins file for each TEMP_SENSOR_n using an SPI Thermocouple. By default, - * Hardware SPI on the default serial bus is used. If you have also set TEMP_n_SCK_PIN and TEMP_n_MISO_PIN, - * Software SPI will be used on those ports instead. You can force Hardware SPI on the default bus in the - * Configuration_adv.h file. At this time, separate Hardware SPI buses for sensors are not supported. - * - * Analog Themocouple Boards - * ------- - * -4 : AD8495 with Thermocouple - * -1 : AD595 with Thermocouple + * NORMAL IS 4.7kΩ PULLUP! Hotend sensors can use 1kΩ pullup with correct resistor and table. * + * ================================================================ * Analog Thermistors - 4.7kΩ pullup - Normal - * ------- - * 1 : 100kΩ EPCOS - Best choice for EPCOS thermistors - * 331 : 100kΩ Same as #1, but 3.3V scaled for MEGA - * 332 : 100kΩ Same as #1, but 3.3V scaled for DUE - * 2 : 200kΩ ATC Semitec 204GT-2 - * 202 : 200kΩ Copymaster 3D - * 3 : ???Ω Mendel-parts thermistor - * 4 : 10kΩ Generic Thermistor !! DO NOT use for a hotend - it gives bad resolution at high temp. !! - * 5 : 100kΩ ATC Semitec 104GT-2/104NT-4-R025H42G - Used in ParCan, J-Head, and E3D, SliceEngineering 300°C - * 501 : 100kΩ Zonestar - Tronxy X3A - * 502 : 100kΩ Zonestar - used by hot bed in Zonestar Průša P802M - * 503 : 100kΩ Zonestar (Z8XM2) Heated Bed thermistor - * 504 : 100kΩ Zonestar P802QR2 (Part# QWG-104F-B3950) Hotend Thermistor - * 505 : 100kΩ Zonestar P802QR2 (Part# QWG-104F-3950) Bed Thermistor - * 512 : 100kΩ RPW-Ultra hotend - * 6 : 100kΩ EPCOS - Not as accurate as table #1 (created using a fluke thermocouple) - * 7 : 100kΩ Honeywell 135-104LAG-J01 - * 71 : 100kΩ Honeywell 135-104LAF-J01 - * 8 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT - * 9 : 100kΩ GE Sensing AL03006-58.2K-97-G1 - * 10 : 100kΩ RS PRO 198-961 - * 11 : 100kΩ Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1% - * 12 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed - * 13 : 100kΩ Hisens up to 300°C - for "Simple ONE" & "All In ONE" hotend - beta 3950, 1% - * 15 : 100kΩ Calibrated for JGAurora A5 hotend - * 18 : 200kΩ ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327 - * 22 : 100kΩ GTM32 Pro vB - hotend - 4.7kΩ pullup to 3.3V and 220Ω to analog input - * 23 : 100kΩ GTM32 Pro vB - bed - 4.7kΩ pullup to 3.3v and 220Ω to analog input - * 30 : 100kΩ Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K - beta 3950 - * 60 : 100kΩ Maker's Tool Works Kapton Bed Thermistor - beta 3950 - * 61 : 100kΩ Formbot/Vivedino 350°C Thermistor - beta 3950 - * 66 : 4.7MΩ Dyze Design / Trianglelab T-D500 500°C High Temperature Thermistor - * 67 : 500kΩ SliceEngineering 450°C Thermistor - * 68 : PT100 amplifier board from Dyze Design - * 70 : 100kΩ bq Hephestos 2 - * 75 : 100kΩ Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32 - * 2000 : 100kΩ Ultimachine Rambo TDK NTCG104LH104KT1 NTC100K motherboard Thermistor + * ================================================================ + * 1 : 100kΩ EPCOS - Best choice for EPCOS thermistors + * 331 : 100kΩ Same as #1, but 3.3V scaled for MEGA + * 332 : 100kΩ Same as #1, but 3.3V scaled for DUE + * 2 : 200kΩ ATC Semitec 204GT-2 + * 202 : 200kΩ Copymaster 3D + * 3 : ???Ω Mendel-parts thermistor + * 4 : 10kΩ Generic Thermistor !! DO NOT use for a hotend - it gives bad resolution at high temp. !! + * 5 : 100kΩ ATC Semitec 104GT-2/104NT-4-R025H42G - Used in ParCan, J-Head, and E3D, SliceEngineering 300°C + * 501 : 100kΩ Zonestar - Tronxy X3A + * 502 : 100kΩ Zonestar - used by hot bed in Zonestar Průša P802M + * 503 : 100kΩ Zonestar (Z8XM2) Heated Bed thermistor + * 504 : 100kΩ Zonestar P802QR2 (Part# QWG-104F-B3950) Hotend Thermistor + * 505 : 100kΩ Zonestar P802QR2 (Part# QWG-104F-3950) Bed Thermistor + * 512 : 100kΩ RPW-Ultra hotend + * 6 : 100kΩ EPCOS - Not as accurate as table #1 (created using a fluke thermocouple) + * 7 : 100kΩ Honeywell 135-104LAG-J01 + * 71 : 100kΩ Honeywell 135-104LAF-J01 + * 8 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT + * 9 : 100kΩ GE Sensing AL03006-58.2K-97-G1 + * 10 : 100kΩ RS PRO 198-961 + * 11 : 100kΩ Keenovo AC silicone mats, most Wanhao i3 machines - beta 3950, 1% + * 12 : 100kΩ Vishay 0603 SMD NTCS0603E3104FXT (#8) - calibrated for Makibox hot bed + * 13 : 100kΩ Hisens up to 300°C - for "Simple ONE" & "All In ONE" hotend - beta 3950, 1% + * 14 : 100kΩ (R25), 4092K (beta25), 4.7kΩ pull-up, bed thermistor as used in Ender-5 S1 + * 15 : 100kΩ Calibrated for JGAurora A5 hotend + * 18 : 200kΩ ATC Semitec 204GT-2 Dagoma.Fr - MKS_Base_DKU001327 + * 22 : 100kΩ GTM32 Pro vB - hotend - 4.7kΩ pullup to 3.3V and 220Ω to analog input + * 23 : 100kΩ GTM32 Pro vB - bed - 4.7kΩ pullup to 3.3v and 220Ω to analog input + * 30 : 100kΩ Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K - beta 3950 + * 60 : 100kΩ Maker's Tool Works Kapton Bed Thermistor - beta 3950 + * 61 : 100kΩ Formbot/Vivedino 350°C Thermistor - beta 3950 + * 66 : 4.7MΩ Dyze Design / Trianglelab T-D500 500°C High Temperature Thermistor + * 67 : 500kΩ SliceEngineering 450°C Thermistor + * 68 : PT100 Smplifier board from Dyze Design + * 70 : 100kΩ bq Hephestos 2 + * 75 : 100kΩ Generic Silicon Heat Pad with NTC100K MGB18-104F39050L32 + * 2000 : 100kΩ Ultimachine Rambo TDK NTCG104LH104KT1 NTC100K motherboard Thermistor * - * Analog Thermistors - 1kΩ pullup - Atypical, and requires changing out the 4.7kΩ pullup for 1kΩ. - * ------- (but gives greater accuracy and more stable PID) - * 51 : 100kΩ EPCOS (1kΩ pullup) - * 52 : 200kΩ ATC Semitec 204GT-2 (1kΩ pullup) - * 55 : 100kΩ ATC Semitec 104GT-2 - Used in ParCan & J-Head (1kΩ pullup) + * ================================================================ + * Analog Thermistors - 1kΩ pullup + * Atypical, and requires changing out the 4.7kΩ pullup for 1kΩ. + * (but gives greater accuracy and more stable PID) + * ================================================================ + * 51 : 100kΩ EPCOS (1kΩ pullup) + * 52 : 200kΩ ATC Semitec 204GT-2 (1kΩ pullup) + * 55 : 100kΩ ATC Semitec 104GT-2 - Used in ParCan & J-Head (1kΩ pullup) * + * ================================================================ * Analog Thermistors - 10kΩ pullup - Atypical - * ------- - * 99 : 100kΩ Found on some Wanhao i3 machines with a 10kΩ pull-up resistor + * ================================================================ + * 99 : 100kΩ Found on some Wanhao i3 machines with a 10kΩ pull-up resistor * + * ================================================================ * Analog RTDs (Pt100/Pt1000) - * ------- + * ================================================================ * 110 : Pt100 with 1kΩ pullup (atypical) * 147 : Pt100 with 4.7kΩ pullup * 1010 : Pt1000 with 1kΩ pullup (atypical) @@ -515,15 +505,39 @@ * NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C. * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x * + * ================================================================ + * SPI RTD/Thermocouple Boards + * ================================================================ + * -5 : MAX31865 with Pt100/Pt1000, 2, 3, or 4-wire (only for sensors 0-1) + * NOTE: You must uncomment/set the MAX31865_*_OHMS_n defines below. + * -3 : MAX31855 with Thermocouple, -200°C to +700°C (only for sensors 0-1) + * -2 : MAX6675 with Thermocouple, 0°C to +700°C (only for sensors 0-1) + * + * NOTE: Ensure TEMP_n_CS_PIN is set in your pins file for each TEMP_SENSOR_n using an SPI Thermocouple. By default, + * Hardware SPI on the default serial bus is used. If you have also set TEMP_n_SCK_PIN and TEMP_n_MISO_PIN, + * Software SPI will be used on those ports instead. You can force Hardware SPI on the default bus in the + * Configuration_adv.h file. At this time, separate Hardware SPI buses for sensors are not supported. + * + * ================================================================ + * Analog Thermocouple Boards + * ================================================================ + * -4 : AD8495 with Thermocouple + * -1 : AD595 with Thermocouple + * + * ================================================================ + * SoC internal sensor + * ================================================================ + * 100 : SoC internal sensor + * + * ================================================================ * Custom/Dummy/Other Thermal Sensors - * ------ + * ================================================================ * 0 : not used * 1000 : Custom - Specify parameters in Configuration_adv.h * * !!! Use these for Testing or Development purposes. NEVER for production machine. !!! * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. - * */ #define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 @@ -533,11 +547,12 @@ #define TEMP_SENSOR_5 0 #define TEMP_SENSOR_6 0 #define TEMP_SENSOR_7 0 -#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_PROBE 0 #define TEMP_SENSOR_CHAMBER 0 #define TEMP_SENSOR_COOLER 0 #define TEMP_SENSOR_BOARD 0 +#define TEMP_SENSOR_SOC 0 #define TEMP_SENSOR_REDUNDANT 0 // Dummy thermistor constant temperature readings, for use with 998 and 999 @@ -635,14 +650,18 @@ // @section hotend temp -// Enable PIDTEMP for PID control or MPCTEMP for Predictive Model. -// temperature control. Disable both for bang-bang heating. -#define PIDTEMP // See the PID Tuning Guide at https://reprap.org/wiki/PID_Tuning -//#define MPCTEMP // ** EXPERIMENTAL ** +/** + * Temperature Control + * + * (NONE) : Bang-bang heating + * PIDTEMP : PID temperature control (~4.1K) + * MPCTEMP : Predictive Model temperature control. (~1.8K without auto-tune) + */ +#define PIDTEMP // See the PID Tuning Guide at https://reprap.org/wiki/PID_Tuning +//#define MPCTEMP // ** EXPERIMENTAL ** See https://marlinfw.org/docs/features/model_predictive_control.html -#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current -#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current -#define PID_K1 0.95 // Smoothing factor within any PID loop +#define PID_MAX 255 // Limit hotend current while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop #if ENABLED(PIDTEMP) //#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation. @@ -660,22 +679,24 @@ #define DEFAULT_Ki 1.08 #define DEFAULT_Kd 114.00 #endif +#else + #define BANG_MAX 255 // Limit hotend current while in bang-bang mode; 255=full current #endif /** * Model Predictive Control for hotend * - * Use a physical model of the hotend to control temperature. When configured correctly - * this gives better responsiveness and stability than PID and it also removes the need - * for PID_EXTRUSION_SCALING and PID_FAN_SCALING. Use M306 T to autotune the model. + * Use a physical model of the hotend to control temperature. When configured correctly this gives + * better responsiveness and stability than PID and removes the need for PID_EXTRUSION_SCALING + * and PID_FAN_SCALING. Enable MPC_AUTOTUNE and use M306 T to autotune the model. * @section mpctemp */ #if ENABLED(MPCTEMP) - //#define MPC_AUTOTUNE // Include a method to do MPC auto-tuning (~5664-5882 bytes of flash) - //#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1300 bytes of flash) + #define MPC_AUTOTUNE // Include a method to do MPC auto-tuning (~6.3K bytes of flash) + //#define MPC_EDIT_MENU // Add MPC editing to the "Advanced Settings" menu. (~1.3K bytes of flash) //#define MPC_AUTOTUNE_MENU // Add MPC auto-tuning to the "Advanced Settings" menu. (~350 bytes of flash) - #define MPC_MAX BANG_MAX // (0..255) Current to nozzle while MPC is active. + #define MPC_MAX 255 // (0..255) Current to nozzle while MPC is active. #define MPC_HEATER_POWER { 40.0f } // (W) Heat cartridge powers. #define MPC_INCLUDE_FAN // Model the fan speed? @@ -694,8 +715,12 @@ //#define MPC_FAN_0_ACTIVE_HOTEND #endif + // Filament Heat Capacity (joules/kelvin/mm) + // Set at runtime with M306 H #define FILAMENT_HEAT_CAPACITY_PERMM { 5.6e-3f } // 0.0056 J/K/mm for 1.75mm PLA (0.0149 J/K/mm for 2.85mm PLA). - //#define FILAMENT_HEAT_CAPACITY_PERMM { 3.6e-3f } // 0.0036 J/K/mm for 1.75mm PETG (0.0094 J/K/mm for 2.85mm PETG). + // 0.0036 J/K/mm for 1.75mm PETG (0.0094 J/K/mm for 2.85mm PETG). + // 0.00515 J/K/mm for 1.75mm ABS (0.0137 J/K/mm for 2.85mm ABS). + // 0.00522 J/K/mm for 1.75mm Nylon (0.0138 J/K/mm for 2.85mm Nylon). // Advanced options #define MPC_SMOOTHING_FACTOR 0.5f // (0.0...1.0) Noisy temperature sensors may need a lower value for stabilization. @@ -710,23 +735,7 @@ //====================== PID > Bed Temperature Control ====================== //=========================================================================== -/** - * PID Bed Heating - * - * If this option is enabled set PID constants below. - * If this option is disabled, bang-bang will be used and BED_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 250W - * heater. If your configuration is significantly different than this and you don't understand - * the issues involved, don't use bed PID until someone else verifies that your hardware works. - * @section bed temp - */ -//#define PIDTEMPBED - -//#define BED_LIMIT_SWITCHING +// @section bed temp /** * Max Bed Power @@ -736,6 +745,20 @@ */ #define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current +/** + * PID Bed Heating + * + * 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 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + * + * With this option disabled, bang-bang will be used. BED_LIMIT_SWITCHING enables hysteresis. + */ +//#define PIDTEMPBED + #if ENABLED(PIDTEMPBED) //#define MIN_BED_POWER 0 //#define PID_BED_DEBUG // Print Bed PID debug data to the serial port. @@ -747,7 +770,9 @@ #define DEFAULT_bedKd 305.4 // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. -#endif // PIDTEMPBED +#else + //#define BED_LIMIT_SWITCHING // Keep the bed temperature within BED_HYSTERESIS of the target +#endif //=========================================================================== //==================== PID > Chamber Temperature Control ==================== @@ -900,7 +925,7 @@ #define DELTA_CALIBRATION_DEFAULT_POINTS 4 #endif - #if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU) + #if ANY(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU) // Step size for paper-test probing #define PROBE_MANUALLY_STEP 0.05 // (mm) #endif @@ -944,7 +969,7 @@ */ //#define MORGAN_SCARA //#define MP_SCARA -#if EITHER(MORGAN_SCARA, MP_SCARA) +#if ANY(MORGAN_SCARA, MP_SCARA) // If movement is choppy try lowering this value #define DEFAULT_SEGMENTS_PER_SECOND 200 @@ -1073,28 +1098,6 @@ // @section endstops -// Specify here all the endstop connectors that are connected to any endstop or probe. -// Almost all printers will be using one per axis. Probes will use one or more of the -// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. -#define USE_XMIN_PLUG -#define USE_YMIN_PLUG -#define USE_ZMIN_PLUG -//#define USE_IMIN_PLUG -//#define USE_JMIN_PLUG -//#define USE_KMIN_PLUG -//#define USE_UMIN_PLUG -//#define USE_VMIN_PLUG -//#define USE_WMIN_PLUG -//#define USE_XMAX_PLUG -//#define USE_YMAX_PLUG -//#define USE_ZMAX_PLUG -//#define USE_IMAX_PLUG -//#define USE_JMAX_PLUG -//#define USE_KMAX_PLUG -//#define USE_UMAX_PLUG -//#define USE_VMAX_PLUG -//#define USE_WMAX_PLUG - // Enable pullup for all endstops to prevent a floating state #define ENDSTOPPULLUPS #if DISABLED(ENDSTOPPULLUPS) @@ -1733,7 +1736,7 @@ //#define Z_CLEARANCE_FOR_HOMING 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. -//#define Z_AFTER_HOMING 10 // (mm) Height to move to after homing Z +//#define Z_AFTER_HOMING 10 // (mm) Height to move to after homing (if Z was homed) // Direction of endstops when homing; 1=MAX, -1=MIN // :[-1,1] @@ -1810,7 +1813,7 @@ #define MAX_SOFTWARE_ENDSTOP_W #endif -#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) +#if ANY(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD #endif @@ -2047,7 +2050,7 @@ #endif -#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) +#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) // Set the number of grid points per dimension. #define GRID_MAX_POINTS_X 3 @@ -2416,9 +2419,7 @@ // Default pattern to use when 'P' is not provided to G12. One of the enabled options above. #define NOZZLE_CLEAN_DEFAULT_PATTERN 0 - #if ENABLED(NOZZLE_CLEAN_PATTERN_LINE) - #define NOZZLE_CLEAN_STROKES 12 // Default number of pattern repetitions - #endif + #define NOZZLE_CLEAN_STROKES 12 // Default number of pattern repetitions #if ENABLED(NOZZLE_CLEAN_PATTERN_ZIGZAG) #define NOZZLE_CLEAN_TRIANGLES 3 // Default number of triangles @@ -3343,7 +3344,7 @@ //#define TOUCH_OFFSET_Y 257 //#define TOUCH_ORIENTATION TOUCH_LANDSCAPE - #if BOTH(TOUCH_SCREEN_CALIBRATION, EEPROM_SETTINGS) + #if ALL(TOUCH_SCREEN_CALIBRATION, EEPROM_SETTINGS) #define TOUCH_CALIBRATION_AUTO_SAVE // Auto save successful calibration values to EEPROM #endif @@ -3440,7 +3441,7 @@ //#define RGB_LED //#define RGBW_LED -#if EITHER(RGB_LED, RGBW_LED) +#if ANY(RGB_LED, RGBW_LED) //#define RGB_LED_R_PIN 34 //#define RGB_LED_G_PIN 43 //#define RGB_LED_B_PIN 35 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 22c97c3b8c..eee111a541 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -276,9 +276,15 @@ #define THERMAL_PROTECTION_BOARD // Halt the printer if the board sensor leaves the temp range below. #define BOARD_MINTEMP 8 // (°C) #define BOARD_MAXTEMP 70 // (°C) - #ifndef TEMP_BOARD_PIN - //#define TEMP_BOARD_PIN -1 // Board temp sensor pin, if not set in pins file. - #endif + //#define TEMP_BOARD_PIN -1 // Board temp sensor pin override. +#endif + +// +// SoC Sensor options +// +#if TEMP_SENSOR_SOC + #define THERMAL_PROTECTION_SOC // Halt the printer if the SoC sensor leaves the temp range below. + #define SOC_MAXTEMP 85 // (°C) #endif /** @@ -304,7 +310,7 @@ //#define ADAPTIVE_FAN_SLOWING // Slow down the part-cooling fan if the temperature drops #if ENABLED(ADAPTIVE_FAN_SLOWING) //#define REPORT_ADAPTIVE_FAN_SLOWING // Report fan slowing activity to the console - #if EITHER(MPCTEMP, PIDTEMP) + #if ANY(MPCTEMP, PIDTEMP) //#define TEMP_TUNING_MAINTAIN_FAN // Don't slow down the fan speed during M303 or M306 T #endif #endif @@ -579,6 +585,9 @@ // Use TEMP_SENSOR_BOARD as a trigger for enabling the controller fan //#define CONTROLLER_FAN_MIN_BOARD_TEMP 40 // (°C) Turn on the fan if the board reaches this temperature + // Use TEMP_SENSOR_SOC as a trigger for enabling the controller fan + //#define CONTROLLER_FAN_MIN_SOC_TEMP 40 // (°C) Turn on the fan if the SoC reaches this temperature + //#define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings #if ENABLED(CONTROLLER_FAN_EDITABLE) #define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu @@ -651,9 +660,12 @@ #endif /** - * Use one of the PWM fans as a redundant part-cooling fan + * Assign more PWM fans for part cooling, synchronized with Fan 0 */ -//#define REDUNDANT_PART_COOLING_FAN 2 // Index of the fan to sync with FAN 0. +//#define REDUNDANT_PART_COOLING_FAN 1 // Index of the first fan to synchronize with Fan 0 +#ifdef REDUNDANT_PART_COOLING_FAN + //#define NUM_REDUNDANT_FANS 1 // Number of sequential fans to synchronize with Fan 0 +#endif // @section extruder @@ -747,10 +759,10 @@ #if ENABLED(NEOPIXEL_LED) //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light #endif - #if EITHER(RGB_LED, RGBW_LED) + #if ANY(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) + #if ANY(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED) #define CASE_LIGHT_DEFAULT_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } #endif #endif @@ -806,7 +818,6 @@ #define X1_MAX_POS X_BED_SIZE // A max coordinate so the X1 carriage can't hit the parked X2 carriage #define X2_MIN_POS 80 // A min coordinate so the X2 carriage can't hit the parked X1 carriage #define X2_MAX_POS 353 // The max position of the X2 carriage, typically also the home position - #define X2_HOME_DIR 1 // Set to 1. The X2 carriage always homes to the max endstop position #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS. // NOTE: For Dual X Carriage use M218 T1 Xn to override the X2_HOME_POS. // This allows recalibration of endstops distance without a rebuild. @@ -840,22 +851,22 @@ * Get the offset by homing X and measuring the error. * Also set with 'M666 X' and stored to EEPROM with 'M500'. * - * - Use X2_USE_ENDSTOP to set the endstop plug by name. (_XMIN_, _XMAX_, _YMIN_, _YMAX_, _ZMIN_, _ZMAX_) + * - Define the extra endstop pins here to override defaults. No auto-assignment. */ #if HAS_X2_STEPPER && DISABLED(DUAL_X_CARRIAGE) //#define INVERT_X2_VS_X_DIR // X2 direction signal is the opposite of X //#define X_DUAL_ENDSTOPS // X2 has its own endstop #if ENABLED(X_DUAL_ENDSTOPS) - #define X2_USE_ENDSTOP _XMAX_ // X2 endstop board plug. Don't forget to enable USE_*_PLUG. + //#define X2_STOP_PIN X_MAX_PIN // X2 endstop pin override #define X2_ENDSTOP_ADJUSTMENT 0 // X2 offset relative to X endstop #endif #endif -#if HAS_DUAL_Y_STEPPERS +#if HAS_Y2_STEPPER //#define INVERT_Y2_VS_Y_DIR // Y2 direction signal is the opposite of Y //#define Y_DUAL_ENDSTOPS // Y2 has its own endstop #if ENABLED(Y_DUAL_ENDSTOPS) - #define Y2_USE_ENDSTOP _YMAX_ // Y2 endstop board plug. Don't forget to enable USE_*_PLUG. + //#define Y2_STOP_PIN Y_MAX_PIN // Y2 endstop pin override #define Y2_ENDSTOP_ADJUSTMENT 0 // Y2 offset relative to Y endstop #endif #endif @@ -868,20 +879,20 @@ //#define Z_MULTI_ENDSTOPS // Other Z axes have their own endstops #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z2_USE_ENDSTOP _XMAX_ // Z2 endstop board plug. Don't forget to enable USE_*_PLUG. + //#define Z2_STOP_PIN X_MAX_PIN // Z2 endstop pin override #define Z2_ENDSTOP_ADJUSTMENT 0 // Z2 offset relative to Z endstop #endif #ifdef Z3_DRIVER_TYPE //#define INVERT_Z3_VS_Z_DIR // Z3 direction signal is the opposite of Z #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z3_USE_ENDSTOP _YMAX_ // Z3 endstop board plug. Don't forget to enable USE_*_PLUG. + //#define Z3_STOP_PIN Y_MAX_PIN // Z3 endstop pin override #define Z3_ENDSTOP_ADJUSTMENT 0 // Z3 offset relative to Z endstop #endif #endif #ifdef Z4_DRIVER_TYPE //#define INVERT_Z4_VS_Z_DIR // Z4 direction signal is the opposite of Z #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z4_USE_ENDSTOP _ZMAX_ // Z4 endstop board plug. Don't forget to enable USE_*_PLUG. + //#define Z4_STOP_PIN Z_MAX_PIN // Z4 endstop pin override #define Z4_ENDSTOP_ADJUSTMENT 0 // Z4 offset relative to Z endstop #endif #endif @@ -915,7 +926,7 @@ //#define QUICK_HOME // If G28 contains XY do a diagonal move first //#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X -//#define HOME_Z_FIRST // Home Z first. Requires a Z-MIN endstop (not a probe). +//#define HOME_Z_FIRST // Home Z first. Requires a real endstop (not a probe). //#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first // @section bltouch @@ -1101,7 +1112,7 @@ */ //#define FT_MOTION #if ENABLED(FT_MOTION) - #define FTM_DEFAULT_MODE ftMotionMode_ENABLED // Default mode of fixed time control. (Enums in ft_types.h) + #define FTM_DEFAULT_MODE ftMotionMode_DISABLED // Default mode of fixed time control. (Enums in ft_types.h) #define FTM_DEFAULT_DYNFREQ_MODE dynFreqMode_DISABLED // Default mode of dynamic frequency calculation. (Enums in ft_types.h) #define FTM_SHAPING_DEFAULT_X_FREQ 37.0f // (Hz) Default peak frequency used by input shapers. #define FTM_SHAPING_DEFAULT_Y_FREQ 37.0f // (Hz) Default peak frequency used by input shapers. @@ -1113,30 +1124,32 @@ /** * Advanced configuration */ - #define FTM_BATCH_SIZE 100 // Batch size for trajectory generation; + #define FTM_BATCH_SIZE 100 // Batch size for trajectory generation; // half the window size for Ulendo FBS. - #define FTM_FS 1000 // (Hz) Frequency for trajectory generation. (1 / FTM_TS) - #define FTM_TS 0.001f // (s) Time step for trajectory generation. (1 / FTM_FS) - #define FTM_STEPPER_FS 20000 // (Hz) Frequency for stepper I/O update. + #define FTM_FS 1000 // (Hz) Frequency for trajectory generation. (1 / FTM_TS) + #define FTM_TS 0.001f // (s) Time step for trajectory generation. (1 / FTM_FS) + #define FTM_STEPPER_FS 20000 // (Hz) Frequency for stepper I/O update. #define FTM_MIN_TICKS ((STEPPER_TIMER_RATE) / (FTM_STEPPER_FS)) // Minimum stepper ticks between steps. - #define FTM_MIN_SHAPE_FREQ 10 // Minimum shaping frequency. - #define FTM_ZMAX 100 // Maximum delays for shaping functions (even numbers only!). + #define FTM_MIN_SHAPE_FREQ 10 // Minimum shaping frequency. + #define FTM_ZMAX 100 // Maximum delays for shaping functions (even numbers only!). // Calculate as: // 1/2 * (FTM_FS / FTM_MIN_SHAPE_FREQ) for ZV. // (FTM_FS / FTM_MIN_SHAPE_FREQ) for ZVD, MZV. // 3/2 * (FTM_FS / FTM_MIN_SHAPE_FREQ) for 2HEI. // 2 * (FTM_FS / FTM_MIN_SHAPE_FREQ) for 3HEI. - #define FTM_STEPS_PER_UNIT_TIME 20 // Interpolated stepper commands per unit time. + #define FTM_STEPS_PER_UNIT_TIME 20 // Interpolated stepper commands per unit time. // Calculate as (FTM_STEPPER_FS / FTM_FS). - #define FTM_CTS_COMPARE_VAL 10 // Comparison value used in interpolation algorithm. + #define FTM_CTS_COMPARE_VAL 10 // Comparison value used in interpolation algorithm. // Calculate as (FTM_STEPS_PER_UNIT_TIME / 2). // These values may be configured to adjust duration of loop(). - #define FTM_STEPS_PER_LOOP 60 // Number of stepper commands to generate each loop(). - #define FTM_POINTS_PER_LOOP 100 // Number of trajectory points to generate each loop(). + #define FTM_STEPS_PER_LOOP 60 // Number of stepper commands to generate each loop(). + #define FTM_POINTS_PER_LOOP 100 // Number of trajectory points to generate each loop(). // This value may be configured to adjust duration to consume the command buffer. // Try increasing this value if stepper motion is not smooth. #define FTM_STEPPERCMD_BUFF_SIZE 1000 // Size of the stepper command buffers. + + //#define FT_MOTION_MENU // Provide a MarlinUI menu to set M493 parameters. #endif /** @@ -1162,7 +1175,7 @@ */ //#define INPUT_SHAPING_X //#define INPUT_SHAPING_Y -#if EITHER(INPUT_SHAPING_X, INPUT_SHAPING_Y) +#if ANY(INPUT_SHAPING_X, INPUT_SHAPING_Y) #if ENABLED(INPUT_SHAPING_X) #define SHAPING_FREQ_X 40 // (Hz) The default dominant resonant frequency on the X axis. #define SHAPING_ZETA_X 0.15f // Damping ratio of the X axis (range: 0.0 = no damping to 1.0 = critical damping). @@ -1404,7 +1417,7 @@ */ //#define DIGIPOT_MCP4018 // Requires https://github.com/felias-fogg/SlowSoftI2CMaster //#define DIGIPOT_MCP4451 -#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) +#if ANY(DIGIPOT_MCP4018, DIGIPOT_MCP4451) #define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT:4 AZTEEG_X3_PRO:8 MKS_SBASE:5 MIGHTYBOARD_REVE:5 // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. @@ -1461,7 +1474,7 @@ // //#define LCD_BACKLIGHT_TIMEOUT_MINS 1 // (minutes) Timeout before turning off the backlight -#if HAS_BED_PROBE && EITHER(HAS_MARLINUI_MENU, HAS_TFT_LVGL_UI) +#if HAS_BED_PROBE && ANY(HAS_MARLINUI_MENU, HAS_TFT_LVGL_UI) //#define PROBE_OFFSET_WIZARD // Add a Probe Z Offset calibration option to the LCD menu #if ENABLED(PROBE_OFFSET_WIZARD) /** @@ -1528,21 +1541,22 @@ * We encourage you to take advantage of this new feature and we also * respectfully request that you retain the unmodified Marlin boot screen. */ - #if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, IS_DWIN_MARLINUI) - #define SHOW_BOOTSCREEN // Show the Marlin bootscreen on startup. ** ENABLE FOR PRODUCTION ** - #if ENABLED(SHOW_BOOTSCREEN) - #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) - #if EITHER(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI) - #define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash) - #endif - //#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup. + #define SHOW_BOOTSCREEN // Show the Marlin bootscreen on startup. ** ENABLE FOR PRODUCTION ** + #if ENABLED(SHOW_BOOTSCREEN) + #define BOOTSCREEN_TIMEOUT 3000 // (ms) Total Duration to display the boot screen(s) + #if ANY(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI) + #define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash) #endif #if HAS_MARLINUI_U8GLIB - #if ENABLED(SHOW_BOOTSCREEN) - //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash. - #endif - //#define CUSTOM_STATUS_SCREEN_IMAGE // Show the bitmap in Marlin/_Statusscreen.h on the status screen. + //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash. #endif + #if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE) + //#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup. + #endif + #endif + + #if HAS_MARLINUI_U8GLIB + //#define CUSTOM_STATUS_SCREEN_IMAGE // Show the bitmap in Marlin/_Statusscreen.h on the status screen. #endif //#define SOUND_MENU_ITEM // Add a mute option to the LCD menu @@ -1601,13 +1615,13 @@ #define SET_REMAINING_TIME // Add 'R' parameter to set remaining time //#define SET_INTERACTION_TIME // Add 'C' parameter to set time until next filament change or other user interaction //#define M73_REPORT // Report M73 values to host - #if BOTH(M73_REPORT, HAS_MEDIA) + #if ALL(M73_REPORT, HAS_MEDIA) #define M73_REPORT_SD_ONLY // Report only when printing from SD #endif #endif // LCD Print Progress options. Multiple times may be displayed in turn. -#if HAS_DISPLAY && EITHER(HAS_MEDIA, SET_PROGRESS_MANUALLY) +#if HAS_DISPLAY && ANY(HAS_MEDIA, SET_PROGRESS_MANUALLY) #define SHOW_PROGRESS_PERCENT // Show print progress percentage (doesn't affect progress bar) #define SHOW_ELAPSED_TIME // Display elapsed printing time (prefix 'E') //#define SHOW_REMAINING_TIME // Display estimated time to completion (prefix 'R') @@ -1616,7 +1630,7 @@ #endif //#define PRINT_PROGRESS_SHOW_DECIMALS // Show/report progress with decimal digits, not all UIs support this - #if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) + #if ANY(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing #if ENABLED(LCD_PROGRESS_BAR) #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar @@ -1663,6 +1677,7 @@ //#define NO_SD_AUTOSTART // Remove auto#.g file support completely to save some Flash, SRAM //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files + //#define ONE_CLICK_PRINT // Prompt to print the newest file on inserted media //#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted //#define MEDIA_MENU_AT_TOP // Force the media menu to be listed on the top of the main menu @@ -2175,11 +2190,12 @@ */ //#define BABYSTEPPING #if ENABLED(BABYSTEPPING) - //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR + //#define INTEGRATED_BABYSTEPPING // Integration of babystepping into the Stepper ISR + //#define EP_BABYSTEPPING // M293/M294 babystepping with EMERGENCY_PARSER support //#define BABYSTEP_WITHOUT_HOMING - //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). + //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement) //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! - #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + //#define BABYSTEP_INVERT_Z // Enable if Z babysteps should go the other way //#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps #define BABYSTEP_MULTIPLICATOR_Z 1 // (steps or mm) Steps or millimeter distance for each Z babystep #define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep @@ -2286,7 +2302,7 @@ //#define PROBING_MARGIN_BACK PROBING_MARGIN #endif -#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) +#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) // Override the mesh area if the automatic (max) area is too large //#define MESH_MIN_X MESH_INSET //#define MESH_MIN_Y MESH_INSET @@ -2294,7 +2310,7 @@ //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) #endif -#if BOTH(AUTO_BED_LEVELING_UBL, EEPROM_SETTINGS) +#if ALL(AUTO_BED_LEVELING_UBL, EEPROM_SETTINGS) //#define OPTIMIZED_MESH_STORAGE // Store mesh with less precision to save EEPROM space #endif @@ -2364,7 +2380,7 @@ #endif // G76 options - #if BOTH(PTC_PROBE, PTC_BED) + #if ALL(PTC_PROBE, PTC_BED) // Park position to wait for probe cooldown #define PTC_PARK_POS { 0, 0, 100 } @@ -2406,7 +2422,7 @@ // G5 Bézier Curve Support with XYZE destination and IJPQ offsets //#define BEZIER_CURVE_SUPPORT // Requires ~2666 bytes -#if EITHER(ARC_SUPPORT, BEZIER_CURVE_SUPPORT) +#if ANY(ARC_SUPPORT, BEZIER_CURVE_SUPPORT) //#define CNC_WORKSPACE_PLANES // Allow G2/G3/G5 to operate in XY, ZX, or YZ planes #endif @@ -2492,7 +2508,7 @@ // The number of linear moves that can be in the planner at once. // The value of BLOCK_BUFFER_SIZE must be a power of 2 (e.g., 8, 16, 32) -#if BOTH(HAS_MEDIA, DIRECT_STEPPING) +#if ALL(HAS_MEDIA, DIRECT_STEPPING) #define BLOCK_BUFFER_SIZE 8 #elif HAS_MEDIA #define BLOCK_BUFFER_SIZE 16 @@ -2846,10 +2862,10 @@ #endif #if AXIS_IS_TMC_CONFIG(X2) - #define X2_CURRENT 800 - #define X2_CURRENT_HOME X2_CURRENT - #define X2_MICROSTEPS X_MICROSTEPS - #define X2_RSENSE 0.11 + #define X2_CURRENT X_CURRENT + #define X2_CURRENT_HOME X_CURRENT_HOME + #define X2_MICROSTEPS X_MICROSTEPS + #define X2_RSENSE X_RSENSE #define X2_CHAIN_POS -1 //#define X2_INTERPOLATE true //#define X2_HOLD_MULTIPLIER 0.5 @@ -2866,10 +2882,10 @@ #endif #if AXIS_IS_TMC_CONFIG(Y2) - #define Y2_CURRENT 800 - #define Y2_CURRENT_HOME Y2_CURRENT - #define Y2_MICROSTEPS Y_MICROSTEPS - #define Y2_RSENSE 0.11 + #define Y2_CURRENT Y_CURRENT + #define Y2_CURRENT_HOME Y_CURRENT_HOME + #define Y2_MICROSTEPS Y_MICROSTEPS + #define Y2_RSENSE Y_RSENSE #define Y2_CHAIN_POS -1 //#define Y2_INTERPOLATE true //#define Y2_HOLD_MULTIPLIER 0.5 @@ -2886,30 +2902,30 @@ #endif #if AXIS_IS_TMC_CONFIG(Z2) - #define Z2_CURRENT 800 - #define Z2_CURRENT_HOME Z2_CURRENT - #define Z2_MICROSTEPS Z_MICROSTEPS - #define Z2_RSENSE 0.11 + #define Z2_CURRENT Z_CURRENT + #define Z2_CURRENT_HOME Z_CURRENT_HOME + #define Z2_MICROSTEPS Z_MICROSTEPS + #define Z2_RSENSE Z_RSENSE #define Z2_CHAIN_POS -1 //#define Z2_INTERPOLATE true //#define Z2_HOLD_MULTIPLIER 0.5 #endif #if AXIS_IS_TMC_CONFIG(Z3) - #define Z3_CURRENT 800 - #define Z3_CURRENT_HOME Z3_CURRENT - #define Z3_MICROSTEPS Z_MICROSTEPS - #define Z3_RSENSE 0.11 + #define Z3_CURRENT Z_CURRENT + #define Z3_CURRENT_HOME Z_CURRENT_HOME + #define Z3_MICROSTEPS Z_MICROSTEPS + #define Z3_RSENSE Z_RSENSE #define Z3_CHAIN_POS -1 //#define Z3_INTERPOLATE true //#define Z3_HOLD_MULTIPLIER 0.5 #endif #if AXIS_IS_TMC_CONFIG(Z4) - #define Z4_CURRENT 800 - #define Z4_CURRENT_HOME Z4_CURRENT - #define Z4_MICROSTEPS Z_MICROSTEPS - #define Z4_RSENSE 0.11 + #define Z4_CURRENT Z_CURRENT + #define Z4_CURRENT_HOME Z_CURRENT_HOME + #define Z4_MICROSTEPS Z_MICROSTEPS + #define Z4_RSENSE Z_RSENSE #define Z4_CHAIN_POS -1 //#define Z4_INTERPOLATE true //#define Z4_HOLD_MULTIPLIER 0.5 @@ -2985,63 +3001,63 @@ #endif #if AXIS_IS_TMC_CONFIG(E1) - #define E1_CURRENT 800 + #define E1_CURRENT E0_CURRENT #define E1_MICROSTEPS E0_MICROSTEPS - #define E1_RSENSE 0.11 + #define E1_RSENSE E0_RSENSE #define E1_CHAIN_POS -1 //#define E1_INTERPOLATE true //#define E1_HOLD_MULTIPLIER 0.5 #endif #if AXIS_IS_TMC_CONFIG(E2) - #define E2_CURRENT 800 + #define E2_CURRENT E0_CURRENT #define E2_MICROSTEPS E0_MICROSTEPS - #define E2_RSENSE 0.11 + #define E2_RSENSE E0_RSENSE #define E2_CHAIN_POS -1 //#define E2_INTERPOLATE true //#define E2_HOLD_MULTIPLIER 0.5 #endif #if AXIS_IS_TMC_CONFIG(E3) - #define E3_CURRENT 800 + #define E3_CURRENT E0_CURRENT #define E3_MICROSTEPS E0_MICROSTEPS - #define E3_RSENSE 0.11 + #define E3_RSENSE E0_RSENSE #define E3_CHAIN_POS -1 //#define E3_INTERPOLATE true //#define E3_HOLD_MULTIPLIER 0.5 #endif #if AXIS_IS_TMC_CONFIG(E4) - #define E4_CURRENT 800 + #define E4_CURRENT E0_CURRENT #define E4_MICROSTEPS E0_MICROSTEPS - #define E4_RSENSE 0.11 + #define E4_RSENSE E0_RSENSE #define E4_CHAIN_POS -1 //#define E4_INTERPOLATE true //#define E4_HOLD_MULTIPLIER 0.5 #endif #if AXIS_IS_TMC_CONFIG(E5) - #define E5_CURRENT 800 + #define E5_CURRENT E0_CURRENT #define E5_MICROSTEPS E0_MICROSTEPS - #define E5_RSENSE 0.11 + #define E5_RSENSE E0_RSENSE #define E5_CHAIN_POS -1 //#define E5_INTERPOLATE true //#define E5_HOLD_MULTIPLIER 0.5 #endif #if AXIS_IS_TMC_CONFIG(E6) - #define E6_CURRENT 800 + #define E6_CURRENT E0_CURRENT #define E6_MICROSTEPS E0_MICROSTEPS - #define E6_RSENSE 0.11 + #define E6_RSENSE E0_RSENSE #define E6_CHAIN_POS -1 //#define E6_INTERPOLATE true //#define E6_HOLD_MULTIPLIER 0.5 #endif #if AXIS_IS_TMC_CONFIG(E7) - #define E7_CURRENT 800 + #define E7_CURRENT E0_CURRENT #define E7_MICROSTEPS E0_MICROSTEPS - #define E7_RSENSE 0.11 + #define E7_RSENSE E0_RSENSE #define E7_CHAIN_POS -1 //#define E7_INTERPOLATE true //#define E7_HOLD_MULTIPLIER 0.5 @@ -3274,7 +3290,7 @@ */ //#define SENSORLESS_HOMING // StallGuard capable drivers only - #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + #if ANY(SENSORLESS_HOMING, SENSORLESS_PROBING) // TMC2209: 0...255. TMC2130: -64...63 #define X_STALL_SENSITIVITY 8 #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY @@ -3437,7 +3453,7 @@ */ //#define SPINDLE_FEATURE //#define LASER_FEATURE -#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) +#if ANY(SPINDLE_FEATURE, LASER_FEATURE) #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if SPINDLE_LASER_ENA_PIN is active HIGH #define SPINDLE_LASER_USE_PWM // Enable if your controller supports setting the speed/power @@ -3724,6 +3740,9 @@ * Auto-report position with M154 S */ //#define AUTO_REPORT_POSITION +#if ENABLED(AUTO_REPORT_POSITION) + //#define AUTO_REPORT_REAL_POSITION // Auto-report the real position +#endif /** * Include capabilities in M115 output @@ -4186,7 +4205,7 @@ //#define WIFISUPPORT // Marlin embedded WiFi management //#define ESP3D_WIFISUPPORT // ESP3D Library WiFi management (https://github.com/luc-github/ESP3DLib) -#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) +#if ANY(WIFISUPPORT, ESP3D_WIFISUPPORT) //#define WEBSUPPORT // Start a webserver (which may include auto-discovery) //#define OTASUPPORT // Support over-the-air firmware updates //#define WIFI_CUSTOM_COMMAND // Accept feature config commands (e.g., WiFi ESP3D) from the host @@ -4237,30 +4256,29 @@ // Add an LCD menu for MMU2 //#define MMU2_MENUS - #if EITHER(MMU2_MENUS, HAS_PRUSA_MMU2S) - // Settings for filament load / unload from the LCD menu. - // This is for Průša MK3-style extruders. Customize for your hardware. - #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 - #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ - { 7.2, 1145 }, \ - { 14.4, 871 }, \ - { 36.0, 1393 }, \ - { 14.4, 871 }, \ - { 50.0, 198 } - #define MMU2_RAMMING_SEQUENCE \ - { 1.0, 1000 }, \ - { 1.0, 1500 }, \ - { 2.0, 2000 }, \ - { 1.5, 3000 }, \ - { 2.5, 4000 }, \ - { -15.0, 5000 }, \ - { -14.0, 1200 }, \ - { -6.0, 600 }, \ - { 10.0, 700 }, \ - { -10.0, 400 }, \ - { -50.0, 2000 } - #endif + // Settings for filament load / unload from the LCD menu. + // This is for Průša MK3-style extruders. Customize for your hardware. + #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 + #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ + { 7.2, 1145 }, \ + { 14.4, 871 }, \ + { 36.0, 1393 }, \ + { 14.4, 871 }, \ + { 50.0, 198 } + + #define MMU2_RAMMING_SEQUENCE \ + { 1.0, 1000 }, \ + { 1.0, 1500 }, \ + { 2.0, 2000 }, \ + { 1.5, 3000 }, \ + { 2.5, 4000 }, \ + { -15.0, 5000 }, \ + { -14.0, 1200 }, \ + { -6.0, 600 }, \ + { 10.0, 700 }, \ + { -10.0, 400 }, \ + { -50.0, 2000 } /** * Using a sensor like the MMU2S @@ -4283,6 +4301,8 @@ #define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \ { -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE } + // Continue unloading if sensor detects filament after the initial unload move + //#define MMU_IR_UNLOAD_MOVE #else /** diff --git a/Marlin/Version.h b/Marlin/Version.h index a2a254824d..c48243e8b9 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2023-04-24" +//#define STRING_DISTRIBUTION_DATE "2023-06-23" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/config.ini b/Marlin/config.ini index c4fe7597f8..17ff3bec7e 100644 --- a/Marlin/config.ini +++ b/Marlin/config.ini @@ -42,7 +42,7 @@ preheat_1_temp_hotend = 180 bang_max = 255 pidtemp = on pid_k1 = 0.95 -pid_max = BANG_MAX +pid_max = 255 pid_functional_range = 10 default_kp = 22.20 @@ -69,10 +69,6 @@ x_home_dir = -1 y_home_dir = -1 z_home_dir = -1 -use_xmin_plug = on -use_ymin_plug = on -use_zmin_plug = on - x_min_endstop_hit_state = HIGH y_min_endstop_hit_state = HIGH z_min_endstop_hit_state = HIGH @@ -100,10 +96,10 @@ step_state_x = HIGH step_state_y = HIGH step_state_z = HIGH -disable_x = false -disable_y = false -disable_z = false -disable_e = false +disable_x = off +disable_y = off +disable_z = off +disable_e = off proportional_font_ratio = 1.0 default_nominal_filament_dia = 1.75 diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index d458790979..6d98dff080 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -140,7 +140,7 @@ typedef Servo hal_servo_t; #endif #define LCD_SERIAL lcdSerial #if HAS_DGUS_LCD - #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free() + #define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free() #endif #endif diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp index dc98f2f79e..32c0361d03 100644 --- a/Marlin/src/HAL/AVR/HAL_SPI.cpp +++ b/Marlin/src/HAL/AVR/HAL_SPI.cpp @@ -198,7 +198,7 @@ void spiBegin() { // output pin high - like sending 0xFF WRITE(SD_MOSI_PIN, HIGH); - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { WRITE(SD_SCK_PIN, HIGH); nop; // adjust so SCK is nice @@ -225,7 +225,7 @@ void spiBegin() { void spiSend(uint8_t data) { // no interrupts during byte send - about 8µs cli(); - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { WRITE(SD_SCK_PIN, LOW); WRITE(SD_MOSI_PIN, data & 0x80); data <<= 1; diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 7dd208e54e..f47541f12d 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -280,7 +280,7 @@ 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); + static constexpr bool RX_OVERRUNS = ALL(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS); }; typedef Serial1Class< MarlinSerial< LCDSerialCfg > > MSerialLCD; diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp index 8d084dec7f..6465e47025 100644 --- a/Marlin/src/HAL/AVR/eeprom.cpp +++ b/Marlin/src/HAL/AVR/eeprom.cpp @@ -23,7 +23,7 @@ #include "../../inc/MarlinConfig.h" -#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) +#if ANY(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) /** * PersistentStore for Arduino-style EEPROM interface diff --git a/Marlin/src/HAL/AVR/endstop_interrupts.h b/Marlin/src/HAL/AVR/endstop_interrupts.h index 5511aa406f..ac827f1842 100644 --- a/Marlin/src/HAL/AVR/endstop_interrupts.h +++ b/Marlin/src/HAL/AVR/endstop_interrupts.h @@ -120,7 +120,7 @@ void pciSetup(const int8_t pin) { void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - #if HAS_X_MAX + #if USE_X_MAX #if (digitalPinToInterrupt(X_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(X_MAX_PIN); #else @@ -128,7 +128,7 @@ void setup_endstop_interrupts() { pciSetup(X_MAX_PIN); #endif #endif - #if HAS_X_MIN + #if USE_X_MIN #if (digitalPinToInterrupt(X_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(X_MIN_PIN); #else @@ -136,7 +136,7 @@ void setup_endstop_interrupts() { pciSetup(X_MIN_PIN); #endif #endif - #if HAS_Y_MAX + #if USE_Y_MAX #if (digitalPinToInterrupt(Y_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Y_MAX_PIN); #else @@ -144,7 +144,7 @@ void setup_endstop_interrupts() { pciSetup(Y_MAX_PIN); #endif #endif - #if HAS_Y_MIN + #if USE_Y_MIN #if (digitalPinToInterrupt(Y_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Y_MIN_PIN); #else @@ -152,7 +152,7 @@ void setup_endstop_interrupts() { pciSetup(Y_MIN_PIN); #endif #endif - #if HAS_Z_MAX + #if USE_Z_MAX #if (digitalPinToInterrupt(Z_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z_MAX_PIN); #else @@ -160,7 +160,7 @@ void setup_endstop_interrupts() { pciSetup(Z_MAX_PIN); #endif #endif - #if HAS_Z_MIN + #if HAS_Z_MIN_PIN #if (digitalPinToInterrupt(Z_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z_MIN_PIN); #else @@ -168,97 +168,97 @@ void setup_endstop_interrupts() { pciSetup(Z_MIN_PIN); #endif #endif - #if HAS_I_MAX + #if USE_I_MAX #if (digitalPinToInterrupt(I_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(I_MAX_PIN); #else - static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(I_MAX_PIN), "I_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(I_MAX_PIN); #endif - #elif HAS_I_MIN + #elif USE_I_MIN #if (digitalPinToInterrupt(I_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(I_MIN_PIN); #else - static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(I_MIN_PIN), "I_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(I_MIN_PIN); #endif #endif - #if HAS_J_MAX + #if USE_J_MAX #if (digitalPinToInterrupt(J_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(J_MAX_PIN); #else - static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(J_MAX_PIN), "J_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(J_MAX_PIN); #endif - #elif HAS_J_MIN + #elif USE_J_MIN #if (digitalPinToInterrupt(J_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(J_MIN_PIN); #else - static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(J_MIN_PIN), "J_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(J_MIN_PIN); #endif #endif - #if HAS_K_MAX + #if USE_K_MAX #if (digitalPinToInterrupt(K_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(K_MAX_PIN); #else - static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(K_MAX_PIN), "K_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(K_MAX_PIN); #endif - #elif HAS_K_MIN + #elif USE_K_MIN #if (digitalPinToInterrupt(K_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(K_MIN_PIN); #else - static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(K_MIN_PIN), "K_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(K_MIN_PIN); #endif #endif - #if HAS_U_MAX + #if USE_U_MAX #if (digitalPinToInterrupt(U_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(U_MAX_PIN); #else - static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(U_MAX_PIN), "U_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(U_MAX_PIN); #endif - #elif HAS_U_MIN + #elif USE_U_MIN #if (digitalPinToInterrupt(U_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(U_MIN_PIN); #else - static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(U_MIN_PIN), "U_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(U_MIN_PIN); #endif #endif - #if HAS_V_MAX + #if USE_V_MAX #if (digitalPinToInterrupt(V_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(V_MAX_PIN); #else - static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(V_MAX_PIN), "V_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(V_MAX_PIN); #endif - #elif HAS_V_MIN + #elif USE_V_MIN #if (digitalPinToInterrupt(V_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(V_MIN_PIN); #else - static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(V_MIN_PIN), "V_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(V_MIN_PIN); #endif #endif - #if HAS_W_MAX + #if USE_W_MAX #if (digitalPinToInterrupt(W_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(W_MAX_PIN); #else - static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(W_MAX_PIN), "W_MAX_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(W_MAX_PIN); #endif - #elif HAS_W_MIN + #elif USE_W_MIN #if (digitalPinToInterrupt(W_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(W_MIN_PIN); #else - static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable"); + static_assert(digitalPinHasPCICR(W_MIN_PIN), "W_MIN_PIN is not interrupt-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."); pciSetup(W_MIN_PIN); #endif #endif - #if HAS_X2_MAX + #if USE_X2_MAX #if (digitalPinToInterrupt(X2_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(X2_MAX_PIN); #else @@ -266,7 +266,7 @@ void setup_endstop_interrupts() { pciSetup(X2_MAX_PIN); #endif #endif - #if HAS_X2_MIN + #if USE_X2_MIN #if (digitalPinToInterrupt(X2_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(X2_MIN_PIN); #else @@ -274,7 +274,7 @@ void setup_endstop_interrupts() { pciSetup(X2_MIN_PIN); #endif #endif - #if HAS_Y2_MAX + #if USE_Y2_MAX #if (digitalPinToInterrupt(Y2_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Y2_MAX_PIN); #else @@ -282,7 +282,7 @@ void setup_endstop_interrupts() { pciSetup(Y2_MAX_PIN); #endif #endif - #if HAS_Y2_MIN + #if USE_Y2_MIN #if (digitalPinToInterrupt(Y2_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Y2_MIN_PIN); #else @@ -290,7 +290,7 @@ void setup_endstop_interrupts() { pciSetup(Y2_MIN_PIN); #endif #endif - #if HAS_Z2_MAX + #if USE_Z2_MAX #if (digitalPinToInterrupt(Z2_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z2_MAX_PIN); #else @@ -298,7 +298,7 @@ void setup_endstop_interrupts() { pciSetup(Z2_MAX_PIN); #endif #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN #if (digitalPinToInterrupt(Z2_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z2_MIN_PIN); #else @@ -306,7 +306,7 @@ void setup_endstop_interrupts() { pciSetup(Z2_MIN_PIN); #endif #endif - #if HAS_Z3_MAX + #if USE_Z3_MAX #if (digitalPinToInterrupt(Z3_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z3_MAX_PIN); #else @@ -314,7 +314,7 @@ void setup_endstop_interrupts() { pciSetup(Z3_MAX_PIN); #endif #endif - #if HAS_Z3_MIN + #if USE_Z3_MIN #if (digitalPinToInterrupt(Z3_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z3_MIN_PIN); #else @@ -322,7 +322,7 @@ void setup_endstop_interrupts() { pciSetup(Z3_MIN_PIN); #endif #endif - #if HAS_Z4_MAX + #if USE_Z4_MAX #if (digitalPinToInterrupt(Z4_MAX_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z4_MAX_PIN); #else @@ -330,7 +330,7 @@ void setup_endstop_interrupts() { pciSetup(Z4_MAX_PIN); #endif #endif - #if HAS_Z4_MIN + #if USE_Z4_MIN #if (digitalPinToInterrupt(Z4_MIN_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z4_MIN_PIN); #else @@ -338,7 +338,7 @@ void setup_endstop_interrupts() { pciSetup(Z4_MIN_PIN); #endif #endif - #if HAS_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE #if (digitalPinToInterrupt(Z_MIN_PROBE_PIN) != NOT_AN_INTERRUPT) _ATTACH(Z_MIN_PROBE_PIN); #else diff --git a/Marlin/src/HAL/AVR/fast_pwm.cpp b/Marlin/src/HAL/AVR/fast_pwm.cpp index 0b2b8fd0b3..6da68e6245 100644 --- a/Marlin/src/HAL/AVR/fast_pwm.cpp +++ b/Marlin/src/HAL/AVR/fast_pwm.cpp @@ -132,7 +132,7 @@ void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) { DEBUG_ECHOLNPGM("f=", f); DEBUG_ECHOLNPGM("(prescaler loop)"); - LOOP_L_N(i, COUNT(prescaler)) { // Loop through all prescaler values + for (uint8_t i = 0; i < COUNT(prescaler); ++i) { // Loop through all prescaler values const uint32_t p = prescaler[i]; // Extend to 32 bits for calculations DEBUG_ECHOLNPGM("prescaler[", i, "]=", p); uint16_t res_fast_temp, res_pc_temp; @@ -232,7 +232,7 @@ void MarlinHAL::init_pwm_timers() { #endif }; - LOOP_L_N(i, COUNT(pwm_pin)) + for (uint8_t i = 0; i < COUNT(pwm_pin); ++i) set_pwm_frequency(pwm_pin[i], 1000); } diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1280.h b/Marlin/src/HAL/AVR/fastio/fastio_1280.h index 6f074cf911..633774dda9 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_1280.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_1280.h @@ -35,39 +35,36 @@ #include "../fastio.h" -// change for your board -#define DEBUG_LED DIO21 - // UART -#define RXD DIO0 -#define TXD DIO1 +#define RXD 0 +#define TXD 1 // SPI -#define SCK DIO52 -#define MISO DIO50 -#define MOSI DIO51 -#define SS DIO53 +#define MISO 50 +#define MOSI 51 +#define SCK 52 +#define SS 53 // TWI (I2C) -#define SCL DIO21 -#define SDA DIO20 +#define SCL 21 +#define SDA 20 // Timers and PWM -#define OC0A DIO13 -#define OC0B DIO4 -#define OC1A DIO11 -#define OC1B DIO12 -#define OC2A DIO10 -#define OC2B DIO9 -#define OC3A DIO5 -#define OC3B DIO2 -#define OC3C DIO3 -#define OC4A DIO6 -#define OC4B DIO7 -#define OC4C DIO8 -#define OC5A DIO46 -#define OC5B DIO45 -#define OC5C DIO44 +#define OC0A 13 +#define OC0B 4 +#define OC1A 11 +#define OC1B 12 +#define OC2A 10 +#define OC2B 9 +#define OC3A 5 +#define OC3B 2 +#define OC3C 3 +#define OC4A 6 +#define OC4B 7 +#define OC4C 8 +#define OC5A 46 +#define OC5B 45 +#define OC5C 44 // Digital I/O diff --git a/Marlin/src/HAL/AVR/fastio/fastio_1281.h b/Marlin/src/HAL/AVR/fastio/fastio_1281.h index 812586225d..6067248978 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_1281.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_1281.h @@ -33,32 +33,29 @@ #include "../fastio.h" -// change for your board -#define DEBUG_LED DIO46 - // UART -#define RXD DIO0 -#define TXD DIO1 +#define RXD 0 +#define TXD 1 // SPI -#define SCK DIO10 -#define MISO DIO12 -#define MOSI DIO11 -#define SS DIO16 +#define SCK 10 +#define MISO 12 +#define MOSI 11 +#define SS 16 // TWI (I2C) -#define SCL DIO17 -#define SDA DIO18 +#define SCL 17 +#define SDA 18 // Timers and PWM -#define OC0A DIO9 -#define OC0B DIO4 -#define OC1A DIO7 -#define OC1B DIO8 -#define OC2A DIO6 -#define OC3A DIO5 -#define OC3B DIO2 -#define OC3C DIO3 +#define OC0A 9 +#define OC0B 4 +#define OC1A 7 +#define OC1B 8 +#define OC2A 6 +#define OC3A 5 +#define OC3B 2 +#define OC3C 3 // Digital I/O diff --git a/Marlin/src/HAL/AVR/fastio/fastio_168.h b/Marlin/src/HAL/AVR/fastio/fastio_168.h index 4f591b37b9..cc55979740 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_168.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_168.h @@ -33,29 +33,27 @@ #include "../fastio.h" -#define DEBUG_LED AIO5 - // UART -#define RXD DIO0 -#define TXD DIO1 +#define RXD 0 +#define TXD 1 // SPI -#define SCK DIO13 -#define MISO DIO12 -#define MOSI DIO11 -#define SS DIO10 +#define SS 10 +#define MOSI 11 +#define MISO 12 +#define SCK 13 // TWI (I2C) #define SCL AIO5 #define SDA AIO4 // Timers and PWM -#define OC0A DIO6 -#define OC0B DIO5 -#define OC1A DIO9 -#define OC1B DIO10 -#define OC2A DIO11 -#define OC2B DIO3 +#define OC0A 6 +#define OC0B 5 +#define OC1A 9 +#define OC1B 10 +#define OC2A 11 +#define OC2B 3 // Digital I/O diff --git a/Marlin/src/HAL/AVR/fastio/fastio_644.h b/Marlin/src/HAL/AVR/fastio/fastio_644.h index 16bdc6a23d..94b322a819 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_644.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_644.h @@ -59,34 +59,32 @@ #include "../fastio.h" -#define DEBUG_LED DIO0 - // UART -#define RXD DIO8 -#define TXD DIO9 -#define RXD0 DIO8 -#define TXD0 DIO9 +#define RXD 8 +#define TXD 9 +#define RXD0 8 +#define TXD0 9 -#define RXD1 DIO10 -#define TXD1 DIO11 +#define RXD1 10 +#define TXD1 11 // SPI -#define SCK DIO7 -#define MISO DIO6 -#define MOSI DIO5 -#define SS DIO4 +#define SS 4 +#define MOSI 5 +#define MISO 6 +#define SCK 7 // TWI (I2C) -#define SCL DIO16 -#define SDA DIO17 +#define SCL 16 +#define SDA 17 // Timers and PWM -#define OC0A DIO3 -#define OC0B DIO4 -#define OC1A DIO13 -#define OC1B DIO12 -#define OC2A DIO15 -#define OC2B DIO14 +#define OC0A 3 +#define OC0B 4 +#define OC1A 13 +#define OC1B 12 +#define OC2A 15 +#define OC2B 14 // Digital I/O diff --git a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h b/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h index d2a8aca6f3..0c434b157c 100644 --- a/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h +++ b/Marlin/src/HAL/AVR/fastio/fastio_AT90USB.h @@ -34,14 +34,11 @@ #include "../fastio.h" -// change for your board -#define DEBUG_LED DIO31 /* led D5 red */ - // SPI -#define SCK DIO21 // 9 -#define MISO DIO23 // 11 -#define MOSI DIO22 // 10 -#define SS DIO20 // 8 +#define SS 20 // 8 +#define SCK 21 // 9 +#define MOSI 22 // 10 +#define MISO 23 // 11 // Digital I/O diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h index 665e68043a..6a7e172889 100644 --- a/Marlin/src/HAL/AVR/inc/SanityCheck.h +++ b/Marlin/src/HAL/AVR/inc/SanityCheck.h @@ -95,11 +95,11 @@ /** * The Trinamic library includes SoftwareSerial.h, leading to a compile error. */ -#if BOTH(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE) +#if ALL(HAS_TRINAMIC_CONFIG, ENDSTOP_INTERRUPTS_FEATURE) #error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif -#if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS) +#if ALL(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 diff --git a/Marlin/src/HAL/AVR/pinsDebug.h b/Marlin/src/HAL/AVR/pinsDebug.h index 3fe877cd00..fc51f41ef8 100644 --- a/Marlin/src/HAL/AVR/pinsDebug.h +++ b/Marlin/src/HAL/AVR/pinsDebug.h @@ -77,12 +77,12 @@ void PRINT_ARRAY_NAME(uint8_t x) { PGM_P const name_mem_pointer = (PGM_P)pgm_read_ptr(&pin_array[x].name); - LOOP_L_N(y, MAX_NAME_LENGTH) { + for (uint8_t y = 0; y < MAX_NAME_LENGTH; ++y) { char temp_char = pgm_read_byte(name_mem_pointer + y); if (temp_char != 0) SERIAL_CHAR(temp_char); else { - LOOP_L_N(i, MAX_NAME_LENGTH - y) SERIAL_CHAR(' '); + for (uint8_t i = 0; i < MAX_NAME_LENGTH - y; ++i) SERIAL_CHAR(' '); break; } } @@ -109,7 +109,7 @@ void PRINT_ARRAY_NAME(uint8_t x) { * Print a pin's PWM status. * Return true if it's currently a PWM pin. */ -static bool pwm_status(uint8_t pin) { +bool pwm_status(uint8_t pin) { char buffer[20]; // for the sprintf statements switch (digitalPinToTimer_DEBUG(pin)) { @@ -232,12 +232,12 @@ const volatile uint8_t* const PWM_OCR[][3] PROGMEM = { #define OCR_VAL(T, L) pgm_read_word(&PWM_OCR[T][L]) -static void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); } -static void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); } -static void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); } -static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); } +void err_is_counter() { SERIAL_ECHOPGM(" non-standard PWM mode"); } +void err_is_interrupt() { SERIAL_ECHOPGM(" compare interrupt enabled"); } +void err_prob_interrupt() { SERIAL_ECHOPGM(" overflow interrupt enabled"); } +void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); SERIAL_ECHO_SP(14); } -inline void com_print(const uint8_t N, const uint8_t Z) { +void com_print(const uint8_t N, const uint8_t Z) { const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); SERIAL_ECHOPGM(" COM", AS_DIGIT(N)); SERIAL_CHAR(Z); @@ -279,7 +279,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - if (TEST(*TMSK, TOIE)) err_prob_interrupt(); } -static void pwm_details(uint8_t pin) { +void pwm_details(uint8_t pin) { switch (digitalPinToTimer_DEBUG(pin)) { #if ABTEST(0) @@ -353,47 +353,41 @@ static void pwm_details(uint8_t pin) { } // pwm_details #ifndef digitalRead_mod // Use Teensyduino's version of digitalRead - it doesn't disable the PWMs - int digitalRead_mod(const int8_t pin) { // same as digitalRead except the PWM stop section has been removed + int digitalRead_mod(const pin_t pin) { // same as digitalRead except the PWM stop section has been removed const uint8_t port = digitalPinToPort_DEBUG(pin); return (port != NOT_A_PIN) && (*portInputRegister(port) & digitalPinToBitMask_DEBUG(pin)) ? HIGH : LOW; } #endif -#ifndef PRINT_PORT +void print_port(const pin_t pin) { // print port number + #ifdef digitalPinToPort_DEBUG + uint8_t x; + SERIAL_ECHOPGM(" Port: "); + #if AVR_AT90USB1286_FAMILY + x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64; + #else + x = digitalPinToPort_DEBUG(pin) + 64; + #endif + SERIAL_CHAR(x); - void print_port(int8_t pin) { // print port number - #ifdef digitalPinToPort_DEBUG - uint8_t x; - SERIAL_ECHOPGM(" Port: "); - #if AVR_AT90USB1286_FAMILY - x = (pin == 46 || pin == 47) ? 'E' : digitalPinToPort_DEBUG(pin) + 64; - #else - x = digitalPinToPort_DEBUG(pin) + 64; - #endif - SERIAL_CHAR(x); - - #if AVR_AT90USB1286_FAMILY - if (pin == 46) - x = '2'; - else if (pin == 47) - x = '3'; - else { - uint8_t temp = digitalPinToBitMask_DEBUG(pin); - for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; - } - #else + #if AVR_AT90USB1286_FAMILY + if (pin == 46) + x = '2'; + else if (pin == 47) + x = '3'; + else { uint8_t temp = digitalPinToBitMask_DEBUG(pin); for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; - #endif - SERIAL_CHAR(x); + } #else - SERIAL_ECHO_SP(10); + uint8_t temp = digitalPinToBitMask_DEBUG(pin); + for (x = '0'; x < '9' && temp != 1; x++) temp >>= 1; #endif - } - - #define PRINT_PORT(p) print_port(p) - -#endif + SERIAL_CHAR(x); + #else + SERIAL_ECHO_SP(10); + #endif +} #define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0) diff --git a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h index 582ae79ba7..c812d4fb11 100644 --- a/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h +++ b/Marlin/src/HAL/AVR/pinsDebug_Teensyduino.h @@ -22,11 +22,10 @@ #pragma once // -// some of the pin mapping functions of the Teensduino extension to the Arduino IDE -// do not function the same as the other Arduino extensions +// Some of the pin mapping functions of the Arduino IDE Teensduino extension +// function differently from other Arduino extensions. // - #define TEENSYDUINO_IDE //digitalPinToTimer(pin) function works like Arduino but Timers are not defined @@ -48,8 +47,6 @@ #define PE 5 #define PF 6 -#undef digitalPinToPort - const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PD, // 0 - PD0 - INT0 - PWM PD, // 1 - PD1 - INT1 - PWM @@ -101,7 +98,7 @@ const uint8_t PROGMEM digital_pin_to_port_PGM[] = { PE, // 47 - PE3 (not defined in teensyduino) }; -#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) +#define digitalPinToPort(P) pgm_read_byte(digital_pin_to_port_PGM[P]) // digitalPinToBitMask(pin) is OK diff --git a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp index 45b54379db..79bafe2939 100644 --- a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp +++ b/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp @@ -88,7 +88,7 @@ void u8g_spiSend_sw_AVR_mode_0(uint8_t val) { volatile uint8_t *outData = u8g_outData, *outClock = u8g_outClock; U8G_ATOMIC_START(); - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { if (val & 0x80) *outData |= bitData; else @@ -108,7 +108,7 @@ void u8g_spiSend_sw_AVR_mode_3(uint8_t val) { volatile uint8_t *outData = u8g_outData, *outClock = u8g_outClock; U8G_ATOMIC_START(); - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { *outClock &= bitNotClock; if (val & 0x80) *outData |= bitData; diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index f5bcaacee5..63ebf164f2 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -42,7 +42,7 @@ // Public functions // ------------------------ -#if EITHER(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI) +#if ANY(DUE_SOFTWARE_SPI, FORCE_SOFT_SPI) // ------------------------ // Software SPI diff --git a/Marlin/src/HAL/DUE/MinSerial.cpp b/Marlin/src/HAL/DUE/MinSerial.cpp index e5b3dbfe6f..505a712aa9 100644 --- a/Marlin/src/HAL/DUE/MinSerial.cpp +++ b/Marlin/src/HAL/DUE/MinSerial.cpp @@ -73,18 +73,18 @@ void install_min_serial() { } #if DISABLED(DYNAMIC_VECTORTABLE) -extern "C" { - __attribute__((naked)) void JumpHandler_ASM() { - __asm__ __volatile__ ( - "b CommonHandler_ASM\n" - ); + 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(); } - 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 diff --git a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp index 904924793b..86c8a48470 100644 --- a/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp +++ b/Marlin/src/HAL/DUE/dogm/u8g_com_HAL_DUE_sw_spi_shared.cpp @@ -81,7 +81,7 @@ Pio *SCK_pPio, *MOSI_pPio; uint32_t SCK_dwMask, MOSI_dwMask; void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { if (val & 0x80) MOSI_pPio->PIO_SODR = MOSI_dwMask; else @@ -95,7 +95,7 @@ void u8g_spiSend_sw_DUE_mode_0(uint8_t val) { // 3MHz } void u8g_spiSend_sw_DUE_mode_3(uint8_t val) { // 3.5MHz - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { SCK_pPio->PIO_CODR = SCK_dwMask; DELAY_NS(50); if (val & 0x80) diff --git a/Marlin/src/HAL/DUE/endstop_interrupts.h b/Marlin/src/HAL/DUE/endstop_interrupts.h index c1bbcb121b..28510fb508 100644 --- a/Marlin/src/HAL/DUE/endstop_interrupts.h +++ b/Marlin/src/HAL/DUE/endstop_interrupts.h @@ -47,33 +47,33 @@ void endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); - TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN)); - TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN)); - TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN)); - TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); - TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); - TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); - TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN)); - TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN)); - TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN)); - TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN)); - TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN)); - TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN)); + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN_PIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); } diff --git a/Marlin/src/HAL/DUE/fastio.h b/Marlin/src/HAL/DUE/fastio.h index a609210d81..77bc1911d8 100644 --- a/Marlin/src/HAL/DUE/fastio.h +++ b/Marlin/src/HAL/DUE/fastio.h @@ -189,12 +189,12 @@ */ // UART -#define RXD DIO0 -#define TXD DIO1 +#define RXD 0 +#define TXD 1 // TWI (I2C) -#define SCL DIO21 -#define SDA DIO20 +#define SCL 21 +#define SDA 20 /** * pins diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.h b/Marlin/src/HAL/DUE/fastio/G2_PWM.h index dc4edffff8..2afe246cea 100644 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.h +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.h @@ -63,7 +63,7 @@ extern PWM_map ISR_table[NUM_PWMS]; extern uint32_t motor_current_setting[3]; #define IR_BIT(p) (WITHIN(p, 0, 3) ? (p) : (p) + 4) -#define COPY_ACTIVE_TABLE() do{ LOOP_L_N(i, 6) work_table[i] = active_table[i]; }while(0) +#define COPY_ACTIVE_TABLE() do{ for (uint8_t i = 0; i < 6; ++i) work_table[i] = active_table[i]; }while(0) #define PWM_MR0 19999 // base repetition rate minus one count - 20mS #define PWM_PR 24 // prescaler value - prescaler divide by 24 + 1 - 1 MHz output diff --git a/Marlin/src/HAL/DUE/inc/Conditionals_post.h b/Marlin/src/HAL/DUE/inc/Conditionals_post.h index ce6d3fdde2..295596b78b 100644 --- a/Marlin/src/HAL/DUE/inc/Conditionals_post.h +++ b/Marlin/src/HAL/DUE/inc/Conditionals_post.h @@ -23,6 +23,6 @@ #if USE_FALLBACK_EEPROM #define FLASH_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) +#elif ANY(I2C_EEPROM, SPI_EEPROM) #define USE_SHARED_EEPROM 1 #endif diff --git a/Marlin/src/HAL/DUE/pinsDebug.h b/Marlin/src/HAL/DUE/pinsDebug.h index 2aafe9be0c..1544853553 100644 --- a/Marlin/src/HAL/DUE/pinsDebug.h +++ b/Marlin/src/HAL/DUE/pinsDebug.h @@ -64,7 +64,6 @@ #define NUMBER_PINS_TOTAL PINS_COUNT #define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin -#define PRINT_PORT(p) #define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0) @@ -93,6 +92,8 @@ void pwm_details(int32_t pin) { } } +void print_port(const pin_t) {} + /** * DUE Board pin | PORT | Label * ----------------+--------+------- diff --git a/Marlin/src/HAL/DUE/usb/genclk.h b/Marlin/src/HAL/DUE/usb/genclk.h index cde03bc0d1..45eba5873f 100644 --- a/Marlin/src/HAL/DUE/usb/genclk.h +++ b/Marlin/src/HAL/DUE/usb/genclk.h @@ -74,17 +74,17 @@ extern "C" { //@{ enum genclk_source { - GENCLK_PCK_SRC_SLCK_RC = 0, //!< Internal 32kHz RC oscillator as PCK source clock - GENCLK_PCK_SRC_SLCK_XTAL = 1, //!< External 32kHz crystal oscillator as PCK source clock - GENCLK_PCK_SRC_SLCK_BYPASS = 2, //!< External 32kHz bypass oscillator as PCK source clock - GENCLK_PCK_SRC_MAINCK_4M_RC = 3, //!< Internal 4MHz RC oscillator as PCK source clock - GENCLK_PCK_SRC_MAINCK_8M_RC = 4, //!< Internal 8MHz RC oscillator as PCK source clock - GENCLK_PCK_SRC_MAINCK_12M_RC = 5, //!< Internal 12MHz RC oscillator as PCK source clock - GENCLK_PCK_SRC_MAINCK_XTAL = 6, //!< External crystal oscillator as PCK source clock - GENCLK_PCK_SRC_MAINCK_BYPASS = 7, //!< External bypass oscillator as PCK source clock - GENCLK_PCK_SRC_PLLACK = 8, //!< Use PLLACK as PCK source clock - GENCLK_PCK_SRC_PLLBCK = 9, //!< Use PLLBCK as PCK source clock - GENCLK_PCK_SRC_MCK = 10, //!< Use Master Clk as PCK source clock + GENCLK_PCK_SRC_SLCK_RC = 0, //!< Internal 32kHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_SLCK_XTAL = 1, //!< External 32kHz crystal oscillator as PCK source clock + GENCLK_PCK_SRC_SLCK_BYPASS = 2, //!< External 32kHz bypass oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_4M_RC = 3, //!< Internal 4MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_8M_RC = 4, //!< Internal 8MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_12M_RC = 5, //!< Internal 12MHz RC oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_XTAL = 6, //!< External crystal oscillator as PCK source clock + GENCLK_PCK_SRC_MAINCK_BYPASS = 7, //!< External bypass oscillator as PCK source clock + GENCLK_PCK_SRC_PLLACK = 8, //!< Use PLLACK as PCK source clock + GENCLK_PCK_SRC_PLLBCK = 9, //!< Use PLLBCK as PCK source clock + GENCLK_PCK_SRC_MCK = 10, //!< Use Master Clk as PCK source clock }; //@} @@ -93,176 +93,162 @@ enum genclk_source { //@{ enum genclk_divider { - GENCLK_PCK_PRES_1 = PMC_PCK_PRES_CLK_1, //!< Set PCK clock prescaler to 1 - GENCLK_PCK_PRES_2 = PMC_PCK_PRES_CLK_2, //!< Set PCK clock prescaler to 2 - GENCLK_PCK_PRES_4 = PMC_PCK_PRES_CLK_4, //!< Set PCK clock prescaler to 4 - GENCLK_PCK_PRES_8 = PMC_PCK_PRES_CLK_8, //!< Set PCK clock prescaler to 8 - GENCLK_PCK_PRES_16 = PMC_PCK_PRES_CLK_16, //!< Set PCK clock prescaler to 16 - GENCLK_PCK_PRES_32 = PMC_PCK_PRES_CLK_32, //!< Set PCK clock prescaler to 32 - GENCLK_PCK_PRES_64 = PMC_PCK_PRES_CLK_64, //!< Set PCK clock prescaler to 64 + GENCLK_PCK_PRES_1 = PMC_PCK_PRES_CLK_1, //!< Set PCK clock prescaler to 1 + GENCLK_PCK_PRES_2 = PMC_PCK_PRES_CLK_2, //!< Set PCK clock prescaler to 2 + GENCLK_PCK_PRES_4 = PMC_PCK_PRES_CLK_4, //!< Set PCK clock prescaler to 4 + GENCLK_PCK_PRES_8 = PMC_PCK_PRES_CLK_8, //!< Set PCK clock prescaler to 8 + GENCLK_PCK_PRES_16 = PMC_PCK_PRES_CLK_16, //!< Set PCK clock prescaler to 16 + GENCLK_PCK_PRES_32 = PMC_PCK_PRES_CLK_32, //!< Set PCK clock prescaler to 32 + GENCLK_PCK_PRES_64 = PMC_PCK_PRES_CLK_64, //!< Set PCK clock prescaler to 64 }; //@} struct genclk_config { - uint32_t ctrl; + uint32_t ctrl; }; -static inline void genclk_config_defaults(struct genclk_config *p_cfg, - uint32_t ul_id) -{ - ul_id = ul_id; - p_cfg->ctrl = 0; +static inline void genclk_config_defaults(struct genclk_config *p_cfg, uint32_t ul_id) { + ul_id = ul_id; + p_cfg->ctrl = 0; } -static inline void genclk_config_read(struct genclk_config *p_cfg, - uint32_t ul_id) -{ - p_cfg->ctrl = PMC->PMC_PCK[ul_id]; +static inline void genclk_config_read(struct genclk_config *p_cfg, uint32_t ul_id) { + p_cfg->ctrl = PMC->PMC_PCK[ul_id]; } -static inline void genclk_config_write(const struct genclk_config *p_cfg, - uint32_t ul_id) -{ - PMC->PMC_PCK[ul_id] = p_cfg->ctrl; +static inline void genclk_config_write(const struct genclk_config *p_cfg, uint32_t ul_id) { + PMC->PMC_PCK[ul_id] = p_cfg->ctrl; } //! \name Programmable Clock Source and Prescaler configuration //@{ -static inline void genclk_config_set_source(struct genclk_config *p_cfg, - enum genclk_source e_src) -{ - p_cfg->ctrl &= (~PMC_PCK_CSS_Msk); +static inline void genclk_config_set_source(struct genclk_config *p_cfg, enum genclk_source e_src) { + p_cfg->ctrl &= (~PMC_PCK_CSS_Msk); - switch (e_src) { - case GENCLK_PCK_SRC_SLCK_RC: - case GENCLK_PCK_SRC_SLCK_XTAL: - case GENCLK_PCK_SRC_SLCK_BYPASS: - p_cfg->ctrl |= (PMC_PCK_CSS_SLOW_CLK); - break; + switch (e_src) { + case GENCLK_PCK_SRC_SLCK_RC: + case GENCLK_PCK_SRC_SLCK_XTAL: + case GENCLK_PCK_SRC_SLCK_BYPASS: + p_cfg->ctrl |= (PMC_PCK_CSS_SLOW_CLK); + break; - case GENCLK_PCK_SRC_MAINCK_4M_RC: - case GENCLK_PCK_SRC_MAINCK_8M_RC: - case GENCLK_PCK_SRC_MAINCK_12M_RC: - case GENCLK_PCK_SRC_MAINCK_XTAL: - case GENCLK_PCK_SRC_MAINCK_BYPASS: - p_cfg->ctrl |= (PMC_PCK_CSS_MAIN_CLK); - break; + case GENCLK_PCK_SRC_MAINCK_4M_RC: + case GENCLK_PCK_SRC_MAINCK_8M_RC: + case GENCLK_PCK_SRC_MAINCK_12M_RC: + case GENCLK_PCK_SRC_MAINCK_XTAL: + case GENCLK_PCK_SRC_MAINCK_BYPASS: + p_cfg->ctrl |= (PMC_PCK_CSS_MAIN_CLK); + break; - case GENCLK_PCK_SRC_PLLACK: - p_cfg->ctrl |= (PMC_PCK_CSS_PLLA_CLK); - break; + case GENCLK_PCK_SRC_PLLACK: + p_cfg->ctrl |= (PMC_PCK_CSS_PLLA_CLK); + break; - case GENCLK_PCK_SRC_PLLBCK: - p_cfg->ctrl |= (PMC_PCK_CSS_UPLL_CLK); - break; + case GENCLK_PCK_SRC_PLLBCK: + p_cfg->ctrl |= (PMC_PCK_CSS_UPLL_CLK); + break; - case GENCLK_PCK_SRC_MCK: - p_cfg->ctrl |= (PMC_PCK_CSS_MCK); - break; - } + case GENCLK_PCK_SRC_MCK: + p_cfg->ctrl |= (PMC_PCK_CSS_MCK); + break; + } } -static inline void genclk_config_set_divider(struct genclk_config *p_cfg, - uint32_t e_divider) -{ - p_cfg->ctrl &= ~PMC_PCK_PRES_Msk; - p_cfg->ctrl |= e_divider; +static inline void genclk_config_set_divider(struct genclk_config *p_cfg, uint32_t e_divider) { + p_cfg->ctrl &= ~PMC_PCK_PRES_Msk; + p_cfg->ctrl |= e_divider; } //@} -static inline void genclk_enable(const struct genclk_config *p_cfg, - uint32_t ul_id) -{ - PMC->PMC_PCK[ul_id] = p_cfg->ctrl; - pmc_enable_pck(ul_id); +static inline void genclk_enable(const struct genclk_config *p_cfg, uint32_t ul_id) { + PMC->PMC_PCK[ul_id] = p_cfg->ctrl; + pmc_enable_pck(ul_id); } -static inline void genclk_disable(uint32_t ul_id) -{ - pmc_disable_pck(ul_id); +static inline void genclk_disable(uint32_t ul_id) { + pmc_disable_pck(ul_id); } -static inline void genclk_enable_source(enum genclk_source e_src) -{ - switch (e_src) { - case GENCLK_PCK_SRC_SLCK_RC: - if (!osc_is_ready(OSC_SLCK_32K_RC)) { - osc_enable(OSC_SLCK_32K_RC); - osc_wait_ready(OSC_SLCK_32K_RC); - } - break; +static inline void genclk_enable_source(enum genclk_source e_src) { + switch (e_src) { + case GENCLK_PCK_SRC_SLCK_RC: + if (!osc_is_ready(OSC_SLCK_32K_RC)) { + osc_enable(OSC_SLCK_32K_RC); + osc_wait_ready(OSC_SLCK_32K_RC); + } + break; - case GENCLK_PCK_SRC_SLCK_XTAL: - if (!osc_is_ready(OSC_SLCK_32K_XTAL)) { - osc_enable(OSC_SLCK_32K_XTAL); - osc_wait_ready(OSC_SLCK_32K_XTAL); - } - break; + case GENCLK_PCK_SRC_SLCK_XTAL: + if (!osc_is_ready(OSC_SLCK_32K_XTAL)) { + osc_enable(OSC_SLCK_32K_XTAL); + osc_wait_ready(OSC_SLCK_32K_XTAL); + } + break; - case GENCLK_PCK_SRC_SLCK_BYPASS: - if (!osc_is_ready(OSC_SLCK_32K_BYPASS)) { - osc_enable(OSC_SLCK_32K_BYPASS); - osc_wait_ready(OSC_SLCK_32K_BYPASS); - } - break; + case GENCLK_PCK_SRC_SLCK_BYPASS: + if (!osc_is_ready(OSC_SLCK_32K_BYPASS)) { + osc_enable(OSC_SLCK_32K_BYPASS); + osc_wait_ready(OSC_SLCK_32K_BYPASS); + } + break; - case GENCLK_PCK_SRC_MAINCK_4M_RC: - if (!osc_is_ready(OSC_MAINCK_4M_RC)) { - osc_enable(OSC_MAINCK_4M_RC); - osc_wait_ready(OSC_MAINCK_4M_RC); - } - break; + case GENCLK_PCK_SRC_MAINCK_4M_RC: + if (!osc_is_ready(OSC_MAINCK_4M_RC)) { + osc_enable(OSC_MAINCK_4M_RC); + osc_wait_ready(OSC_MAINCK_4M_RC); + } + break; - case GENCLK_PCK_SRC_MAINCK_8M_RC: - if (!osc_is_ready(OSC_MAINCK_8M_RC)) { - osc_enable(OSC_MAINCK_8M_RC); - osc_wait_ready(OSC_MAINCK_8M_RC); - } - break; + case GENCLK_PCK_SRC_MAINCK_8M_RC: + if (!osc_is_ready(OSC_MAINCK_8M_RC)) { + osc_enable(OSC_MAINCK_8M_RC); + osc_wait_ready(OSC_MAINCK_8M_RC); + } + break; - case GENCLK_PCK_SRC_MAINCK_12M_RC: - if (!osc_is_ready(OSC_MAINCK_12M_RC)) { - osc_enable(OSC_MAINCK_12M_RC); - osc_wait_ready(OSC_MAINCK_12M_RC); - } - break; + case GENCLK_PCK_SRC_MAINCK_12M_RC: + if (!osc_is_ready(OSC_MAINCK_12M_RC)) { + osc_enable(OSC_MAINCK_12M_RC); + osc_wait_ready(OSC_MAINCK_12M_RC); + } + break; - case GENCLK_PCK_SRC_MAINCK_XTAL: - if (!osc_is_ready(OSC_MAINCK_XTAL)) { - osc_enable(OSC_MAINCK_XTAL); - osc_wait_ready(OSC_MAINCK_XTAL); - } - break; + case GENCLK_PCK_SRC_MAINCK_XTAL: + if (!osc_is_ready(OSC_MAINCK_XTAL)) { + osc_enable(OSC_MAINCK_XTAL); + osc_wait_ready(OSC_MAINCK_XTAL); + } + break; - case GENCLK_PCK_SRC_MAINCK_BYPASS: - if (!osc_is_ready(OSC_MAINCK_BYPASS)) { - osc_enable(OSC_MAINCK_BYPASS); - osc_wait_ready(OSC_MAINCK_BYPASS); - } - break; + case GENCLK_PCK_SRC_MAINCK_BYPASS: + if (!osc_is_ready(OSC_MAINCK_BYPASS)) { + osc_enable(OSC_MAINCK_BYPASS); + osc_wait_ready(OSC_MAINCK_BYPASS); + } + break; -#ifdef CONFIG_PLL0_SOURCE - case GENCLK_PCK_SRC_PLLACK: - pll_enable_config_defaults(0); - break; -#endif + #ifdef CONFIG_PLL0_SOURCE + case GENCLK_PCK_SRC_PLLACK: + pll_enable_config_defaults(0); + break; + #endif -#ifdef CONFIG_PLL1_SOURCE - case GENCLK_PCK_SRC_PLLBCK: - pll_enable_config_defaults(1); - break; -#endif + #ifdef CONFIG_PLL1_SOURCE + case GENCLK_PCK_SRC_PLLBCK: + pll_enable_config_defaults(1); + break; + #endif - case GENCLK_PCK_SRC_MCK: - break; + case GENCLK_PCK_SRC_MCK: + break; - default: - Assert(false); - break; - } + default: + Assert(false); + break; + } } //! @} diff --git a/Marlin/src/HAL/DUE/usb/osc.h b/Marlin/src/HAL/DUE/usb/osc.h index 953bcbbed1..c0ae24381a 100644 --- a/Marlin/src/HAL/DUE/usb/osc.h +++ b/Marlin/src/HAL/DUE/usb/osc.h @@ -62,28 +62,28 @@ extern "C" { * should be defined by the board code, otherwise default value are used. */ #ifndef BOARD_FREQ_SLCK_XTAL -# warning The board slow clock xtal frequency has not been defined. -# define BOARD_FREQ_SLCK_XTAL (32768UL) + #warning The board slow clock xtal frequency has not been defined. + #define BOARD_FREQ_SLCK_XTAL (32768UL) #endif #ifndef BOARD_FREQ_SLCK_BYPASS -# warning The board slow clock bypass frequency has not been defined. -# define BOARD_FREQ_SLCK_BYPASS (32768UL) + #warning The board slow clock bypass frequency has not been defined. + #define BOARD_FREQ_SLCK_BYPASS (32768UL) #endif #ifndef BOARD_FREQ_MAINCK_XTAL -# warning The board main clock xtal frequency has not been defined. -# define BOARD_FREQ_MAINCK_XTAL (12000000UL) + #warning The board main clock xtal frequency has not been defined. + #define BOARD_FREQ_MAINCK_XTAL (12000000UL) #endif #ifndef BOARD_FREQ_MAINCK_BYPASS -# warning The board main clock bypass frequency has not been defined. -# define BOARD_FREQ_MAINCK_BYPASS (12000000UL) + #warning The board main clock bypass frequency has not been defined. + #define BOARD_FREQ_MAINCK_BYPASS (12000000UL) #endif #ifndef BOARD_OSC_STARTUP_US -# warning The board main clock xtal startup time has not been defined. -# define BOARD_OSC_STARTUP_US (15625UL) + #warning The board main clock xtal startup time has not been defined. + #define BOARD_OSC_STARTUP_US (15625UL) #endif /** @@ -115,122 +115,118 @@ extern "C" { #define OSC_MAINCK_BYPASS_HZ BOARD_FREQ_MAINCK_BYPASS //!< External bypass oscillator. //@} -static inline void osc_enable(uint32_t ul_id) -{ - switch (ul_id) { - case OSC_SLCK_32K_RC: - break; +static inline void osc_enable(uint32_t ul_id) { + switch (ul_id) { + case OSC_SLCK_32K_RC: + break; - case OSC_SLCK_32K_XTAL: - pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL); - break; + case OSC_SLCK_32K_XTAL: + pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL); + break; - case OSC_SLCK_32K_BYPASS: - pmc_switch_sclk_to_32kxtal(PMC_OSC_BYPASS); - break; + case OSC_SLCK_32K_BYPASS: + pmc_switch_sclk_to_32kxtal(PMC_OSC_BYPASS); + break; - case OSC_MAINCK_4M_RC: - pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz); - break; + case OSC_MAINCK_4M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz); + break; - case OSC_MAINCK_8M_RC: - pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz); - break; + case OSC_MAINCK_8M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz); + break; - case OSC_MAINCK_12M_RC: - pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz); - break; + case OSC_MAINCK_12M_RC: + pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz); + break; - case OSC_MAINCK_XTAL: - pmc_switch_mainck_to_xtal(PMC_OSC_XTAL/*, - pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, - OSC_SLCK_32K_RC_HZ)*/); - break; + case OSC_MAINCK_XTAL: + pmc_switch_mainck_to_xtal(PMC_OSC_XTAL/*, + pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, + OSC_SLCK_32K_RC_HZ)*/); + break; - case OSC_MAINCK_BYPASS: - pmc_switch_mainck_to_xtal(PMC_OSC_BYPASS/*, - pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, - OSC_SLCK_32K_RC_HZ)*/); - break; - } + case OSC_MAINCK_BYPASS: + pmc_switch_mainck_to_xtal(PMC_OSC_BYPASS/*, + pmc_us_to_moscxtst(BOARD_OSC_STARTUP_US, + OSC_SLCK_32K_RC_HZ)*/); + break; + } } -static inline void osc_disable(uint32_t ul_id) -{ - switch (ul_id) { - case OSC_SLCK_32K_RC: - case OSC_SLCK_32K_XTAL: - case OSC_SLCK_32K_BYPASS: - break; +static inline void osc_disable(uint32_t ul_id) { + switch (ul_id) { + case OSC_SLCK_32K_RC: + case OSC_SLCK_32K_XTAL: + case OSC_SLCK_32K_BYPASS: + break; - case OSC_MAINCK_4M_RC: - case OSC_MAINCK_8M_RC: - case OSC_MAINCK_12M_RC: - pmc_osc_disable_fastrc(); - break; + case OSC_MAINCK_4M_RC: + case OSC_MAINCK_8M_RC: + case OSC_MAINCK_12M_RC: + pmc_osc_disable_fastrc(); + break; - case OSC_MAINCK_XTAL: - pmc_osc_disable_xtal(PMC_OSC_XTAL); - break; + case OSC_MAINCK_XTAL: + pmc_osc_disable_xtal(PMC_OSC_XTAL); + break; - case OSC_MAINCK_BYPASS: - pmc_osc_disable_xtal(PMC_OSC_BYPASS); - break; - } + case OSC_MAINCK_BYPASS: + pmc_osc_disable_xtal(PMC_OSC_BYPASS); + break; + } } -static inline bool osc_is_ready(uint32_t ul_id) -{ - switch (ul_id) { - case OSC_SLCK_32K_RC: - return 1; +static inline bool osc_is_ready(uint32_t ul_id) { + switch (ul_id) { + case OSC_SLCK_32K_RC: + return 1; - case OSC_SLCK_32K_XTAL: - case OSC_SLCK_32K_BYPASS: - return pmc_osc_is_ready_32kxtal(); + case OSC_SLCK_32K_XTAL: + case OSC_SLCK_32K_BYPASS: + return pmc_osc_is_ready_32kxtal(); - case OSC_MAINCK_4M_RC: - case OSC_MAINCK_8M_RC: - case OSC_MAINCK_12M_RC: - case OSC_MAINCK_XTAL: - case OSC_MAINCK_BYPASS: - return pmc_osc_is_ready_mainck(); - } + case OSC_MAINCK_4M_RC: + case OSC_MAINCK_8M_RC: + case OSC_MAINCK_12M_RC: + case OSC_MAINCK_XTAL: + case OSC_MAINCK_BYPASS: + return pmc_osc_is_ready_mainck(); + } - return 0; + return 0; } -static inline uint32_t osc_get_rate(uint32_t ul_id) -{ - switch (ul_id) { - case OSC_SLCK_32K_RC: - return OSC_SLCK_32K_RC_HZ; +static inline uint32_t osc_get_rate(uint32_t ul_id) { + switch (ul_id) { + case OSC_SLCK_32K_RC: + return OSC_SLCK_32K_RC_HZ; - case OSC_SLCK_32K_XTAL: - return BOARD_FREQ_SLCK_XTAL; + case OSC_SLCK_32K_XTAL: + return BOARD_FREQ_SLCK_XTAL; - case OSC_SLCK_32K_BYPASS: - return BOARD_FREQ_SLCK_BYPASS; + case OSC_SLCK_32K_BYPASS: + return BOARD_FREQ_SLCK_BYPASS; - case OSC_MAINCK_4M_RC: - return OSC_MAINCK_4M_RC_HZ; + case OSC_MAINCK_4M_RC: + return OSC_MAINCK_4M_RC_HZ; - case OSC_MAINCK_8M_RC: - return OSC_MAINCK_8M_RC_HZ; + case OSC_MAINCK_8M_RC: + return OSC_MAINCK_8M_RC_HZ; - case OSC_MAINCK_12M_RC: - return OSC_MAINCK_12M_RC_HZ; + case OSC_MAINCK_12M_RC: + return OSC_MAINCK_12M_RC_HZ; - case OSC_MAINCK_XTAL: - return BOARD_FREQ_MAINCK_XTAL; + case OSC_MAINCK_XTAL: + return BOARD_FREQ_MAINCK_XTAL; - case OSC_MAINCK_BYPASS: - return BOARD_FREQ_MAINCK_BYPASS; - } + case OSC_MAINCK_BYPASS: + return BOARD_FREQ_MAINCK_BYPASS; + } - return 0; + return 0; } /** @@ -241,11 +237,10 @@ static inline uint32_t osc_get_rate(uint32_t ul_id) * * \param id A number identifying the oscillator to wait for. */ -static inline void osc_wait_ready(uint8_t id) -{ - while (!osc_is_ready(id)) { - /* Do nothing */ - } +static inline void osc_wait_ready(uint8_t id) { + while (!osc_is_ready(id)) { + /* Do nothing */ + } } //! @} diff --git a/Marlin/src/HAL/DUE/usb/pll.h b/Marlin/src/HAL/DUE/usb/pll.h index 8eaf27672b..d25a1f65d0 100644 --- a/Marlin/src/HAL/DUE/usb/pll.h +++ b/Marlin/src/HAL/DUE/usb/pll.h @@ -77,22 +77,22 @@ extern "C" { #define PLL_COUNT 0x3FU enum pll_source { - PLL_SRC_MAINCK_4M_RC = OSC_MAINCK_4M_RC, //!< Internal 4MHz RC oscillator. - PLL_SRC_MAINCK_8M_RC = OSC_MAINCK_8M_RC, //!< Internal 8MHz RC oscillator. - PLL_SRC_MAINCK_12M_RC = OSC_MAINCK_12M_RC, //!< Internal 12MHz RC oscillator. - PLL_SRC_MAINCK_XTAL = OSC_MAINCK_XTAL, //!< External crystal oscillator. - PLL_SRC_MAINCK_BYPASS = OSC_MAINCK_BYPASS, //!< External bypass oscillator. - PLL_NR_SOURCES, //!< Number of PLL sources. + PLL_SRC_MAINCK_4M_RC = OSC_MAINCK_4M_RC, //!< Internal 4MHz RC oscillator. + PLL_SRC_MAINCK_8M_RC = OSC_MAINCK_8M_RC, //!< Internal 8MHz RC oscillator. + PLL_SRC_MAINCK_12M_RC = OSC_MAINCK_12M_RC, //!< Internal 12MHz RC oscillator. + PLL_SRC_MAINCK_XTAL = OSC_MAINCK_XTAL, //!< External crystal oscillator. + PLL_SRC_MAINCK_BYPASS = OSC_MAINCK_BYPASS, //!< External bypass oscillator. + PLL_NR_SOURCES, //!< Number of PLL sources. }; struct pll_config { - uint32_t ctrl; + uint32_t ctrl; }; #define pll_get_default_rate(pll_id) \ - ((osc_get_rate(CONFIG_PLL##pll_id##_SOURCE) \ - * CONFIG_PLL##pll_id##_MUL) \ - / CONFIG_PLL##pll_id##_DIV) + ((osc_get_rate(CONFIG_PLL##pll_id##_SOURCE) \ + * CONFIG_PLL##pll_id##_MUL) \ + / CONFIG_PLL##pll_id##_DIV) /* Force UTMI PLL parameters (Hardware defined) */ #ifdef CONFIG_PLL1_SOURCE @@ -113,145 +113,130 @@ struct pll_config { * is hidden in this implementation. Use mul as mul effective value. */ static inline void pll_config_init(struct pll_config *p_cfg, - enum pll_source e_src, uint32_t ul_div, uint32_t ul_mul) -{ - uint32_t vco_hz; + enum pll_source e_src, uint32_t ul_div, uint32_t ul_mul) { + uint32_t vco_hz; - Assert(e_src < PLL_NR_SOURCES); + Assert(e_src < PLL_NR_SOURCES); - if (ul_div == 0 && ul_mul == 0) { /* Must only be true for UTMI PLL */ - p_cfg->ctrl = CKGR_UCKR_UPLLCOUNT(PLL_COUNT); - } else { /* PLLA */ - /* Calculate internal VCO frequency */ - vco_hz = osc_get_rate(e_src) / ul_div; - Assert(vco_hz >= PLL_INPUT_MIN_HZ); - Assert(vco_hz <= PLL_INPUT_MAX_HZ); + if (ul_div == 0 && ul_mul == 0) { /* Must only be true for UTMI PLL */ + p_cfg->ctrl = CKGR_UCKR_UPLLCOUNT(PLL_COUNT); + } + else { /* PLLA */ + /* Calculate internal VCO frequency */ + vco_hz = osc_get_rate(e_src) / ul_div; + Assert(vco_hz >= PLL_INPUT_MIN_HZ); + Assert(vco_hz <= PLL_INPUT_MAX_HZ); - vco_hz *= ul_mul; - Assert(vco_hz >= PLL_OUTPUT_MIN_HZ); - Assert(vco_hz <= PLL_OUTPUT_MAX_HZ); + vco_hz *= ul_mul; + Assert(vco_hz >= PLL_OUTPUT_MIN_HZ); + Assert(vco_hz <= PLL_OUTPUT_MAX_HZ); - /* PMC hardware will automatically make it mul+1 */ - p_cfg->ctrl = CKGR_PLLAR_MULA(ul_mul - 1) | CKGR_PLLAR_DIVA(ul_div) | CKGR_PLLAR_PLLACOUNT(PLL_COUNT); - } + /* PMC hardware will automatically make it mul+1 */ + p_cfg->ctrl = CKGR_PLLAR_MULA(ul_mul - 1) | CKGR_PLLAR_DIVA(ul_div) | CKGR_PLLAR_PLLACOUNT(PLL_COUNT); + } } -#define pll_config_defaults(cfg, pll_id) \ - pll_config_init(cfg, \ - CONFIG_PLL##pll_id##_SOURCE, \ - CONFIG_PLL##pll_id##_DIV, \ - CONFIG_PLL##pll_id##_MUL) +#define pll_config_defaults(cfg, pll_id) \ + pll_config_init(cfg, \ + CONFIG_PLL##pll_id##_SOURCE, \ + CONFIG_PLL##pll_id##_DIV, \ + CONFIG_PLL##pll_id##_MUL) -static inline void pll_config_read(struct pll_config *p_cfg, uint32_t ul_pll_id) -{ - Assert(ul_pll_id < NR_PLLS); - - if (ul_pll_id == PLLA_ID) { - p_cfg->ctrl = PMC->CKGR_PLLAR; - } else { - p_cfg->ctrl = PMC->CKGR_UCKR; - } +static inline void pll_config_read(struct pll_config *p_cfg, uint32_t ul_pll_id) { + Assert(ul_pll_id < NR_PLLS); + p_cfg->ctrl = ul_pll_id == PLLA_ID ? PMC->CKGR_PLLAR : PMC->CKGR_UCKR; } -static inline void pll_config_write(const struct pll_config *p_cfg, uint32_t ul_pll_id) -{ - Assert(ul_pll_id < NR_PLLS); +static inline void pll_config_write(const struct pll_config *p_cfg, uint32_t ul_pll_id) { + Assert(ul_pll_id < NR_PLLS); - if (ul_pll_id == PLLA_ID) { - pmc_disable_pllack(); // Always stop PLL first! - PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; - } else { - PMC->CKGR_UCKR = p_cfg->ctrl; - } + if (ul_pll_id == PLLA_ID) { + pmc_disable_pllack(); // Always stop PLL first! + PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; + } + else + PMC->CKGR_UCKR = p_cfg->ctrl; } -static inline void pll_enable(const struct pll_config *p_cfg, uint32_t ul_pll_id) -{ - Assert(ul_pll_id < NR_PLLS); +static inline void pll_enable(const struct pll_config *p_cfg, uint32_t ul_pll_id) { + Assert(ul_pll_id < NR_PLLS); - if (ul_pll_id == PLLA_ID) { - pmc_disable_pllack(); // Always stop PLL first! - PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; - } else { - PMC->CKGR_UCKR = p_cfg->ctrl | CKGR_UCKR_UPLLEN; - } + if (ul_pll_id == PLLA_ID) { + pmc_disable_pllack(); // Always stop PLL first! + PMC->CKGR_PLLAR = CKGR_PLLAR_ONE | p_cfg->ctrl; + } + else + PMC->CKGR_UCKR = p_cfg->ctrl | CKGR_UCKR_UPLLEN; } /** * \note This will only disable the selected PLL, not the underlying oscillator (mainck). */ -static inline void pll_disable(uint32_t ul_pll_id) -{ - Assert(ul_pll_id < NR_PLLS); +static inline void pll_disable(uint32_t ul_pll_id) { + Assert(ul_pll_id < NR_PLLS); - if (ul_pll_id == PLLA_ID) { - pmc_disable_pllack(); - } else { - PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN; - } + if (ul_pll_id == PLLA_ID) + pmc_disable_pllack(); + else + PMC->CKGR_UCKR &= ~CKGR_UCKR_UPLLEN; } -static inline uint32_t pll_is_locked(uint32_t ul_pll_id) -{ - Assert(ul_pll_id < NR_PLLS); +static inline uint32_t pll_is_locked(uint32_t ul_pll_id) { + Assert(ul_pll_id < NR_PLLS); - if (ul_pll_id == PLLA_ID) { - return pmc_is_locked_pllack(); - } else { - return pmc_is_locked_upll(); - } + if (ul_pll_id == PLLA_ID) + return pmc_is_locked_pllack(); + else + return pmc_is_locked_upll(); } -static inline void pll_enable_source(enum pll_source e_src) -{ - switch (e_src) { - case PLL_SRC_MAINCK_4M_RC: - case PLL_SRC_MAINCK_8M_RC: - case PLL_SRC_MAINCK_12M_RC: - case PLL_SRC_MAINCK_XTAL: - case PLL_SRC_MAINCK_BYPASS: - osc_enable(e_src); - osc_wait_ready(e_src); - break; +static inline void pll_enable_source(enum pll_source e_src) { + switch (e_src) { + case PLL_SRC_MAINCK_4M_RC: + case PLL_SRC_MAINCK_8M_RC: + case PLL_SRC_MAINCK_12M_RC: + case PLL_SRC_MAINCK_XTAL: + case PLL_SRC_MAINCK_BYPASS: + osc_enable(e_src); + osc_wait_ready(e_src); + break; - default: - Assert(false); - break; - } + default: + Assert(false); + break; + } } -static inline void pll_enable_config_defaults(unsigned int ul_pll_id) -{ - struct pll_config pllcfg; +static inline void pll_enable_config_defaults(unsigned int ul_pll_id) { + struct pll_config pllcfg; - if (pll_is_locked(ul_pll_id)) { - return; // Pll already running - } - switch (ul_pll_id) { -#ifdef CONFIG_PLL0_SOURCE - case 0: - pll_enable_source(CONFIG_PLL0_SOURCE); - pll_config_init(&pllcfg, - CONFIG_PLL0_SOURCE, - CONFIG_PLL0_DIV, - CONFIG_PLL0_MUL); - break; -#endif -#ifdef CONFIG_PLL1_SOURCE - case 1: - pll_enable_source(CONFIG_PLL1_SOURCE); - pll_config_init(&pllcfg, - CONFIG_PLL1_SOURCE, - CONFIG_PLL1_DIV, - CONFIG_PLL1_MUL); - break; -#endif - default: - Assert(false); - break; - } - pll_enable(&pllcfg, ul_pll_id); - while (!pll_is_locked(ul_pll_id)); + if (pll_is_locked(ul_pll_id)) return; // Pll already running + + switch (ul_pll_id) { + #ifdef CONFIG_PLL0_SOURCE + case 0: + pll_enable_source(CONFIG_PLL0_SOURCE); + pll_config_init(&pllcfg, + CONFIG_PLL0_SOURCE, + CONFIG_PLL0_DIV, + CONFIG_PLL0_MUL); + break; + #endif + #ifdef CONFIG_PLL1_SOURCE + case 1: + pll_enable_source(CONFIG_PLL1_SOURCE); + pll_config_init(&pllcfg, + CONFIG_PLL1_SOURCE, + CONFIG_PLL1_DIV, + CONFIG_PLL1_MUL); + break; + #endif + default: + Assert(false); + break; + } + pll_enable(&pllcfg, ul_pll_id); + while (!pll_is_locked(ul_pll_id)); } /** @@ -264,15 +249,12 @@ static inline void pll_enable_config_defaults(unsigned int ul_pll_id) * \retval STATUS_OK The PLL is now locked. * \retval ERR_TIMEOUT Timed out waiting for PLL to become locked. */ -static inline int pll_wait_for_lock(unsigned int pll_id) -{ - Assert(pll_id < NR_PLLS); +static inline int pll_wait_for_lock(unsigned int pll_id) { + Assert(pll_id < NR_PLLS); - while (!pll_is_locked(pll_id)) { - /* Do nothing */ - } + while (!pll_is_locked(pll_id)) { /* Do nothing */ } - return 0; + return 0; } //! @} diff --git a/Marlin/src/HAL/DUE/usb/sbc_protocol.h b/Marlin/src/HAL/DUE/usb/sbc_protocol.h index ab845739fd..983ec7adca 100644 --- a/Marlin/src/HAL/DUE/usb/sbc_protocol.h +++ b/Marlin/src/HAL/DUE/usb/sbc_protocol.h @@ -57,7 +57,6 @@ #ifndef _SBC_PROTOCOL_H_ #define _SBC_PROTOCOL_H_ - /** * \ingroup usb_msc_protocol * \defgroup usb_sbc_protocol SCSI Block Commands protocol definitions @@ -81,82 +80,82 @@ //@{ enum scsi_sbc_mode { - SCSI_MS_MODE_RW_ERR_RECOV = 0x01, //!< Read-Write Error Recovery mode page - SCSI_MS_MODE_FORMAT_DEVICE = 0x03, //!< Format Device mode page - SCSI_MS_MODE_FLEXIBLE_DISK = 0x05, //!< Flexible Disk mode page - SCSI_MS_MODE_CACHING = 0x08, //!< Caching mode page + SCSI_MS_MODE_RW_ERR_RECOV = 0x01, //!< Read-Write Error Recovery mode page + SCSI_MS_MODE_FORMAT_DEVICE = 0x03, //!< Format Device mode page + SCSI_MS_MODE_FLEXIBLE_DISK = 0x05, //!< Flexible Disk mode page + SCSI_MS_MODE_CACHING = 0x08, //!< Caching mode page }; //! \name SBC-2 Device-Specific Parameter //@{ -#define SCSI_MS_SBC_WP 0x80 //!< Write Protected -#define SCSI_MS_SBC_DPOFUA 0x10 //!< DPO and FUA supported +#define SCSI_MS_SBC_WP 0x80 //!< Write Protected +#define SCSI_MS_SBC_DPOFUA 0x10 //!< DPO and FUA supported //@} /** * \brief SBC-2 Short LBA mode parameter block descriptor */ struct sbc_slba_block_desc { - be32_t nr_blocks; //!< Number of Blocks - be32_t block_len; //!< Block Length -#define SBC_SLBA_BLOCK_LEN_MASK 0x00FFFFFFU //!< Mask reserved bits + be32_t nr_blocks; //!< Number of Blocks + be32_t block_len; //!< Block Length +#define SBC_SLBA_BLOCK_LEN_MASK 0x00FFFFFFU //!< Mask reserved bits }; /** * \brief SBC-2 Caching mode page */ struct sbc_caching_mode_page { - uint8_t page_code; - uint8_t page_length; - uint8_t flags2; -#define SBC_MP_CACHE_IC (1 << 7) //!< Initiator Control -#define SBC_MP_CACHE_ABPF (1 << 6) //!< Abort Pre-Fetch -#define SBC_MP_CACHE_CAP (1 << 5) //!< Catching Analysis Permitted -#define SBC_MP_CACHE_DISC (1 << 4) //!< Discontinuity -#define SBC_MP_CACHE_SIZE (1 << 3) //!< Size enable -#define SBC_MP_CACHE_WCE (1 << 2) //!< Write back Cache Enable -#define SBC_MP_CACHE_MF (1 << 1) //!< Multiplication Factor -#define SBC_MP_CACHE_RCD (1 << 0) //!< Read Cache Disable - uint8_t retention; - be16_t dis_pf_transfer_len; - be16_t min_prefetch; - be16_t max_prefetch; - be16_t max_prefetch_ceil; - uint8_t flags12; -#define SBC_MP_CACHE_FSW (1 << 7) //!< Force Sequential Write -#define SBC_MP_CACHE_LBCSS (1 << 6) //!< Logical Blk Cache Seg Sz -#define SBC_MP_CACHE_DRA (1 << 5) //!< Disable Read-Ahead -#define SBC_MP_CACHE_NV_DIS (1 << 0) //!< Non-Volatile Cache Disable - uint8_t nr_cache_segments; - be16_t cache_segment_size; - uint8_t reserved[4]; + uint8_t page_code; + uint8_t page_length; + uint8_t flags2; +#define SBC_MP_CACHE_IC (1 << 7) //!< Initiator Control +#define SBC_MP_CACHE_ABPF (1 << 6) //!< Abort Pre-Fetch +#define SBC_MP_CACHE_CAP (1 << 5) //!< Catching Analysis Permitted +#define SBC_MP_CACHE_DISC (1 << 4) //!< Discontinuity +#define SBC_MP_CACHE_SIZE (1 << 3) //!< Size enable +#define SBC_MP_CACHE_WCE (1 << 2) //!< Write back Cache Enable +#define SBC_MP_CACHE_MF (1 << 1) //!< Multiplication Factor +#define SBC_MP_CACHE_RCD (1 << 0) //!< Read Cache Disable + uint8_t retention; + be16_t dis_pf_transfer_len; + be16_t min_prefetch; + be16_t max_prefetch; + be16_t max_prefetch_ceil; + uint8_t flags12; +#define SBC_MP_CACHE_FSW (1 << 7) //!< Force Sequential Write +#define SBC_MP_CACHE_LBCSS (1 << 6) //!< Logical Blk Cache Seg Sz +#define SBC_MP_CACHE_DRA (1 << 5) //!< Disable Read-Ahead +#define SBC_MP_CACHE_NV_DIS (1 << 0) //!< Non-Volatile Cache Disable + uint8_t nr_cache_segments; + be16_t cache_segment_size; + uint8_t reserved[4]; }; /** * \brief SBC-2 Read-Write Error Recovery mode page */ struct sbc_rdwr_error_recovery_mode_page { - uint8_t page_code; - uint8_t page_length; -#define SPC_MP_RW_ERR_RECOV_PAGE_LENGTH 0x0A - uint8_t flags1; -#define SBC_MP_RW_ERR_RECOV_AWRE (1 << 7) -#define SBC_MP_RW_ERR_RECOV_ARRE (1 << 6) -#define SBC_MP_RW_ERR_RECOV_TB (1 << 5) -#define SBC_MP_RW_ERR_RECOV_RC (1 << 4) -#define SBC_MP_RW_ERR_RECOV_ERR (1 << 3) -#define SBC_MP_RW_ERR_RECOV_PER (1 << 2) -#define SBC_MP_RW_ERR_RECOV_DTE (1 << 1) -#define SBC_MP_RW_ERR_RECOV_DCR (1 << 0) - uint8_t read_retry_count; - uint8_t correction_span; - uint8_t head_offset_count; - uint8_t data_strobe_offset_count; - uint8_t flags2; - uint8_t write_retry_count; - uint8_t flags3; - be16_t recovery_time_limit; + uint8_t page_code; + uint8_t page_length; + #define SPC_MP_RW_ERR_RECOV_PAGE_LENGTH 0x0A + uint8_t flags1; + #define SBC_MP_RW_ERR_RECOV_AWRE (1 << 7) + #define SBC_MP_RW_ERR_RECOV_ARRE (1 << 6) + #define SBC_MP_RW_ERR_RECOV_TB (1 << 5) + #define SBC_MP_RW_ERR_RECOV_RC (1 << 4) + #define SBC_MP_RW_ERR_RECOV_ERR (1 << 3) + #define SBC_MP_RW_ERR_RECOV_PER (1 << 2) + #define SBC_MP_RW_ERR_RECOV_DTE (1 << 1) + #define SBC_MP_RW_ERR_RECOV_DCR (1 << 0) + uint8_t read_retry_count; + uint8_t correction_span; + uint8_t head_offset_count; + uint8_t data_strobe_offset_count; + uint8_t flags2; + uint8_t write_retry_count; + uint8_t flags3; + be16_t recovery_time_limit; }; //@} @@ -164,8 +163,8 @@ struct sbc_rdwr_error_recovery_mode_page { * \brief SBC-2 READ CAPACITY (10) parameter data */ struct sbc_read_capacity10_data { - be32_t max_lba; //!< LBA of last logical block - be32_t block_len; //!< Number of bytes in the last logical block + be32_t max_lba; //!< LBA of last logical block + be32_t block_len; //!< Number of bytes in the last logical block }; //@} diff --git a/Marlin/src/HAL/DUE/usb/spc_protocol.h b/Marlin/src/HAL/DUE/usb/spc_protocol.h index d67cc5c788..808c388f4f 100644 --- a/Marlin/src/HAL/DUE/usb/spc_protocol.h +++ b/Marlin/src/HAL/DUE/usb/spc_protocol.h @@ -59,23 +59,23 @@ //! \name SCSI commands defined by SPC-2 //@{ -#define SPC_TEST_UNIT_READY 0x00 -#define SPC_REQUEST_SENSE 0x03 -#define SPC_INQUIRY 0x12 -#define SPC_MODE_SELECT6 0x15 -#define SPC_MODE_SENSE6 0x1A -#define SPC_SEND_DIAGNOSTIC 0x1D -#define SPC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E -#define SPC_MODE_SENSE10 0x5A -#define SPC_REPORT_LUNS 0xA0 +#define SPC_TEST_UNIT_READY 0x00 +#define SPC_REQUEST_SENSE 0x03 +#define SPC_INQUIRY 0x12 +#define SPC_MODE_SELECT6 0x15 +#define SPC_MODE_SENSE6 0x1A +#define SPC_SEND_DIAGNOSTIC 0x1D +#define SPC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E +#define SPC_MODE_SENSE10 0x5A +#define SPC_REPORT_LUNS 0xA0 //@} //! \brief May be set in byte 0 of the INQUIRY CDB //@{ //! Enable Vital Product Data -#define SCSI_INQ_REQ_EVPD 0x01 +#define SCSI_INQ_REQ_EVPD 0x01 //! Command Support Data specified by the PAGE OR OPERATION CODE field -#define SCSI_INQ_REQ_CMDT 0x02 +#define SCSI_INQ_REQ_CMDT 0x02 //@} COMPILER_PACK_SET(1) @@ -84,110 +84,110 @@ COMPILER_PACK_SET(1) * \brief SCSI Standard Inquiry data structure */ struct scsi_inquiry_data { - uint8_t pq_pdt; //!< Peripheral Qual / Peripheral Dev Type -#define SCSI_INQ_PQ_CONNECTED 0x00 //!< Peripheral connected -#define SCSI_INQ_PQ_NOT_CONN 0x20 //!< Peripheral not connected -#define SCSI_INQ_PQ_NOT_SUPP 0x60 //!< Peripheral not supported -#define SCSI_INQ_DT_DIR_ACCESS 0x00 //!< Direct Access (SBC) -#define SCSI_INQ_DT_SEQ_ACCESS 0x01 //!< Sequential Access -#define SCSI_INQ_DT_PRINTER 0x02 //!< Printer -#define SCSI_INQ_DT_PROCESSOR 0x03 //!< Processor device -#define SCSI_INQ_DT_WRITE_ONCE 0x04 //!< Write-once device -#define SCSI_INQ_DT_CD_DVD 0x05 //!< CD/DVD device -#define SCSI_INQ_DT_OPTICAL 0x07 //!< Optical Memory -#define SCSI_INQ_DT_MC 0x08 //!< Medium Changer -#define SCSI_INQ_DT_ARRAY 0x0C //!< Storage Array Controller -#define SCSI_INQ_DT_ENCLOSURE 0x0D //!< Enclosure Services -#define SCSI_INQ_DT_RBC 0x0E //!< Simplified Direct Access -#define SCSI_INQ_DT_OCRW 0x0F //!< Optical card reader/writer -#define SCSI_INQ_DT_BCC 0x10 //!< Bridge Controller Commands -#define SCSI_INQ_DT_OSD 0x11 //!< Object-based Storage -#define SCSI_INQ_DT_NONE 0x1F //!< No Peripheral - uint8_t flags1; //!< Flags (byte 1) -#define SCSI_INQ_RMB 0x80 //!< Removable Medium - uint8_t version; //!< Version -#define SCSI_INQ_VER_NONE 0x00 //!< No standards conformance -#define SCSI_INQ_VER_SPC 0x03 //!< SCSI Primary Commands (link to SBC) -#define SCSI_INQ_VER_SPC2 0x04 //!< SCSI Primary Commands - 2 (link to SBC-2) -#define SCSI_INQ_VER_SPC3 0x05 //!< SCSI Primary Commands - 3 (link to SBC-2) -#define SCSI_INQ_VER_SPC4 0x06 //!< SCSI Primary Commands - 4 (link to SBC-3) - uint8_t flags3; //!< Flags (byte 3) -#define SCSI_INQ_NORMACA 0x20 //!< Normal ACA Supported -#define SCSI_INQ_HISUP 0x10 //!< Hierarchal LUN addressing -#define SCSI_INQ_RSP_SPC2 0x02 //!< SPC-2 / SPC-3 response format - uint8_t addl_len; //!< Additional Length (n-4) -#define SCSI_INQ_ADDL_LEN(tot) ((tot)-5) //!< Total length is \a tot - uint8_t flags5; //!< Flags (byte 5) -#define SCSI_INQ_SCCS 0x80 - uint8_t flags6; //!< Flags (byte 6) -#define SCSI_INQ_BQUE 0x80 -#define SCSI_INQ_ENCSERV 0x40 -#define SCSI_INQ_MULTIP 0x10 -#define SCSI_INQ_MCHGR 0x08 -#define SCSI_INQ_ADDR16 0x01 - uint8_t flags7; //!< Flags (byte 7) -#define SCSI_INQ_WBUS16 0x20 -#define SCSI_INQ_SYNC 0x10 -#define SCSI_INQ_LINKED 0x08 -#define SCSI_INQ_CMDQUE 0x02 - uint8_t vendor_id[8]; //!< T10 Vendor Identification - uint8_t product_id[16]; //!< Product Identification - uint8_t product_rev[4]; //!< Product Revision Level + uint8_t pq_pdt; //!< Peripheral Qual / Peripheral Dev Type + #define SCSI_INQ_PQ_CONNECTED 0x00 //!< Peripheral connected + #define SCSI_INQ_PQ_NOT_CONN 0x20 //!< Peripheral not connected + #define SCSI_INQ_PQ_NOT_SUPP 0x60 //!< Peripheral not supported + #define SCSI_INQ_DT_DIR_ACCESS 0x00 //!< Direct Access (SBC) + #define SCSI_INQ_DT_SEQ_ACCESS 0x01 //!< Sequential Access + #define SCSI_INQ_DT_PRINTER 0x02 //!< Printer + #define SCSI_INQ_DT_PROCESSOR 0x03 //!< Processor device + #define SCSI_INQ_DT_WRITE_ONCE 0x04 //!< Write-once device + #define SCSI_INQ_DT_CD_DVD 0x05 //!< CD/DVD device + #define SCSI_INQ_DT_OPTICAL 0x07 //!< Optical Memory + #define SCSI_INQ_DT_MC 0x08 //!< Medium Changer + #define SCSI_INQ_DT_ARRAY 0x0C //!< Storage Array Controller + #define SCSI_INQ_DT_ENCLOSURE 0x0D //!< Enclosure Services + #define SCSI_INQ_DT_RBC 0x0E //!< Simplified Direct Access + #define SCSI_INQ_DT_OCRW 0x0F //!< Optical card reader/writer + #define SCSI_INQ_DT_BCC 0x10 //!< Bridge Controller Commands + #define SCSI_INQ_DT_OSD 0x11 //!< Object-based Storage + #define SCSI_INQ_DT_NONE 0x1F //!< No Peripheral + uint8_t flags1; //!< Flags (byte 1) + #define SCSI_INQ_RMB 0x80 //!< Removable Medium + uint8_t version; //!< Version + #define SCSI_INQ_VER_NONE 0x00 //!< No standards conformance + #define SCSI_INQ_VER_SPC 0x03 //!< SCSI Primary Commands (link to SBC) + #define SCSI_INQ_VER_SPC2 0x04 //!< SCSI Primary Commands - 2 (link to SBC-2) + #define SCSI_INQ_VER_SPC3 0x05 //!< SCSI Primary Commands - 3 (link to SBC-2) + #define SCSI_INQ_VER_SPC4 0x06 //!< SCSI Primary Commands - 4 (link to SBC-3) + uint8_t flags3; //!< Flags (byte 3) + #define SCSI_INQ_NORMACA 0x20 //!< Normal ACA Supported + #define SCSI_INQ_HISUP 0x10 //!< Hierarchal LUN addressing + #define SCSI_INQ_RSP_SPC2 0x02 //!< SPC-2 / SPC-3 response format + uint8_t addl_len; //!< Additional Length (n-4) + #define SCSI_INQ_ADDL_LEN(tot) ((tot)-5) //!< Total length is \a tot + uint8_t flags5; //!< Flags (byte 5) + #define SCSI_INQ_SCCS 0x80 + uint8_t flags6; //!< Flags (byte 6) + #define SCSI_INQ_BQUE 0x80 + #define SCSI_INQ_ENCSERV 0x40 + #define SCSI_INQ_MULTIP 0x10 + #define SCSI_INQ_MCHGR 0x08 + #define SCSI_INQ_ADDR16 0x01 + uint8_t flags7; //!< Flags (byte 7) + #define SCSI_INQ_WBUS16 0x20 + #define SCSI_INQ_SYNC 0x10 + #define SCSI_INQ_LINKED 0x08 + #define SCSI_INQ_CMDQUE 0x02 + uint8_t vendor_id[8]; //!< T10 Vendor Identification + uint8_t product_id[16]; //!< Product Identification + uint8_t product_rev[4]; //!< Product Revision Level }; /** * \brief SCSI Standard Request sense data structure */ struct scsi_request_sense_data { - /* 1st byte: REQUEST SENSE response flags*/ - uint8_t valid_reponse_code; -#define SCSI_SENSE_VALID 0x80 //!< Indicates the INFORMATION field contains valid information -#define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F -#define SCSI_SENSE_CURRENT 0x70 //!< Response code 70h (current errors) -#define SCSI_SENSE_DEFERRED 0x71 + /* 1st byte: REQUEST SENSE response flags*/ + uint8_t valid_reponse_code; + #define SCSI_SENSE_VALID 0x80 //!< Indicates the INFORMATION field contains valid information + #define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F + #define SCSI_SENSE_CURRENT 0x70 //!< Response code 70h (current errors) + #define SCSI_SENSE_DEFERRED 0x71 - /* 2nd byte */ - uint8_t obsolete; + /* 2nd byte */ + uint8_t obsolete; - /* 3rd byte */ - uint8_t sense_flag_key; -#define SCSI_SENSE_FILEMARK 0x80 //!< Indicates that the current command has read a filemark or setmark. -#define SCSI_SENSE_EOM 0x40 //!< Indicates that an end-of-medium condition exists. -#define SCSI_SENSE_ILI 0x20 //!< Indicates that the requested logical block length did not match the logical block length of the data on the medium. -#define SCSI_SENSE_RESERVED 0x10 //!< Reserved -#define SCSI_SENSE_KEY(x) (x&0x0F) //!< Sense Key + /* 3rd byte */ + uint8_t sense_flag_key; + #define SCSI_SENSE_FILEMARK 0x80 //!< Indicates that the current command has read a filemark or setmark. + #define SCSI_SENSE_EOM 0x40 //!< Indicates that an end-of-medium condition exists. + #define SCSI_SENSE_ILI 0x20 //!< Indicates that the requested logical block length did not match the logical block length of the data on the medium. + #define SCSI_SENSE_RESERVED 0x10 //!< Reserved + #define SCSI_SENSE_KEY(x) (x&0x0F) //!< Sense Key - /* 4th to 7th bytes - INFORMATION field */ - uint8_t information[4]; + /* 4th to 7th bytes - INFORMATION field */ + uint8_t information[4]; - /* 8th byte - ADDITIONAL SENSE LENGTH field */ - uint8_t AddSenseLen; -#define SCSI_SENSE_ADDL_LEN(total_len) ((total_len) - 8) + /* 8th byte - ADDITIONAL SENSE LENGTH field */ + uint8_t AddSenseLen; + #define SCSI_SENSE_ADDL_LEN(total_len) ((total_len) - 8) - /* 9th to 12th byte - COMMAND-SPECIFIC INFORMATION field */ - uint8_t CmdSpecINFO[4]; + /* 9th to 12th byte - COMMAND-SPECIFIC INFORMATION field */ + uint8_t CmdSpecINFO[4]; - /* 13th byte - ADDITIONAL SENSE CODE field */ - uint8_t AddSenseCode; + /* 13th byte - ADDITIONAL SENSE CODE field */ + uint8_t AddSenseCode; - /* 14th byte - ADDITIONAL SENSE CODE QUALIFIER field */ - uint8_t AddSnsCodeQlfr; + /* 14th byte - ADDITIONAL SENSE CODE QUALIFIER field */ + uint8_t AddSnsCodeQlfr; - /* 15th byte - FIELD REPLACEABLE UNIT CODE field */ - uint8_t FldReplUnitCode; + /* 15th byte - FIELD REPLACEABLE UNIT CODE field */ + uint8_t FldReplUnitCode; - /* 16th byte */ - uint8_t SenseKeySpec[3]; -#define SCSI_SENSE_SKSV 0x80 //!< Indicates the SENSE-KEY SPECIFIC field contains valid information + /* 16th byte */ + uint8_t SenseKeySpec[3]; + #define SCSI_SENSE_SKSV 0x80 //!< Indicates the SENSE-KEY SPECIFIC field contains valid information }; COMPILER_PACK_RESET() /* Vital Product Data page codes */ enum scsi_vpd_page_code { - SCSI_VPD_SUPPORTED_PAGES = 0x00, - SCSI_VPD_UNIT_SERIAL_NUMBER = 0x80, - SCSI_VPD_DEVICE_IDENTIFICATION = 0x83, + SCSI_VPD_SUPPORTED_PAGES = 0x00, + SCSI_VPD_UNIT_SERIAL_NUMBER = 0x80, + SCSI_VPD_DEVICE_IDENTIFICATION = 0x83, }; #define SCSI_VPD_HEADER_SIZE 4 @@ -200,37 +200,36 @@ enum scsi_vpd_page_code { #define SCSI_VPD_ID_TYPE_T10 1 - /* Sense keys */ enum scsi_sense_key { - SCSI_SK_NO_SENSE = 0x0, - SCSI_SK_RECOVERED_ERROR = 0x1, - SCSI_SK_NOT_READY = 0x2, - SCSI_SK_MEDIUM_ERROR = 0x3, - SCSI_SK_HARDWARE_ERROR = 0x4, - SCSI_SK_ILLEGAL_REQUEST = 0x5, - SCSI_SK_UNIT_ATTENTION = 0x6, - SCSI_SK_DATA_PROTECT = 0x7, - SCSI_SK_BLANK_CHECK = 0x8, - SCSI_SK_VENDOR_SPECIFIC = 0x9, - SCSI_SK_COPY_ABORTED = 0xA, - SCSI_SK_ABORTED_COMMAND = 0xB, - SCSI_SK_VOLUME_OVERFLOW = 0xD, - SCSI_SK_MISCOMPARE = 0xE, + SCSI_SK_NO_SENSE = 0x0, + SCSI_SK_RECOVERED_ERROR = 0x1, + SCSI_SK_NOT_READY = 0x2, + SCSI_SK_MEDIUM_ERROR = 0x3, + SCSI_SK_HARDWARE_ERROR = 0x4, + SCSI_SK_ILLEGAL_REQUEST = 0x5, + SCSI_SK_UNIT_ATTENTION = 0x6, + SCSI_SK_DATA_PROTECT = 0x7, + SCSI_SK_BLANK_CHECK = 0x8, + SCSI_SK_VENDOR_SPECIFIC = 0x9, + SCSI_SK_COPY_ABORTED = 0xA, + SCSI_SK_ABORTED_COMMAND = 0xB, + SCSI_SK_VOLUME_OVERFLOW = 0xD, + SCSI_SK_MISCOMPARE = 0xE, }; /* Additional Sense Code / Additional Sense Code Qualifier pairs */ enum scsi_asc_ascq { - SCSI_ASC_NO_ADDITIONAL_SENSE_INFO = 0x0000, - SCSI_ASC_LU_NOT_READY_REBUILD_IN_PROGRESS = 0x0405, - SCSI_ASC_WRITE_ERROR = 0x0C00, - SCSI_ASC_UNRECOVERED_READ_ERROR = 0x1100, - SCSI_ASC_INVALID_COMMAND_OPERATION_CODE = 0x2000, - SCSI_ASC_INVALID_FIELD_IN_CDB = 0x2400, - SCSI_ASC_WRITE_PROTECTED = 0x2700, - SCSI_ASC_NOT_READY_TO_READY_CHANGE = 0x2800, - SCSI_ASC_MEDIUM_NOT_PRESENT = 0x3A00, - SCSI_ASC_INTERNAL_TARGET_FAILURE = 0x4400, + SCSI_ASC_NO_ADDITIONAL_SENSE_INFO = 0x0000, + SCSI_ASC_LU_NOT_READY_REBUILD_IN_PROGRESS = 0x0405, + SCSI_ASC_WRITE_ERROR = 0x0C00, + SCSI_ASC_UNRECOVERED_READ_ERROR = 0x1100, + SCSI_ASC_INVALID_COMMAND_OPERATION_CODE = 0x2000, + SCSI_ASC_INVALID_FIELD_IN_CDB = 0x2400, + SCSI_ASC_WRITE_PROTECTED = 0x2700, + SCSI_ASC_NOT_READY_TO_READY_CHANGE = 0x2800, + SCSI_ASC_MEDIUM_NOT_PRESENT = 0x3A00, + SCSI_ASC_INTERNAL_TARGET_FAILURE = 0x4400, }; /** @@ -240,9 +239,9 @@ enum scsi_asc_ascq { * that are applicable to all SCSI devices. */ enum scsi_spc_mode { - SCSI_MS_MODE_VENDOR_SPEC = 0x00, - SCSI_MS_MODE_INFEXP = 0x1C, // Informational exceptions control page - SCSI_MS_MODE_ALL = 0x3F, + SCSI_MS_MODE_VENDOR_SPEC = 0x00, + SCSI_MS_MODE_INFEXP = 0x1C, // Informational exceptions control page + SCSI_MS_MODE_ALL = 0x3F, }; /** @@ -250,51 +249,45 @@ enum scsi_spc_mode { * See chapter 8.3.8 */ struct spc_control_page_info_execpt { - uint8_t page_code; - uint8_t page_length; -#define SPC_MP_INFEXP_PAGE_LENGTH 0x0A - uint8_t flags1; -#define SPC_MP_INFEXP_PERF (1<<7) //!< Initiator Control -#define SPC_MP_INFEXP_EBF (1<<5) //!< Caching Analysis Permitted -#define SPC_MP_INFEXP_EWASC (1<<4) //!< Discontinuity -#define SPC_MP_INFEXP_DEXCPT (1<<3) //!< Size enable -#define SPC_MP_INFEXP_TEST (1<<2) //!< Writeback Cache Enable -#define SPC_MP_INFEXP_LOGERR (1<<0) //!< Log errors bit - uint8_t mrie; -#define SPC_MP_INFEXP_MRIE_NO_REPORT 0x00 -#define SPC_MP_INFEXP_MRIE_ASYNC_EVENT 0x01 -#define SPC_MP_INFEXP_MRIE_GEN_UNIT 0x02 -#define SPC_MP_INFEXP_MRIE_COND_RECOV_ERROR 0x03 -#define SPC_MP_INFEXP_MRIE_UNCOND_RECOV_ERROR 0x04 -#define SPC_MP_INFEXP_MRIE_NO_SENSE 0x05 -#define SPC_MP_INFEXP_MRIE_ONLY_REPORT 0x06 - be32_t interval_timer; - be32_t report_count; + uint8_t page_code; + uint8_t page_length; + #define SPC_MP_INFEXP_PAGE_LENGTH 0x0A + uint8_t flags1; + #define SPC_MP_INFEXP_PERF (1<<7) //!< Initiator Control + #define SPC_MP_INFEXP_EBF (1<<5) //!< Caching Analysis Permitted + #define SPC_MP_INFEXP_EWASC (1<<4) //!< Discontinuity + #define SPC_MP_INFEXP_DEXCPT (1<<3) //!< Size enable + #define SPC_MP_INFEXP_TEST (1<<2) //!< Writeback Cache Enable + #define SPC_MP_INFEXP_LOGERR (1<<0) //!< Log errors bit + uint8_t mrie; + #define SPC_MP_INFEXP_MRIE_NO_REPORT 0x00 + #define SPC_MP_INFEXP_MRIE_ASYNC_EVENT 0x01 + #define SPC_MP_INFEXP_MRIE_GEN_UNIT 0x02 + #define SPC_MP_INFEXP_MRIE_COND_RECOV_ERROR 0x03 + #define SPC_MP_INFEXP_MRIE_UNCOND_RECOV_ERROR 0x04 + #define SPC_MP_INFEXP_MRIE_NO_SENSE 0x05 + #define SPC_MP_INFEXP_MRIE_ONLY_REPORT 0x06 + be32_t interval_timer; + be32_t report_count; }; - enum scsi_spc_mode_sense_pc { - SCSI_MS_SENSE_PC_CURRENT = 0, - SCSI_MS_SENSE_PC_CHANGEABLE = 1, - SCSI_MS_SENSE_PC_DEFAULT = 2, - SCSI_MS_SENSE_PC_SAVED = 3, + SCSI_MS_SENSE_PC_CURRENT = 0, + SCSI_MS_SENSE_PC_CHANGEABLE = 1, + SCSI_MS_SENSE_PC_DEFAULT = 2, + SCSI_MS_SENSE_PC_SAVED = 3, }; - - -static inline bool scsi_mode_sense_dbd_is_set(const uint8_t * cdb) -{ - return (cdb[1] >> 3) & 1; +static inline bool scsi_mode_sense_dbd_is_set(const uint8_t * cdb) { + return (cdb[1] >> 3) & 1; } -static inline uint8_t scsi_mode_sense_get_page_code(const uint8_t * cdb) -{ - return cdb[2] & 0x3F; +static inline uint8_t scsi_mode_sense_get_page_code(const uint8_t * cdb) { + return cdb[2] & 0x3F; } -static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb) -{ - return cdb[2] >> 6; +static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb) { + return cdb[2] >> 6; } /** @@ -302,10 +295,10 @@ static inline uint8_t scsi_mode_sense_get_pc(const uint8_t * cdb) * SENSE(6) */ struct scsi_mode_param_header6 { - uint8_t mode_data_length; //!< Number of bytes after this - uint8_t medium_type; //!< Medium Type - uint8_t device_specific_parameter; //!< Defined by command set - uint8_t block_descriptor_length; //!< Length of block descriptors + uint8_t mode_data_length; //!< Number of bytes after this + uint8_t medium_type; //!< Medium Type + uint8_t device_specific_parameter; //!< Defined by command set + uint8_t block_descriptor_length; //!< Length of block descriptors }; /** @@ -313,23 +306,23 @@ struct scsi_mode_param_header6 { * SENSE(10) */ struct scsi_mode_param_header10 { - be16_t mode_data_length; //!< Number of bytes after this - uint8_t medium_type; //!< Medium Type - uint8_t device_specific_parameter; //!< Defined by command set - uint8_t flags4; //!< LONGLBA in bit 0 - uint8_t reserved; - be16_t block_descriptor_length; //!< Length of block descriptors + be16_t mode_data_length; //!< Number of bytes after this + uint8_t medium_type; //!< Medium Type + uint8_t device_specific_parameter; //!< Defined by command set + uint8_t flags4; //!< LONGLBA in bit 0 + uint8_t reserved; + be16_t block_descriptor_length; //!< Length of block descriptors }; /** * \brief SCSI Page_0 Mode Page header (SPF not set) */ struct scsi_mode_page_0_header { - uint8_t page_code; -#define SCSI_PAGE_CODE_PS (1 << 7) //!< Parameters Saveable -#define SCSI_PAGE_CODE_SPF (1 << 6) //!< SubPage Format - uint8_t page_length; //!< Number of bytes after this -#define SCSI_MS_PAGE_LEN(total) ((total) - 2) + uint8_t page_code; +#define SCSI_PAGE_CODE_PS (1 << 7) //!< Parameters Saveable +#define SCSI_PAGE_CODE_SPF (1 << 6) //!< SubPage Format + uint8_t page_length; //!< Number of bytes after this +#define SCSI_MS_PAGE_LEN(total) ((total) - 2) }; //@} diff --git a/Marlin/src/HAL/DUE/usb/sysclk.h b/Marlin/src/HAL/DUE/usb/sysclk.h index 16db8c86d3..0623378615 100644 --- a/Marlin/src/HAL/DUE/usb/sysclk.h +++ b/Marlin/src/HAL/DUE/usb/sysclk.h @@ -71,7 +71,7 @@ * \subsection sysclk_quickstart_use_case_1_setup_steps Initialization code * Add to the application initialization code: * \code - sysclk_init(); + sysclk_init(); \endcode * * \subsection sysclk_quickstart_use_case_1_setup_steps_workflow Workflow @@ -82,15 +82,15 @@ * Add or uncomment the following in your conf_clock.h header file, commenting out all other * definitions of the same symbol(s): * \code - #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLLACK - // Fpll0 = (Fclk * PLL_mul) / PLL_div - #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL - #define CONFIG_PLL0_MUL (84000000UL / BOARD_FREQ_MAINCK_XTAL) - #define CONFIG_PLL0_DIV 1 + // Fpll0 = (Fclk * PLL_mul) / PLL_div + #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL + #define CONFIG_PLL0_MUL (84000000UL / BOARD_FREQ_MAINCK_XTAL) + #define CONFIG_PLL0_DIV 1 - // Fbus = Fsys / BUS_div - #define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 + // Fbus = Fsys / BUS_div + #define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 \endcode * * \subsection sysclk_quickstart_use_case_1_example_workflow Workflow @@ -100,14 +100,14 @@ * \code #define CONFIG_PLL0_SOURCE PLL_SRC_MAINCK_XTAL \endcode * -# Configure the PLL module to multiply the external fast crystal oscillator frequency up to 84MHz: * \code - #define CONFIG_PLL0_MUL (84000000UL / BOARD_FREQ_MAINCK_XTAL) - #define CONFIG_PLL0_DIV 1 + #define CONFIG_PLL0_MUL (84000000UL / BOARD_FREQ_MAINCK_XTAL) + #define CONFIG_PLL0_DIV 1 \endcode * \note For user boards, \c BOARD_FREQ_MAINCK_XTAL should be defined in the board \c conf_board.h configuration * file as the frequency of the fast crystal attached to the microcontroller. * -# Configure the main clock to run at the full 84MHz, disable scaling of the main system clock speed: * \code - #define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 + #define CONFIG_SYSCLK_PRES SYSCLK_PRES_1 \endcode * \note Some dividers are powers of two, while others are integer division factors. Refer to the * formulas in the conf_clock.h template commented above each division define. @@ -136,7 +136,7 @@ extern "C" { * initialization. */ #ifndef CONFIG_SYSCLK_SOURCE -# define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_MAINCK_4M_RC #endif /** * \def CONFIG_SYSCLK_PRES @@ -149,7 +149,7 @@ extern "C" { * after initialization. */ #ifndef CONFIG_SYSCLK_PRES -# define CONFIG_SYSCLK_PRES 0 + #define CONFIG_SYSCLK_PRES 0 #endif //@} @@ -197,7 +197,7 @@ extern "C" { * USB is not required. */ #ifdef __DOXYGEN__ -# define CONFIG_USBCLK_SOURCE + #define CONFIG_USBCLK_SOURCE #endif /** @@ -209,7 +209,7 @@ extern "C" { * defined. */ #ifdef __DOXYGEN__ -# define CONFIG_USBCLK_DIV + #define CONFIG_USBCLK_DIV #endif diff --git a/Marlin/src/HAL/DUE/usb/udc.h b/Marlin/src/HAL/DUE/usb/udc.h index 8d92eb5c03..6230a81b35 100644 --- a/Marlin/src/HAL/DUE/usb/udc.h +++ b/Marlin/src/HAL/DUE/usb/udc.h @@ -144,15 +144,15 @@ extern "C" { * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode * User C file contains: * \code - // Authorize VBUS monitoring - if (!udc_include_vbus_monitoring()) { - // Implement custom VBUS monitoring via GPIO or other - } - Event_VBUS_present() // VBUS interrupt or GPIO interrupt or other - { - // Attach USB Device - udc_attach(); - } + // Authorize VBUS monitoring + if (!udc_include_vbus_monitoring()) { + // Implement custom VBUS monitoring via GPIO or other + } + Event_VBUS_present() // VBUS interrupt or GPIO interrupt or other + { + // Attach USB Device + udc_attach(); + } \endcode * * - Case of battery charging. conf_usb.h file contains define @@ -160,21 +160,20 @@ extern "C" { * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode * User C file contains: * \code - Event VBUS present() // VBUS interrupt or GPIO interrupt or .. - { - // Authorize battery charging, but wait key press to start USB. - } - Event Key press() - { - // Stop batteries charging - // Start USB - udc_attach(); - } + Event VBUS present() // VBUS interrupt or GPIO interrupt or .. + { + // Authorize battery charging, but wait key press to start USB. + } + Event Key press() + { + // Stop batteries charging + // Start USB + udc_attach(); + } \endcode */ -static inline bool udc_include_vbus_monitoring(void) -{ - return udd_include_vbus_monitoring(); +static inline bool udc_include_vbus_monitoring(void) { + return udd_include_vbus_monitoring(); } /*! \brief Start the USB Device stack @@ -192,32 +191,26 @@ void udc_stop(void); * then it will attach device when an acceptable Vbus * level from the host is detected. */ -static inline void udc_attach(void) -{ - udd_attach(); +static inline void udc_attach(void) { + udd_attach(); } - /** * \brief Detaches the device from the bus * * The driver must remove pull-up on USB line D- or D+. */ -static inline void udc_detach(void) -{ - udd_detach(); +static inline void udc_detach(void) { + udd_detach(); } - /*! \brief The USB driver sends a resume signal called \e "Upstream Resume" * This is authorized only when the remote wakeup feature is enabled by host. */ -static inline void udc_remotewakeup(void) -{ - udd_send_remotewakeup(); +static inline void udc_remotewakeup(void) { + udd_send_remotewakeup(); } - /** * \brief Returns a pointer on the current interface descriptor * @@ -296,23 +289,23 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * * for AVR and SAM3/4 devices, add to the initialization code: * \code - sysclk_init(); - irq_initialize_vectors(); - cpu_irq_enable(); - board_init(); - sleepmgr_init(); // Optional + sysclk_init(); + irq_initialize_vectors(); + cpu_irq_enable(); + board_init(); + sleepmgr_init(); // Optional \endcode * * For SAMD devices, add to the initialization code: * \code - system_init(); - irq_initialize_vectors(); - cpu_irq_enable(); - sleepmgr_init(); // Optional + system_init(); + irq_initialize_vectors(); + cpu_irq_enable(); + sleepmgr_init(); // Optional \endcode * Add to the main IDLE loop: * \code - sleepmgr_enter_sleep(); // Optional + sleepmgr_enter_sleep(); // Optional \endcode * */ @@ -324,20 +317,20 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * * Content of conf_usb.h: * \code - #define USB_DEVICE_VENDOR_ID 0x03EB - #define USB_DEVICE_PRODUCT_ID 0xXXXX - #define USB_DEVICE_MAJOR_VERSION 1 - #define USB_DEVICE_MINOR_VERSION 0 - #define USB_DEVICE_POWER 100 - #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED + #define USB_DEVICE_VENDOR_ID 0x03EB + #define USB_DEVICE_PRODUCT_ID 0xXXXX + #define USB_DEVICE_MAJOR_VERSION 1 + #define USB_DEVICE_MINOR_VERSION 0 + #define USB_DEVICE_POWER 100 + #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED \endcode * * Add to application C-file: * \code - void usb_init(void) - { - udc_start(); - } + void usb_init(void) + { + udc_start(); + } \endcode */ @@ -349,17 +342,17 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * -# Ensure that conf_usb.h is available and contains the following configuration * which is the main USB device configuration: * - \code // Vendor ID provided by USB org (ATMEL 0x03EB) - #define USB_DEVICE_VENDOR_ID 0x03EB // Type Word - // Product ID (Atmel PID referenced in usb_atmel.h) - #define USB_DEVICE_PRODUCT_ID 0xXXXX // Type Word - // Major version of the device - #define USB_DEVICE_MAJOR_VERSION 1 // Type Byte - // Minor version of the device - #define USB_DEVICE_MINOR_VERSION 0 // Type Byte - // Maximum device power (mA) - #define USB_DEVICE_POWER 100 // Type 9-bits - // USB attributes to enable features - #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED // Flags \endcode + #define USB_DEVICE_VENDOR_ID 0x03EB // Type Word + // Product ID (Atmel PID referenced in usb_atmel.h) + #define USB_DEVICE_PRODUCT_ID 0xXXXX // Type Word + // Major version of the device + #define USB_DEVICE_MAJOR_VERSION 1 // Type Byte + // Minor version of the device + #define USB_DEVICE_MINOR_VERSION 0 // Type Byte + // Maximum device power (mA) + #define USB_DEVICE_POWER 100 // Type 9-bits + // USB attributes to enable features + #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED // Flags \endcode * -# Call the USB device stack start function to enable stack and start USB: * - \code udc_start(); \endcode * \note In case of USB dual roles (Device and Host) managed through USB OTG connector @@ -372,90 +365,90 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * * Content of XMEGA conf_clock.h: * \code - // Configuration based on internal RC: - // USB clock need of 48Mhz - #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC - #define CONFIG_OSC_RC32_CAL 48000000UL - #define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF - // CPU clock need of clock > 12MHz to run with USB (Here 24MHz) - #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC32MHZ - #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_2 - #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1 + // Configuration based on internal RC: + // USB clock need of 48Mhz + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC + #define CONFIG_OSC_RC32_CAL 48000000UL + #define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF + // CPU clock need of clock > 12MHz to run with USB (Here 24MHz) + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC32MHZ + #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_2 + #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1 \endcode * * Content of conf_clock.h for AT32UC3A0, AT32UC3A1, AT32UC3B devices (USBB): * \code - // Configuration based on 12MHz external OSC: - #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 - #define CONFIG_PLL1_MUL 8 - #define CONFIG_PLL1_DIV 2 - #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 - #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) + // Configuration based on 12MHz external OSC: + #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 + #define CONFIG_PLL1_MUL 8 + #define CONFIG_PLL1_DIV 2 + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) \endcode * * Content of conf_clock.h for AT32UC3A3, AT32UC3A4 devices (USBB with high speed support): * \code - // Configuration based on 12MHz external OSC: - #define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0 - #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) + // Configuration based on 12MHz external OSC: + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) \endcode * * Content of conf_clock.h for AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U devices (USBC): * \code - // Configuration based on 12MHz external OSC: - #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 - #define CONFIG_PLL1_MUL 8 - #define CONFIG_PLL1_DIV 2 - #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 - #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) - // CPU clock need of clock > 25MHz to run with USBC - #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1 + // Configuration based on 12MHz external OSC: + #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 + #define CONFIG_PLL1_MUL 8 + #define CONFIG_PLL1_DIV 2 + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) + // CPU clock need of clock > 25MHz to run with USBC + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1 \endcode * * Content of conf_clock.h for SAM3S, SAM3SD, SAM4S devices (UPD: USB Peripheral Device): * \code - // PLL1 (B) Options (Fpll = (Fclk * PLL_mul) / PLL_div) - #define CONFIG_PLL1_SOURCE PLL_SRC_MAINCK_XTAL - #define CONFIG_PLL1_MUL 16 - #define CONFIG_PLL1_DIV 2 - // USB Clock Source Options (Fusb = FpllX / USB_div) - #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 - #define CONFIG_USBCLK_DIV 2 + // PLL1 (B) Options (Fpll = (Fclk * PLL_mul) / PLL_div) + #define CONFIG_PLL1_SOURCE PLL_SRC_MAINCK_XTAL + #define CONFIG_PLL1_MUL 16 + #define CONFIG_PLL1_DIV 2 + // USB Clock Source Options (Fusb = FpllX / USB_div) + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 2 \endcode * * Content of conf_clock.h for SAM3U device (UPDHS: USB Peripheral Device High Speed): * \code - // USB Clock Source fixed at UPLL. + // USB Clock Source fixed at UPLL. \endcode * * Content of conf_clock.h for SAM3X, SAM3A devices (UOTGHS: USB OTG High Speed): * \code - // USB Clock Source fixed at UPLL. - #define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL - #define CONFIG_USBCLK_DIV 1 + // USB Clock Source fixed at UPLL. + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL + #define CONFIG_USBCLK_DIV 1 \endcode * * Content of conf_clocks.h for SAMD devices (USB): * \code - // System clock bus configuration - # define CONF_CLOCK_FLASH_WAIT_STATES 2 + // System clock bus configuration + # define CONF_CLOCK_FLASH_WAIT_STATES 2 - // USB Clock Source fixed at DFLL. - // SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop - # define CONF_CLOCK_DFLL_ENABLE true - # define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_USB_RECOVERY - # define CONF_CLOCK_DFLL_ON_DEMAND true + // USB Clock Source fixed at DFLL. + // SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop + # define CONF_CLOCK_DFLL_ENABLE true + # define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_USB_RECOVERY + # define CONF_CLOCK_DFLL_ON_DEMAND true - // Set this to true to configure the GCLK when running clocks_init. - // If set to false, none of the GCLK generators will be configured in clocks_init(). - # define CONF_CLOCK_CONFIGURE_GCLK true + // Set this to true to configure the GCLK when running clocks_init. + // If set to false, none of the GCLK generators will be configured in clocks_init(). + # define CONF_CLOCK_CONFIGURE_GCLK true - // Configure GCLK generator 0 (Main Clock) - # define CONF_CLOCK_GCLK_0_ENABLE true - # define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true - # define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL - # define CONF_CLOCK_GCLK_0_PRESCALER 1 - # define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false + // Configure GCLK generator 0 (Main Clock) + # define CONF_CLOCK_GCLK_0_ENABLE true + # define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true + # define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL + # define CONF_CLOCK_GCLK_0_PRESCALER 1 + # define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false \endcode */ @@ -474,34 +467,34 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * \subsection udc_use_case_1_usage_code Example code * Content of conf_usb.h: * \code - #if // Low speed - #define USB_DEVICE_LOW_SPEED - // #define USB_DEVICE_HS_SUPPORT + #if // Low speed + #define USB_DEVICE_LOW_SPEED + // #define USB_DEVICE_HS_SUPPORT - #elif // Full speed - // #define USB_DEVICE_LOW_SPEED - // #define USB_DEVICE_HS_SUPPORT + #elif // Full speed + // #define USB_DEVICE_LOW_SPEED + // #define USB_DEVICE_HS_SUPPORT - #elif // High speed - // #define USB_DEVICE_LOW_SPEED - #define USB_DEVICE_HS_SUPPORT + #elif // High speed + // #define USB_DEVICE_LOW_SPEED + #define USB_DEVICE_HS_SUPPORT - #endif + #endif \endcode * * \subsection udc_use_case_1_usage_flow Workflow * -# Ensure that conf_usb.h is available and contains the following parameters * required for a USB device low speed (1.5Mbit/s): * - \code #define USB_DEVICE_LOW_SPEED - //#define USB_DEVICE_HS_SUPPORT \endcode + //#define USB_DEVICE_HS_SUPPORT \endcode * -# Ensure that conf_usb.h contains the following parameters * required for a USB device full speed (12Mbit/s): * - \code //#define USB_DEVICE_LOW_SPEED - //#define USB_DEVICE_HS_SUPPORT \endcode + //#define USB_DEVICE_HS_SUPPORT \endcode * -# Ensure that conf_usb.h contains the following parameters * required for a USB device high speed (480Mbit/s): * - \code //#define USB_DEVICE_LOW_SPEED - #define USB_DEVICE_HS_SUPPORT \endcode + #define USB_DEVICE_HS_SUPPORT \endcode */ /** @@ -518,20 +511,20 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * \subsection udc_use_case_2_usage_code Example code * Content of conf_usb.h: * \code - #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" - #define USB_DEVICE_PRODUCT_NAME "Product name" - #define USB_DEVICE_SERIAL_NAME "12...EF" + #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" + #define USB_DEVICE_PRODUCT_NAME "Product name" + #define USB_DEVICE_SERIAL_NAME "12...EF" \endcode * * \subsection udc_use_case_2_usage_flow Workflow * -# Ensure that conf_usb.h is available and contains the following parameters * required to enable different USB strings: * - \code // Static ASCII name for the manufacture - #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" \endcode + #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" \endcode * - \code // Static ASCII name for the product - #define USB_DEVICE_PRODUCT_NAME "Product name" \endcode + #define USB_DEVICE_PRODUCT_NAME "Product name" \endcode * - \code // Static ASCII name to enable and set a serial number - #define USB_DEVICE_SERIAL_NAME "12...EF" \endcode + #define USB_DEVICE_SERIAL_NAME "12...EF" \endcode */ /** @@ -548,42 +541,42 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * \subsection udc_use_case_3_usage_code Example code * Content of conf_usb.h: * \code - #define USB_DEVICE_ATTR \ - (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) - #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() - extern void my_callback_remotewakeup_enable(void); - #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() - extern void my_callback_remotewakeup_disable(void); + #define USB_DEVICE_ATTR \ + (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) + #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() + extern void my_callback_remotewakeup_enable(void); + #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() + extern void my_callback_remotewakeup_disable(void); \endcode * * Add to application C-file: * \code - void my_callback_remotewakeup_enable(void) - { - // Enable application wakeup events (e.g. enable GPIO interrupt) - } - void my_callback_remotewakeup_disable(void) - { - // Disable application wakeup events (e.g. disable GPIO interrupt) - } + void my_callback_remotewakeup_enable(void) + { + // Enable application wakeup events (e.g. enable GPIO interrupt) + } + void my_callback_remotewakeup_disable(void) + { + // Disable application wakeup events (e.g. disable GPIO interrupt) + } - void my_interrupt_event(void) - { - udc_remotewakeup(); - } + void my_interrupt_event(void) + { + udc_remotewakeup(); + } \endcode * * \subsection udc_use_case_3_usage_flow Workflow * -# Ensure that conf_usb.h is available and contains the following parameters * required to enable remote wakeup feature: * - \code // Authorizes the remote wakeup feature - #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) \endcode + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) \endcode * - \code // Define callback called when the host enables the remotewakeup feature - #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() - extern void my_callback_remotewakeup_enable(void); \endcode + #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() + extern void my_callback_remotewakeup_enable(void); \endcode * - \code // Define callback called when the host disables the remotewakeup feature - #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() - extern void my_callback_remotewakeup_disable(void); \endcode + #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() + extern void my_callback_remotewakeup_disable(void); \endcode * -# Send a remote wakeup (USB upstream): * - \code udc_remotewakeup(); \endcode */ @@ -603,40 +596,40 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * \subsection udc_use_case_5_usage_code Example code * Content of conf_usb.h: * \code - #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) - #define UDC_SUSPEND_EVENT() user_callback_suspend_action() - extern void user_callback_suspend_action(void) - #define UDC_RESUME_EVENT() user_callback_resume_action() - extern void user_callback_resume_action(void) + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) + #define UDC_SUSPEND_EVENT() user_callback_suspend_action() + extern void user_callback_suspend_action(void) + #define UDC_RESUME_EVENT() user_callback_resume_action() + extern void user_callback_resume_action(void) \endcode * * Add to application C-file: * \code - void user_callback_suspend_action(void) - { - // Disable hardware component to reduce power consumption - } - void user_callback_resume_action(void) - { - // Re-enable hardware component - } + void user_callback_suspend_action(void) + { + // Disable hardware component to reduce power consumption + } + void user_callback_resume_action(void) + { + // Re-enable hardware component + } \endcode * * \subsection udc_use_case_5_usage_flow Workflow * -# Ensure that conf_usb.h is available and contains the following parameters: * - \code // Authorizes the BUS power feature - #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) \endcode + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) \endcode * - \code // Define callback called when the host suspend the USB line - #define UDC_SUSPEND_EVENT() user_callback_suspend_action() - extern void user_callback_suspend_action(void); \endcode + #define UDC_SUSPEND_EVENT() user_callback_suspend_action() + extern void user_callback_suspend_action(void); \endcode * - \code // Define callback called when the host or device resume the USB line - #define UDC_RESUME_EVENT() user_callback_resume_action() - extern void user_callback_resume_action(void); \endcode + #define UDC_RESUME_EVENT() user_callback_resume_action() + extern void user_callback_resume_action(void); \endcode * -# Reduce power consumption in suspend mode (max. 2.5mA on Vbus): * - \code void user_callback_suspend_action(void) - { - turn_off_components(); - } \endcode + { + turn_off_components(); + } \endcode */ /** @@ -654,42 +647,42 @@ usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); * \subsection udc_use_case_6_usage_code Example code * Content of conf_usb.h: * \code - #define USB_DEVICE_SERIAL_NAME - #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number - #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 - extern uint8_t serial_number[]; + #define USB_DEVICE_SERIAL_NAME + #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number + #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 + extern uint8_t serial_number[]; \endcode * * Add to application C-file: * \code - uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; + uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; - void init_build_usb_serial_number(void) - { - serial_number[0] = 'A'; - serial_number[1] = 'B'; - ... - serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; - } \endcode + void init_build_usb_serial_number(void) + { + serial_number[0] = 'A'; + serial_number[1] = 'B'; + ... + serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; + } \endcode * * \subsection udc_use_case_6_usage_flow Workflow * -# Ensure that conf_usb.h is available and contains the following parameters * required to enable a USB serial number strings dynamically: * - \code #define USB_DEVICE_SERIAL_NAME // Define this empty - #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number // Give serial array pointer - #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 // Give size of serial array - extern uint8_t serial_number[]; // Declare external serial array \endcode + #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number // Give serial array pointer + #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 // Give size of serial array + extern uint8_t serial_number[]; // Declare external serial array \endcode * -# Before start USB stack, initialize the serial array * - \code - uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; + uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; - void init_build_usb_serial_number(void) - { - serial_number[0] = 'A'; - serial_number[1] = 'B'; - ... - serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; - } \endcode + void init_build_usb_serial_number(void) + { + serial_number[0] = 'A'; + serial_number[1] = 'B'; + ... + serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; + } \endcode */ diff --git a/Marlin/src/HAL/DUE/usb/udc_desc.h b/Marlin/src/HAL/DUE/usb/udc_desc.h index 052ca08eca..f1f328d035 100644 --- a/Marlin/src/HAL/DUE/usb/udc_desc.h +++ b/Marlin/src/HAL/DUE/usb/udc_desc.h @@ -78,50 +78,47 @@ extern "C" { * For Mega application used "code". */ #define UDC_DESC_STORAGE - // Descriptor storage in internal RAM + // Descriptor storage in internal RAM #if (defined UDC_DATA_USE_HRAM_SUPPORT) -# if defined(__GNUC__) -# define UDC_DATA(x) COMPILER_WORD_ALIGNED __attribute__((__section__(".data_hram0"))) -# define UDC_BSS(x) COMPILER_ALIGNED(x) __attribute__((__section__(".bss_hram0"))) -# elif defined(__ICCAVR32__) -# define UDC_DATA(x) COMPILER_ALIGNED(x) __data32 -# define UDC_BSS(x) COMPILER_ALIGNED(x) __data32 -# endif -#else -# define UDC_DATA(x) COMPILER_ALIGNED(x) -# define UDC_BSS(x) COMPILER_ALIGNED(x) + #if defined(__GNUC__) + #define UDC_DATA(x) COMPILER_WORD_ALIGNED __attribute__((__section__(".data_hram0"))) + #define UDC_BSS(x) COMPILER_ALIGNED(x) __attribute__((__section__(".bss_hram0"))) +#elif defined(__ICCAVR32__) + #define UDC_DATA(x) COMPILER_ALIGNED(x) __data32 + #define UDC_BSS(x) COMPILER_ALIGNED(x) __data32 +#endif +#else + #define UDC_DATA(x) COMPILER_ALIGNED(x) + #define UDC_BSS(x) COMPILER_ALIGNED(x) #endif - - /** * \brief Configuration descriptor and UDI link for one USB speed */ typedef struct { - //! USB configuration descriptor - usb_conf_desc_t UDC_DESC_STORAGE *desc; - //! Array of UDI API pointer - udi_api_t UDC_DESC_STORAGE *UDC_DESC_STORAGE * udi_apis; + //! USB configuration descriptor + usb_conf_desc_t UDC_DESC_STORAGE *desc; + //! Array of UDI API pointer + udi_api_t UDC_DESC_STORAGE *UDC_DESC_STORAGE * udi_apis; } udc_config_speed_t; - /** * \brief All information about the USB Device */ typedef struct { - //! USB device descriptor for low or full speed - usb_dev_desc_t UDC_DESC_STORAGE *confdev_lsfs; - //! USB configuration descriptor and UDI API pointers for low or full speed - udc_config_speed_t UDC_DESC_STORAGE *conf_lsfs; -#ifdef USB_DEVICE_HS_SUPPORT - //! USB device descriptor for high speed - usb_dev_desc_t UDC_DESC_STORAGE *confdev_hs; - //! USB device qualifier, only use in high speed mode - usb_dev_qual_desc_t UDC_DESC_STORAGE *qualifier; - //! USB configuration descriptor and UDI API pointers for high speed - udc_config_speed_t UDC_DESC_STORAGE *conf_hs; -#endif - usb_dev_bos_desc_t UDC_DESC_STORAGE *conf_bos; + //! USB device descriptor for low or full speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_lsfs; + //! USB configuration descriptor and UDI API pointers for low or full speed + udc_config_speed_t UDC_DESC_STORAGE *conf_lsfs; + #ifdef USB_DEVICE_HS_SUPPORT + //! USB device descriptor for high speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_hs; + //! USB device qualifier, only use in high speed mode + usb_dev_qual_desc_t UDC_DESC_STORAGE *qualifier; + //! USB configuration descriptor and UDI API pointers for high speed + udc_config_speed_t UDC_DESC_STORAGE *conf_hs; + #endif + usb_dev_bos_desc_t UDC_DESC_STORAGE *conf_bos; } udc_config_t; //! Global variables of USB Device Descriptor and UDI links diff --git a/Marlin/src/HAL/DUE/usb/udd.h b/Marlin/src/HAL/DUE/usb/udd.h index 319d8842f7..6eda465e54 100644 --- a/Marlin/src/HAL/DUE/usb/udd.h +++ b/Marlin/src/HAL/DUE/usb/udd.h @@ -71,8 +71,8 @@ typedef uint8_t udd_ep_id_t; //! \brief Endpoint transfer status //! Returned in parameters of callback register via udd_ep_run routine. typedef enum { - UDD_EP_TRANSFER_OK = 0, - UDD_EP_TRANSFER_ABORT = 1, + UDD_EP_TRANSFER_OK = 0, + UDD_EP_TRANSFER_ABORT = 1, } udd_ep_status_t; /** @@ -82,41 +82,37 @@ typedef enum { * It can be updated by udc_process_setup() from UDC or *setup() from UDIs. */ typedef struct { - //! Data received in USB SETUP packet - //! Note: The swap of "req.wValues" from uin16_t to le16_t is done by UDD. - usb_setup_req_t req; + //! Data received in USB SETUP packet + //! Note: The swap of "req.wValues" from uin16_t to le16_t is done by UDD. + usb_setup_req_t req; - //! Point to buffer to send or fill with data following SETUP packet - //! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer) - uint8_t *payload; + //! Point to buffer to send or fill with data following SETUP packet + //! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer) + uint8_t *payload; - //! Size of buffer to send or fill, and content the number of byte transferred - uint16_t payload_size; + //! Size of buffer to send or fill, and content the number of byte transferred + uint16_t payload_size; - //! Callback called after reception of ZLP from setup request - void (*callback)(void); + //! Callback called after reception of ZLP from setup request + void (*callback)(void); - //! Callback called when the buffer given (.payload) is full or empty. - //! This one return false to abort data transfer, or true with a new buffer in .payload. - bool (*over_under_run)(void); + //! Callback called when the buffer given (.payload) is full or empty. + //! This one return false to abort data transfer, or true with a new buffer in .payload. + bool (*over_under_run)(void); } udd_ctrl_request_t; extern udd_ctrl_request_t udd_g_ctrlreq; //! Return true if the setup request \a udd_g_ctrlreq indicates IN data transfer -#define Udd_setup_is_in() \ - (USB_REQ_DIR_IN == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) +#define Udd_setup_is_in() (USB_REQ_DIR_IN == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) //! Return true if the setup request \a udd_g_ctrlreq indicates OUT data transfer -#define Udd_setup_is_out() \ - (USB_REQ_DIR_OUT == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) +#define Udd_setup_is_out() (USB_REQ_DIR_OUT == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) //! Return the type of the SETUP request \a udd_g_ctrlreq. \see usb_reqtype. -#define Udd_setup_type() \ - (udd_g_ctrlreq.req.bmRequestType & USB_REQ_TYPE_MASK) +#define Udd_setup_type() (udd_g_ctrlreq.req.bmRequestType & USB_REQ_TYPE_MASK) //! Return the recipient of the SETUP request \a udd_g_ctrlreq. \see usb_recipient -#define Udd_setup_recipient() \ - (udd_g_ctrlreq.req.bmRequestType & USB_REQ_RECIP_MASK) +#define Udd_setup_recipient() (udd_g_ctrlreq.req.bmRequestType & USB_REQ_RECIP_MASK) /** * \brief End of halt callback function type. @@ -134,8 +130,7 @@ typedef void (*udd_callback_halt_cleared_t)(void); * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted * \param n number of data transferred */ -typedef void (*udd_callback_trans_t) (udd_ep_status_t status, - iram_size_t nb_transferred, udd_ep_id_t ep); +typedef void (*udd_callback_trans_t) (udd_ep_status_t status, iram_size_t nb_transferred, udd_ep_id_t ep); /** * \brief Authorizes the VBUS event @@ -239,8 +234,7 @@ void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size ); * * \return \c 1 if the endpoint is enabled, otherwise \c 0. */ -bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, - uint16_t MaxEndpointSize); +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, uint16_t MaxEndpointSize); /** * \brief Disables an endpoint @@ -294,8 +288,7 @@ bool udd_ep_clear_halt(udd_ep_id_t ep); * * \return \c 1 if the register is accepted, otherwise \c 0. */ -bool udd_ep_wait_stall_clear(udd_ep_id_t ep, - udd_callback_halt_cleared_t callback); +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, udd_callback_halt_cleared_t callback); /** * \brief Allows to receive or send data on an endpoint @@ -321,9 +314,8 @@ bool udd_ep_wait_stall_clear(udd_ep_id_t ep, * * \return \c 1 if function was successfully done, otherwise \c 0. */ -bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, - uint8_t * buf, iram_size_t buf_size, - udd_callback_trans_t callback); +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, uint8_t * buf, iram_size_t buf_size, udd_callback_trans_t callback); + /** * \brief Aborts transfer on going on endpoint * @@ -339,7 +331,6 @@ void udd_ep_abort(udd_ep_id_t ep); //@} - /** * \name High speed test mode management * @@ -352,7 +343,6 @@ void udd_test_mode_se0_nak(void); void udd_test_mode_packet(void); //@} - /** * \name UDC callbacks to provide for UDD * diff --git a/Marlin/src/HAL/DUE/usb/udi.h b/Marlin/src/HAL/DUE/usb/udi.h index febf03b718..bc5de086f3 100644 --- a/Marlin/src/HAL/DUE/usb/udi.h +++ b/Marlin/src/HAL/DUE/usb/udi.h @@ -72,57 +72,57 @@ extern "C" { * selected by UDC. */ typedef struct { - /** - * \brief Enable the interface. - * - * This function is called when the host selects a configuration - * to which this interface belongs through a Set Configuration - * request, and when the host selects an alternate setting of - * this interface through a Set Interface request. - * - * \return \c 1 if function was successfully done, otherwise \c 0. - */ - bool (*enable)(void); + /** + * \brief Enable the interface. + * + * This function is called when the host selects a configuration + * to which this interface belongs through a Set Configuration + * request, and when the host selects an alternate setting of + * this interface through a Set Interface request. + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ + bool (*enable)(void); - /** - * \brief Disable the interface. - * - * This function is called when this interface is currently - * active, and - * - the host selects any configuration through a Set - * Configuration request, or - * - the host issues a USB reset, or - * - the device is detached from the host (i.e. Vbus is no - * longer present) - */ - void (*disable)(void); + /** + * \brief Disable the interface. + * + * This function is called when this interface is currently + * active, and + * - the host selects any configuration through a Set + * Configuration request, or + * - the host issues a USB reset, or + * - the device is detached from the host (i.e. Vbus is no + * longer present) + */ + void (*disable)(void); - /** - * \brief Handle a control request directed at an interface. - * - * This function is called when this interface is currently - * active and the host sends a SETUP request - * with this interface as the recipient. - * - * Use udd_g_ctrlreq to decode and response to SETUP request. - * - * \return \c 1 if this interface supports the SETUP request, otherwise \c 0. - */ - bool (*setup)(void); + /** + * \brief Handle a control request directed at an interface. + * + * This function is called when this interface is currently + * active and the host sends a SETUP request + * with this interface as the recipient. + * + * Use udd_g_ctrlreq to decode and response to SETUP request. + * + * \return \c 1 if this interface supports the SETUP request, otherwise \c 0. + */ + bool (*setup)(void); - /** - * \brief Returns the current setting of the selected interface. - * - * This function is called when UDC when know alternate setting of selected interface. - * - * \return alternate setting of selected interface - */ - uint8_t (*getsetting)(void); + /** + * \brief Returns the current setting of the selected interface. + * + * This function is called when UDC when know alternate setting of selected interface. + * + * \return alternate setting of selected interface + */ + uint8_t (*getsetting)(void); - /** - * \brief To signal that a SOF is occurred - */ - void (*sof_notify)(void); + /** + * \brief To signal that a SOF is occurred + */ + void (*sof_notify)(void); } udi_api_t; //@} diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.h b/Marlin/src/HAL/DUE/usb/udi_cdc.h index b61845011a..2bc5fff187 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc.h +++ b/Marlin/src/HAL/DUE/usb/udi_cdc.h @@ -92,18 +92,18 @@ extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_data; * descriptors for the CDC Communication Class interface. */ typedef struct { - //! Standard interface descriptor - usb_iface_desc_t iface; - //! CDC Header functional descriptor - usb_cdc_hdr_desc_t header; - //! CDC Abstract Control Model functional descriptor - usb_cdc_acm_desc_t acm; - //! CDC Union functional descriptor - usb_cdc_union_desc_t union_desc; - //! CDC Call Management functional descriptor - usb_cdc_call_mgmt_desc_t call_mgmt; - //! Notification endpoint descriptor - usb_ep_desc_t ep_notify; + //! Standard interface descriptor + usb_iface_desc_t iface; + //! CDC Header functional descriptor + usb_cdc_hdr_desc_t header; + //! CDC Abstract Control Model functional descriptor + usb_cdc_acm_desc_t acm; + //! CDC Union functional descriptor + usb_cdc_union_desc_t union_desc; + //! CDC Call Management functional descriptor + usb_cdc_call_mgmt_desc_t call_mgmt; + //! Notification endpoint descriptor + usb_ep_desc_t ep_notify; } udi_cdc_comm_desc_t; @@ -114,11 +114,11 @@ typedef struct { * CDC Data Class interface. */ typedef struct { - //! Standard interface descriptor - usb_iface_desc_t iface; - //! Data IN/OUT endpoint descriptors - usb_ep_desc_t ep_in; - usb_ep_desc_t ep_out; + //! Standard interface descriptor + usb_iface_desc_t iface; + //! Data IN/OUT endpoint descriptors + usb_ep_desc_t ep_in; + usb_ep_desc_t ep_out; } udi_cdc_data_desc_t; @@ -136,13 +136,13 @@ typedef struct { //@{ //! By default no string associated to these interfaces #ifndef UDI_CDC_IAD_STRING_ID_0 -#define UDI_CDC_IAD_STRING_ID_0 0 + #define UDI_CDC_IAD_STRING_ID_0 0 #endif #ifndef UDI_CDC_COMM_STRING_ID_0 -#define UDI_CDC_COMM_STRING_ID_0 0 + #define UDI_CDC_COMM_STRING_ID_0 0 #endif #ifndef UDI_CDC_DATA_STRING_ID_0 -#define UDI_CDC_DATA_STRING_ID_0 0 + #define UDI_CDC_DATA_STRING_ID_0 0 #endif #define UDI_CDC_IAD_DESC_0 UDI_CDC_IAD_DESC(0) #define UDI_CDC_COMM_DESC_0 UDI_CDC_COMM_DESC(0) @@ -151,13 +151,13 @@ typedef struct { //! By default no string associated to these interfaces #ifndef UDI_CDC_IAD_STRING_ID_1 -#define UDI_CDC_IAD_STRING_ID_1 0 + #define UDI_CDC_IAD_STRING_ID_1 0 #endif #ifndef UDI_CDC_COMM_STRING_ID_1 -#define UDI_CDC_COMM_STRING_ID_1 0 + #define UDI_CDC_COMM_STRING_ID_1 0 #endif #ifndef UDI_CDC_DATA_STRING_ID_1 -#define UDI_CDC_DATA_STRING_ID_1 0 + #define UDI_CDC_DATA_STRING_ID_1 0 #endif #define UDI_CDC_IAD_DESC_1 UDI_CDC_IAD_DESC(1) #define UDI_CDC_COMM_DESC_1 UDI_CDC_COMM_DESC(1) @@ -166,13 +166,13 @@ typedef struct { //! By default no string associated to these interfaces #ifndef UDI_CDC_IAD_STRING_ID_2 -#define UDI_CDC_IAD_STRING_ID_2 0 + #define UDI_CDC_IAD_STRING_ID_2 0 #endif #ifndef UDI_CDC_COMM_STRING_ID_2 -#define UDI_CDC_COMM_STRING_ID_2 0 + #define UDI_CDC_COMM_STRING_ID_2 0 #endif #ifndef UDI_CDC_DATA_STRING_ID_2 -#define UDI_CDC_DATA_STRING_ID_2 0 + #define UDI_CDC_DATA_STRING_ID_2 0 #endif #define UDI_CDC_IAD_DESC_2 UDI_CDC_IAD_DESC(2) #define UDI_CDC_COMM_DESC_2 UDI_CDC_COMM_DESC(2) @@ -181,13 +181,13 @@ typedef struct { //! By default no string associated to these interfaces #ifndef UDI_CDC_IAD_STRING_ID_3 -#define UDI_CDC_IAD_STRING_ID_3 0 + #define UDI_CDC_IAD_STRING_ID_3 0 #endif #ifndef UDI_CDC_COMM_STRING_ID_3 -#define UDI_CDC_COMM_STRING_ID_3 0 + #define UDI_CDC_COMM_STRING_ID_3 0 #endif #ifndef UDI_CDC_DATA_STRING_ID_3 -#define UDI_CDC_DATA_STRING_ID_3 0 + #define UDI_CDC_DATA_STRING_ID_3 0 #endif #define UDI_CDC_IAD_DESC_3 UDI_CDC_IAD_DESC(3) #define UDI_CDC_COMM_DESC_3 UDI_CDC_COMM_DESC(3) @@ -196,13 +196,13 @@ typedef struct { //! By default no string associated to these interfaces #ifndef UDI_CDC_IAD_STRING_ID_4 -#define UDI_CDC_IAD_STRING_ID_4 0 + #define UDI_CDC_IAD_STRING_ID_4 0 #endif #ifndef UDI_CDC_COMM_STRING_ID_4 -#define UDI_CDC_COMM_STRING_ID_4 0 + #define UDI_CDC_COMM_STRING_ID_4 0 #endif #ifndef UDI_CDC_DATA_STRING_ID_4 -#define UDI_CDC_DATA_STRING_ID_4 0 + #define UDI_CDC_DATA_STRING_ID_4 0 #endif #define UDI_CDC_IAD_DESC_4 UDI_CDC_IAD_DESC(4) #define UDI_CDC_COMM_DESC_4 UDI_CDC_COMM_DESC(4) @@ -211,13 +211,13 @@ typedef struct { //! By default no string associated to these interfaces #ifndef UDI_CDC_IAD_STRING_ID_5 -#define UDI_CDC_IAD_STRING_ID_5 0 + #define UDI_CDC_IAD_STRING_ID_5 0 #endif #ifndef UDI_CDC_COMM_STRING_ID_5 -#define UDI_CDC_COMM_STRING_ID_5 0 + #define UDI_CDC_COMM_STRING_ID_5 0 #endif #ifndef UDI_CDC_DATA_STRING_ID_5 -#define UDI_CDC_DATA_STRING_ID_5 0 + #define UDI_CDC_DATA_STRING_ID_5 0 #endif #define UDI_CDC_IAD_DESC_5 UDI_CDC_IAD_DESC(5) #define UDI_CDC_COMM_DESC_5 UDI_CDC_COMM_DESC(5) @@ -226,13 +226,13 @@ typedef struct { //! By default no string associated to these interfaces #ifndef UDI_CDC_IAD_STRING_ID_6 -#define UDI_CDC_IAD_STRING_ID_6 0 + #define UDI_CDC_IAD_STRING_ID_6 0 #endif #ifndef UDI_CDC_COMM_STRING_ID_6 -#define UDI_CDC_COMM_STRING_ID_6 0 + #define UDI_CDC_COMM_STRING_ID_6 0 #endif #ifndef UDI_CDC_DATA_STRING_ID_6 -#define UDI_CDC_DATA_STRING_ID_6 0 + #define UDI_CDC_DATA_STRING_ID_6 0 #endif #define UDI_CDC_IAD_DESC_6 UDI_CDC_IAD_DESC(6) #define UDI_CDC_COMM_DESC_6 UDI_CDC_COMM_DESC(6) @@ -240,7 +240,6 @@ typedef struct { #define UDI_CDC_DATA_DESC_6_HS UDI_CDC_DATA_DESC_HS(6) //@} - //! Content of CDC IAD interface descriptor for all speeds #define UDI_CDC_IAD_DESC(port) { \ .bLength = sizeof(usb_iad_desc_t),\ @@ -270,7 +269,7 @@ typedef struct { .call_mgmt.bDescriptorType = CDC_CS_INTERFACE,\ .call_mgmt.bDescriptorSubtype = CDC_SCS_CALL_MGMT,\ .call_mgmt.bmCapabilities = \ - CDC_CALL_MGMT_SUPPORTED | CDC_CALL_MGMT_OVER_DCI,\ + CDC_CALL_MGMT_SUPPORTED | CDC_CALL_MGMT_OVER_DCI,\ .acm.bFunctionLength = sizeof(usb_cdc_acm_desc_t),\ .acm.bDescriptorType = CDC_CS_INTERFACE,\ .acm.bDescriptorSubtype = CDC_SCS_ACM,\ @@ -610,40 +609,37 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s * \subsection udi_cdc_basic_use_case_usage_code Example code * Content of conf_usb.h: * \code - #define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable() - extern bool my_callback_cdc_enable(void); - #define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable() - extern void my_callback_cdc_disable(void); - #define UDI_CDC_LOW_RATE + #define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable() + extern bool my_callback_cdc_enable(void); + #define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable() + extern void my_callback_cdc_disable(void); + #define UDI_CDC_LOW_RATE - #define UDI_CDC_DEFAULT_RATE 115200 - #define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 - #define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE - #define UDI_CDC_DEFAULT_DATABITS 8 + #define UDI_CDC_DEFAULT_RATE 115200 + #define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 + #define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE + #define UDI_CDC_DEFAULT_DATABITS 8 - #include "udi_cdc_conf.h" // At the end of conf_usb.h file + #include "udi_cdc_conf.h" // At the end of conf_usb.h file \endcode * * Add to application C-file: * \code - static bool my_flag_autorize_cdc_transfert = false; - bool my_callback_cdc_enable(void) - { - my_flag_autorize_cdc_transfert = true; - return true; - } - void my_callback_cdc_disable(void) - { - my_flag_autorize_cdc_transfert = false; - } + static bool my_flag_autorize_cdc_transfert = false; + bool my_callback_cdc_enable(void) { + my_flag_autorize_cdc_transfert = true; + return true; + } + void my_callback_cdc_disable(void) { + my_flag_autorize_cdc_transfert = false; + } - void task(void) - { - if (my_flag_autorize_cdc_transfert) { - udi_cdc_putc('A'); - udi_cdc_getc(); - } - } + void task(void) { + if (my_flag_autorize_cdc_transfert) { + udi_cdc_putc('A'); + udi_cdc_getc(); + } + } \endcode * * \subsection udi_cdc_basic_use_case_setup_flow Workflow @@ -652,14 +648,14 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s * - \code #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for CDC \endcode * \note The USB serial number is mandatory when a CDC interface is used. * - \code #define UDI_CDC_ENABLE_EXT(port) my_callback_cdc_enable() - extern bool my_callback_cdc_enable(void); \endcode + extern bool my_callback_cdc_enable(void); \endcode * \note After the device enumeration (detecting and identifying USB devices), * the USB host starts the device configuration. When the USB CDC interface * from the device is accepted by the host, the USB host enables this interface and the * UDI_CDC_ENABLE_EXT() callback function is called and return true. * Thus, when this event is received, the data transfer on CDC interface are authorized. * - \code #define UDI_CDC_DISABLE_EXT(port) my_callback_cdc_disable() - extern void my_callback_cdc_disable(void); \endcode + extern void my_callback_cdc_disable(void); \endcode * \note When the USB device is unplugged or is reset by the USB host, the USB * interface is disabled and the UDI_CDC_DISABLE_EXT() callback function * is called. Thus, the data transfer must be stopped on CDC interface. @@ -667,19 +663,19 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s * \note Define it when the transfer CDC Device to Host is a low rate * (<512000 bauds) to reduce CDC buffers size. * - \code #define UDI_CDC_DEFAULT_RATE 115200 - #define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 - #define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE - #define UDI_CDC_DEFAULT_DATABITS 8 \endcode + #define UDI_CDC_DEFAULT_STOPBITS CDC_STOP_BITS_1 + #define UDI_CDC_DEFAULT_PARITY CDC_PAR_NONE + #define UDI_CDC_DEFAULT_DATABITS 8 \endcode * \note Default configuration of communication port at startup. * -# Send or wait data on CDC line: * - \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); - // 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 + 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); + // 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 * * \section udi_cdc_use_cases Advanced use cases * For more advanced use of the UDI CDC module, see the following use cases: @@ -713,90 +709,90 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s * \subsection udi_cdc_use_case_composite_usage_code Example code * Content of conf_usb.h: * \code - #define USB_DEVICE_EP_CTRL_SIZE 64 - #define USB_DEVICE_NB_INTERFACE (X+2) - #define USB_DEVICE_MAX_EP (X+3) + #define USB_DEVICE_EP_CTRL_SIZE 64 + #define USB_DEVICE_NB_INTERFACE (X+2) + #define USB_DEVICE_MAX_EP (X+3) - #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX - #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX - #define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint - #define UDI_CDC_COMM_IFACE_NUMBER_0 X+0 - #define UDI_CDC_DATA_IFACE_NUMBER_0 X+1 + #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX + #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX + #define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + #define UDI_CDC_COMM_IFACE_NUMBER_0 X+0 + #define UDI_CDC_DATA_IFACE_NUMBER_0 X+1 - #define UDI_COMPOSITE_DESC_T \ - usb_iad_desc_t udi_cdc_iad; \ - udi_cdc_comm_desc_t udi_cdc_comm; \ - udi_cdc_data_desc_t udi_cdc_data; \ - ... - #define UDI_COMPOSITE_DESC_FS \ - .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ - .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ - .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ - ... - #define UDI_COMPOSITE_DESC_HS \ - .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ - .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ - .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ - ... - #define UDI_COMPOSITE_API \ - &udi_api_cdc_comm, \ - &udi_api_cdc_data, \ - ... + #define UDI_COMPOSITE_DESC_T \ + usb_iad_desc_t udi_cdc_iad; \ + udi_cdc_comm_desc_t udi_cdc_comm; \ + udi_cdc_data_desc_t udi_cdc_data; \ + ... + #define UDI_COMPOSITE_DESC_FS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ + ... + #define UDI_COMPOSITE_DESC_HS \ + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ + ... + #define UDI_COMPOSITE_API \ + &udi_api_cdc_comm, \ + &udi_api_cdc_data, \ + ... \endcode * * \subsection udi_cdc_use_case_composite_usage_flow Workflow * -# Ensure that conf_usb.h is available and contains the following parameters * required for a USB composite device configuration: * - \code // Endpoint control size, This must be: - // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) - // - 64 for a high speed device - #define USB_DEVICE_EP_CTRL_SIZE 64 - // Total Number of interfaces on this USB device. - // Add 2 for CDC. - #define USB_DEVICE_NB_INTERFACE (X+2) - // Total number of endpoints on this USB device. - // This must include each endpoint for each interface. - // Add 3 for CDC. - #define USB_DEVICE_MAX_EP (X+3) \endcode + // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) + // - 64 for a high speed device + #define USB_DEVICE_EP_CTRL_SIZE 64 + // Total Number of interfaces on this USB device. + // Add 2 for CDC. + #define USB_DEVICE_NB_INTERFACE (X+2) + // Total number of endpoints on this USB device. + // This must include each endpoint for each interface. + // Add 3 for CDC. + #define USB_DEVICE_MAX_EP (X+3) \endcode * -# Ensure that conf_usb.h contains the description of * composite device: * - \code // The endpoint numbers chosen by you for the CDC. - // The endpoint numbers starting from 1. - #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX - #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX - #define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint - // The interface index of an interface starting from 0 - #define UDI_CDC_COMM_IFACE_NUMBER_0 X+0 - #define UDI_CDC_DATA_IFACE_NUMBER_0 X+1 \endcode + // The endpoint numbers starting from 1. + #define UDI_CDC_DATA_EP_IN_0 (1 | USB_EP_DIR_IN) // TX + #define UDI_CDC_DATA_EP_OUT_0 (2 | USB_EP_DIR_OUT) // RX + #define UDI_CDC_COMM_EP_0 (3 | USB_EP_DIR_IN) // Notify endpoint + // The interface index of an interface starting from 0 + #define UDI_CDC_COMM_IFACE_NUMBER_0 X+0 + #define UDI_CDC_DATA_IFACE_NUMBER_0 X+1 \endcode * -# Ensure that conf_usb.h contains the following parameters * required for a USB composite device configuration: * - \code // USB Interfaces descriptor structure - #define UDI_COMPOSITE_DESC_T \ - ... - usb_iad_desc_t udi_cdc_iad; \ - udi_cdc_comm_desc_t udi_cdc_comm; \ - udi_cdc_data_desc_t udi_cdc_data; \ - ... - // USB Interfaces descriptor value for Full Speed - #define UDI_COMPOSITE_DESC_FS \ - ... - .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ - .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ - .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ - ... - // USB Interfaces descriptor value for High Speed - #define UDI_COMPOSITE_DESC_HS \ - ... - .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ - .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ - .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ - ... - // USB Interface APIs - #define UDI_COMPOSITE_API \ - ... - &udi_api_cdc_comm, \ - &udi_api_cdc_data, \ - ... \endcode + #define UDI_COMPOSITE_DESC_T \ + ... + usb_iad_desc_t udi_cdc_iad; \ + udi_cdc_comm_desc_t udi_cdc_comm; \ + udi_cdc_data_desc_t udi_cdc_data; \ + ... + // USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + ... + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_FS, \ + ... + // USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + ... + .udi_cdc_iad = UDI_CDC_IAD_DESC_0, \ + .udi_cdc_comm = UDI_CDC_COMM_DESC_0, \ + .udi_cdc_data = UDI_CDC_DATA_DESC_0_HS, \ + ... + // USB Interface APIs + #define UDI_COMPOSITE_API \ + ... + &udi_api_cdc_comm, \ + &udi_api_cdc_data, \ + ... \endcode * - \note The descriptors order given in the four lists above must be the * same as the order defined by all interface indexes. The interface index * orders are defined through UDI_X_IFACE_NUMBER defines.\n diff --git a/Marlin/src/HAL/DUE/usb/udi_msc.c b/Marlin/src/HAL/DUE/usb/udi_msc.c index a75b5936b3..3f70a8fb18 100644 --- a/Marlin/src/HAL/DUE/usb/udi_msc.c +++ b/Marlin/src/HAL/DUE/usb/udi_msc.c @@ -372,9 +372,7 @@ static void udi_msc_sbc_trans(bool b_read); //@} - -bool udi_msc_enable(void) -{ +bool udi_msc_enable(void) { uint8_t lun; udi_msc_b_trans_req = false; udi_msc_b_cbw_invalid = false; @@ -397,18 +395,14 @@ bool udi_msc_enable(void) return true; } - -void udi_msc_disable(void) -{ +void udi_msc_disable(void) { udi_msc_b_trans_req = false; udi_msc_b_ack_trans = true; udi_msc_b_reset_trans = true; UDI_MSC_DISABLE_EXT(); } - -bool udi_msc_setup(void) -{ +bool udi_msc_setup(void) { if (Udd_setup_is_in()) { // Requests Interface GET if (Udd_setup_type() == USB_REQ_TYPE_CLASS) { @@ -451,17 +445,14 @@ bool udi_msc_setup(void) return false; // Not supported request } -uint8_t udi_msc_getsetting(void) -{ +uint8_t udi_msc_getsetting(void) { return 0; // MSC don't have multiple alternate setting } - // ------------------------ //------- Routines to process CBW packet -static void udi_msc_cbw_invalid(void) -{ +static void udi_msc_cbw_invalid(void) { if (!udi_msc_b_cbw_invalid) return; // Don't re-stall endpoint if error reset by setup udd_ep_set_halt(UDI_MSC_EP_OUT); @@ -469,8 +460,7 @@ static void udi_msc_cbw_invalid(void) udd_ep_wait_stall_clear(UDI_MSC_EP_OUT, udi_msc_cbw_invalid); } -static void udi_msc_csw_invalid(void) -{ +static void udi_msc_csw_invalid(void) { if (!udi_msc_b_cbw_invalid) return; // Don't re-stall endpoint if error reset by setup udd_ep_set_halt(UDI_MSC_EP_IN); @@ -478,8 +468,7 @@ static void udi_msc_csw_invalid(void) udd_ep_wait_stall_clear(UDI_MSC_EP_IN, udi_msc_csw_invalid); } -static void udi_msc_cbw_wait(void) -{ +static void udi_msc_cbw_wait(void) { // Register buffer and callback on OUT endpoint if (!udd_ep_run(UDI_MSC_EP_OUT, true, (uint8_t *) & udi_msc_cbw, @@ -490,10 +479,8 @@ static void udi_msc_cbw_wait(void) } } - static void udi_msc_cbw_received(udd_ep_status_t status, - iram_size_t nb_received, udd_ep_id_t ep) -{ + iram_size_t nb_received, udd_ep_id_t ep) { UNUSED(ep); // Check status of transfer if (UDD_EP_TRANSFER_OK != status) { @@ -582,9 +569,7 @@ static void udi_msc_cbw_received(udd_ep_status_t status, } } - -static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag) -{ +static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag) { /* * The following cases should result in a phase error: * - Case 2: Hn < Di @@ -612,12 +597,10 @@ static bool udi_msc_cbw_validate(uint32_t alloc_len, uint8_t dir_flag) return true; } - // ------------------------ //------- Routines to process small data packet -static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size) -{ +static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size) { // Sends data on IN endpoint if (!udd_ep_run(UDI_MSC_EP_IN, true, buffer, buf_size, udi_msc_data_sent)) { @@ -627,10 +610,8 @@ static void udi_msc_data_send(uint8_t * buffer, uint8_t buf_size) } } - static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, - udd_ep_id_t ep) -{ + udd_ep_id_t ep) { UNUSED(ep); if (UDD_EP_TRANSFER_OK != status) { // Error protocol @@ -644,12 +625,10 @@ static void udi_msc_data_sent(udd_ep_status_t status, iram_size_t nb_sent, udi_msc_csw_process(); } - // ------------------------ //------- Routines to process CSW packet -static void udi_msc_csw_process(void) -{ +static void udi_msc_csw_process(void) { if (0 != udi_msc_csw.dCSWDataResidue) { // Residue not NULL // then STALL next request from USB host on corresponding endpoint @@ -664,9 +643,7 @@ static void udi_msc_csw_process(void) udi_msc_csw_send(); } - -void udi_msc_csw_send(void) -{ +void udi_msc_csw_send(void) { // Sends CSW on IN endpoint if (!udd_ep_run(UDI_MSC_EP_IN, false, (uint8_t *) & udi_msc_csw, @@ -678,10 +655,8 @@ void udi_msc_csw_send(void) } } - static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, - udd_ep_id_t ep) -{ + udd_ep_id_t ep) { UNUSED(ep); UNUSED(status); UNUSED(nb_sent); @@ -690,20 +665,17 @@ static void udi_msc_csw_sent(udd_ep_status_t status, iram_size_t nb_sent, udi_msc_cbw_wait(); } - // ------------------------ //------- Routines manage sense data -static void udi_msc_clear_sense(void) -{ +static void udi_msc_clear_sense(void) { memset((uint8_t*)&udi_msc_sense, 0, sizeof(struct scsi_request_sense_data)); udi_msc_sense.valid_reponse_code = SCSI_SENSE_VALID | SCSI_SENSE_CURRENT; udi_msc_sense.AddSenseLen = SCSI_SENSE_ADDL_LEN(sizeof(udi_msc_sense)); } static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense, - uint32_t lba) -{ + uint32_t lba) { udi_msc_clear_sense(); udi_msc_csw.bCSWStatus = USB_CSW_STATUS_FAIL; udi_msc_sense.sense_flag_key = sense_key; @@ -715,53 +687,39 @@ static void udi_msc_sense_fail(uint8_t sense_key, uint16_t add_sense, udi_msc_sense.AddSnsCodeQlfr = add_sense; } -static void udi_msc_sense_pass(void) -{ +static void udi_msc_sense_pass(void) { udi_msc_clear_sense(); udi_msc_csw.bCSWStatus = USB_CSW_STATUS_PASS; } - -static void udi_msc_sense_fail_not_present(void) -{ +static void udi_msc_sense_fail_not_present(void) { udi_msc_sense_fail(SCSI_SK_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT, 0); } -static void udi_msc_sense_fail_busy_or_change(void) -{ - udi_msc_sense_fail(SCSI_SK_UNIT_ATTENTION, - SCSI_ASC_NOT_READY_TO_READY_CHANGE, 0); +static void udi_msc_sense_fail_busy_or_change(void) { + udi_msc_sense_fail(SCSI_SK_UNIT_ATTENTION, SCSI_ASC_NOT_READY_TO_READY_CHANGE, 0); } -static void udi_msc_sense_fail_hardware(void) -{ - udi_msc_sense_fail(SCSI_SK_HARDWARE_ERROR, - SCSI_ASC_NO_ADDITIONAL_SENSE_INFO, 0); +static void udi_msc_sense_fail_hardware(void) { + udi_msc_sense_fail(SCSI_SK_HARDWARE_ERROR, SCSI_ASC_NO_ADDITIONAL_SENSE_INFO, 0); } -static void udi_msc_sense_fail_protected(void) -{ +static void udi_msc_sense_fail_protected(void) { udi_msc_sense_fail(SCSI_SK_DATA_PROTECT, SCSI_ASC_WRITE_PROTECTED, 0); } -static void udi_msc_sense_fail_cdb_invalid(void) -{ - udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, - SCSI_ASC_INVALID_FIELD_IN_CDB, 0); +static void udi_msc_sense_fail_cdb_invalid(void) { + udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, SCSI_ASC_INVALID_FIELD_IN_CDB, 0); } -static void udi_msc_sense_command_invalid(void) -{ - udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, - SCSI_ASC_INVALID_COMMAND_OPERATION_CODE, 0); +static void udi_msc_sense_command_invalid(void) { + udi_msc_sense_fail(SCSI_SK_ILLEGAL_REQUEST, SCSI_ASC_INVALID_COMMAND_OPERATION_CODE, 0); } - // ------------------------ //------- Routines manage SCSI Commands -static void udi_msc_spc_requestsense(void) -{ +static void udi_msc_spc_requestsense(void) { uint8_t length = udi_msc_cbw.CDB[4]; // Can't send more than sense data length @@ -774,9 +732,7 @@ static void udi_msc_spc_requestsense(void) udi_msc_data_send((uint8_t*)&udi_msc_sense, length); } - -static void udi_msc_spc_inquiry(void) -{ +static void udi_msc_spc_inquiry(void) { uint8_t length, i; UDC_DATA(4) // Constant inquiry data for all LUNs @@ -835,9 +791,7 @@ static void udi_msc_spc_inquiry(void) udi_msc_data_send((uint8_t *) & udi_msc_inquiry_data, length); } - -static bool udi_msc_spc_testunitready_global(void) -{ +static bool udi_msc_spc_testunitready_global(void) { switch (mem_test_unit_ready(udi_msc_cbw.bCBWLUN)) { case CTRL_GOOD: return true; // Don't change sense data @@ -855,9 +809,7 @@ static bool udi_msc_spc_testunitready_global(void) return false; } - -static void udi_msc_spc_testunitready(void) -{ +static void udi_msc_spc_testunitready(void) { if (udi_msc_spc_testunitready_global()) { // LUN ready, then update sense data with status pass udi_msc_sense_pass(); @@ -866,9 +818,7 @@ static void udi_msc_spc_testunitready(void) udi_msc_csw_process(); } - -static void udi_msc_spc_mode_sense(bool b_sense10) -{ +static void udi_msc_spc_mode_sense(bool b_sense10) { // Union of all mode sense structures union sense_6_10 { struct { @@ -943,9 +893,7 @@ static void udi_msc_spc_mode_sense(bool b_sense10) udi_msc_data_send((uint8_t *) & sense, request_lgt); } - -static void udi_msc_spc_prevent_allow_medium_removal(void) -{ +static void udi_msc_spc_prevent_allow_medium_removal(void) { uint8_t prevent = udi_msc_cbw.CDB[4]; if (0 == prevent) { udi_msc_sense_pass(); @@ -955,9 +903,7 @@ static void udi_msc_spc_prevent_allow_medium_removal(void) udi_msc_csw_process(); } - -static void udi_msc_sbc_start_stop(void) -{ +static void udi_msc_sbc_start_stop(void) { bool start = 0x1 & udi_msc_cbw.CDB[4]; bool loej = 0x2 & udi_msc_cbw.CDB[4]; if (loej) { @@ -967,9 +913,7 @@ static void udi_msc_sbc_start_stop(void) udi_msc_csw_process(); } - -static void udi_msc_sbc_read_capacity(void) -{ +static void udi_msc_sbc_read_capacity(void) { UDC_BSS(4) static struct sbc_read_capacity10_data udi_msc_capacity; if (!udi_msc_cbw_validate(sizeof(udi_msc_capacity), @@ -1003,9 +947,7 @@ static void udi_msc_sbc_read_capacity(void) sizeof(udi_msc_capacity)); } - -static void udi_msc_sbc_trans(bool b_read) -{ +static void udi_msc_sbc_trans(bool b_read) { uint32_t trans_size; if (!b_read) { @@ -1038,9 +980,7 @@ static void udi_msc_sbc_trans(bool b_read) UDI_MSC_NOTIFY_TRANS_EXT(); } - -bool udi_msc_process_trans(void) -{ +bool udi_msc_process_trans(void) { Ctrl_status status; if (!udi_msc_b_trans_req) @@ -1084,10 +1024,8 @@ bool udi_msc_process_trans(void) return true; } - static void udi_msc_trans_ack(udd_ep_status_t status, iram_size_t n, - udd_ep_id_t ep) -{ + udd_ep_id_t ep) { UNUSED(ep); UNUSED(n); // Update variable to signal the end of transfer @@ -1095,10 +1033,8 @@ static void udi_msc_trans_ack(udd_ep_status_t status, iram_size_t n, udi_msc_b_ack_trans = true; } - bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, - void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)) -{ + void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)) { if (!udi_msc_b_ack_trans) return false; // No possible, transfer on going diff --git a/Marlin/src/HAL/DUE/usb/udi_msc.h b/Marlin/src/HAL/DUE/usb/udi_msc.h index 730dbc8eec..0ede4d6a83 100644 --- a/Marlin/src/HAL/DUE/usb/udi_msc.h +++ b/Marlin/src/HAL/DUE/usb/udi_msc.h @@ -77,9 +77,9 @@ extern UDC_DESC_STORAGE udi_api_t udi_api_msc; //! Interface descriptor structure for MSC typedef struct { - usb_iface_desc_t iface; - usb_ep_desc_t ep_in; - usb_ep_desc_t ep_out; + usb_iface_desc_t iface; + usb_ep_desc_t ep_in; + usb_ep_desc_t ep_out; } udi_msc_desc_t; //! By default no string associated to this interface @@ -94,32 +94,32 @@ typedef struct { //! Content of MSC interface descriptor for all speeds #define UDI_MSC_DESC \ - .iface.bLength = sizeof(usb_iface_desc_t),\ - .iface.bDescriptorType = USB_DT_INTERFACE,\ - .iface.bInterfaceNumber = UDI_MSC_IFACE_NUMBER,\ - .iface.bAlternateSetting = 0,\ - .iface.bNumEndpoints = 2,\ - .iface.bInterfaceClass = MSC_CLASS,\ - .iface.bInterfaceSubClass = MSC_SUBCLASS_TRANSPARENT,\ - .iface.bInterfaceProtocol = MSC_PROTOCOL_BULK,\ - .iface.iInterface = UDI_MSC_STRING_ID,\ - .ep_in.bLength = sizeof(usb_ep_desc_t),\ - .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ - .ep_in.bEndpointAddress = UDI_MSC_EP_IN,\ - .ep_in.bmAttributes = USB_EP_TYPE_BULK,\ - .ep_in.bInterval = 0,\ - .ep_out.bLength = sizeof(usb_ep_desc_t),\ - .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ - .ep_out.bEndpointAddress = UDI_MSC_EP_OUT,\ - .ep_out.bmAttributes = USB_EP_TYPE_BULK,\ - .ep_out.bInterval = 0, + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = UDI_MSC_IFACE_NUMBER,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 2,\ + .iface.bInterfaceClass = MSC_CLASS,\ + .iface.bInterfaceSubClass = MSC_SUBCLASS_TRANSPARENT,\ + .iface.bInterfaceProtocol = MSC_PROTOCOL_BULK,\ + .iface.iInterface = UDI_MSC_STRING_ID,\ + .ep_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_in.bEndpointAddress = UDI_MSC_EP_IN,\ + .ep_in.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_in.bInterval = 0,\ + .ep_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_out.bEndpointAddress = UDI_MSC_EP_OUT,\ + .ep_out.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_out.bInterval = 0, //! Content of MSC interface descriptor for full speed only #define UDI_MSC_DESC_FS {\ - UDI_MSC_DESC \ - .ep_in.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_FS),\ - .ep_out.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_FS),\ - } + UDI_MSC_DESC \ + .ep_in.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_FS),\ + .ep_out.wMaxPacketSize = LE16(UDI_MSC_EPS_SIZE_FS),\ + } //! Content of MSC interface descriptor for high speed only #define UDI_MSC_DESC_HS {\ @@ -129,7 +129,6 @@ typedef struct { } //@} - /** * \ingroup udi_group * \defgroup udi_msc_group USB Device Interface (UDI) for Mass Storage Class (MSC) @@ -163,14 +162,13 @@ bool udi_msc_process_trans(void); * \return \c 1 if function was successfully done, otherwise \c 0. */ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, - void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)); + void (*callback) (udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)); //@} #ifdef __cplusplus } #endif - /** * \page udi_msc_quickstart Quick start guide for USB device Mass Storage module (UDI MSC) * @@ -200,35 +198,32 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, * \subsection udi_msc_basic_use_case_usage_code Example code * Content of conf_usb.h: * \code - #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for MSC - #define UDI_MSC_GLOBAL_VENDOR_ID \ - 'A', 'T', 'M', 'E', 'L', ' ', ' ', ' ' - #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ - '1', '.', '0', '0' - #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable() - extern bool my_callback_msc_enable(void); - #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable() - extern void my_callback_msc_disable(void); - #include "udi_msc_conf.h" // At the end of conf_usb.h file + #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for MSC + #define UDI_MSC_GLOBAL_VENDOR_ID \ + 'A', 'T', 'M', 'E', 'L', ' ', ' ', ' ' + #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ + '1', '.', '0', '0' + #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable() + extern bool my_callback_msc_enable(void); + #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable() + extern void my_callback_msc_disable(void); + #include "udi_msc_conf.h" // At the end of conf_usb.h file \endcode * * Add to application C-file: * \code - static bool my_flag_autorize_msc_transfert = false; - bool my_callback_msc_enable(void) - { - my_flag_autorize_msc_transfert = true; - return true; - } - void my_callback_msc_disable(void) - { - my_flag_autorize_msc_transfert = false; - } + static bool my_flag_autorize_msc_transfert = false; + bool my_callback_msc_enable(void) { + my_flag_autorize_msc_transfert = true; + return true; + } + void my_callback_msc_disable(void) { + my_flag_autorize_msc_transfert = false; + } - void task(void) - { - udi_msc_process_trans(); - } + void task(void) { + udi_msc_process_trans(); + } \endcode * * \subsection udi_msc_basic_use_case_setup_flow Workflow @@ -237,14 +232,14 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, * - \code #define USB_DEVICE_SERIAL_NAME "12...EF" // Disk SN for MSC \endcode * \note The USB serial number is mandatory when a MSC interface is used. * - \code //! Vendor name and Product version of MSC interface - #define UDI_MSC_GLOBAL_VENDOR_ID \ - 'A', 'T', 'M', 'E', 'L', ' ', ' ', ' ' - #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ - '1', '.', '0', '0' \endcode + #define UDI_MSC_GLOBAL_VENDOR_ID \ + 'A', 'T', 'M', 'E', 'L', ' ', ' ', ' ' + #define UDI_MSC_GLOBAL_PRODUCT_VERSION \ + '1', '.', '0', '0' \endcode * \note The USB MSC interface requires a vendor ID (8 ASCII characters) * and a product version (4 ASCII characters). * - \code #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable() - extern bool my_callback_msc_enable(void); \endcode + extern bool my_callback_msc_enable(void); \endcode * \note After the device enumeration (detecting and identifying USB devices), * the USB host starts the device configuration. When the USB MSC interface * from the device is accepted by the host, the USB host enables this interface and the @@ -252,7 +247,7 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, * Thus, when this event is received, the tasks which call * udi_msc_process_trans() must be enabled. * - \code #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable() - extern void my_callback_msc_disable(void); \endcode + extern void my_callback_msc_disable(void); \endcode * \note When the USB device is unplugged or is reset by the USB host, the USB * interface is disabled and the UDI_MSC_DISABLE_EXT() callback function * is called. Thus, it is recommended to disable the task which is called udi_msc_process_trans(). @@ -261,15 +256,15 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, * must be done outside USB interrupt routine. This is done in the MSC process * ("udi_msc_process_trans()") called by main loop: * - \code * void task(void) { - udi_msc_process_trans(); - } \endcode + udi_msc_process_trans(); + } \endcode * -# The MSC speed depends on task periodicity. To get the best speed * the notification callback "UDI_MSC_NOTIFY_TRANS_EXT" can be used to wakeup * this task (Example, through a mutex): * - \code #define UDI_MSC_NOTIFY_TRANS_EXT() msc_notify_trans() - void msc_notify_trans(void) { - wakeup_my_task(); - } \endcode + void msc_notify_trans(void) { + wakeup_my_task(); + } \endcode * * \section udi_msc_use_cases Advanced use cases * For more advanced use of the UDI MSC module, see the following use cases: @@ -302,72 +297,72 @@ bool udi_msc_trans_block(bool b_read, uint8_t * block, iram_size_t block_size, * \subsection udi_msc_use_case_composite_usage_code Example code * Content of conf_usb.h: * \code - #define USB_DEVICE_EP_CTRL_SIZE 64 - #define USB_DEVICE_NB_INTERFACE (X+1) - #define USB_DEVICE_MAX_EP (X+2) + #define USB_DEVICE_EP_CTRL_SIZE 64 + #define USB_DEVICE_NB_INTERFACE (X+1) + #define USB_DEVICE_MAX_EP (X+2) - #define UDI_MSC_EP_IN (X | USB_EP_DIR_IN) - #define UDI_MSC_EP_OUT (Y | USB_EP_DIR_OUT) - #define UDI_MSC_IFACE_NUMBER X + #define UDI_MSC_EP_IN (X | USB_EP_DIR_IN) + #define UDI_MSC_EP_OUT (Y | USB_EP_DIR_OUT) + #define UDI_MSC_IFACE_NUMBER X - #define UDI_COMPOSITE_DESC_T \ - udi_msc_desc_t udi_msc; \ - ... - #define UDI_COMPOSITE_DESC_FS \ - .udi_msc = UDI_MSC_DESC, \ - ... - #define UDI_COMPOSITE_DESC_HS \ - .udi_msc = UDI_MSC_DESC, \ - ... - #define UDI_COMPOSITE_API \ - &udi_api_msc, \ - ... + #define UDI_COMPOSITE_DESC_T \ + udi_msc_desc_t udi_msc; \ + ... + #define UDI_COMPOSITE_DESC_FS \ + .udi_msc = UDI_MSC_DESC, \ + ... + #define UDI_COMPOSITE_DESC_HS \ + .udi_msc = UDI_MSC_DESC, \ + ... + #define UDI_COMPOSITE_API \ + &udi_api_msc, \ + ... \endcode * * \subsection udi_msc_use_case_composite_usage_flow Workflow * -# Ensure that conf_usb.h is available and contains the following parameters * required for a USB composite device configuration: * - \code // Endpoint control size, This must be: - // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) - // - 64 for a high speed device - #define USB_DEVICE_EP_CTRL_SIZE 64 - // Total Number of interfaces on this USB device. - // Add 1 for MSC. - #define USB_DEVICE_NB_INTERFACE (X+1) - // Total number of endpoints on this USB device. - // This must include each endpoint for each interface. - // Add 2 for MSC. - #define USB_DEVICE_MAX_EP (X+2) \endcode + // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) + // - 64 for a high speed device + #define USB_DEVICE_EP_CTRL_SIZE 64 + // Total Number of interfaces on this USB device. + // Add 1 for MSC. + #define USB_DEVICE_NB_INTERFACE (X+1) + // Total number of endpoints on this USB device. + // This must include each endpoint for each interface. + // Add 2 for MSC. + #define USB_DEVICE_MAX_EP (X+2) \endcode * -# Ensure that conf_usb.h contains the description of * composite device: * - \code // The endpoint numbers chosen by you for the MSC. - // The endpoint numbers starting from 1. - #define UDI_MSC_EP_IN (X | USB_EP_DIR_IN) - #define UDI_MSC_EP_OUT (Y | USB_EP_DIR_OUT) - // The interface index of an interface starting from 0 - #define UDI_MSC_IFACE_NUMBER X \endcode + // The endpoint numbers starting from 1. + #define UDI_MSC_EP_IN (X | USB_EP_DIR_IN) + #define UDI_MSC_EP_OUT (Y | USB_EP_DIR_OUT) + // The interface index of an interface starting from 0 + #define UDI_MSC_IFACE_NUMBER X \endcode * -# Ensure that conf_usb.h contains the following parameters * required for a USB composite device configuration: * - \code // USB Interfaces descriptor structure - #define UDI_COMPOSITE_DESC_T \ - ... - udi_msc_desc_t udi_msc; \ - ... - // USB Interfaces descriptor value for Full Speed - #define UDI_COMPOSITE_DESC_FS \ - ... - .udi_msc = UDI_MSC_DESC_FS, \ - ... - // USB Interfaces descriptor value for High Speed - #define UDI_COMPOSITE_DESC_HS \ - ... - .udi_msc = UDI_MSC_DESC_HS, \ - ... - // USB Interface APIs - #define UDI_COMPOSITE_API \ - ... - &udi_api_msc, \ - ... \endcode + #define UDI_COMPOSITE_DESC_T \ + ... + udi_msc_desc_t udi_msc; \ + ... + // USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + ... + .udi_msc = UDI_MSC_DESC_FS, \ + ... + // USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + ... + .udi_msc = UDI_MSC_DESC_HS, \ + ... + // USB Interface APIs + #define UDI_COMPOSITE_API \ + ... + &udi_api_msc, \ + ... \endcode * - \note The descriptors order given in the four lists above must be the * same as the order defined by all interface indexes. The interface index * orders are defined through UDI_X_IFACE_NUMBER defines. diff --git a/Marlin/src/HAL/DUE/usb/uotghs_otg.h b/Marlin/src/HAL/DUE/usb/uotghs_otg.h index eca5e938bb..f0e55c896f 100644 --- a/Marlin/src/HAL/DUE/usb/uotghs_otg.h +++ b/Marlin/src/HAL/DUE/usb/uotghs_otg.h @@ -127,13 +127,13 @@ void otg_dual_disable(void); //! These macros allows to enable/disable pad and UOTGHS hardware //! @{ //! Reset USB macro -#define otg_reset() \ - do { \ - UOTGHS->UOTGHS_CTRL = 0; \ - while( UOTGHS->UOTGHS_SR & 0x3FFF) {\ - UOTGHS->UOTGHS_SCR = 0xFFFFFFFF;\ - } \ - } while (0) +#define otg_reset() \ + do { \ + UOTGHS->UOTGHS_CTRL = 0; \ + while( UOTGHS->UOTGHS_SR & 0x3FFF) { \ + UOTGHS->UOTGHS_SCR = 0xFFFFFFFF; \ + } \ + } while (0) //! Enable USB macro #define otg_enable() (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_USBE)) //! Disable USB macro @@ -157,15 +157,14 @@ void otg_dual_disable(void); //! Configure time-out of specified OTG timer #define otg_configure_timeout(timer, timeout) (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ - Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMPAGE_Msk, timer),\ - Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk, timeout),\ - Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK)) + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMPAGE_Msk, timer),\ + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk, timeout),\ + Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK)) //! Get configured time-out of specified OTG timer #define otg_get_timeout(timer) (Set_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ - Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMPAGE_Msk, timer),\ - Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ - Rd_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk)) - + Wr_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMPAGE_Msk, timer),\ + Clr_bits(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_UNLOCK),\ + Rd_bitfield(UOTGHS->UOTGHS_CTRL, UOTGHS_CTRL_TIMVALUE_Msk)) //! Get the dual-role device state of the internal USB finite state machine of the UOTGHS controller #define otg_get_fsm_drd_state() (Rd_bitfield(UOTGHS->UOTGHS_FSM, UOTGHS_FSM_DRDSTATE_Msk)) diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol.h b/Marlin/src/HAL/DUE/usb/usb_protocol.h index ea51a86896..4540247df8 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol.h +++ b/Marlin/src/HAL/DUE/usb/usb_protocol.h @@ -108,17 +108,17 @@ * \brief Standard USB requests (bRequest) */ enum usb_reqid { - USB_REQ_GET_STATUS = 0, - USB_REQ_CLEAR_FEATURE = 1, - USB_REQ_SET_FEATURE = 3, - USB_REQ_SET_ADDRESS = 5, - USB_REQ_GET_DESCRIPTOR = 6, - USB_REQ_SET_DESCRIPTOR = 7, - USB_REQ_GET_CONFIGURATION = 8, - USB_REQ_SET_CONFIGURATION = 9, - USB_REQ_GET_INTERFACE = 10, - USB_REQ_SET_INTERFACE = 11, - USB_REQ_SYNCH_FRAME = 12, + USB_REQ_GET_STATUS = 0, + USB_REQ_CLEAR_FEATURE = 1, + USB_REQ_SET_FEATURE = 3, + USB_REQ_SET_ADDRESS = 5, + USB_REQ_GET_DESCRIPTOR = 6, + USB_REQ_SET_DESCRIPTOR = 7, + USB_REQ_GET_CONFIGURATION = 8, + USB_REQ_SET_CONFIGURATION = 9, + USB_REQ_GET_INTERFACE = 10, + USB_REQ_SET_INTERFACE = 11, + USB_REQ_SYNCH_FRAME = 12, }; /** @@ -126,9 +126,9 @@ enum usb_reqid { * */ enum usb_device_status { - USB_DEV_STATUS_BUS_POWERED = 0, - USB_DEV_STATUS_SELF_POWERED = 1, - USB_DEV_STATUS_REMOTEWAKEUP = 2 + USB_DEV_STATUS_BUS_POWERED = 0, + USB_DEV_STATUS_SELF_POWERED = 1, + USB_DEV_STATUS_REMOTEWAKEUP = 2 }; /** @@ -136,7 +136,7 @@ enum usb_device_status { * */ enum usb_interface_status { - USB_IFACE_STATUS_RESERVED = 0 + USB_IFACE_STATUS_RESERVED = 0 }; /** @@ -144,7 +144,7 @@ enum usb_interface_status { * */ enum usb_endpoint_status { - USB_EP_STATUS_HALTED = 1, + USB_EP_STATUS_HALTED = 1, }; /** @@ -153,11 +153,11 @@ enum usb_endpoint_status { * \note valid for SetFeature request. */ enum usb_device_feature { - USB_DEV_FEATURE_REMOTE_WAKEUP = 1, //!< Remote wakeup enabled - USB_DEV_FEATURE_TEST_MODE = 2, //!< USB test mode - USB_DEV_FEATURE_OTG_B_HNP_ENABLE = 3, - USB_DEV_FEATURE_OTG_A_HNP_SUPPORT = 4, - USB_DEV_FEATURE_OTG_A_ALT_HNP_SUPPORT = 5 + USB_DEV_FEATURE_REMOTE_WAKEUP = 1, //!< Remote wakeup enabled + USB_DEV_FEATURE_TEST_MODE = 2, //!< USB test mode + USB_DEV_FEATURE_OTG_B_HNP_ENABLE = 3, + USB_DEV_FEATURE_OTG_A_HNP_SUPPORT = 4, + USB_DEV_FEATURE_OTG_A_ALT_HNP_SUPPORT = 5 }; /** @@ -166,54 +166,54 @@ enum usb_device_feature { * \note valid for USB_DEV_FEATURE_TEST_MODE request. */ enum usb_device_hs_test_mode { - USB_DEV_TEST_MODE_J = 1, - USB_DEV_TEST_MODE_K = 2, - USB_DEV_TEST_MODE_SE0_NAK = 3, - USB_DEV_TEST_MODE_PACKET = 4, - USB_DEV_TEST_MODE_FORCE_ENABLE = 5, + USB_DEV_TEST_MODE_J = 1, + USB_DEV_TEST_MODE_K = 2, + USB_DEV_TEST_MODE_SE0_NAK = 3, + USB_DEV_TEST_MODE_PACKET = 4, + USB_DEV_TEST_MODE_FORCE_ENABLE = 5, }; /** * \brief Standard USB endpoint feature/status flags */ enum usb_endpoint_feature { - USB_EP_FEATURE_HALT = 0, + USB_EP_FEATURE_HALT = 0, }; /** * \brief Standard USB Test Mode Selectors */ enum usb_test_mode_selector { - USB_TEST_J = 0x01, - USB_TEST_K = 0x02, - USB_TEST_SE0_NAK = 0x03, - USB_TEST_PACKET = 0x04, - USB_TEST_FORCE_ENABLE = 0x05, + USB_TEST_J = 0x01, + USB_TEST_K = 0x02, + USB_TEST_SE0_NAK = 0x03, + USB_TEST_PACKET = 0x04, + USB_TEST_FORCE_ENABLE = 0x05, }; /** * \brief Standard USB descriptor types */ enum usb_descriptor_type { - USB_DT_DEVICE = 1, - USB_DT_CONFIGURATION = 2, - USB_DT_STRING = 3, - USB_DT_INTERFACE = 4, - USB_DT_ENDPOINT = 5, - USB_DT_DEVICE_QUALIFIER = 6, - USB_DT_OTHER_SPEED_CONFIGURATION = 7, - USB_DT_INTERFACE_POWER = 8, - USB_DT_OTG = 9, - USB_DT_IAD = 0x0B, - USB_DT_BOS = 0x0F, - USB_DT_DEVICE_CAPABILITY = 0x10, + USB_DT_DEVICE = 1, + USB_DT_CONFIGURATION = 2, + USB_DT_STRING = 3, + USB_DT_INTERFACE = 4, + USB_DT_ENDPOINT = 5, + USB_DT_DEVICE_QUALIFIER = 6, + USB_DT_OTHER_SPEED_CONFIGURATION = 7, + USB_DT_INTERFACE_POWER = 8, + USB_DT_OTG = 9, + USB_DT_IAD = 0x0B, + USB_DT_BOS = 0x0F, + USB_DT_DEVICE_CAPABILITY = 0x10, }; /** * \brief USB Device Capability types */ enum usb_capability_type { - USB_DC_USB20_EXTENSION = 0x02, + USB_DC_USB20_EXTENSION = 0x02, }; /** @@ -221,7 +221,7 @@ enum usb_capability_type { * To fill bmAttributes field of usb_capa_ext_desc_t structure. */ enum usb_capability_extension_attr { - USB_DC_EXT_LPM = 0x00000002, + USB_DC_EXT_LPM = 0x00000002, }; #define HIRD_50_US 0 @@ -254,18 +254,18 @@ enum usb_capability_extension_attr { * \brief Standard USB endpoint transfer types */ enum usb_ep_type { - USB_EP_TYPE_CONTROL = 0x00, - USB_EP_TYPE_ISOCHRONOUS = 0x01, - USB_EP_TYPE_BULK = 0x02, - USB_EP_TYPE_INTERRUPT = 0x03, - USB_EP_TYPE_MASK = 0x03, + USB_EP_TYPE_CONTROL = 0x00, + USB_EP_TYPE_ISOCHRONOUS = 0x01, + USB_EP_TYPE_BULK = 0x02, + USB_EP_TYPE_INTERRUPT = 0x03, + USB_EP_TYPE_MASK = 0x03, }; /** * \brief Standard USB language IDs for string descriptors */ enum usb_langid { - USB_LANGID_EN_US = 0x0409, //!< English (United States) + USB_LANGID_EN_US = 0x0409, //!< English (United States) }; /** @@ -308,31 +308,31 @@ COMPILER_PACK_SET(1) * The data payload of SETUP packets always follows this structure. */ typedef struct { - uint8_t bmRequestType; - uint8_t bRequest; - le16_t wValue; - le16_t wIndex; - le16_t wLength; + uint8_t bmRequestType; + uint8_t bRequest; + le16_t wValue; + le16_t wIndex; + le16_t wLength; } usb_setup_req_t; /** * \brief Standard USB device descriptor structure */ typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - le16_t bcdUSB; - uint8_t bDeviceClass; - uint8_t bDeviceSubClass; - uint8_t bDeviceProtocol; - uint8_t bMaxPacketSize0; - le16_t idVendor; - le16_t idProduct; - le16_t bcdDevice; - uint8_t iManufacturer; - uint8_t iProduct; - uint8_t iSerialNumber; - uint8_t bNumConfigurations; + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + le16_t idVendor; + le16_t idProduct; + le16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; } usb_dev_desc_t; /** @@ -344,15 +344,15 @@ typedef struct { * the device was operating at full speed.) */ typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - le16_t bcdUSB; - uint8_t bDeviceClass; - uint8_t bDeviceSubClass; - uint8_t bDeviceProtocol; - uint8_t bMaxPacketSize0; - uint8_t bNumConfigurations; - uint8_t bReserved; + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; } usb_dev_qual_desc_t; /** @@ -368,10 +368,10 @@ typedef struct { * The descriptor type in the GetDescriptor() request is set to BOS. */ typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - le16_t wTotalLength; - uint8_t bNumDeviceCaps; + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumDeviceCaps; } usb_dev_bos_desc_t; @@ -381,10 +381,10 @@ typedef struct { * Defines the set of USB 1.1-specific device level capabilities. */ typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDevCapabilityType; - le32_t bmAttributes; + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + le32_t bmAttributes; } usb_dev_capa_ext_desc_t; /** @@ -393,22 +393,22 @@ typedef struct { * The BOS descriptor and capabilities descriptors for LPM. */ typedef struct { - usb_dev_bos_desc_t bos; - usb_dev_capa_ext_desc_t capa_ext; + usb_dev_bos_desc_t bos; + usb_dev_capa_ext_desc_t capa_ext; } usb_dev_lpm_desc_t; /** * \brief Standard USB Interface Association Descriptor structure */ typedef struct { - uint8_t bLength; //!< size of this descriptor in bytes - uint8_t bDescriptorType; //!< INTERFACE descriptor type - uint8_t bFirstInterface; //!< Number of interface - uint8_t bInterfaceCount; //!< value to select alternate setting - uint8_t bFunctionClass; //!< Class code assigned by the USB - uint8_t bFunctionSubClass;//!< Sub-class code assigned by the USB - uint8_t bFunctionProtocol;//!< Protocol code assigned by the USB - uint8_t iFunction; //!< Index of string descriptor + uint8_t bLength; //!< size of this descriptor in bytes + uint8_t bDescriptorType; //!< INTERFACE descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass;//!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol;//!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor } usb_association_desc_t; @@ -416,14 +416,14 @@ typedef struct { * \brief Standard USB configuration descriptor structure */ typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - le16_t wTotalLength; - uint8_t bNumInterfaces; - uint8_t bConfigurationValue; - uint8_t iConfiguration; - uint8_t bmAttributes; - uint8_t bMaxPower; + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; } usb_conf_desc_t; @@ -438,41 +438,41 @@ typedef struct { * \brief Standard USB association descriptor structure */ typedef struct { - uint8_t bLength; //!< Size of this descriptor in bytes - uint8_t bDescriptorType; //!< Interface descriptor type - uint8_t bFirstInterface; //!< Number of interface - uint8_t bInterfaceCount; //!< value to select alternate setting - uint8_t bFunctionClass; //!< Class code assigned by the USB - uint8_t bFunctionSubClass; //!< Sub-class code assigned by the USB - uint8_t bFunctionProtocol; //!< Protocol code assigned by the USB - uint8_t iFunction; //!< Index of string descriptor + uint8_t bLength; //!< Size of this descriptor in bytes + uint8_t bDescriptorType; //!< Interface descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass; //!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol; //!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor } usb_iad_desc_t; /** * \brief Standard USB interface descriptor structure */ typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bInterfaceNumber; - uint8_t bAlternateSetting; - uint8_t bNumEndpoints; - uint8_t bInterfaceClass; - uint8_t bInterfaceSubClass; - uint8_t bInterfaceProtocol; - uint8_t iInterface; + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; } usb_iface_desc_t; /** * \brief Standard USB endpoint descriptor structure */ typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - le16_t wMaxPacketSize; - uint8_t bInterval; + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + le16_t wMaxPacketSize; + uint8_t bInterval; } usb_ep_desc_t; @@ -480,13 +480,13 @@ typedef struct { * \brief A standard USB string descriptor structure */ typedef struct { - uint8_t bLength; - uint8_t bDescriptorType; + uint8_t bLength; + uint8_t bDescriptorType; } usb_str_desc_t; typedef struct { - usb_str_desc_t desc; - le16_t string[1]; + usb_str_desc_t desc; + le16_t string[1]; } usb_str_lgid_desc_t; COMPILER_PACK_RESET() diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h b/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h index d594db52e3..9b82afc624 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h +++ b/Marlin/src/HAL/DUE/usb/usb_protocol_cdc.h @@ -58,42 +58,42 @@ * \name Possible values of class */ //@{ -#define CDC_CLASS_DEVICE 0x02 //!< USB Communication Device Class -#define CDC_CLASS_COMM 0x02 //!< CDC Communication Class Interface -#define CDC_CLASS_DATA 0x0A //!< CDC Data Class Interface +#define CDC_CLASS_DEVICE 0x02 //!< USB Communication Device Class +#define CDC_CLASS_COMM 0x02 //!< CDC Communication Class Interface +#define CDC_CLASS_DATA 0x0A //!< CDC Data Class Interface #define CDC_CLASS_MULTI 0xEF //!< CDC Multi-interface Function //@} //! \name USB CDC Subclass IDs //@{ -#define CDC_SUBCLASS_DLCM 0x01 //!< Direct Line Control Model -#define CDC_SUBCLASS_ACM 0x02 //!< Abstract Control Model -#define CDC_SUBCLASS_TCM 0x03 //!< Telephone Control Model -#define CDC_SUBCLASS_MCCM 0x04 //!< Multi-Channel Control Model -#define CDC_SUBCLASS_CCM 0x05 //!< CAPI Control Model -#define CDC_SUBCLASS_ETH 0x06 //!< Ethernet Networking Control Model -#define CDC_SUBCLASS_ATM 0x07 //!< ATM Networking Control Model +#define CDC_SUBCLASS_DLCM 0x01 //!< Direct Line Control Model +#define CDC_SUBCLASS_ACM 0x02 //!< Abstract Control Model +#define CDC_SUBCLASS_TCM 0x03 //!< Telephone Control Model +#define CDC_SUBCLASS_MCCM 0x04 //!< Multi-Channel Control Model +#define CDC_SUBCLASS_CCM 0x05 //!< CAPI Control Model +#define CDC_SUBCLASS_ETH 0x06 //!< Ethernet Networking Control Model +#define CDC_SUBCLASS_ATM 0x07 //!< ATM Networking Control Model //@} //! \name USB CDC Communication Interface Protocol IDs //@{ -#define CDC_PROTOCOL_V25TER 0x01 //!< Common AT commands +#define CDC_PROTOCOL_V25TER 0x01 //!< Common AT commands //@} //! \name USB CDC Data Interface Protocol IDs //@{ -#define CDC_PROTOCOL_I430 0x30 //!< ISDN BRI -#define CDC_PROTOCOL_HDLC 0x31 //!< HDLC -#define CDC_PROTOCOL_TRANS 0x32 //!< Transparent -#define CDC_PROTOCOL_Q921M 0x50 //!< Q.921 management protocol -#define CDC_PROTOCOL_Q921 0x51 //!< Q.931 [sic] Data link protocol -#define CDC_PROTOCOL_Q921TM 0x52 //!< Q.921 TEI-multiplexor -#define CDC_PROTOCOL_V42BIS 0x90 //!< Data compression procedures -#define CDC_PROTOCOL_Q931 0x91 //!< Euro-ISDN protocol control -#define CDC_PROTOCOL_V120 0x92 //!< V.24 rate adaption to ISDN -#define CDC_PROTOCOL_CAPI20 0x93 //!< CAPI Commands -#define CDC_PROTOCOL_HOST 0xFD //!< Host based driver +#define CDC_PROTOCOL_I430 0x30 //!< ISDN BRI +#define CDC_PROTOCOL_HDLC 0x31 //!< HDLC +#define CDC_PROTOCOL_TRANS 0x32 //!< Transparent +#define CDC_PROTOCOL_Q921M 0x50 //!< Q.921 management protocol +#define CDC_PROTOCOL_Q921 0x51 //!< Q.931 [sic] Data link protocol +#define CDC_PROTOCOL_Q921TM 0x52 //!< Q.921 TEI-multiplexor +#define CDC_PROTOCOL_V42BIS 0x90 //!< Data compression procedures +#define CDC_PROTOCOL_Q931 0x91 //!< Euro-ISDN protocol control +#define CDC_PROTOCOL_V120 0x92 //!< V.24 rate adaption to ISDN +#define CDC_PROTOCOL_CAPI20 0x93 //!< CAPI Commands +#define CDC_PROTOCOL_HOST 0xFD //!< Host based driver /** * \brief Describes the Protocol Unit Functional Descriptors [sic] * on Communication Class Interface @@ -103,16 +103,16 @@ //! \name USB CDC Functional Descriptor Types //@{ -#define CDC_CS_INTERFACE 0x24 //!< Interface Functional Descriptor -#define CDC_CS_ENDPOINT 0x25 //!< Endpoint Functional Descriptor +#define CDC_CS_INTERFACE 0x24 //!< Interface Functional Descriptor +#define CDC_CS_ENDPOINT 0x25 //!< Endpoint Functional Descriptor //@} //! \name USB CDC Functional Descriptor Subtypes //@{ -#define CDC_SCS_HEADER 0x00 //!< Header Functional Descriptor -#define CDC_SCS_CALL_MGMT 0x01 //!< Call Management -#define CDC_SCS_ACM 0x02 //!< Abstract Control Management -#define CDC_SCS_UNION 0x06 //!< Union Functional Descriptor +#define CDC_SCS_HEADER 0x00 //!< Header Functional Descriptor +#define CDC_SCS_CALL_MGMT 0x01 //!< Call Management +#define CDC_SCS_ACM 0x02 //!< Abstract Control Management +#define CDC_SCS_UNION 0x06 //!< Union Functional Descriptor //@} //! \name USB CDC Request IDs @@ -171,36 +171,36 @@ COMPILER_PACK_SET(1) //! CDC Header Functional Descriptor typedef struct { - uint8_t bFunctionLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - le16_t bcdCDC; + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + le16_t bcdCDC; } usb_cdc_hdr_desc_t; //! CDC Call Management Functional Descriptor typedef struct { - uint8_t bFunctionLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bmCapabilities; - uint8_t bDataInterface; + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; + uint8_t bDataInterface; } usb_cdc_call_mgmt_desc_t; //! CDC ACM Functional Descriptor typedef struct { - uint8_t bFunctionLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bmCapabilities; + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; } usb_cdc_acm_desc_t; //! CDC Union Functional Descriptor typedef struct { - uint8_t bFunctionLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bMasterInterface; - uint8_t bSlaveInterface0; + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bMasterInterface; + uint8_t bSlaveInterface0; } usb_cdc_union_desc_t; @@ -235,24 +235,24 @@ typedef struct { //@{ //! Line Coding structure typedef struct { - le32_t dwDTERate; - uint8_t bCharFormat; - uint8_t bParityType; - uint8_t bDataBits; + le32_t dwDTERate; + uint8_t bCharFormat; + uint8_t bParityType; + uint8_t bDataBits; } usb_cdc_line_coding_t; //! Possible values of bCharFormat enum cdc_char_format { - CDC_STOP_BITS_1 = 0, //!< 1 stop bit - CDC_STOP_BITS_1_5 = 1, //!< 1.5 stop bits - CDC_STOP_BITS_2 = 2, //!< 2 stop bits + CDC_STOP_BITS_1 = 0, //!< 1 stop bit + CDC_STOP_BITS_1_5 = 1, //!< 1.5 stop bits + CDC_STOP_BITS_2 = 2, //!< 2 stop bits }; //! Possible values of bParityType enum cdc_parity { - CDC_PAR_NONE = 0, //!< No parity - CDC_PAR_ODD = 1, //!< Odd parity - CDC_PAR_EVEN = 2, //!< Even parity - CDC_PAR_MARK = 3, //!< Parity forced to 0 (space) - CDC_PAR_SPACE = 4, //!< Parity forced to 1 (mark) + CDC_PAR_NONE = 0, //!< No parity + CDC_PAR_ODD = 1, //!< Odd parity + CDC_PAR_EVEN = 2, //!< Even parity + CDC_PAR_MARK = 3, //!< Parity forced to 0 (space) + CDC_PAR_SPACE = 4, //!< Parity forced to 1 (mark) }; //@} @@ -262,7 +262,7 @@ enum cdc_parity { //! Control signal structure typedef struct { - uint16_t value; + uint16_t value; } usb_cdc_control_signal_t; //! \name Possible values in usb_cdc_control_signal_t @@ -283,11 +283,11 @@ typedef struct { //@{ typedef struct { - uint8_t bmRequestType; - uint8_t bNotification; - le16_t wValue; - le16_t wIndex; - le16_t wLength; + uint8_t bmRequestType; + uint8_t bNotification; + le16_t wValue; + le16_t wIndex; + le16_t wLength; } usb_cdc_notify_msg_t; //! \name USB CDC serial state @@ -295,8 +295,8 @@ typedef struct { //! Hardware handshake support (cdc spec 1.1 chapter 6.3.5) typedef struct { - usb_cdc_notify_msg_t header; - le16_t value; + usb_cdc_notify_msg_t header; + le16_t value; } usb_cdc_notify_serial_state_t; //! \name Possible values in usb_cdc_notify_serial_state_t diff --git a/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h b/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h index e1e59237d8..cc30a94e4f 100644 --- a/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h +++ b/Marlin/src/HAL/DUE/usb/usb_protocol_msc.h @@ -59,7 +59,7 @@ * \name Possible Class value */ //@{ -#define MSC_CLASS 0x08 +#define MSC_CLASS 0x08 //@} /** @@ -71,12 +71,12 @@ * operating systems like Windows XP. */ //@{ -#define MSC_SUBCLASS_RBC 0x01 //!< Reduced Block Commands -#define MSC_SUBCLASS_ATAPI 0x02 //!< CD/DVD devices -#define MSC_SUBCLASS_QIC_157 0x03 //!< Tape devices -#define MSC_SUBCLASS_UFI 0x04 //!< Floppy disk drives -#define MSC_SUBCLASS_SFF_8070I 0x05 //!< Floppy disk drives -#define MSC_SUBCLASS_TRANSPARENT 0x06 //!< Determined by INQUIRY +#define MSC_SUBCLASS_RBC 0x01 //!< Reduced Block Commands +#define MSC_SUBCLASS_ATAPI 0x02 //!< CD/DVD devices +#define MSC_SUBCLASS_QIC_157 0x03 //!< Tape devices +#define MSC_SUBCLASS_UFI 0x04 //!< Floppy disk drives +#define MSC_SUBCLASS_SFF_8070I 0x05 //!< Floppy disk drives +#define MSC_SUBCLASS_TRANSPARENT 0x06 //!< Determined by INQUIRY //@} /** @@ -84,9 +84,9 @@ * \note Only the BULK protocol should be used in new designs. */ //@{ -#define MSC_PROTOCOL_CBI 0x00 //!< Command/Bulk/Interrupt -#define MSC_PROTOCOL_CBI_ALT 0x01 //!< W/o command completion -#define MSC_PROTOCOL_BULK 0x50 //!< Bulk-only +#define MSC_PROTOCOL_CBI 0x00 //!< Command/Bulk/Interrupt +#define MSC_PROTOCOL_CBI_ALT 0x01 //!< W/o command completion +#define MSC_PROTOCOL_BULK 0x50 //!< Bulk-only //@} @@ -94,8 +94,8 @@ * \brief MSC USB requests (bRequest) */ enum usb_reqid_msc { - USB_REQ_MSC_BULK_RESET = 0xFF, //!< Mass Storage Reset - USB_REQ_MSC_GET_MAX_LUN = 0xFE //!< Get Max LUN + USB_REQ_MSC_BULK_RESET = 0xFF, //!< Mass Storage Reset + USB_REQ_MSC_GET_MAX_LUN = 0xFE //!< Get Max LUN }; @@ -106,20 +106,20 @@ COMPILER_PACK_SET(1) */ //@{ struct usb_msc_cbw { - le32_t dCBWSignature; //!< Must contain 'USBC' - le32_t dCBWTag; //!< Unique command ID - le32_t dCBWDataTransferLength; //!< Number of bytes to transfer - uint8_t bmCBWFlags; //!< Direction in bit 7 - uint8_t bCBWLUN; //!< Logical Unit Number - uint8_t bCBWCBLength; //!< Number of valid CDB bytes - uint8_t CDB[16]; //!< SCSI Command Descriptor Block + le32_t dCBWSignature; //!< Must contain 'USBC' + le32_t dCBWTag; //!< Unique command ID + le32_t dCBWDataTransferLength; //!< Number of bytes to transfer + uint8_t bmCBWFlags; //!< Direction in bit 7 + uint8_t bCBWLUN; //!< Logical Unit Number + uint8_t bCBWCBLength; //!< Number of valid CDB bytes + uint8_t CDB[16]; //!< SCSI Command Descriptor Block }; -#define USB_CBW_SIGNATURE 0x55534243 //!< dCBWSignature value -#define USB_CBW_DIRECTION_IN (1<<7) //!< Data from device to host -#define USB_CBW_DIRECTION_OUT (0<<7) //!< Data from host to device -#define USB_CBW_LUN_MASK 0x0F //!< Valid bits in bCBWLUN -#define USB_CBW_LEN_MASK 0x1F //!< Valid bits in bCBWCBLength +#define USB_CBW_SIGNATURE 0x55534243 //!< dCBWSignature value +#define USB_CBW_DIRECTION_IN (1<<7) //!< Data from device to host +#define USB_CBW_DIRECTION_OUT (0<<7) //!< Data from host to device +#define USB_CBW_LUN_MASK 0x0F //!< Valid bits in bCBWLUN +#define USB_CBW_LEN_MASK 0x1F //!< Valid bits in bCBWCBLength //@} @@ -128,16 +128,16 @@ struct usb_msc_cbw { */ //@{ struct usb_msc_csw { - le32_t dCSWSignature; //!< Must contain 'USBS' - le32_t dCSWTag; //!< Same as dCBWTag - le32_t dCSWDataResidue; //!< Number of bytes not transferred - uint8_t bCSWStatus; //!< Status code + le32_t dCSWSignature; //!< Must contain 'USBS' + le32_t dCSWTag; //!< Same as dCBWTag + le32_t dCSWDataResidue; //!< Number of bytes not transferred + uint8_t bCSWStatus; //!< Status code }; -#define USB_CSW_SIGNATURE 0x55534253 //!< dCSWSignature value -#define USB_CSW_STATUS_PASS 0x00 //!< Command Passed -#define USB_CSW_STATUS_FAIL 0x01 //!< Command Failed -#define USB_CSW_STATUS_PE 0x02 //!< Phase Error +#define USB_CSW_SIGNATURE 0x55534253 //!< dCSWSignature value +#define USB_CSW_STATUS_PASS 0x00 //!< Command Passed +#define USB_CSW_STATUS_FAIL 0x01 //!< Command Failed +#define USB_CSW_STATUS_PE 0x02 //!< Phase Error //@} COMPILER_PACK_RESET() diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index 46dd4e761b..27f6516f9a 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -165,7 +165,7 @@ void MarlinHAL::init_board() { } void MarlinHAL::idletask() { - #if BOTH(WIFISUPPORT, OTASUPPORT) + #if ALL(WIFISUPPORT, OTASUPPORT) OTA_handle(); #endif TERN_(ESP3D_WIFISUPPORT, esp3dlib.idletask()); diff --git a/Marlin/src/HAL/ESP32/endstop_interrupts.h b/Marlin/src/HAL/ESP32/endstop_interrupts.h index 0536864610..43f4975d46 100644 --- a/Marlin/src/HAL/ESP32/endstop_interrupts.h +++ b/Marlin/src/HAL/ESP32/endstop_interrupts.h @@ -42,33 +42,33 @@ void ICACHE_RAM_ATTR endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); - TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN)); - TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN)); - TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN)); - TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); - TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); - TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); - TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN)); - TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN)); - TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN)); - TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN)); - TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN)); - TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN)); + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN_PIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); } diff --git a/Marlin/src/HAL/ESP32/i2s.cpp b/Marlin/src/HAL/ESP32/i2s.cpp index 63ceed4c9d..69f8ca9845 100644 --- a/Marlin/src/HAL/ESP32/i2s.cpp +++ b/Marlin/src/HAL/ESP32/i2s.cpp @@ -356,7 +356,7 @@ void i2s_push_sample() { // Every 4µs (when space in DMA buffer) toggle each expander PWM output using // the current duty cycle/frequency so they sync with any steps (once // through the DMA/FIFO buffers). PWM signal inversion handled by other functions - LOOP_L_N(p, MAX_EXPANDER_BITS) { + for (uint8_t p = 0; p < MAX_EXPANDER_BITS; ++p) { if (hal.pwm_pin_data[p].pwm_duty_ticks > 0) { // pin has active pwm? if (hal.pwm_pin_data[p].pwm_tick_count == 0) { if (TEST32(i2s_port_data, p)) { // hi->lo diff --git a/Marlin/src/HAL/ESP32/inc/SanityCheck.h b/Marlin/src/HAL/ESP32/inc/SanityCheck.h index 910918b9ea..e6c364a6fe 100644 --- a/Marlin/src/HAL/ESP32/inc/SanityCheck.h +++ b/Marlin/src/HAL/ESP32/inc/SanityCheck.h @@ -40,7 +40,7 @@ #error "TMC220x Software Serial is not supported on ESP32." #endif -#if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT) +#if ALL(WIFISUPPORT, ESP3D_WIFISUPPORT) #error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT." #endif @@ -52,7 +52,7 @@ #error "FAST_PWM_FAN is not available on TinyBee." #endif -#if BOTH(I2S_STEPPER_STREAM, BABYSTEPPING) && DISABLED(INTEGRATED_BABYSTEPPING) +#if ALL(I2S_STEPPER_STREAM, BABYSTEPPING) && DISABLED(INTEGRATED_BABYSTEPPING) #error "BABYSTEPPING on I2S stream requires INTEGRATED_BABYSTEPPING." #endif @@ -60,10 +60,10 @@ #error "PULLDOWN pin mode is not available on ESP32 boards." #endif -#if BOTH(I2S_STEPPER_STREAM, LIN_ADVANCE) && DISABLED(EXPERIMENTAL_I2S_LA) +#if ALL(I2S_STEPPER_STREAM, LIN_ADVANCE) && DISABLED(EXPERIMENTAL_I2S_LA) #error "I2S stream is currently incompatible with LIN_ADVANCE." #endif -#if BOTH(I2S_STEPPER_STREAM, PRINTCOUNTER) && PRINTCOUNTER_SAVE_INTERVAL > 0 && DISABLED(PRINTCOUNTER_SYNC) +#if ALL(I2S_STEPPER_STREAM, PRINTCOUNTER) && PRINTCOUNTER_SAVE_INTERVAL > 0 && DISABLED(PRINTCOUNTER_SYNC) #error "PRINTCOUNTER_SAVE_INTERVAL may cause issues on ESP32 with an I2S expander. Define PRINTCOUNTER_SYNC in Configuration.h for an imperfect solution." #endif diff --git a/Marlin/src/HAL/ESP32/ota.cpp b/Marlin/src/HAL/ESP32/ota.cpp index f31a78c2c5..c5c3082c30 100644 --- a/Marlin/src/HAL/ESP32/ota.cpp +++ b/Marlin/src/HAL/ESP32/ota.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(WIFISUPPORT, OTASUPPORT) +#if ALL(WIFISUPPORT, OTASUPPORT) #include #include diff --git a/Marlin/src/HAL/ESP32/spiffs.cpp b/Marlin/src/HAL/ESP32/spiffs.cpp index a0e713bff0..043ad7849a 100644 --- a/Marlin/src/HAL/ESP32/spiffs.cpp +++ b/Marlin/src/HAL/ESP32/spiffs.cpp @@ -23,7 +23,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(WIFISUPPORT, WEBSUPPORT) +#if ALL(WIFISUPPORT, WEBSUPPORT) #include "../../core/serial.h" diff --git a/Marlin/src/HAL/ESP32/u8g_esp32_spi.cpp b/Marlin/src/HAL/ESP32/u8g_esp32_spi.cpp index 955c751e48..012604dbfb 100644 --- a/Marlin/src/HAL/ESP32/u8g_esp32_spi.cpp +++ b/Marlin/src/HAL/ESP32/u8g_esp32_spi.cpp @@ -25,7 +25,7 @@ #include "../../inc/MarlinConfig.h" -#if EITHER(MKS_MINI_12864, FYSETC_MINI_12864_2_1) +#if ANY(MKS_MINI_12864, FYSETC_MINI_12864_2_1) #include #include "../shared/HAL_SPI.h" @@ -101,6 +101,6 @@ uint8_t u8g_eps_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_pt return 1; } -#endif // EITHER(MKS_MINI_12864, FYSETC_MINI_12864_2_1) +#endif // MKS_MINI_12864 || FYSETC_MINI_12864_2_1 #endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/ESP32/web.cpp b/Marlin/src/HAL/ESP32/web.cpp index 7a27707a3e..63a101595f 100644 --- a/Marlin/src/HAL/ESP32/web.cpp +++ b/Marlin/src/HAL/ESP32/web.cpp @@ -23,7 +23,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(WIFISUPPORT, WEBSUPPORT) +#if ALL(WIFISUPPORT, WEBSUPPORT) #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index 5186578019..f3e16cfdf1 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -27,7 +27,7 @@ #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #endif -#include HAL_PATH(.,HAL.h) +#include HAL_PATH(..,HAL.h) extern MarlinHAL hal; #define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) diff --git a/Marlin/src/HAL/LINUX/HAL.cpp b/Marlin/src/HAL/LINUX/HAL.cpp index db43f42eaa..6a767c76e7 100644 --- a/Marlin/src/HAL/LINUX/HAL.cpp +++ b/Marlin/src/HAL/LINUX/HAL.cpp @@ -52,8 +52,7 @@ uint8_t MarlinHAL::active_ch = 0; uint16_t MarlinHAL::adc_value() { const pin_t pin = analogInputToDigitalPin(active_ch); if (!VALID_PIN(pin)) return 0; - const uint16_t data = ((Gpio::get(pin) >> 2) & 0x3FF); - return data; // return 10bit value as Marlin expects + return uint16_t((Gpio::get(pin) >> 2) & 0x3FF); // return 10bit value as Marlin expects } void MarlinHAL::reboot() { /* Reset the application state and GPIO */ } diff --git a/Marlin/src/HAL/LINUX/pinsDebug.h b/Marlin/src/HAL/LINUX/pinsDebug.h index 7bfd97d024..e4ee27e8dd 100644 --- a/Marlin/src/HAL/LINUX/pinsDebug.h +++ b/Marlin/src/HAL/LINUX/pinsDebug.h @@ -28,36 +28,33 @@ * Translation of routines & variables used by pinsDebug.h */ -#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define pwm_details(pin) NOOP // (do nothing) -#define pwm_status(pin) false // Print a pin's PWM status. Return true if it's currently a PWM pin. +#define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS #define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) #define digitalRead_mod(p) digitalRead(p) -#define PRINT_PORT(p) #define GET_ARRAY_PIN(p) pin_array[p].pin #define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0) -#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin +#define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin // active ADC function/mode/code values for PINSEL registers -constexpr int8_t ADC_pin_mode(pin_t pin) { - return (-1); -} +constexpr int8_t ADC_pin_mode(pin_t pin) { return -1; } -int8_t get_pin_mode(pin_t pin) { - if (!VALID_PIN(pin)) return -1; - return 0; -} +int8_t get_pin_mode(const pin_t pin) { return VALID_PIN(pin) ? 0 : -1; } -bool GET_PINMODE(pin_t pin) { - int8_t pin_mode = get_pin_mode(pin); - if (pin_mode == -1 || pin_mode == ADC_pin_mode(pin)) // found an invalid pin or active analog pin +bool GET_PINMODE(const pin_t pin) { + const int8_t pin_mode = get_pin_mode(pin); + if (pin_mode == -1 || pin_mode == ADC_pin_mode(pin)) // Invalid pin or active analog pin return false; - return (Gpio::getMode(pin) != 0); //input/output state + return (Gpio::getMode(pin) != 0); // Input/output state } -bool GET_ARRAY_IS_DIGITAL(pin_t pin) { +bool GET_ARRAY_IS_DIGITAL(const pin_t pin) { return (!IS_ANALOG(pin) || get_pin_mode(pin) != ADC_pin_mode(pin)); } + +void pwm_details(const pin_t pin) {} +bool pwm_status(const pin_t) { return false; } + +void print_port(const pin_t) {} diff --git a/Marlin/src/HAL/LINUX/spi_pins.h b/Marlin/src/HAL/LINUX/spi_pins.h index f09d1decb8..7bd2498be7 100644 --- a/Marlin/src/HAL/LINUX/spi_pins.h +++ b/Marlin/src/HAL/LINUX/spi_pins.h @@ -24,7 +24,7 @@ #include "../../core/macros.h" #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_U8GLIB, HAS_MEDIA) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_EN == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) +#if ALL(HAS_MARLINUI_U8GLIB, HAS_MEDIA) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_EN == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) #define SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently // needed due to the speed and mode required for communicating with each device being different. // This requirement can be removed if the SPI access to these devices is updated to use diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 15d61d30d1..be4d59ada7 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -101,7 +101,7 @@ extern DefaultSerial1 USBSerial; #error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif #if HAS_DGUS_LCD - #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.available() + #define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.available() #endif #endif @@ -165,7 +165,9 @@ int16_t PARSED_PIN_INDEX(const char code, const int16_t dval); // Defines // ------------------------ -#define PLATFORM_M997_SUPPORT +#ifndef PLATFORM_M997_SUPPORT + #define PLATFORM_M997_SUPPORT +#endif void flashFirmware(const int16_t); #define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment diff --git a/Marlin/src/HAL/LPC1768/MinSerial.cpp b/Marlin/src/HAL/LPC1768/MinSerial.cpp index 7a1c038c0b..368bcb5259 100644 --- a/Marlin/src/HAL/LPC1768/MinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MinSerial.cpp @@ -33,18 +33,18 @@ 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" - ); + 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(); } - 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 diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp index 1991d79719..5ebd437c1e 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp @@ -91,15 +91,9 @@ 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) { #if ENABLED(DEBUG_SD_EEPROM_EMULATION) FSTR_P const rw_str = write ? F("write") : F("read"); - SERIAL_CHAR(' '); - SERIAL_ECHOF(rw_str); - SERIAL_ECHOLNPGM("_data(", pos, ",", *value, ",", size, ", ...)"); - if (total) { - SERIAL_ECHOPGM(" f_"); - SERIAL_ECHOF(rw_str); - SERIAL_ECHOPGM("()=", s, "\n size=", size, "\n bytes_"); - SERIAL_ECHOLNF(write ? F("written=") : F("read="), total); - } + SERIAL_ECHOLN(AS_CHAR(' '), rw_str, F("_data("), pos, AS_CHAR(','), *value, AS_CHAR(','), size, F(", ...)")); + if (total) + SERIAL_ECHOLN(F(" f_"), rw_str, F("()="), s, F("\n size="), size, F("\n bytes_"), write ? F("written=") : F("read="), total); else SERIAL_ECHOLNPGM(" f_lseek()=", s); #endif diff --git a/Marlin/src/HAL/LPC1768/endstop_interrupts.h b/Marlin/src/HAL/LPC1768/endstop_interrupts.h index e4ac17f608..cd9de25477 100644 --- a/Marlin/src/HAL/LPC1768/endstop_interrupts.h +++ b/Marlin/src/HAL/LPC1768/endstop_interrupts.h @@ -44,147 +44,171 @@ void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) #define LPC1768_PIN_INTERRUPT_M(pin) ((pin >> 0x5 & 0x7) == 0 || (pin >> 0x5 & 0x7) == 2) - #if HAS_X_MAX + #if USE_X_MAX #if !LPC1768_PIN_INTERRUPT_M(X_MAX_PIN) #error "X_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(X_MAX_PIN); #endif - #if HAS_X_MIN + #if USE_X_MIN #if !LPC1768_PIN_INTERRUPT_M(X_MIN_PIN) #error "X_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(X_MIN_PIN); #endif - #if HAS_Y_MAX + #if USE_Y_MAX #if !LPC1768_PIN_INTERRUPT_M(Y_MAX_PIN) #error "Y_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Y_MAX_PIN); #endif - #if HAS_Y_MIN + #if USE_Y_MIN #if !LPC1768_PIN_INTERRUPT_M(Y_MIN_PIN) #error "Y_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Y_MIN_PIN); #endif - #if HAS_Z_MAX + #if USE_Z_MAX #if !LPC1768_PIN_INTERRUPT_M(Z_MAX_PIN) #error "Z_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MAX_PIN); #endif - #if HAS_Z_MIN + #if HAS_Z_MIN_PIN #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PIN) #error "Z_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MIN_PIN); #endif - #if HAS_Z2_MAX + #if USE_X2_MAX + #if !LPC1768_PIN_INTERRUPT_M(X2_MAX_PIN) + #error "X2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." + #endif + _ATTACH(X2_MAX_PIN); + #endif + #if USE_X2_MIN + #if !LPC1768_PIN_INTERRUPT_M(X2_MIN_PIN) + #error "X2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." + #endif + _ATTACH(X2_MIN_PIN); + #endif + #if USE_Y2_MAX + #if !LPC1768_PIN_INTERRUPT_M(Y2_MAX_PIN) + #error "Y2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." + #endif + _ATTACH(Y2_MAX_PIN); + #endif + #if USE_Y2_MIN + #if !LPC1768_PIN_INTERRUPT_M(Y2_MIN_PIN) + #error "Y2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." + #endif + _ATTACH(Y2_MIN_PIN); + #endif + #if USE_Z2_MAX #if !LPC1768_PIN_INTERRUPT_M(Z2_MAX_PIN) #error "Z2_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z2_MAX_PIN); #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN #if !LPC1768_PIN_INTERRUPT_M(Z2_MIN_PIN) #error "Z2_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z2_MIN_PIN); #endif - #if HAS_Z3_MAX + #if USE_Z3_MAX #if !LPC1768_PIN_INTERRUPT_M(Z3_MAX_PIN) #error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z3_MAX_PIN); #endif - #if HAS_Z3_MIN + #if USE_Z3_MIN #if !LPC1768_PIN_INTERRUPT_M(Z3_MIN_PIN) #error "Z3_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z3_MIN_PIN); #endif - #if HAS_Z4_MAX + #if USE_Z4_MAX #if !LPC1768_PIN_INTERRUPT_M(Z4_MAX_PIN) #error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z4_MAX_PIN); #endif - #if HAS_Z4_MIN + #if USE_Z4_MIN #if !LPC1768_PIN_INTERRUPT_M(Z4_MIN_PIN) #error "Z4_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z4_MIN_PIN); #endif - #if HAS_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE #if !LPC1768_PIN_INTERRUPT_M(Z_MIN_PROBE_PIN) #error "Z_MIN_PROBE_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MIN_PROBE_PIN); #endif - #if HAS_I_MAX + #if USE_I_MAX #if !LPC1768_PIN_INTERRUPT_M(I_MAX_PIN) - #error "I_MAX_PIN is not INTERRUPT-capable." + #error "I_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(I_MAX_PIN); - #elif HAS_I_MIN + #elif USE_I_MIN #if !LPC1768_PIN_INTERRUPT_M(I_MIN_PIN) - #error "I_MIN_PIN is not INTERRUPT-capable." + #error "I_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(I_MIN_PIN); #endif - #if HAS_J_MAX + #if USE_J_MAX #if !LPC1768_PIN_INTERRUPT_M(J_MAX_PIN) - #error "J_MAX_PIN is not INTERRUPT-capable." + #error "J_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(J_MAX_PIN); - #elif HAS_J_MIN + #elif USE_J_MIN #if !LPC1768_PIN_INTERRUPT_M(J_MIN_PIN) - #error "J_MIN_PIN is not INTERRUPT-capable." + #error "J_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(J_MIN_PIN); #endif - #if HAS_K_MAX + #if USE_K_MAX #if !LPC1768_PIN_INTERRUPT_M(K_MAX_PIN) - #error "K_MAX_PIN is not INTERRUPT-capable." + #error "K_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(K_MAX_PIN); - #elif HAS_K_MIN + #elif USE_K_MIN #if !LPC1768_PIN_INTERRUPT_M(K_MIN_PIN) - #error "K_MIN_PIN is not INTERRUPT-capable." + #error "K_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(K_MIN_PIN); #endif - #if HAS_U_MAX + #if USE_U_MAX #if !LPC1768_PIN_INTERRUPT_M(U_MAX_PIN) - #error "U_MAX_PIN is not INTERRUPT-capable." + #error "U_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(U_MAX_PIN); - #elif HAS_U_MIN + #elif USE_U_MIN #if !LPC1768_PIN_INTERRUPT_M(U_MIN_PIN) - #error "U_MIN_PIN is not INTERRUPT-capable." + #error "U_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(U_MIN_PIN); #endif - #if HAS_V_MAX + #if USE_V_MAX #if !LPC1768_PIN_INTERRUPT_M(V_MAX_PIN) - #error "V_MAX_PIN is not INTERRUPT-capable." + #error "V_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(V_MAX_PIN); - #elif HAS_V_MIN + #elif USE_V_MIN #if !LPC1768_PIN_INTERRUPT_M(V_MIN_PIN) - #error "V_MIN_PIN is not INTERRUPT-capable." + #error "V_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(V_MIN_PIN); #endif - #if HAS_W_MAX + #if USE_W_MAX #if !LPC1768_PIN_INTERRUPT_M(W_MAX_PIN) - #error "W_MAX_PIN is not INTERRUPT-capable." + #error "W_MAX_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(W_MAX_PIN); - #elif HAS_W_MIN + #elif USE_W_MIN #if !LPC1768_PIN_INTERRUPT_M(W_MIN_PIN) - #error "W_MIN_PIN is not INTERRUPT-capable." + #error "W_MIN_PIN is not INTERRUPT-capable. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(W_MIN_PIN); #endif diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h index a0bf421538..0b03cb2aea 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h @@ -23,7 +23,7 @@ #if USE_FALLBACK_EEPROM #define FLASH_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) +#elif ANY(I2C_EEPROM, SPI_EEPROM) #define USE_SHARED_EEPROM 1 #endif diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index f49bc34c92..2782f225b0 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -150,7 +150,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #error "Serial port pins (2) conflict with other pins!" #elif Y_HOME_TO_MIN && IS_TX2(Y_STOP_PIN) #error "Serial port pins (2) conflict with Y endstop pin!" - #elif USES_Z_MIN_PROBE_PIN && IS_TX2(Z_MIN_PROBE_PIN) + #elif USE_Z_MIN_PROBE && IS_TX2(Z_MIN_PROBE_PIN) #error "Serial port pins (2) conflict with probe pin!" #elif ANY_TX(2, X_ENABLE_PIN, Y_ENABLE_PIN) || ANY_RX(2, X_DIR_PIN, Y_DIR_PIN) #error "Serial port pins (2) conflict with X/Y stepper pins!" @@ -241,7 +241,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #define PIN_IS_SCL2(P) (P##_PIN == P0_11) #if PIN_IS_SDA2(Y_STOP) #error "i2c SDA2 overlaps with Y endstop pin!" - #elif USES_Z_MIN_PROBE_PIN && PIN_IS_SDA2(Z_MIN_PROBE) + #elif USE_Z_MIN_PROBE && PIN_IS_SDA2(Z_MIN_PROBE) #error "i2c SDA2 overlaps with Z probe pin!" #elif PIN_IS_SDA2(X_ENABLE) || PIN_IS_SDA2(Y_ENABLE) #error "i2c SDA2 overlaps with X/Y ENABLE pin!" diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index 419c99793f..15518c3d86 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -68,7 +68,7 @@ void MarlinHAL::init() { #endif // Flash status LED 3 times to indicate Marlin has started booting - LOOP_L_N(i, 6) { + for (uint8_t i = 0; i < 6; ++i) { TOGGLE(LED_PIN); delay(100); } diff --git a/Marlin/src/HAL/LPC1768/pinsDebug.h b/Marlin/src/HAL/LPC1768/pinsDebug.h index a2f5c123a2..975511be9a 100644 --- a/Marlin/src/HAL/LPC1768/pinsDebug.h +++ b/Marlin/src/HAL/LPC1768/pinsDebug.h @@ -29,11 +29,8 @@ */ #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define pwm_details(pin) pin = pin // do nothing // print PWM details -#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. #define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) #define digitalRead_mod(p) extDigitalRead(p) -#define PRINT_PORT(p) #define GET_ARRAY_PIN(p) pin_array[p].pin #define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("P%d_%02d"), LPC176x::pin_port(p), LPC176x::pin_bit(p)); SERIAL_ECHO(buffer); }while(0) @@ -46,10 +43,14 @@ #endif bool GET_PINMODE(const pin_t pin) { - if (!LPC176x::pin_is_valid(pin) || LPC176x::pin_adc_enabled(pin)) // found an invalid pin or active analog pin + if (!LPC176x::pin_is_valid(pin) || LPC176x::pin_adc_enabled(pin)) // Invalid pin or active analog pin return false; return LPC176x::gpio_direction(pin); } #define GET_ARRAY_IS_DIGITAL(x) ((bool) pin_array[x].is_digital) + +void print_port(const pin_t) {} +void pwm_details(const pin_t) {} +bool pwm_status(const pin_t) { return false; } diff --git a/Marlin/src/HAL/LPC1768/spi_pins.h b/Marlin/src/HAL/LPC1768/spi_pins.h index 33a5b369ad..babe8a11d7 100644 --- a/Marlin/src/HAL/LPC1768/spi_pins.h +++ b/Marlin/src/HAL/LPC1768/spi_pins.h @@ -23,7 +23,7 @@ #include "../../core/macros.h" -#if BOTH(HAS_MEDIA, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_EN == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) +#if ALL(HAS_MEDIA, HAS_MARLINUI_U8GLIB) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_EN == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) #define SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently // needed due to the speed and mode required for communicating with each device being different. // This requirement can be removed if the SPI access to these devices is updated to use diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp index abf1cf5e43..440e9f8598 100644 --- a/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp +++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.cpp @@ -20,6 +20,8 @@ * */ +#ifdef TARGET_LPC1768 + #include "../../../inc/MarlinConfig.h" #if HAS_SPI_TFT @@ -28,7 +30,7 @@ SPIClass TFT_SPI::SPIx(TFT_SPI_DEVICE); -void TFT_SPI::Init() { +void TFT_SPI::init() { #if PIN_EXISTS(TFT_RESET) OUT_WRITE(TFT_RESET_PIN, HIGH); delay(100); @@ -47,21 +49,21 @@ void TFT_SPI::Init() { SPIx.setDataMode(SPI_MODE0); } -void TFT_SPI::DataTransferBegin(uint16_t DataSize) { - SPIx.setDataSize(DataSize); +void TFT_SPI::dataTransferBegin(uint16_t dataSize) { + SPIx.setDataSize(dataSize); SPIx.begin(); WRITE(TFT_CS_PIN, LOW); } -uint32_t TFT_SPI::GetID() { +uint32_t TFT_SPI::getID() { uint32_t id; - id = ReadID(LCD_READ_ID); + id = readID(LCD_READ_ID); if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) - id = ReadID(LCD_READ_ID4); + id = readID(LCD_READ_ID4); return id; } -uint32_t TFT_SPI::ReadID(uint16_t Reg) { +uint32_t TFT_SPI::readID(uint16_t reg) { uint32_t data = 0; #if PIN_EXISTS(TFT_MISO) @@ -70,14 +72,14 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { SPIx.setClock(SPI_CLOCK_DIV64); SPIx.begin(); WRITE(TFT_CS_PIN, LOW); - WriteReg(Reg); + writeReg(reg); - LOOP_L_N(i, 4) { + for (uint8_t i = 0; i < 4; ++i) { SPIx.read((uint8_t*)&d, 1); data = (data << 8) | d; } - DataTransferEnd(); + dataTransferEnd(); SPIx.setClock(SPI_CLOCK_MAX_TFT); #endif @@ -101,11 +103,11 @@ bool TFT_SPI::isBusy() { if ((SSP_GetStatus(LPC_SSPx, SSP_STAT_TXFIFO_EMPTY) == RESET) || (SSP_GetStatus(LPC_SSPx, SSP_STAT_BUSY) == SET)) return true; } - Abort(); + abort(); return false; } -void TFT_SPI::Abort() { +void TFT_SPI::abort() { // DMA Channel 0 is hardcoded in dmaSendAsync() and dmaSend() // Disable DMA @@ -124,22 +126,23 @@ void TFT_SPI::Abort() { LPC_GPDMACH0->DMACCSrcAddr = 0U; LPC_GPDMACH0->DMACCDestAddr = 0U; - DataTransferEnd(); + dataTransferEnd(); } -void TFT_SPI::Transmit(uint16_t Data) { SPIx.transfer(Data); } +void TFT_SPI::transmit(uint16_t data) { SPIx.transfer(data); } -void TFT_SPI::Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DataTransferBegin(DATASIZE_16BIT); - SPIx.dmaSend(Data, Count, MemoryIncrease); - Abort(); +void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { + dataTransferBegin(DATASIZE_16BIT); + SPIx.dmaSend(data, count, memoryIncrease); + abort(); } -void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DataTransferBegin(DATASIZE_16BIT); - SPIx.dmaSendAsync(Data, Count, MemoryIncrease); +void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { + dataTransferBegin(DATASIZE_16BIT); + SPIx.dmaSendAsync(data, count, memoryIncrease); TERN_(TFT_SHARED_IO, while (isBusy())); } #endif // HAS_SPI_TFT +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/tft/tft_spi.h b/Marlin/src/HAL/LPC1768/tft/tft_spi.h index 4817a5aae3..884bcaed04 100644 --- a/Marlin/src/HAL/LPC1768/tft/tft_spi.h +++ b/Marlin/src/HAL/LPC1768/tft/tft_spi.h @@ -56,34 +56,34 @@ class TFT_SPI { private: - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + static uint32_t readID(uint16_t reg); + static void transmit(uint16_t data); + static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count); + static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count); public: static SPIClass SPIx; - static void Init(); - static uint32_t GetID(); + static void init(); + static uint32_t getID(); static bool isBusy(); - static void Abort(); + static void abort(); - static void DataTransferBegin(uint16_t DataWidth=DATASIZE_16BIT); - static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); SSP_Cmd(LPC_SSPx, DISABLE); }; - static void DataTransferAbort(); + static void dataTransferBegin(uint16_t dataWidth=DATASIZE_16BIT); + static void dataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); SSP_Cmd(LPC_SSPx, DISABLE); }; + static void dataTransferAbort(); - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg) { WRITE(TFT_DC_PIN, LOW); Transmit(Reg); WRITE(TFT_DC_PIN, HIGH); } + static void writeData(uint16_t data) { transmit(data); } + static void writeReg(uint16_t reg) { WRITE(TFT_DC_PIN, LOW); transmit(reg); WRITE(TFT_DC_PIN, HIGH); } - static void WriteSequence_DMA(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } - static void WriteMultiple_DMA(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + static void writeSequence_DMA(uint16_t *data, uint16_t count) { transmitDMA(DMA_MINC_ENABLE, data, count); } + static void writeMultiple_DMA(uint16_t color, uint16_t count) { static uint16_t data; data = color; transmitDMA(DMA_MINC_DISABLE, &data, count); } - static void WriteSequence(uint16_t *Data, uint16_t Count) { Transmit(DMA_MINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - while (Count > 0) { - Transmit(DMA_MINC_DISABLE, &Color, Count > DMA_MAX_SIZE ? DMA_MAX_SIZE : Count); - Count = Count > DMA_MAX_SIZE ? Count - DMA_MAX_SIZE : 0; + static void writeSequence(uint16_t *data, uint16_t count) { transmit(DMA_MINC_ENABLE, data, count); } + static void writeMultiple(uint16_t color, uint32_t count) { + while (count > 0) { + transmit(DMA_MINC_DISABLE, &color, count > DMA_MAX_SIZE ? DMA_MAX_SIZE : count); + count = count > DMA_MAX_SIZE ? count - DMA_MAX_SIZE : 0; } } }; diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp index 68a2176f5e..74596935e9 100644 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.cpp @@ -20,6 +20,8 @@ * */ +#ifdef TARGET_LPC1768 + #include "../../../inc/MarlinConfig.h" #if HAS_TFT_XPT2046 || HAS_RES_TOUCH_BUTTONS @@ -43,7 +45,7 @@ uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } } #endif -void XPT2046::Init() { +void XPT2046::init() { #if DISABLED(TOUCH_BUTTONS_HW_SPI) SET_INPUT(TOUCH_MISO_PIN); SET_OUTPUT(TOUCH_MOSI_PIN); @@ -83,7 +85,7 @@ bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { uint16_t data[3]; - DataTransferBegin(); + dataTransferBegin(); TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.begin()); for (uint16_t i = 0; i < 3 ; i++) { @@ -92,7 +94,7 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { } TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.end()); - DataTransferEnd(); + dataTransferEnd(); uint16_t delta01 = delta(data[0], data[1]), delta02 = delta(data[0], data[2]), @@ -105,18 +107,18 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { } uint16_t XPT2046::IO(uint16_t data) { - return TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); + return TERN(TOUCH_BUTTONS_HW_SPI, hardwareIO, softwareIO)(data); } extern uint8_t spiTransfer(uint8_t b); #if ENABLED(TOUCH_BUTTONS_HW_SPI) - uint16_t XPT2046::HardwareIO(uint16_t data) { + uint16_t XPT2046::hardwareIO(uint16_t data) { return SPIx.transfer(data & 0xFF); } #endif -uint16_t XPT2046::SoftwareIO(uint16_t data) { +uint16_t XPT2046::softwareIO(uint16_t data) { uint16_t result = 0; for (uint8_t j = 0x80; j; j >>= 1) { @@ -130,4 +132,5 @@ uint16_t XPT2046::SoftwareIO(uint16_t data) { return result; } -#endif // HAS_TFT_XPT2046 +#endif // HAS_TFT_XPT2046 || HAS_RES_TOUCH_BUTTONS +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/tft/xpt2046.h b/Marlin/src/HAL/LPC1768/tft/xpt2046.h index 7c456cf00e..8fdcacf926 100644 --- a/Marlin/src/HAL/LPC1768/tft/xpt2046.h +++ b/Marlin/src/HAL/LPC1768/tft/xpt2046.h @@ -65,12 +65,12 @@ private: static uint16_t getRawData(const XPTCoordinate coordinate); static bool isTouched(); - static void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; - static void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + static void dataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; + static void dataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; #if ENABLED(TOUCH_BUTTONS_HW_SPI) - static uint16_t HardwareIO(uint16_t data); + static uint16_t hardwareIO(uint16_t data); #endif - static uint16_t SoftwareIO(uint16_t data); + static uint16_t softwareIO(uint16_t data); static uint16_t IO(uint16_t data = 0); public: @@ -78,6 +78,6 @@ public: static SPIClass SPIx; #endif - static void Init(); + static void init(); static bool getRawPoint(int16_t *x, int16_t *y); }; diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp index f116a9b80a..f6ed7b0e7e 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp @@ -75,7 +75,7 @@ uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { if (spi_speed == 0) { LPC176x::gpio_set(mosi_pin, !!(b & 0x80)); LPC176x::gpio_set(sck_pin, HIGH); @@ -85,16 +85,16 @@ uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck } else { const uint8_t state = (b & 0x80) ? HIGH : LOW; - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) LPC176x::gpio_set(mosi_pin, state); - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); ++j) LPC176x::gpio_set(sck_pin, HIGH); b <<= 1; if (miso_pin >= 0 && LPC176x::gpio_get(miso_pin)) b |= 1; - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) LPC176x::gpio_set(sck_pin, LOW); } } @@ -104,7 +104,7 @@ uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { const uint8_t state = (b & 0x80) ? HIGH : LOW; if (spi_speed == 0) { LPC176x::gpio_set(sck_pin, LOW); @@ -113,13 +113,13 @@ uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck LPC176x::gpio_set(sck_pin, HIGH); } else { - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); ++j) LPC176x::gpio_set(sck_pin, LOW); - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) LPC176x::gpio_set(mosi_pin, state); - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) LPC176x::gpio_set(sck_pin, HIGH); } b <<= 1; @@ -132,7 +132,7 @@ uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck static uint8_t SPI_speed = 0; static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) { - #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) + #if ANY(FYSETC_MINI_12864, MKS_MINI_12864) swSpiTransfer_mode_3(val, SPI_speed, clockPin, -1, dataPin); #else swSpiTransfer_mode_0(val, SPI_speed, clockPin, -1, dataPin); @@ -160,10 +160,10 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, break; case U8G_COM_MSG_CHIP_SELECT: - #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 - if (arg_val) { // SCK idle state needs to be set to the proper idle state before - // the next chip select goes active - u8g_SetPILevel(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active + #if ANY(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + u8g_SetPILevel(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active u8g_SetPILevel(u8g, U8G_PI_CS, LOW); } else { diff --git a/Marlin/src/HAL/NATIVE_SIM/pinsDebug.cpp b/Marlin/src/HAL/NATIVE_SIM/pinsDebug.cpp new file mode 100644 index 0000000000..e75826c58a --- /dev/null +++ b/Marlin/src/HAL/NATIVE_SIM/pinsDebug.cpp @@ -0,0 +1,45 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * 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 __PLAT_NATIVE_SIM__ + +#include "../../inc/MarlinConfig.h" +#include "pinsDebug.h" + +int8_t ADC_pin_mode(pin_t pin) { return -1; } + +int8_t get_pin_mode(const pin_t pin) { return VALID_PIN(pin) ? 0 : -1; } + +bool GET_PINMODE(const pin_t pin) { + const int8_t pin_mode = get_pin_mode(pin); + if (pin_mode == -1 || pin_mode == ADC_pin_mode(pin)) // Invalid pin or active analog pin + return false; + + return (Gpio::getMode(pin) != 0); // Input/output state +} + +bool GET_ARRAY_IS_DIGITAL(const pin_t pin) { + return !IS_ANALOG(pin) || get_pin_mode(pin) != ADC_pin_mode(pin); +} + +void print_port(const pin_t) {} +void pwm_details(const pin_t) {} +bool pwm_status(const pin_t) { return false; } + +#endif diff --git a/Marlin/src/HAL/NATIVE_SIM/pinsDebug.h b/Marlin/src/HAL/NATIVE_SIM/pinsDebug.h index aa90eb39a3..28821acbd0 100644 --- a/Marlin/src/HAL/NATIVE_SIM/pinsDebug.h +++ b/Marlin/src/HAL/NATIVE_SIM/pinsDebug.h @@ -27,35 +27,19 @@ */ #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS -#define pwm_details(pin) pin = pin // do nothing // print PWM details -#define pwm_status(pin) false //Print a pin's PWM status. Return true if it's currently a PWM pin. #define IS_ANALOG(P) (DIGITAL_PIN_TO_ANALOG_PIN(P) >= 0 ? 1 : 0) #define digitalRead_mod(p) digitalRead(p) -#define PRINT_PORT(p) #define GET_ARRAY_PIN(p) pin_array[p].pin #define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3d "), p); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0) #define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin -// active ADC function/mode/code values for PINSEL registers -inline constexpr int8_t ADC_pin_mode(pin_t pin) { - return (-1); -} - -inline int8_t get_pin_mode(pin_t pin) { - if (!VALID_PIN(pin)) return -1; - return 0; -} - -inline bool GET_PINMODE(pin_t pin) { - int8_t pin_mode = get_pin_mode(pin); - if (pin_mode == -1 || pin_mode == ADC_pin_mode(pin)) // found an invalid pin or active analog pin - return false; - - return (Gpio::getMode(pin) != 0); //input/output state -} - -inline bool GET_ARRAY_IS_DIGITAL(pin_t pin) { - return (!IS_ANALOG(pin) || get_pin_mode(pin) != ADC_pin_mode(pin)); -} +// Active ADC function/mode/code values for PINSEL registers +int8_t ADC_pin_mode(pin_t pin); +int8_t get_pin_mode(const pin_t pin); +bool GET_PINMODE(const pin_t pin); +bool GET_ARRAY_IS_DIGITAL(const pin_t pin); +void print_port(const pin_t); +void pwm_details(const pin_t); +bool pwm_status(const pin_t); diff --git a/Marlin/src/HAL/NATIVE_SIM/spi_pins.h b/Marlin/src/HAL/NATIVE_SIM/spi_pins.h index 02fb359238..9b1bae9a58 100644 --- a/Marlin/src/HAL/NATIVE_SIM/spi_pins.h +++ b/Marlin/src/HAL/NATIVE_SIM/spi_pins.h @@ -24,7 +24,7 @@ #include "../../core/macros.h" #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_U8GLIB, HAS_MEDIA) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_EN == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) +#if ALL(HAS_MARLINUI_U8GLIB, HAS_MEDIA) && (LCD_PINS_D4 == SD_SCK_PIN || LCD_PINS_EN == SD_MOSI_PIN || DOGLCD_SCK == SD_SCK_PIN || DOGLCD_MOSI == SD_MOSI_PIN) #define SOFTWARE_SPI // If the SD card and LCD adapter share the same SPI pins, then software SPI is currently // needed due to the speed and mode required for communicating with each device being different. // This requirement can be removed if the SPI access to these devices is updated to use diff --git a/Marlin/src/HAL/NATIVE_SIM/tft/tft_spi.h b/Marlin/src/HAL/NATIVE_SIM/tft/tft_spi.h index f3b64c4cca..df7b942099 100644 --- a/Marlin/src/HAL/NATIVE_SIM/tft/tft_spi.h +++ b/Marlin/src/HAL/NATIVE_SIM/tft/tft_spi.h @@ -40,28 +40,28 @@ class TFT_SPI { private: - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + static uint32_t readID(uint16_t reg); + static void transmit(uint16_t data); + static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count); public: // static SPIClass SPIx; - static void Init(); - static uint32_t GetID(); + static void init(); + static uint32_t getID(); static bool isBusy(); - static void Abort(); + static void abort(); - static void DataTransferBegin(uint16_t DataWidth=DATASIZE_16BIT); - static void DataTransferEnd(); - static void DataTransferAbort(); + static void dataTransferBegin(uint16_t dataWidth=DATASIZE_16BIT); + static void dataTransferEnd(); + static void dataTransferAbort(); - static void WriteData(uint16_t Data); - static void WriteReg(uint16_t Reg); + static void writeData(uint16_t data); + static void writeReg(uint16_t reg); - static void WriteSequence_DMA(uint16_t *Data, uint16_t Count) { WriteSequence(Data, Count); } - static void WriteMultiple_DMA(uint16_t Color, uint16_t Count) { WriteMultiple(Color, Count); } + static void writeSequence_DMA(uint16_t *data, uint16_t count) { writeSequence(data, count); } + static void writeMultiple_DMA(uint16_t color, uint16_t count) { writeMultiple(color, count); } - static void WriteSequence(uint16_t *Data, uint16_t Count); - static void WriteMultiple(uint16_t Color, uint32_t Count); + static void writeSequence(uint16_t *data, uint16_t count); + static void writeMultiple(uint16_t color, uint32_t count); }; diff --git a/Marlin/src/HAL/NATIVE_SIM/tft/xpt2046.h b/Marlin/src/HAL/NATIVE_SIM/tft/xpt2046.h index 4e999f88ff..c546646d16 100644 --- a/Marlin/src/HAL/NATIVE_SIM/tft/xpt2046.h +++ b/Marlin/src/HAL/NATIVE_SIM/tft/xpt2046.h @@ -62,12 +62,12 @@ private: static uint16_t getRawData(const XPTCoordinate coordinate); static bool isTouched(); - static void DataTransferBegin(); - static void DataTransferEnd(); + static void dataTransferBegin(); + static void dataTransferEnd(); #if ENABLED(TOUCH_BUTTONS_HW_SPI) - static uint16_t HardwareIO(uint16_t data); + static uint16_t hardwareIO(uint16_t data); #endif - static uint16_t SoftwareIO(uint16_t data); + static uint16_t softwareIO(uint16_t data); static uint16_t IO(uint16_t data = 0); public: @@ -75,6 +75,6 @@ public: static SPIClass SPIx; #endif - static void Init(); + static void init(); static bool getRawPoint(int16_t *x, int16_t *y); }; diff --git a/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp b/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp index 7be84580b1..9184e2f618 100644 --- a/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp +++ b/Marlin/src/HAL/NATIVE_SIM/u8g/u8g_com_sw_spi.cpp @@ -70,7 +70,7 @@ #endif uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { if (spi_speed == 0) { WRITE_PIN(mosi_pin, !!(b & 0x80)); WRITE_PIN(sck_pin, HIGH); @@ -80,16 +80,16 @@ uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck } else { const uint8_t state = (b & 0x80) ? HIGH : LOW; - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) WRITE_PIN(mosi_pin, state); - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); ++j) WRITE_PIN(sck_pin, HIGH); b <<= 1; if (miso_pin >= 0 && READ_PIN(miso_pin)) b |= 1; - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) WRITE_PIN(sck_pin, LOW); } } @@ -99,7 +99,7 @@ uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t sck uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck_pin, const pin_t miso_pin, const pin_t mosi_pin ) { - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { const uint8_t state = (b & 0x80) ? HIGH : LOW; if (spi_speed == 0) { WRITE_PIN(sck_pin, LOW); @@ -108,13 +108,13 @@ uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck WRITE_PIN(sck_pin, HIGH); } else { - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); ++j) WRITE_PIN(sck_pin, LOW); - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) WRITE_PIN(mosi_pin, state); - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) WRITE_PIN(sck_pin, HIGH); } b <<= 1; @@ -131,7 +131,7 @@ static uint8_t swSpiInit(const uint8_t spi_speed, const uint8_t clk_pin, const u } static void u8g_sw_spi_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) { - #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) + #if ANY(FYSETC_MINI_12864, MKS_MINI_12864) swSpiTransfer_mode_3(val, SPI_speed, clockPin, -1, dataPin); #else swSpiTransfer_mode_0(val, SPI_speed, clockPin, -1, dataPin); @@ -159,10 +159,10 @@ uint8_t u8g_com_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_pt break; case U8G_COM_MSG_CHIP_SELECT: - #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 - if (arg_val) { // SCK idle state needs to be set to the proper idle state before - // the next chip select goes active - u8g_SetPILevel(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active + #if ANY(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + u8g_SetPILevel(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active u8g_SetPILevel(u8g, U8G_PI_CS, LOW); } else { diff --git a/Marlin/src/HAL/SAMD21/HAL_SPI.cpp b/Marlin/src/HAL/SAMD21/HAL_SPI.cpp index 69c6a43af8..e01f540cf8 100644 --- a/Marlin/src/HAL/SAMD21/HAL_SPI.cpp +++ b/Marlin/src/HAL/SAMD21/HAL_SPI.cpp @@ -45,7 +45,7 @@ // Public functions // -------------------------------------------------------------------------- -#if EITHER(SOFTWARE_SPI, FORCE_SOFT_SPI) +#if ANY(SOFTWARE_SPI, FORCE_SOFT_SPI) // ------------------------ // Software SPI diff --git a/Marlin/src/HAL/SAMD21/endstop_interrupts.h b/Marlin/src/HAL/SAMD21/endstop_interrupts.h index d8711aa018..31414a39e3 100644 --- a/Marlin/src/HAL/SAMD21/endstop_interrupts.h +++ b/Marlin/src/HAL/SAMD21/endstop_interrupts.h @@ -54,31 +54,35 @@ #include "../../module/endstops.h" #define MATCH_EILINE(P1,P2) (P1 != P2 && PIN_TO_EILINE(P1) == PIN_TO_EILINE(P2)) -#define MATCH_X_MAX_EILINE(P) TERN0(HAS_X_MAX, DEFER4(MATCH_EILINE)(P, X_MAX_PIN)) -#define MATCH_X_MIN_EILINE(P) TERN0(HAS_X_MIN, DEFER4(MATCH_EILINE)(P, X_MIN_PIN)) -#define MATCH_Y_MAX_EILINE(P) TERN0(HAS_Y_MAX, DEFER4(MATCH_EILINE)(P, Y_MAX_PIN)) -#define MATCH_Y_MIN_EILINE(P) TERN0(HAS_Y_MIN, DEFER4(MATCH_EILINE)(P, Y_MIN_PIN)) -#define MATCH_Z_MAX_EILINE(P) TERN0(HAS_Z_MAX, DEFER4(MATCH_EILINE)(P, Z_MAX_PIN)) -#define MATCH_Z_MIN_EILINE(P) TERN0(HAS_Z_MIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PIN)) -#define MATCH_I_MAX_EILINE(P) TERN0(HAS_I_MAX, DEFER4(MATCH_EILINE)(P, I_MAX_PIN)) -#define MATCH_I_MIN_EILINE(P) TERN0(HAS_I_MIN, DEFER4(MATCH_EILINE)(P, I_MIN_PIN)) -#define MATCH_J_MAX_EILINE(P) TERN0(HAS_J_MAX, DEFER4(MATCH_EILINE)(P, J_MAX_PIN)) -#define MATCH_J_MIN_EILINE(P) TERN0(HAS_J_MIN, DEFER4(MATCH_EILINE)(P, J_MIN_PIN)) -#define MATCH_K_MAX_EILINE(P) TERN0(HAS_K_MAX, DEFER4(MATCH_EILINE)(P, K_MAX_PIN)) -#define MATCH_K_MIN_EILINE(P) TERN0(HAS_K_MIN, DEFER4(MATCH_EILINE)(P, K_MIN_PIN)) -#define MATCH_U_MAX_EILINE(P) TERN0(HAS_U_MAX, DEFER4(MATCH_EILINE)(P, U_MAX_PIN)) -#define MATCH_U_MIN_EILINE(P) TERN0(HAS_U_MIN, DEFER4(MATCH_EILINE)(P, U_MIN_PIN)) -#define MATCH_V_MAX_EILINE(P) TERN0(HAS_V_MAX, DEFER4(MATCH_EILINE)(P, V_MAX_PIN)) -#define MATCH_V_MIN_EILINE(P) TERN0(HAS_V_MIN, DEFER4(MATCH_EILINE)(P, V_MIN_PIN)) -#define MATCH_W_MAX_EILINE(P) TERN0(HAS_W_MAX, DEFER4(MATCH_EILINE)(P, W_MAX_PIN)) -#define MATCH_W_MIN_EILINE(P) TERN0(HAS_W_MIN, DEFER4(MATCH_EILINE)(P, W_MIN_PIN)) -#define MATCH_Z2_MAX_EILINE(P) TERN0(HAS_Z2_MAX, DEFER4(MATCH_EILINE)(P, Z2_MAX_PIN)) -#define MATCH_Z2_MIN_EILINE(P) TERN0(HAS_Z2_MIN, DEFER4(MATCH_EILINE)(P, Z2_MIN_PIN)) -#define MATCH_Z3_MAX_EILINE(P) TERN0(HAS_Z3_MAX, DEFER4(MATCH_EILINE)(P, Z3_MAX_PIN)) -#define MATCH_Z3_MIN_EILINE(P) TERN0(HAS_Z3_MIN, DEFER4(MATCH_EILINE)(P, Z3_MIN_PIN)) -#define MATCH_Z4_MAX_EILINE(P) TERN0(HAS_Z4_MAX, DEFER4(MATCH_EILINE)(P, Z4_MAX_PIN)) -#define MATCH_Z4_MIN_EILINE(P) TERN0(HAS_Z4_MIN, DEFER4(MATCH_EILINE)(P, Z4_MIN_PIN)) -#define MATCH_Z_MIN_PROBE_EILINE(P) TERN0(HAS_Z_MIN_PROBE_PIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PROBE_PIN)) +#define MATCH_X_MAX_EILINE(P) TERN0(USE_X_MAX, DEFER4(MATCH_EILINE)(P, X_MAX_PIN)) +#define MATCH_X_MIN_EILINE(P) TERN0(USE_X_MIN, DEFER4(MATCH_EILINE)(P, X_MIN_PIN)) +#define MATCH_Y_MAX_EILINE(P) TERN0(USE_Y_MAX, DEFER4(MATCH_EILINE)(P, Y_MAX_PIN)) +#define MATCH_Y_MIN_EILINE(P) TERN0(USE_Y_MIN, DEFER4(MATCH_EILINE)(P, Y_MIN_PIN)) +#define MATCH_Z_MAX_EILINE(P) TERN0(USE_Z_MAX, DEFER4(MATCH_EILINE)(P, Z_MAX_PIN)) +#define MATCH_Z_MIN_EILINE(P) TERN0(HAS_Z_MIN_PIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PIN)) +#define MATCH_I_MAX_EILINE(P) TERN0(USE_I_MAX, DEFER4(MATCH_EILINE)(P, I_MAX_PIN)) +#define MATCH_I_MIN_EILINE(P) TERN0(USE_I_MIN, DEFER4(MATCH_EILINE)(P, I_MIN_PIN)) +#define MATCH_J_MAX_EILINE(P) TERN0(USE_J_MAX, DEFER4(MATCH_EILINE)(P, J_MAX_PIN)) +#define MATCH_J_MIN_EILINE(P) TERN0(USE_J_MIN, DEFER4(MATCH_EILINE)(P, J_MIN_PIN)) +#define MATCH_K_MAX_EILINE(P) TERN0(USE_K_MAX, DEFER4(MATCH_EILINE)(P, K_MAX_PIN)) +#define MATCH_K_MIN_EILINE(P) TERN0(USE_K_MIN, DEFER4(MATCH_EILINE)(P, K_MIN_PIN)) +#define MATCH_U_MAX_EILINE(P) TERN0(USE_U_MAX, DEFER4(MATCH_EILINE)(P, U_MAX_PIN)) +#define MATCH_U_MIN_EILINE(P) TERN0(USE_U_MIN, DEFER4(MATCH_EILINE)(P, U_MIN_PIN)) +#define MATCH_V_MAX_EILINE(P) TERN0(USE_V_MAX, DEFER4(MATCH_EILINE)(P, V_MAX_PIN)) +#define MATCH_V_MIN_EILINE(P) TERN0(USE_V_MIN, DEFER4(MATCH_EILINE)(P, V_MIN_PIN)) +#define MATCH_W_MAX_EILINE(P) TERN0(USE_W_MAX, DEFER4(MATCH_EILINE)(P, W_MAX_PIN)) +#define MATCH_W_MIN_EILINE(P) TERN0(USE_W_MIN, DEFER4(MATCH_EILINE)(P, W_MIN_PIN)) +#define MATCH_X2_MAX_EILINE(P) TERN0(USE_X2_MAX, DEFER4(MATCH_EILINE)(P, X2_MAX_PIN)) +#define MATCH_X2_MIN_EILINE(P) TERN0(USE_X2_MIN, DEFER4(MATCH_EILINE)(P, X2_MIN_PIN)) +#define MATCH_Y2_MAX_EILINE(P) TERN0(USE_Y2_MAX, DEFER4(MATCH_EILINE)(P, Y2_MAX_PIN)) +#define MATCH_Y2_MIN_EILINE(P) TERN0(USE_Y2_MIN, DEFER4(MATCH_EILINE)(P, Y2_MIN_PIN)) +#define MATCH_Z2_MAX_EILINE(P) TERN0(USE_Z2_MAX, DEFER4(MATCH_EILINE)(P, Z2_MAX_PIN)) +#define MATCH_Z2_MIN_EILINE(P) TERN0(USE_Z2_MIN, DEFER4(MATCH_EILINE)(P, Z2_MIN_PIN)) +#define MATCH_Z3_MAX_EILINE(P) TERN0(USE_Z3_MAX, DEFER4(MATCH_EILINE)(P, Z3_MAX_PIN)) +#define MATCH_Z3_MIN_EILINE(P) TERN0(USE_Z3_MIN, DEFER4(MATCH_EILINE)(P, Z3_MIN_PIN)) +#define MATCH_Z4_MAX_EILINE(P) TERN0(USE_Z4_MAX, DEFER4(MATCH_EILINE)(P, Z4_MAX_PIN)) +#define MATCH_Z4_MIN_EILINE(P) TERN0(USE_Z4_MIN, DEFER4(MATCH_EILINE)(P, Z4_MIN_PIN)) +#define MATCH_Z_MIN_PROBE_EILINE(P) TERN0(USE_Z_MIN_PROBE, DEFER4(MATCH_EILINE)(P, Z_MIN_PROBE_PIN)) #define AVAILABLE_EILINE(P) ( PIN_TO_EILINE(P) != -1 \ && !MATCH_X_MAX_EILINE(P) && !MATCH_X_MIN_EILINE(P) \ @@ -90,6 +94,8 @@ && !MATCH_U_MAX_EILINE(P) && !MATCH_U_MIN_EILINE(P) \ && !MATCH_V_MAX_EILINE(P) && !MATCH_V_MIN_EILINE(P) \ && !MATCH_W_MAX_EILINE(P) && !MATCH_W_MIN_EILINE(P) \ + && !MATCH_X2_MAX_EILINE(P) && !MATCH_X2_MIN_EILINE(P) \ + && !MATCH_Y2_MAX_EILINE(P) && !MATCH_Y2_MIN_EILINE(P) \ && !MATCH_Z2_MAX_EILINE(P) && !MATCH_Z2_MIN_EILINE(P) \ && !MATCH_Z3_MAX_EILINE(P) && !MATCH_Z3_MIN_EILINE(P) \ && !MATCH_Z4_MAX_EILINE(P) && !MATCH_Z4_MIN_EILINE(P) \ @@ -100,153 +106,177 @@ void endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - #if HAS_X_MAX + #if USE_X_MAX #if !AVAILABLE_EILINE(X_MAX_PIN) - #error "X_MAX_PIN has no EXTINT line available." + #error "X_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(X_MAX_PIN); #endif - #if HAS_X_MIN + #if USE_X_MIN #if !AVAILABLE_EILINE(X_MIN_PIN) - #error "X_MIN_PIN has no EXTINT line available." + #error "X_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(X_MIN_PIN); #endif - #if HAS_Y_MAX + #if USE_Y_MAX #if !AVAILABLE_EILINE(Y_MAX_PIN) - #error "Y_MAX_PIN has no EXTINT line available." + #error "Y_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Y_MAX_PIN); #endif - #if HAS_Y_MIN + #if USE_Y_MIN #if !AVAILABLE_EILINE(Y_MIN_PIN) - #error "Y_MIN_PIN has no EXTINT line available." + #error "Y_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Y_MIN_PIN); #endif - #if HAS_Z_MAX + #if USE_Z_MAX #if !AVAILABLE_EILINE(Z_MAX_PIN) - #error "Z_MAX_PIN has no EXTINT line available." + #error "Z_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MAX_PIN); #endif - #if HAS_Z_MIN + #if HAS_Z_MIN_PIN #if !AVAILABLE_EILINE(Z_MIN_PIN) - #error "Z_MIN_PIN has no EXTINT line available." + #error "Z_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MIN_PIN); #endif - #if HAS_Z2_MAX + #if USE_X2_MAX + #if !AVAILABLE_EILINE(X2_MAX_PIN) + #error "X2_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." + #endif + _ATTACH(X2_MAX_PIN); + #endif + #if USE_X2_MIN + #if !AVAILABLE_EILINE(X2_MIN_PIN) + #error "X2_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." + #endif + _ATTACH(X2_MIN_PIN); + #endif + #if USE_Y2_MAX + #if !AVAILABLE_EILINE(Y2_MAX_PIN) + #error "Y2_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." + #endif + _ATTACH(Y2_MAX_PIN); + #endif + #if USE_Y2_MIN + #if !AVAILABLE_EILINE(Y2_MIN_PIN) + #error "Y2_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." + #endif + _ATTACH(Y2_MIN_PIN); + #endif + #if USE_Z2_MAX #if !AVAILABLE_EILINE(Z2_MAX_PIN) - #error "Z2_MAX_PIN has no EXTINT line available." + #error "Z2_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z2_MAX_PIN); #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN #if !AVAILABLE_EILINE(Z2_MIN_PIN) - #error "Z2_MIN_PIN has no EXTINT line available." + #error "Z2_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z2_MIN_PIN); #endif - #if HAS_Z3_MAX + #if USE_Z3_MAX #if !AVAILABLE_EILINE(Z3_MAX_PIN) - #error "Z3_MAX_PIN has no EXTINT line available." + #error "Z3_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z3_MAX_PIN); #endif - #if HAS_Z3_MIN + #if USE_Z3_MIN #if !AVAILABLE_EILINE(Z3_MIN_PIN) - #error "Z3_MIN_PIN has no EXTINT line available." + #error "Z3_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z3_MIN_PIN); #endif - #if HAS_Z4_MAX + #if USE_Z4_MAX #if !AVAILABLE_EILINE(Z4_MAX_PIN) - #error "Z4_MAX_PIN has no EXTINT line available." + #error "Z4_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z4_MAX_PIN); #endif - #if HAS_Z4_MIN + #if USE_Z4_MIN #if !AVAILABLE_EILINE(Z4_MIN_PIN) - #error "Z4_MIN_PIN has no EXTINT line available." + #error "Z4_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z4_MIN_PIN); #endif - #if HAS_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE #if !AVAILABLE_EILINE(Z_MIN_PROBE_PIN) - #error "Z_MIN_PROBE_PIN has no EXTINT line available." + #error "Z_MIN_PROBE_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MIN_PROBE_PIN); #endif - #if HAS_I_MAX + #if USE_I_MAX #if !AVAILABLE_EILINE(I_MAX_PIN) - #error "I_MAX_PIN has no EXTINT line available." + #error "I_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_I_MIN + #if USE_I_MIN #if !AVAILABLE_EILINE(I_MIN_PIN) - #error "I_MIN_PIN has no EXTINT line available." + #error "I_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(I_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_J_MAX + #if USE_J_MAX #if !AVAILABLE_EILINE(J_MAX_PIN) - #error "J_MAX_PIN has no EXTINT line available." + #error "J_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_J_MIN + #if USE_J_MIN #if !AVAILABLE_EILINE(J_MIN_PIN) - #error "J_MIN_PIN has no EXTINT line available." + #error "J_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(J_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_K_MAX + #if USE_K_MAX #if !AVAILABLE_EILINE(K_MAX_PIN) - #error "K_MAX_PIN has no EXTINT line available." + #error "K_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_K_MIN + #if USE_K_MIN #if !AVAILABLE_EILINE(K_MIN_PIN) - #error "K_MIN_PIN has no EXTINT line available." + #error "K_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(K_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_U_MAX + #if USE_U_MAX #if !AVAILABLE_EILINE(U_MAX_PIN) - #error "U_MAX_PIN has no EXTINT line available." + #error "U_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(U_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_U_MIN + #if USE_U_MIN #if !AVAILABLE_EILINE(U_MIN_PIN) - #error "U_MIN_PIN has no EXTINT line available." + #error "U_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(U_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_V_MAX + #if USE_V_MAX #if !AVAILABLE_EILINE(V_MAX_PIN) - #error "V_MAX_PIN has no EXTINT line available." + #error "V_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(V_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_V_MIN + #if USE_V_MIN #if !AVAILABLE_EILINE(V_MIN_PIN) - #error "V_MIN_PIN has no EXTINT line available." + #error "V_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(V_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_W_MAX + #if USE_W_MAX #if !AVAILABLE_EILINE(W_MAX_PIN) - #error "W_MAX_PIN has no EXTINT line available." + #error "W_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(W_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_W_MIN + #if USE_W_MIN #if !AVAILABLE_EILINE(W_MIN_PIN) - #error "W_MIN_PIN has no EXTINT line available." + #error "W_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(W_MIN_PIN, endstop_ISR, CHANGE); #endif diff --git a/Marlin/src/HAL/SAMD21/inc/Conditionals_post.h b/Marlin/src/HAL/SAMD21/inc/Conditionals_post.h index 7315dc12a7..87d3350c94 100644 --- a/Marlin/src/HAL/SAMD21/inc/Conditionals_post.h +++ b/Marlin/src/HAL/SAMD21/inc/Conditionals_post.h @@ -28,6 +28,6 @@ #if USE_FALLBACK_EEPROM #define FLASH_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) +#elif ANY(I2C_EEPROM, SPI_EEPROM) #define USE_SHARED_EEPROM 1 #endif diff --git a/Marlin/src/HAL/SAMD21/u8g/u8g_com_HAL_samd21_shared_hw_spi.cpp b/Marlin/src/HAL/SAMD21/u8g/u8g_com_HAL_samd21_shared_hw_spi.cpp index 02dc772296..025e5a3bb6 100644 --- a/Marlin/src/HAL/SAMD21/u8g/u8g_com_HAL_samd21_shared_hw_spi.cpp +++ b/Marlin/src/HAL/SAMD21/u8g/u8g_com_HAL_samd21_shared_hw_spi.cpp @@ -60,6 +60,10 @@ #ifdef __SAMD21__ +#include "../../../inc/MarlinConfigPre.h" + +#if HAS_MARLINUI_U8GLIB + #include #include "SPI.h" @@ -151,4 +155,6 @@ uint8_t u8g_com_samd21_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val return 1; } +#endif // HAS_MARLINUI_U8GLIB + #endif // __SAMD21__ diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index bc7a9b6d91..8ec5d5a86c 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -650,10 +650,10 @@ void MarlinHAL::adc_init() { #if ADC_IS_REQUIRED memset(adc_results, 0xFF, sizeof(adc_results)); // Fill result with invalid values - LOOP_L_N(pi, COUNT(adc_pins)) + for (uint8_t pi = 0; pi < COUNT(adc_pins); ++pi) pinPeripheral(adc_pins[pi], PIO_ANALOG); - LOOP_S_LE_N(ai, FIRST_ADC, LAST_ADC) { + for (uint8_t ai = FIRST_ADC; ai <= LAST_ADC; ++ai) { Adc* adc = ((Adc*[])ADC_INSTS)[ai]; // ADC clock setup @@ -685,7 +685,7 @@ void MarlinHAL::adc_init() { void MarlinHAL::adc_start(const pin_t pin) { #if ADC_IS_REQUIRED - LOOP_L_N(pi, COUNT(adc_pins)) + for (uint8_t pi = 0; pi < COUNT(adc_pins); ++pi) if (pin == adc_pins[pi]) { adc_result = adc_results[pi]; return; } #endif diff --git a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp index 58fdfe9499..63d3971965 100644 --- a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp +++ b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp @@ -44,7 +44,7 @@ // Public functions // -------------------------------------------------------------------------- -#if EITHER(SOFTWARE_SPI, FORCE_SOFT_SPI) +#if ANY(SOFTWARE_SPI, FORCE_SOFT_SPI) // ------------------------ // Software SPI diff --git a/Marlin/src/HAL/SAMD51/endstop_interrupts.h b/Marlin/src/HAL/SAMD51/endstop_interrupts.h index e0e811c3a0..40f78baf87 100644 --- a/Marlin/src/HAL/SAMD51/endstop_interrupts.h +++ b/Marlin/src/HAL/SAMD51/endstop_interrupts.h @@ -53,31 +53,35 @@ #include "../../module/endstops.h" #define MATCH_EILINE(P1,P2) (P1 != P2 && PIN_TO_EILINE(P1) == PIN_TO_EILINE(P2)) -#define MATCH_X_MAX_EILINE(P) TERN0(HAS_X_MAX, DEFER4(MATCH_EILINE)(P, X_MAX_PIN)) -#define MATCH_X_MIN_EILINE(P) TERN0(HAS_X_MIN, DEFER4(MATCH_EILINE)(P, X_MIN_PIN)) -#define MATCH_Y_MAX_EILINE(P) TERN0(HAS_Y_MAX, DEFER4(MATCH_EILINE)(P, Y_MAX_PIN)) -#define MATCH_Y_MIN_EILINE(P) TERN0(HAS_Y_MIN, DEFER4(MATCH_EILINE)(P, Y_MIN_PIN)) -#define MATCH_Z_MAX_EILINE(P) TERN0(HAS_Z_MAX, DEFER4(MATCH_EILINE)(P, Z_MAX_PIN)) -#define MATCH_Z_MIN_EILINE(P) TERN0(HAS_Z_MIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PIN)) -#define MATCH_I_MAX_EILINE(P) TERN0(HAS_I_MAX, DEFER4(MATCH_EILINE)(P, I_MAX_PIN)) -#define MATCH_I_MIN_EILINE(P) TERN0(HAS_I_MIN, DEFER4(MATCH_EILINE)(P, I_MIN_PIN)) -#define MATCH_J_MAX_EILINE(P) TERN0(HAS_J_MAX, DEFER4(MATCH_EILINE)(P, J_MAX_PIN)) -#define MATCH_J_MIN_EILINE(P) TERN0(HAS_J_MIN, DEFER4(MATCH_EILINE)(P, J_MIN_PIN)) -#define MATCH_K_MAX_EILINE(P) TERN0(HAS_K_MAX, DEFER4(MATCH_EILINE)(P, K_MAX_PIN)) -#define MATCH_K_MIN_EILINE(P) TERN0(HAS_K_MIN, DEFER4(MATCH_EILINE)(P, K_MIN_PIN)) -#define MATCH_U_MAX_EILINE(P) TERN0(HAS_U_MAX, DEFER4(MATCH_EILINE)(P, U_MAX_PIN)) -#define MATCH_U_MIN_EILINE(P) TERN0(HAS_U_MIN, DEFER4(MATCH_EILINE)(P, U_MIN_PIN)) -#define MATCH_V_MAX_EILINE(P) TERN0(HAS_V_MAX, DEFER4(MATCH_EILINE)(P, V_MAX_PIN)) -#define MATCH_V_MIN_EILINE(P) TERN0(HAS_V_MIN, DEFER4(MATCH_EILINE)(P, V_MIN_PIN)) -#define MATCH_W_MAX_EILINE(P) TERN0(HAS_W_MAX, DEFER4(MATCH_EILINE)(P, W_MAX_PIN)) -#define MATCH_W_MIN_EILINE(P) TERN0(HAS_W_MIN, DEFER4(MATCH_EILINE)(P, W_MIN_PIN)) -#define MATCH_Z2_MAX_EILINE(P) TERN0(HAS_Z2_MAX, DEFER4(MATCH_EILINE)(P, Z2_MAX_PIN)) -#define MATCH_Z2_MIN_EILINE(P) TERN0(HAS_Z2_MIN, DEFER4(MATCH_EILINE)(P, Z2_MIN_PIN)) -#define MATCH_Z3_MAX_EILINE(P) TERN0(HAS_Z3_MAX, DEFER4(MATCH_EILINE)(P, Z3_MAX_PIN)) -#define MATCH_Z3_MIN_EILINE(P) TERN0(HAS_Z3_MIN, DEFER4(MATCH_EILINE)(P, Z3_MIN_PIN)) -#define MATCH_Z4_MAX_EILINE(P) TERN0(HAS_Z4_MAX, DEFER4(MATCH_EILINE)(P, Z4_MAX_PIN)) -#define MATCH_Z4_MIN_EILINE(P) TERN0(HAS_Z4_MIN, DEFER4(MATCH_EILINE)(P, Z4_MIN_PIN)) -#define MATCH_Z_MIN_PROBE_EILINE(P) TERN0(HAS_Z_MIN_PROBE_PIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PROBE_PIN)) +#define MATCH_X_MAX_EILINE(P) TERN0(USE_X_MAX, DEFER4(MATCH_EILINE)(P, X_MAX_PIN)) +#define MATCH_X_MIN_EILINE(P) TERN0(USE_X_MIN, DEFER4(MATCH_EILINE)(P, X_MIN_PIN)) +#define MATCH_Y_MAX_EILINE(P) TERN0(USE_Y_MAX, DEFER4(MATCH_EILINE)(P, Y_MAX_PIN)) +#define MATCH_Y_MIN_EILINE(P) TERN0(USE_Y_MIN, DEFER4(MATCH_EILINE)(P, Y_MIN_PIN)) +#define MATCH_Z_MAX_EILINE(P) TERN0(USE_Z_MAX, DEFER4(MATCH_EILINE)(P, Z_MAX_PIN)) +#define MATCH_Z_MIN_EILINE(P) TERN0(HAS_Z_MIN_PIN, DEFER4(MATCH_EILINE)(P, Z_MIN_PIN)) +#define MATCH_I_MAX_EILINE(P) TERN0(USE_I_MAX, DEFER4(MATCH_EILINE)(P, I_MAX_PIN)) +#define MATCH_I_MIN_EILINE(P) TERN0(USE_I_MIN, DEFER4(MATCH_EILINE)(P, I_MIN_PIN)) +#define MATCH_J_MAX_EILINE(P) TERN0(USE_J_MAX, DEFER4(MATCH_EILINE)(P, J_MAX_PIN)) +#define MATCH_J_MIN_EILINE(P) TERN0(USE_J_MIN, DEFER4(MATCH_EILINE)(P, J_MIN_PIN)) +#define MATCH_K_MAX_EILINE(P) TERN0(USE_K_MAX, DEFER4(MATCH_EILINE)(P, K_MAX_PIN)) +#define MATCH_K_MIN_EILINE(P) TERN0(USE_K_MIN, DEFER4(MATCH_EILINE)(P, K_MIN_PIN)) +#define MATCH_U_MAX_EILINE(P) TERN0(USE_U_MAX, DEFER4(MATCH_EILINE)(P, U_MAX_PIN)) +#define MATCH_U_MIN_EILINE(P) TERN0(USE_U_MIN, DEFER4(MATCH_EILINE)(P, U_MIN_PIN)) +#define MATCH_V_MAX_EILINE(P) TERN0(USE_V_MAX, DEFER4(MATCH_EILINE)(P, V_MAX_PIN)) +#define MATCH_V_MIN_EILINE(P) TERN0(USE_V_MIN, DEFER4(MATCH_EILINE)(P, V_MIN_PIN)) +#define MATCH_W_MAX_EILINE(P) TERN0(USE_W_MAX, DEFER4(MATCH_EILINE)(P, W_MAX_PIN)) +#define MATCH_W_MIN_EILINE(P) TERN0(USE_W_MIN, DEFER4(MATCH_EILINE)(P, W_MIN_PIN)) +#define MATCH_X2_MAX_EILINE(P) TERN0(USE_X2_MAX, DEFER4(MATCH_EILINE)(P, X2_MAX_PIN)) +#define MATCH_X2_MIN_EILINE(P) TERN0(USE_X2_MIN, DEFER4(MATCH_EILINE)(P, X2_MIN_PIN)) +#define MATCH_Y2_MAX_EILINE(P) TERN0(USE_Y2_MAX, DEFER4(MATCH_EILINE)(P, Y2_MAX_PIN)) +#define MATCH_Y2_MIN_EILINE(P) TERN0(USE_Y2_MIN, DEFER4(MATCH_EILINE)(P, Y2_MIN_PIN)) +#define MATCH_Z2_MAX_EILINE(P) TERN0(USE_Z2_MAX, DEFER4(MATCH_EILINE)(P, Z2_MAX_PIN)) +#define MATCH_Z2_MIN_EILINE(P) TERN0(USE_Z2_MIN, DEFER4(MATCH_EILINE)(P, Z2_MIN_PIN)) +#define MATCH_Z3_MAX_EILINE(P) TERN0(USE_Z3_MAX, DEFER4(MATCH_EILINE)(P, Z3_MAX_PIN)) +#define MATCH_Z3_MIN_EILINE(P) TERN0(USE_Z3_MIN, DEFER4(MATCH_EILINE)(P, Z3_MIN_PIN)) +#define MATCH_Z4_MAX_EILINE(P) TERN0(USE_Z4_MAX, DEFER4(MATCH_EILINE)(P, Z4_MAX_PIN)) +#define MATCH_Z4_MIN_EILINE(P) TERN0(USE_Z4_MIN, DEFER4(MATCH_EILINE)(P, Z4_MIN_PIN)) +#define MATCH_Z_MIN_PROBE_EILINE(P) TERN0(USE_Z_MIN_PROBE, DEFER4(MATCH_EILINE)(P, Z_MIN_PROBE_PIN)) #define AVAILABLE_EILINE(P) ( PIN_TO_EILINE(P) != -1 \ && !MATCH_X_MAX_EILINE(P) && !MATCH_X_MIN_EILINE(P) \ @@ -89,6 +93,8 @@ && !MATCH_U_MAX_EILINE(P) && !MATCH_U_MIN_EILINE(P) \ && !MATCH_V_MAX_EILINE(P) && !MATCH_V_MIN_EILINE(P) \ && !MATCH_W_MAX_EILINE(P) && !MATCH_W_MIN_EILINE(P) \ + && !MATCH_X2_MAX_EILINE(P) && !MATCH_X2_MIN_EILINE(P) \ + && !MATCH_Y2_MAX_EILINE(P) && !MATCH_Y2_MIN_EILINE(P) \ && !MATCH_Z2_MAX_EILINE(P) && !MATCH_Z2_MIN_EILINE(P) \ && !MATCH_Z3_MAX_EILINE(P) && !MATCH_Z3_MIN_EILINE(P) \ && !MATCH_Z4_MAX_EILINE(P) && !MATCH_Z4_MIN_EILINE(P) \ @@ -99,153 +105,153 @@ void endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - #if HAS_X_MAX + #if USE_X_MAX #if !AVAILABLE_EILINE(X_MAX_PIN) - #error "X_MAX_PIN has no EXTINT line available." + #error "X_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(X_MAX_PIN); #endif - #if HAS_X_MIN + #if USE_X_MIN #if !AVAILABLE_EILINE(X_MIN_PIN) - #error "X_MIN_PIN has no EXTINT line available." + #error "X_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(X_MIN_PIN); #endif - #if HAS_Y_MAX + #if USE_Y_MAX #if !AVAILABLE_EILINE(Y_MAX_PIN) - #error "Y_MAX_PIN has no EXTINT line available." + #error "Y_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Y_MAX_PIN); #endif - #if HAS_Y_MIN + #if USE_Y_MIN #if !AVAILABLE_EILINE(Y_MIN_PIN) - #error "Y_MIN_PIN has no EXTINT line available." + #error "Y_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Y_MIN_PIN); #endif - #if HAS_Z_MAX + #if USE_Z_MAX #if !AVAILABLE_EILINE(Z_MAX_PIN) - #error "Z_MAX_PIN has no EXTINT line available." + #error "Z_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MAX_PIN); #endif - #if HAS_Z_MIN + #if HAS_Z_MIN_PIN #if !AVAILABLE_EILINE(Z_MIN_PIN) - #error "Z_MIN_PIN has no EXTINT line available." + #error "Z_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MIN_PIN); #endif - #if HAS_Z2_MAX + #if USE_Z2_MAX #if !AVAILABLE_EILINE(Z2_MAX_PIN) - #error "Z2_MAX_PIN has no EXTINT line available." + #error "Z2_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z2_MAX_PIN); #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN #if !AVAILABLE_EILINE(Z2_MIN_PIN) - #error "Z2_MIN_PIN has no EXTINT line available." + #error "Z2_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z2_MIN_PIN); #endif - #if HAS_Z3_MAX + #if USE_Z3_MAX #if !AVAILABLE_EILINE(Z3_MAX_PIN) - #error "Z3_MAX_PIN has no EXTINT line available." + #error "Z3_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z3_MAX_PIN); #endif - #if HAS_Z3_MIN + #if USE_Z3_MIN #if !AVAILABLE_EILINE(Z3_MIN_PIN) - #error "Z3_MIN_PIN has no EXTINT line available." + #error "Z3_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z3_MIN_PIN); #endif - #if HAS_Z4_MAX + #if USE_Z4_MAX #if !AVAILABLE_EILINE(Z4_MAX_PIN) - #error "Z4_MAX_PIN has no EXTINT line available." + #error "Z4_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z4_MAX_PIN); #endif - #if HAS_Z4_MIN + #if USE_Z4_MIN #if !AVAILABLE_EILINE(Z4_MIN_PIN) - #error "Z4_MIN_PIN has no EXTINT line available." + #error "Z4_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z4_MIN_PIN); #endif - #if HAS_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE #if !AVAILABLE_EILINE(Z_MIN_PROBE_PIN) - #error "Z_MIN_PROBE_PIN has no EXTINT line available." + #error "Z_MIN_PROBE_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif _ATTACH(Z_MIN_PROBE_PIN); #endif - #if HAS_I_MAX + #if USE_I_MAX #if !AVAILABLE_EILINE(I_MAX_PIN) - #error "I_MAX_PIN has no EXTINT line available." + #error "I_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(I_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_I_MIN + #if USE_I_MIN #if !AVAILABLE_EILINE(I_MIN_PIN) - #error "I_MIN_PIN has no EXTINT line available." + #error "I_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(I_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_J_MAX + #if USE_J_MAX #if !AVAILABLE_EILINE(J_MAX_PIN) - #error "J_MAX_PIN has no EXTINT line available." + #error "J_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(J_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_J_MIN + #if USE_J_MIN #if !AVAILABLE_EILINE(J_MIN_PIN) - #error "J_MIN_PIN has no EXTINT line available." + #error "J_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(J_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_K_MAX + #if USE_K_MAX #if !AVAILABLE_EILINE(K_MAX_PIN) - #error "K_MAX_PIN has no EXTINT line available." + #error "K_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(K_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_K_MIN + #if USE_K_MIN #if !AVAILABLE_EILINE(K_MIN_PIN) - #error "K_MIN_PIN has no EXTINT line available." + #error "K_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(K_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_U_MAX + #if USE_U_MAX #if !AVAILABLE_EILINE(U_MAX_PIN) - #error "U_MAX_PIN has no EXTINT line available." + #error "U_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(U_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_U_MIN + #if USE_U_MIN #if !AVAILABLE_EILINE(U_MIN_PIN) - #error "U_MIN_PIN has no EXTINT line available." + #error "U_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(U_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_V_MAX + #if USE_V_MAX #if !AVAILABLE_EILINE(V_MAX_PIN) - #error "V_MAX_PIN has no EXTINT line available." + #error "V_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(V_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_V_MIN + #if USE_V_MIN #if !AVAILABLE_EILINE(V_MIN_PIN) - #error "V_MIN_PIN has no EXTINT line available." + #error "V_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(V_MIN_PIN, endstop_ISR, CHANGE); #endif - #if HAS_W_MAX + #if USE_W_MAX #if !AVAILABLE_EILINE(W_MAX_PIN) - #error "W_MAX_PIN has no EXTINT line available." + #error "W_MAX_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(W_MAX_PIN, endstop_ISR, CHANGE); #endif - #if HAS_W_MIN + #if USE_W_MIN #if !AVAILABLE_EILINE(W_MIN_PIN) - #error "W_MIN_PIN has no EXTINT line available." + #error "W_MIN_PIN has no EXTINT line available. Disable ENDSTOP_INTERRUPTS_FEATURE to continue." #endif attachInterrupt(W_MIN_PIN, endstop_ISR, CHANGE); #endif diff --git a/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h b/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h index ce6d3fdde2..295596b78b 100644 --- a/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h +++ b/Marlin/src/HAL/SAMD51/inc/Conditionals_post.h @@ -23,6 +23,6 @@ #if USE_FALLBACK_EEPROM #define FLASH_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) +#elif ANY(I2C_EEPROM, SPI_EEPROM) #define USE_SHARED_EEPROM 1 #endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 61569c7937..24589d0fcc 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -28,6 +28,7 @@ #include "../shared/Marduino.h" #include "../shared/math_32bit.h" #include "../shared/HAL_SPI.h" +#include "temp_soc.h" #include "fastio.h" #include "Servo.h" #include "MarlinSerial.h" @@ -70,7 +71,7 @@ #if WITHIN(SERIAL_PORT_2, 1, 6) #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #elif !defined(USBCON) - #error "SERIAL_PORT must be from 1 to 6." + #error "SERIAL_PORT_2 must be from 1 to 6." #elif SERIAL_PORT_2 == -1 #define MYSERIAL2 MSerialUSB #else @@ -82,7 +83,7 @@ #if WITHIN(SERIAL_PORT_3, 1, 6) #define MYSERIAL3 MSERIAL(SERIAL_PORT_3) #elif !defined(USBCON) - #error "SERIAL_PORT must be from 1 to 6." + #error "SERIAL_PORT_3 must be from 1 to 6." #elif SERIAL_PORT_3 == -1 #define MYSERIAL3 MSerialUSB #else @@ -94,7 +95,7 @@ #if WITHIN(MMU2_SERIAL_PORT, 1, 6) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #elif !defined(USBCON) - #error "SERIAL_PORT must be from 1 to 6." + #error "MMU2_SERIAL_PORT must be from 1 to 6." #elif MMU2_SERIAL_PORT == -1 #define MMU2_SERIAL MSerialUSB #else @@ -106,14 +107,14 @@ #if WITHIN(LCD_SERIAL_PORT, 1, 6) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #elif !defined(USBCON) - #error "SERIAL_PORT must be from 1 to 6." + #error "LCD_SERIAL_PORT must be from 1 to 6." #elif LCD_SERIAL_PORT == -1 #define LCD_SERIAL MSerialUSB #else #error "LCD_SERIAL_PORT must be from 1 to 6, or -1 for Native USB." #endif #if HAS_DGUS_LCD - #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() + #define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() #endif #endif @@ -174,7 +175,9 @@ typedef libServo hal_servo_t; #define JTAGSWD_RESET() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_RESET); // Reset: FULL SWD+JTAG #endif -#define PLATFORM_M997_SUPPORT +#ifndef PLATFORM_M997_SUPPORT + #define PLATFORM_M997_SUPPORT +#endif void flashFirmware(const int16_t); // Maple Compatibility diff --git a/Marlin/src/HAL/STM32/MinSerial.cpp b/Marlin/src/HAL/STM32/MinSerial.cpp index b0fcff20c1..c2260f4f26 100644 --- a/Marlin/src/HAL/STM32/MinSerial.cpp +++ b/Marlin/src/HAL/STM32/MinSerial.cpp @@ -135,18 +135,18 @@ void install_min_serial() { } #if NONE(DYNAMIC_VECTORTABLE, STM32F0xx, STM32G0xx) // 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" - ); + 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(); } - 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 diff --git a/Marlin/src/HAL/STM32/endstop_interrupts.h b/Marlin/src/HAL/STM32/endstop_interrupts.h index d2f20ba1c7..5ae228d3f8 100644 --- a/Marlin/src/HAL/STM32/endstop_interrupts.h +++ b/Marlin/src/HAL/STM32/endstop_interrupts.h @@ -29,33 +29,33 @@ void endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); - TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN)); - TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN)); - TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN)); - TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); - TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); - TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); - TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN)); - TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN)); - TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN)); - TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN)); - TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN)); - TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN)); + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN_PIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); } diff --git a/Marlin/src/HAL/STM32/fastio.cpp b/Marlin/src/HAL/STM32/fastio.cpp index b34555b8c8..a4b3ba70c9 100644 --- a/Marlin/src/HAL/STM32/fastio.cpp +++ b/Marlin/src/HAL/STM32/fastio.cpp @@ -29,7 +29,7 @@ GPIO_TypeDef* FastIOPortMap[LastPort + 1] = { 0 }; void FastIO_init() { - LOOP_L_N(i, NUM_DIGITAL_PINS) + for (uint8_t i = 0; i < NUM_DIGITAL_PINS; ++i) FastIOPortMap[STM_PORT(digitalPin[i])] = get_GPIO_Port(STM_PORT(digitalPin[i])); } diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h index ee8c49e4e0..032716a294 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h @@ -21,7 +21,7 @@ */ #pragma once -#if BOTH(HAS_MEDIA, USBD_USE_CDC_MSC) && DISABLED(NO_SD_HOST_DRIVE) +#if ALL(HAS_MEDIA, USBD_USE_CDC_MSC) && DISABLED(NO_SD_HOST_DRIVE) #define HAS_SD_HOST_DRIVE 1 #endif diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_post.h b/Marlin/src/HAL/STM32/inc/Conditionals_post.h index 83ce077c75..6c97a635b3 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_post.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_post.h @@ -24,7 +24,7 @@ // If no real or emulated EEPROM selected, fall back to SD emulation #if USE_FALLBACK_EEPROM #define SDCARD_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) +#elif ANY(I2C_EEPROM, SPI_EEPROM) #define USE_SHARED_EEPROM 1 #endif diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 9b0c232bdf..80d0314dbb 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -51,6 +51,10 @@ #error "TFT_COLOR_UI, TFT_LVGL_UI and TFT_CLASSIC_UI are currently only supported on STM32H7, STM32F4 and STM32F1 hardware." #endif +#if TEMP_SENSOR_SOC && defined(ATEMP) && TEMP_SOC_PIN != ATEMP + #error "TEMP_SENSOR_SOC requires 'TEMP_SOC_PIN ATEMP' on STM32." +#endif + /** * Check for common serial pin conflicts */ diff --git a/Marlin/src/HAL/STM32/pinsDebug.h b/Marlin/src/HAL/STM32/pinsDebug.h index b12d621e98..13990a69f5 100644 --- a/Marlin/src/HAL/STM32/pinsDebug.h +++ b/Marlin/src/HAL/STM32/pinsDebug.h @@ -119,7 +119,6 @@ const XrefInfo pin_xref[] PROGMEM = { #define digitalRead_mod(Ard_num) extDigitalRead(Ard_num) // must use Arduino pin numbers when doing reads #define PRINT_PIN(Q) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PORT(ANUM) port_print(ANUM) #define DIGITAL_PIN_TO_ANALOG_PIN(ANUM) -1 // will report analog pin number in the print port routine // x is a variable used to search pin_array @@ -187,7 +186,7 @@ bool is_digital(const pin_t Ard_num) { return pin_mode == MODE_PIN_INPUT || pin_mode == MODE_PIN_OUTPUT; } -void port_print(const pin_t Ard_num) { +void print_port(const pin_t Ard_num) { char buffer[16]; pin_t Index; for (Index = 0; Index < NUMBER_PINS_TOTAL; Index++) diff --git a/Marlin/src/HAL/STM32/temp_soc.h b/Marlin/src/HAL/STM32/temp_soc.h new file mode 100644 index 0000000000..05262eab8b --- /dev/null +++ b/Marlin/src/HAL/STM32/temp_soc.h @@ -0,0 +1,346 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 + +#ifdef STM32F0xx + /* + STM32F030x4 STM32F030x6 STM32F030x8 STM32F030xC https://www.st.com/resource/en/datasheet/stm32f030f4.pdf + --> TS_CAL2 not defined in datasheet + STM32F031x4 STM32F031x6 https://www.st.com/resource/en/datasheet/stm32f031c4.pdf + STM32F038x6 https://www.st.com/resource/en/datasheet/stm32f038c6.pdf + STM32F042x4 STM32F042x6 https://www.st.com/resource/en/datasheet/stm32f042c4.pdf + STM32F048C6 STM32F048G6 STM32F048T6 https://www.st.com/resource/en/datasheet/stm32f048c6.pdf + STM32F051x4 STM32F051x6 STM32F051x8 https://www.st.com/resource/en/datasheet/dm00039193.pdf + STM32F058C8 STM32F058R8 STM32F058T8 https://www.st.com/resource/en/datasheet/stm32f058c8.pdf + STM32F070CB STM32F070RB STM32F070C6 STM32F070F6 https://www.st.com/resource/en/datasheet/stm32f070c6.pdf + --> TS_CAL2 not defined in datasheet + STM32F071x8 STM32F071xB https://www.st.com/resource/en/datasheet/stm32f071cb.pdf + STM32F072x8 STM32F072xB https://www.st.com/resource/en/datasheet/stm32f072c8.pdf + STM32F078CB STM32F078RB STM32F078VB https://www.st.com/resource/en/datasheet/stm32f078cb.pdf + STM32F091xB STM32F091xC https://www.st.com/resource/en/datasheet/stm32f091cc.pdf + STM32F098CC STM32F098RC STM32F098VC https://www.st.com/resource/en/datasheet/stm32f098cc.pdf + */ + #define TS_CAL1_TEMP 30 // Calibration temperature of TS_CAL1 (see specific SoC datasheet) + #define TS_CAL1_REGOFFSET 0x1FFFF7B8 // Memory address of TS_CAL1 for STM32F030x4/x6/x8/xC (see specific SoC datasheet) + #define TS_CAL2_TEMP 110 // Calibration temperature of TS_CAL2 (see specific SoC datasheet) + #define TS_CAL2_REGOFFSET 0x1FFFF7C2 // Memory address of TS_CAL2 for STM32F030x4/x6/x8/xC (see specific SoC datasheet) + +#elif defined(STM32F1xx) + /* + STM32F100xC STM32F100xD STM32F100xE https://www.st.com/resource/en/datasheet/stm32f100rc.pdf + --> V=1.41 + STM32F100x4 STM32F100x6 STM32F100x8 STM32F100xB https://www.st.com/resource/en/datasheet/stm32f100cb.pdf + --> V=1.41 + STM32F101x8 STM32F101xB https://www.st.com/resource/en/datasheet/stm32f101r8.pdf + STM32F101xC STM32F101xD STM32F101xE https://www.st.com/resource/en/datasheet/stm32f101rc.pdf + STM32F101x4 STM32F101x6 https://www.st.com/resource/en/datasheet/stm32f101c4.pdf + STM32F101xF STM32F101xG https://www.st.com/resource/en/datasheet/stm32f101vf.pdf + STM32F102x8 STM32F102xB https://www.st.com/resource/en/datasheet/stm32f102c8.pdf + --> V=1.42 / Slope=4.35 + STM32F102x4 STM32F102x6 https://www.st.com/resource/en/datasheet/stm32f102c4.pdf + --> V=1.42 / Slope=4.35 + STM32F103x8 STM32F103xB https://www.st.com/resource/en/datasheet/stm32f103c8.pdf + STM32F103xC STM32F103xD STM32F103xE https://www.st.com/resource/en/datasheet/stm32f103rc.pdf + STM32F103x4 STM32F103x6 https://www.st.com/resource/en/datasheet/stm32f103c4.pdf + STM32F103xF STM32F103xG https://www.st.com/resource/en/datasheet/stm32f103rg.pdf + STM32F105xx STM32F107xx https://www.st.com/resource/en/datasheet/stm32f105r8.pdf + */ + #define TS_TYPICAL_V 1.43 + #define TS_TYPICAL_TEMP 25 + #define TS_TYPICAL_SLOPE 4.3 + +#elif defined(STM32F2xx) + /* + STM32F205xx STM32F207xx https://www.st.com/resource/en/datasheet/stm32f205rb.pdf + STM32F215xx STM32F217xx https://www.st.com/resource/en/datasheet/stm32f215re.pdf + */ + #define TS_TYPICAL_V 0.76 + #define TS_TYPICAL_TEMP 25 + #define TS_TYPICAL_SLOPE 2.5 + +#elif defined(STM32F3xx) + /* + STM32F301x6 STM32F301x8 https://www.st.com/resource/en/datasheet/stm32f301c6.pdf + STM32F302xD STM32F302xE https://www.st.com/resource/en/datasheet/stm32f302re.pdf + STM32F302x6 STM32F302x8 https://www.st.com/resource/en/datasheet/stm32f302r6.pdf + STM32F302xB STM32F302xC https://www.st.com/resource/en/datasheet/stm32f302cb.pdf + STM32F303xD STM32F303xE https://www.st.com/resource/en/datasheet/stm32f303re.pdf + STM32F303xB STM32F303xC https://www.st.com/resource/en/datasheet/stm32f303cb.pdf + STM32F303x6/x8 https://www.st.com/resource/en/datasheet/stm32f303c6.pdf + STM32F334x4 STM32F334x6 STM32F334x8 https://www.st.com/resource/en/datasheet/stm32f334k4.pdf + STM32F373xx https://www.st.com/resource/en/datasheet/stm32f373cc.pdf + STM32F358xC https://www.st.com/resource/en/datasheet/stm32f358cc.pdf + STM32F378xx https://www.st.com/resource/en/datasheet/stm32f378cc.pdf + STM32F318C8 STM32F318K8 https://www.st.com/resource/en/datasheet/stm32f318c8.pdf + STM32F328C8 https://www.st.com/resource/en/datasheet/stm32f328c8.pdf + STM32F398VE https://www.st.com/resource/en/datasheet/stm32f398ve.pdf + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FFFF7B8 + #define TS_CAL2_TEMP 110 + #define TS_CAL2_REGOFFSET 0x1FFFF7C2 + +#elif defined(STM32F4xx) + /* + STM32F401xD STM32F401xE https://www.st.com/resource/en/datasheet/stm32f401re.pdf + STM32F411xC STM32F411xE https://www.st.com/resource/en/datasheet/stm32f411ce.pdf + STM32F446xC/E https://www.st.com/resource/en/datasheet/stm32f446mc.pdf + STM32F479xx https://www.st.com/resource/en/datasheet/stm32f479ai.pdf + STM32F412xE STM32F412xG https://www.st.com/resource/en/datasheet/stm32f412ce.pdf + STM32F410x8 STM32F410xB https://www.st.com/resource/en/datasheet/stm32f410cb.pdf + STM32F469xx https://www.st.com/resource/en/datasheet/stm32f469ae.pdf + STM32F423xH https://www.st.com/resource/en/datasheet/stm32f423ch.pdf + STM32F413xG STM32F413xH https://www.st.com/resource/en/datasheet/stm32f413cg.pdf + STM32F415xx STM32F417xx https://www.st.com/resource/en/datasheet/stm32f415rg.pdf + STM32F405xx STM32F407xx https://www.st.com/resource/en/datasheet/stm32f405rg.pdf + STM32F427xx STM32F429xx https://www.st.com/resource/en/datasheet/stm32f427vg.pdf + STM32F437xx STM32F439xx https://www.st.com/resource/en/datasheet/stm32f437vg.pdf + STM32F401xB STM32F401xC https://www.st.com/resource/en/datasheet/stm32f401cb.pdf + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FFF7A2C + #define TS_CAL2_TEMP 110 + #define TS_CAL2_REGOFFSET 0x1FFF7A2E + +#elif defined(STM32F7xx) + /* + STM32F756xx https://www.st.com/resource/en/datasheet/stm32f756bg.pdf + STM32F745xx STM32F746xx https://www.st.com/resource/en/datasheet/stm32f745ie.pdf + STM32F777xx STM32F778Ax STM32F779xx https://www.st.com/resource/en/datasheet/stm32f777bi.pdf + STM32F765xx STM32F767xx STM32F768Ax STM32F769xx https://www.st.com/resource/en/datasheet/stm32f765bi.pdf + STM32F722xx STM32F723xx https://www.st.com/resource/en/datasheet/stm32f722ic.pdf + --> TS_CAL1/2 = 0x1FF07A2C / 0x1FF07A2E + STM32F732xx STM32F733xx https://www.st.com/resource/en/datasheet/stm32f732ie.pdf + --> TS_CAL1/2 = 0x1FF07A2C / 0x1FF07A2E + STM32F750x8 https://www.st.com/resource/en/datasheet/stm32f750n8.pdf + STM32F730x8 https://www.st.com/resource/en/datasheet/stm32f730i8.pdf + --> TS_CAL1/2 = 0x1FF07A2C / 0x1FF07A2E + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FF0F44C + #define TS_CAL2_TEMP 110 + #define TS_CAL2_REGOFFSET 0x1FF0F44E + +#elif defined(STM32G0xx) + /* + STM32G030x6/x8 https://www.st.com/resource/en/datasheet/stm32g030c6.pdf + --> TS_CAL2 not defined in datasheet + STM32G050x6/x8 https://www.st.com/resource/en/datasheet/stm32g050c6.pdf + STM32G0B0KE/CE/RE/VE https://www.st.com/resource/en/datasheet/stm32g0b0ce.pdf + --> TS_CAL2 not defined in datasheet + STM32G081xB https://www.st.com/resource/en/datasheet/stm32g081cb.pdf + STM32G071x8/xB https://www.st.com/resource/en/datasheet/stm32g071c8.pdf + STM32G031x4/x6/x8 https://www.st.com/resource/en/datasheet/stm32g031c6.pdf + STM32G041x6/x8 https://www.st.com/resource/en/datasheet/stm32g041c8.pdf + STM32G051x6/x8 https://www.st.com/resource/en/datasheet/stm32g051c6.pdf + STM32G061x6/x8 https://www.st.com/resource/en/datasheet/stm32g061c6.pdf + STM32G0B1xB/xC/xE https://www.st.com/resource/en/datasheet/stm32g0b1cc.pdf + STM32G0C1xC/xE https://www.st.com/resource/en/datasheet/stm32g0c1cc.pdf + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FFF75A8 + #define TS_CAL2_TEMP 130 + #define TS_CAL2_REGOFFSET 0x1FFF75CA + +#elif defined(STM32G4xx) + /* + STM32G431x6 STM32G431x8 STM32G431xB https://www.st.com/resource/en/datasheet/stm32g431c6.pdf + STM32G441xB https://www.st.com/resource/en/datasheet/stm32g441cb.pdf + STM32G491xC STM32G491xE https://www.st.com/resource/en/datasheet/stm32g491cc.pdf + STM32G4A1xE https://www.st.com/resource/en/datasheet/stm32g4a1ce.pdf + STM32G473xB STM32G473xC STM32G473xE https://www.st.com/resource/en/datasheet/stm32g473cb.pdf + STM32G483xE https://www.st.com/resource/en/datasheet/stm32g483ce.pdf + --> TS_CAL1/TS_CAL2 not defined in datasheet + STM32G474xB STM32G474xC STM32G474xE https://www.st.com/resource/en/datasheet/stm32g474cb.pdf + STM32G484xE https://www.st.com/resource/en/datasheet/stm32g484ce.pdf + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FFF75A8 + #define TS_CAL2_TEMP 130 + #define TS_CAL2_REGOFFSET 0x1FFF75CA + +#elif defined(STM32H7xx) + /* + STM32H7A3xI/G + --> TS_CAL1/2 = 0x08FFF814 / 0x08FFF818 + STM32H7B0xB + --> TS_CAL1/2 = 0x08FFF814 / 0x08FFF818 + STM32H7B3xI + --> TS_CAL1/2 = 0x08FFF814 / 0x08FFF818 + STM32H725xE/G + STM32H735xG + STM32H723VE STM32H723VG STM32H723ZE STM32H723ZG + STM32H730AB STM32H730IB STM32H730VB STM32H730ZB + STM32H733VG STM32H733ZG + STM32H742xI/G STM32H743xI/G + --> CAL2_TEMP = 110 + STM32H745xI/G + STM32H747xI/G + STM32H753xI + STM32H755xI + STM32H757xI + STM32H750VB STM32H750ZB STM32H750IB STM32H750XB + --> CAL2_TEMP = 110 + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FF1E820 + #define TS_CAL2_TEMP 130 + #define TS_CAL2_REGOFFSET 0x1FF1E840 + +#elif defined(STM32L0xx) + /* + STM32L010RB + --> TS_CAL1/TS_CAL2 not defined in datasheet + STM32L010F4 STM32L010K4 + --> TS_CAL1/TS_CAL2 not defined in datasheet + STM32L010C6 + --> TS_CAL1/TS_CAL2 not defined in datasheet + STM32L010K8 STM32L010R8 + --> TS_CAL1/TS_CAL2 not defined in datasheet + STM32L011x3 STM32L011x4 + --> TS_CAL1 not defined in datasheet + STM32L021D4 STM32L021F4 STM32L021G4 STM32L021K4 + --> TS_CAL1 not defined in datasheet + STM32L031x4 STM32L031x6 + STM32L041x6 + STM32L051x6 STM32L051x8 + STM32L071x8 STM32L071xB STM32L071xZ + STM32L081CB STM32L081CZ STM32L081KZ + STM32L052x6 STM32L052x8 + STM32L062K8 STM32L062T8 STM32L062C8 + STM32L072x8 STM32L072xB STM32L072xZ + STM32L082KB STM32L082KZ STM32L082CZ + STM32L053C6 STM32L053C8 STM32L053R6 STM32L053R8 + STM32L063C8 STM32L063R8 + STM32L073x8 STM32L073xB STM32L073xZ + STM32L083x8 STM32L083xB STM32L083xZ + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FF8007A + #define TS_CAL2_TEMP 130 + #define TS_CAL2_REGOFFSET 0x1FF8007E + +#elif defined(STM32L1xx) + /* + STM32L100x6/8/B-A + --> TS_CAL1/TS_CAL2 not defined in datasheet + STM32L100RC + --> TS_CAL1/TS_CAL2 not defined in datasheet + STM32L100C6 STM32L100R8/RB + --> TS_CAL1/TS_CAL2 not defined in datasheet + STM32L151x6/8/B-A STM32L152x6/8/B-A + --> TS_CAL1/2 = 0x08FFF814 / 0x08FFF818 + STM32L151xD STM32L152xD + STM32L151VD-X STM32L152VD-X + STM32L15xCC STM32L15xRC STM32L15xUC STM32L15xVC + STM32L15xQC STM32L15xRC-A STM32L15xVC-A STM32L15xZC + STM32L162xE + STM32L162VD STM32L162ZD STM32L162QD STM32L162RD + STM32L162VC STM32L162RC + STM32L162VD-X + STM32L162QC STM32L162VC-A STM32L162ZC STM32L162RC-A + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FF800FA + #define TS_CAL2_TEMP 110 + #define TS_CAL2_REGOFFSET 0x1FF800FE + +#elif defined(STM32L4xx) + /* + STM32L431xx + STM32L451xx + STM32L471xx + --> CAL2_TEMP = 110 + STM32L412xx + STM32L422xx + STM32L432KB STM32L432KC + STM32L442KC + STM32L452xx + STM32L462CE STM32L462RE STM32L462VE + STM32L433xx + STM32L443CC STM32L443RC STM32L443VC + STM32L475xx + --> CAL2_TEMP = 110 + STM32L476xx + --> CAL2_TEMP = 110 + STM32L486xx : + --> CAL2_TEMP = 110 + STM32L496xx + STM32L4A6xG + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FFF75A8 + #define TS_CAL2_TEMP 130 + #define TS_CAL2_REGOFFSET 0x1FFF75CA + +#elif defined(STM32MP1xx) + /* + STM32MP131A STM32MP131D + STM32MP131C STM32MP131F + STM32MP133A STM32MP133D + STM32MP133C STM32MP133F + STM32MP135A STM32MP135D + STM32MP135C STM32MP135F + STM32MP151A/D + STM32MP151C/F + STM32MP153A/D + STM32MP153C/F + STM32MP157A/D + STM32MP157C/F + */ + // BSEC -> RCC + //#define TS_CAL1_TEMP 30 + //#define TS_CAL1_REGOFFSET 0x5C00 525C[15:0] + //#define TS_CAL2_TEMP 130 + //#define TS_CAL2_REGOFFSET 0x5C00 525C[31:16] + +#elif defined(STM32WBxx) + /* + STM32WB10CC + STM32WB50CG STM32WB30CE + STM32WB15CC + STM32WB55xx STM32WB35xx + */ + #define TS_CAL1_TEMP 30 + #define TS_CAL1_REGOFFSET 0x1FFF75A8 + #define TS_CAL2_TEMP 130 + #define TS_CAL2_REGOFFSET 0x1FFF75CA +#endif + +// TODO implement voltage scaling (calibrated Vrefint) and ADC resolution scaling (when applicable) + +/** + * When provided in datasheet, the use of calibrated values (TS_CAL1, TS_CAL2) should always be preferred over typical values. + * Typical values may result in important variation from the actual temperature. + * + * If calibrated values are not provided in datasheet, it is encouraged to calibrate your specific chip yourself. + */ +#if defined(TS_CAL1_TEMP) && defined(TS_CAL1_REGOFFSET) && defined(TS_CAL2_TEMP) && defined(TS_CAL2_REGOFFSET) + + #define READMEMORY(ADDR) (*((uint16_t const *)(ADDR))) + #define TEMP_SOC_SENSOR(RAW) (float((TS_CAL2_TEMP) - (TS_CAL1_TEMP)) / (READMEMORY(TS_CAL2_REGOFFSET) - READMEMORY(TS_CAL1_REGOFFSET)) * ((RAW) / float(OVERSAMPLENR) - READMEMORY(TS_CAL1_REGOFFSET)) + (TS_CAL1_TEMP)) + +#elif defined(TS_TYPICAL_V) && defined(TS_TYPICAL_SLOPE) && defined(TS_TYPICAL_TEMP) + + #define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * float(ADC_VREF)) / (TS_TYPICAL_SLOPE/1000) + TS_TYPICAL_TEMP) + +#endif diff --git a/Marlin/src/HAL/STM32/tft/gt911.cpp b/Marlin/src/HAL/STM32/tft/gt911.cpp index 82b7c5b103..52119c19b7 100644 --- a/Marlin/src/HAL/STM32/tft/gt911.cpp +++ b/Marlin/src/HAL/STM32/tft/gt911.cpp @@ -90,7 +90,7 @@ bool SW_IIC::read_ack() { } void SW_IIC::send_byte(uint8_t txd) { - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { write_sda(txd & 0x80); // write data bit txd <<= 1; iic_delay(1); @@ -107,7 +107,7 @@ uint8_t SW_IIC::read_byte(bool ack) { uint8_t data = 0; set_sda_in(); - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { write_scl(HIGH); // SCL = 1 iic_delay(1); data <<= 1; @@ -128,12 +128,12 @@ SW_IIC GT911::sw_iic = SW_IIC(GT911_SW_I2C_SDA_PIN, GT911_SW_I2C_SCL_PIN); void GT911::write_reg(uint16_t reg, uint8_t reg_len, uint8_t* w_data, uint8_t w_len) { sw_iic.start(); sw_iic.send_byte(gt911_slave_address); // Set IIC Slave address - LOOP_L_N(i, reg_len) { // Set reg address + for (uint8_t i = 0; i < reg_len; ++i) { // Set reg address uint8_t r = (reg >> (8 * (reg_len - 1 - i))) & 0xFF; sw_iic.send_byte(r); } - LOOP_L_N(i, w_len) { // Write data to reg + for (uint8_t i = 0; i < w_len; ++i) { // Write data to reg sw_iic.send_byte(w_data[i]); } sw_iic.stop(); @@ -142,7 +142,7 @@ void GT911::write_reg(uint16_t reg, uint8_t reg_len, uint8_t* w_data, uint8_t w_ void GT911::read_reg(uint16_t reg, uint8_t reg_len, uint8_t* r_data, uint8_t r_len) { sw_iic.start(); sw_iic.send_byte(gt911_slave_address); // Set IIC Slave address - LOOP_L_N(i, reg_len) { // Set reg address + for (uint8_t i = 0; i < reg_len; ++i) { // Set reg address uint8_t r = (reg >> (8 * (reg_len - 1 - i))) & 0xFF; sw_iic.send_byte(r); } @@ -150,13 +150,13 @@ void GT911::read_reg(uint16_t reg, uint8_t reg_len, uint8_t* r_data, uint8_t r_l sw_iic.start(); sw_iic.send_byte(gt911_slave_address + 1); // Set read mode - LOOP_L_N(i, r_len) + for (uint8_t i = 0; i < r_len; ++i) r_data[i] = sw_iic.read_byte(1); // Read data from reg sw_iic.stop(); } -void GT911::Init() { +void GT911::init() { OUT_WRITE(GT911_RST_PIN, LOW); OUT_WRITE(GT911_INT_PIN, LOW); delay(11); diff --git a/Marlin/src/HAL/STM32/tft/gt911.h b/Marlin/src/HAL/STM32/tft/gt911.h index 260c195eca..75e025245d 100644 --- a/Marlin/src/HAL/STM32/tft/gt911.h +++ b/Marlin/src/HAL/STM32/tft/gt911.h @@ -90,7 +90,7 @@ class GT911 { static void read_reg(uint16_t reg, uint8_t reg_len, uint8_t* r_data, uint8_t r_len); public: - static void Init(); + static void init(); static bool getFirstTouchPoint(int16_t *x, int16_t *y); static bool getPoint(int16_t *x, int16_t *y); }; diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp index 6ac3549b41..35606460ac 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.cpp @@ -35,17 +35,17 @@ SRAM_HandleTypeDef TFT_FSMC::SRAMx; DMA_HandleTypeDef TFT_FSMC::DMAtx; LCD_CONTROLLER_TypeDef *TFT_FSMC::LCD; -void TFT_FSMC::Init() { +void TFT_FSMC::init() { uint32_t controllerAddress; - FSMC_NORSRAM_TimingTypeDef Timing, ExtTiming; + FSMC_NORSRAM_TimingTypeDef timing, extTiming; - uint32_t NSBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); + uint32_t nsBank = (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_CS_PIN), pinMap_FSMC_CS); // Perform the SRAM1 memory initialization sequence SRAMx.Instance = FSMC_NORSRAM_DEVICE; SRAMx.Extended = FSMC_NORSRAM_EXTENDED_DEVICE; // SRAMx.Init - SRAMx.Init.NSBank = NSBank; + SRAMx.Init.NSBank = nsBank; SRAMx.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; SRAMx.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; SRAMx.Init.MemoryDataWidth = TERN(TFT_INTERFACE_FSMC_8BIT, FSMC_NORSRAM_MEM_BUS_WIDTH_8, FSMC_NORSRAM_MEM_BUS_WIDTH_16); @@ -63,42 +63,42 @@ void TFT_FSMC::Init() { #endif // Read Timing - relatively slow to ensure ID information is correctly read from TFT controller // Can be decreases from 15-15-24 to 4-4-8 with risk of stability loss - Timing.AddressSetupTime = 15; - Timing.AddressHoldTime = 15; - Timing.DataSetupTime = 24; - Timing.BusTurnAroundDuration = 0; - Timing.CLKDivision = 16; - Timing.DataLatency = 17; - Timing.AccessMode = FSMC_ACCESS_MODE_A; + timing.AddressSetupTime = 15; + timing.AddressHoldTime = 15; + timing.DataSetupTime = 24; + timing.BusTurnAroundDuration = 0; + timing.CLKDivision = 16; + timing.DataLatency = 17; + timing.AccessMode = FSMC_ACCESS_MODE_A; // Write Timing // Can be decreased from 8-15-8 to 0-0-1 with risk of stability loss - ExtTiming.AddressSetupTime = 8; - ExtTiming.AddressHoldTime = 15; - ExtTiming.DataSetupTime = 8; - ExtTiming.BusTurnAroundDuration = 0; - ExtTiming.CLKDivision = 16; - ExtTiming.DataLatency = 17; - ExtTiming.AccessMode = FSMC_ACCESS_MODE_A; + extTiming.AddressSetupTime = 8; + extTiming.AddressHoldTime = 15; + extTiming.DataSetupTime = 8; + extTiming.BusTurnAroundDuration = 0; + extTiming.CLKDivision = 16; + extTiming.DataLatency = 17; + extTiming.AccessMode = FSMC_ACCESS_MODE_A; __HAL_RCC_FSMC_CLK_ENABLE(); - for (uint16_t i = 0; PinMap_FSMC[i].pin != NC; i++) - pinmap_pinout(PinMap_FSMC[i].pin, PinMap_FSMC); - pinmap_pinout(digitalPinToPinName(TFT_CS_PIN), PinMap_FSMC_CS); - pinmap_pinout(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); + for (uint16_t i = 0; pinMap_FSMC[i].pin != NC; i++) + pinmap_pinout(pinMap_FSMC[i].pin, pinMap_FSMC); + pinmap_pinout(digitalPinToPinName(TFT_CS_PIN), pinMap_FSMC_CS); + pinmap_pinout(digitalPinToPinName(TFT_RS_PIN), pinMap_FSMC_RS); controllerAddress = FSMC_BANK1_1; #ifdef PF0 - switch (NSBank) { + switch (nsBank) { case FSMC_NORSRAM_BANK2: controllerAddress = FSMC_BANK1_2 ; break; case FSMC_NORSRAM_BANK3: controllerAddress = FSMC_BANK1_3 ; break; case FSMC_NORSRAM_BANK4: controllerAddress = FSMC_BANK1_4 ; break; } #endif - controllerAddress |= (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_RS_PIN), PinMap_FSMC_RS); + controllerAddress |= (uint32_t)pinmap_peripheral(digitalPinToPinName(TFT_RS_PIN), pinMap_FSMC_RS); - HAL_SRAM_Init(&SRAMx, &Timing, &ExtTiming); + HAL_SRAM_Init(&SRAMx, &timing, &extTiming); #ifdef STM32F1xx __HAL_RCC_DMA1_CLK_ENABLE(); @@ -123,23 +123,23 @@ void TFT_FSMC::Init() { LCD = (LCD_CONTROLLER_TypeDef *)controllerAddress; } -uint32_t TFT_FSMC::GetID() { +uint32_t TFT_FSMC::getID() { uint32_t id; - WriteReg(0); + writeReg(0); id = LCD->RAM; if (id == 0) - id = ReadID(LCD_READ_ID); + id = readID(LCD_READ_ID); if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) - id = ReadID(LCD_READ_ID4); + id = readID(LCD_READ_ID4); return id; } -uint32_t TFT_FSMC::ReadID(tft_data_t Reg) { +uint32_t TFT_FSMC::readID(tft_data_t reg) { uint32_t id; - WriteReg(Reg); + writeReg(reg); id = LCD->RAM; // dummy read - id = Reg << 24; + id = reg << 24; id |= (LCD->RAM & 0x00FF) << 16; id |= (LCD->RAM & 0x00FF) << 8; id |= LCD->RAM & 0x00FF; @@ -161,30 +161,30 @@ bool TFT_FSMC::isBusy() { if ((__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TE_FLAG_INDEX(&DMAtx)) == 0) && (__HAL_DMA_GET_FLAG(&DMAtx, __HAL_DMA_GET_TC_FLAG_INDEX(&DMAtx)) == 0)) return true; __DSB(); - Abort(); + abort(); return false; } -void TFT_FSMC::Abort() { +void TFT_FSMC::abort() { HAL_DMA_Abort(&DMAtx); // Abort DMA transfer if any HAL_DMA_DeInit(&DMAtx); // Deconfigure DMA } -void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DMAtx.Init.PeriphInc = MemoryIncrease; +void TFT_FSMC::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { + DMAtx.Init.PeriphInc = memoryIncrease; HAL_DMA_Init(&DMAtx); - HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(LCD->RAM), Count); + HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(LCD->RAM), count); TERN_(TFT_SHARED_IO, while (isBusy())); } -void TFT_FSMC::Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DMAtx.Init.PeriphInc = MemoryIncrease; +void TFT_FSMC::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { + DMAtx.Init.PeriphInc = memoryIncrease; HAL_DMA_Init(&DMAtx); - DataTransferBegin(); - HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(LCD->RAM), Count); + dataTransferBegin(); + HAL_DMA_Start(&DMAtx, (uint32_t)data, (uint32_t)&(LCD->RAM), count); HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); - Abort(); + abort(); } #endif // HAS_FSMC_TFT diff --git a/Marlin/src/HAL/STM32/tft/tft_fsmc.h b/Marlin/src/HAL/STM32/tft/tft_fsmc.h index 8eb41d717d..1b0a45ff79 100644 --- a/Marlin/src/HAL/STM32/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32/tft/tft_fsmc.h @@ -62,31 +62,31 @@ class TFT_FSMC { static LCD_CONTROLLER_TypeDef *LCD; - static uint32_t ReadID(tft_data_t Reg); - static void Transmit(tft_data_t Data) { LCD->RAM = Data; __DSB(); } - static void Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + static uint32_t readID(tft_data_t reg); + static void transmit(tft_data_t data) { LCD->RAM = data; __DSB(); } + static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count); + static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count); public: - static void Init(); - static uint32_t GetID(); + static void init(); + static uint32_t getID(); static bool isBusy(); - static void Abort(); + static void abort(); - static void DataTransferBegin(uint16_t DataWidth=TFT_DATASIZE) {} - static void DataTransferEnd() {} + static void dataTransferBegin(uint16_t dataWidth=TFT_DATASIZE) {} + static void dataTransferEnd() {} - static void WriteData(uint16_t Data) { Transmit(tft_data_t(Data)); } - static void WriteReg(uint16_t Reg) { LCD->REG = tft_data_t(Reg); __DSB(); } + static void writeData(uint16_t data) { transmit(tft_data_t(data)); } + static void writeReg(uint16_t reg) { LCD->REG = tft_data_t(reg); __DSB(); } - static void WriteSequence_DMA(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } - static void WriteMultiple_DMA(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } + static void writeSequence_DMA(uint16_t *data, uint16_t count) { transmitDMA(DMA_PINC_ENABLE, data, count); } + static void writeMultiple_DMA(uint16_t color, uint16_t count) { static uint16_t data; data = color; transmitDMA(DMA_PINC_DISABLE, &data, count); } - static void WriteSequence(uint16_t *Data, uint16_t Count) { Transmit(DMA_PINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - while (Count > 0) { - Transmit(DMA_MINC_DISABLE, &Color, Count > DMA_MAX_SIZE ? DMA_MAX_SIZE : Count); - Count = Count > DMA_MAX_SIZE ? Count - DMA_MAX_SIZE : 0; + static void writeSequence(uint16_t *data, uint16_t count) { transmit(DMA_PINC_ENABLE, data, count); } + static void writeMultiple(uint16_t color, uint32_t count) { + while (count > 0) { + transmit(DMA_MINC_DISABLE, &color, count > DMA_MAX_SIZE ? DMA_MAX_SIZE : count); + count = count > DMA_MAX_SIZE ? count - DMA_MAX_SIZE : 0; } } }; @@ -103,7 +103,7 @@ class TFT_FSMC { #error No configuration for this MCU #endif -const PinMap PinMap_FSMC[] = { +const PinMap pinMap_FSMC[] = { {PD_14, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D00 {PD_15, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D01 {PD_0, FSMC_NORSRAM_DEVICE, FSMC_PIN_DATA}, // FSMC_D02 @@ -127,7 +127,7 @@ const PinMap PinMap_FSMC[] = { {NC, NP, 0} }; -const PinMap PinMap_FSMC_CS[] = { +const PinMap pinMap_FSMC_CS[] = { {PD_7, (void *)FSMC_NORSRAM_BANK1, FSMC_PIN_DATA}, // FSMC_NE1 #ifdef PF0 {PG_9, (void *)FSMC_NORSRAM_BANK2, FSMC_PIN_DATA}, // FSMC_NE2 @@ -143,7 +143,7 @@ const PinMap PinMap_FSMC_CS[] = { #define FSMC_RS(A) (void *)((2 << A) - 2) #endif -const PinMap PinMap_FSMC_RS[] = { +const PinMap pinMap_FSMC_RS[] = { #ifdef PF0 {PF_0, FSMC_RS( 0), FSMC_PIN_DATA}, // FSMC_A0 {PF_1, FSMC_RS( 1), FSMC_PIN_DATA}, // FSMC_A1 diff --git a/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp b/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp index 2be900618f..ce47d2e1ec 100644 --- a/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_ltdc.cpp @@ -246,28 +246,28 @@ uint16_t TFT_LTDC::y_cur = 0; uint8_t TFT_LTDC::reg = 0; volatile uint16_t* TFT_LTDC::framebuffer = (volatile uint16_t* )FRAME_BUFFER_ADDRESS; -void TFT_LTDC::Init() { +void TFT_LTDC::init() { // SDRAM pins init - for (uint16_t i = 0; PinMap_SDRAM[i].pin != NC; i++) - pinmap_pinout(PinMap_SDRAM[i].pin, PinMap_SDRAM); + for (uint16_t i = 0; pinMap_SDRAM[i].pin != NC; i++) + pinmap_pinout(pinMap_SDRAM[i].pin, pinMap_SDRAM); // SDRAM peripheral config SDRAM_Config(); // LTDC pins init - for (uint16_t i = 0; PinMap_LTDC[i].pin != NC; i++) - pinmap_pinout(PinMap_LTDC[i].pin, PinMap_LTDC); + for (uint16_t i = 0; pinMap_LTDC[i].pin != NC; i++) + pinmap_pinout(pinMap_LTDC[i].pin, pinMap_LTDC); // LTDC peripheral config LTDC_Config(); } -uint32_t TFT_LTDC::GetID() { +uint32_t TFT_LTDC::getID() { return 0xABAB; } -uint32_t TFT_LTDC::ReadID(tft_data_t Reg) { +uint32_t TFT_LTDC::readID(tft_data_t reg) { return 0xABAB; } @@ -275,15 +275,15 @@ bool TFT_LTDC::isBusy() { return false; } -uint16_t TFT_LTDC::ReadPoint(uint16_t x, uint16_t y) { +uint16_t TFT_LTDC::readPoint(uint16_t x, uint16_t y) { return framebuffer[(TFT_WIDTH * y) + x]; } -void TFT_LTDC::DrawPoint(uint16_t x, uint16_t y, uint16_t color) { +void TFT_LTDC::drawPoint(uint16_t x, uint16_t y, uint16_t color) { framebuffer[(TFT_WIDTH * y) + x] = color; } -void TFT_LTDC::DrawRect(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t color) { +void TFT_LTDC::drawRect(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t color) { if (sx == ex || sy == ey) return; @@ -307,7 +307,7 @@ void TFT_LTDC::DrawRect(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint SBI(DMA2D->IFCR, 1); } -void TFT_LTDC::DrawImage(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *colors) { +void TFT_LTDC::drawImage(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *colors) { if (sx == ex || sy == ey) return; @@ -332,18 +332,18 @@ void TFT_LTDC::DrawImage(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uin SBI(DMA2D->IFCR, 1); } -void TFT_LTDC::WriteData(uint16_t data) { +void TFT_LTDC::writeData(uint16_t data) { switch (reg) { case 0x01: x_cur = x_min = data; return; case 0x02: x_max = data; return; case 0x03: y_cur = y_min = data; return; case 0x04: y_max = data; return; } - Transmit(data); + transmit(data); } -void TFT_LTDC::Transmit(tft_data_t Data) { - DrawPoint(x_cur, y_cur, Data); +void TFT_LTDC::transmit(tft_data_t data) { + drawPoint(x_cur, y_cur, data); x_cur++; if (x_cur > x_max) { x_cur = x_min; @@ -352,35 +352,35 @@ void TFT_LTDC::Transmit(tft_data_t Data) { } } -void TFT_LTDC::WriteReg(uint16_t Reg) { - reg = Reg; +void TFT_LTDC::writeReg(uint16_t reg) { + reg = reg; } -void TFT_LTDC::Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { +void TFT_LTDC::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { - while (x_cur != x_min && Count) { - Transmit(*Data); - if (MemoryIncrease == DMA_PINC_ENABLE) Data++; - Count--; + while (x_cur != x_min && count) { + transmit(*data); + if (memoryIncrease == DMA_PINC_ENABLE) data++; + count--; } uint16_t width = x_max - x_min + 1; - uint16_t height = Count / width; - uint16_t x_end_cnt = Count - (width * height); + uint16_t height = count / width; + uint16_t x_end_cnt = count - (width * height); if (height) { - if (MemoryIncrease == DMA_PINC_ENABLE) { - DrawImage(x_min, y_cur, x_min + width, y_cur + height, Data); - Data += width * height; + if (memoryIncrease == DMA_PINC_ENABLE) { + drawImage(x_min, y_cur, x_min + width, y_cur + height, data); + data += width * height; } else - DrawRect(x_min, y_cur, x_min + width, y_cur + height, *Data); + drawRect(x_min, y_cur, x_min + width, y_cur + height, *data); y_cur += height; } while (x_end_cnt) { - Transmit(*Data); - if (MemoryIncrease == DMA_PINC_ENABLE) Data++; + transmit(*data); + if (memoryIncrease == DMA_PINC_ENABLE) data++; x_end_cnt--; } } diff --git a/Marlin/src/HAL/STM32/tft/tft_ltdc.h b/Marlin/src/HAL/STM32/tft/tft_ltdc.h index ee65561011..d4a254ba70 100644 --- a/Marlin/src/HAL/STM32/tft/tft_ltdc.h +++ b/Marlin/src/HAL/STM32/tft/tft_ltdc.h @@ -43,41 +43,41 @@ class TFT_LTDC { static uint16_t x_min, x_max, y_min, y_max, x_cur, y_cur; static uint8_t reg; - static uint32_t ReadID(tft_data_t Reg); + static uint32_t readID(tft_data_t reg); - static uint16_t ReadPoint(uint16_t x, uint16_t y); - static void DrawPoint(uint16_t x, uint16_t y, uint16_t color); - static void DrawRect(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t color); - static void DrawImage(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *colors); - static void Transmit(tft_data_t Data); - static void Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + static uint16_t readPoint(uint16_t x, uint16_t y); + static void drawPoint(uint16_t x, uint16_t y, uint16_t color); + static void drawRect(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t color); + static void drawImage(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *colors); + static void transmit(tft_data_t data); + static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count); public: - static void Init(); - static uint32_t GetID(); + static void init(); + static uint32_t getID(); static bool isBusy(); - static void Abort() { /*__HAL_DMA_DISABLE(&DMAtx);*/ } + static void abort() { /*__HAL_DMA_DISABLE(&DMAtx);*/ } - static void DataTransferBegin(uint16_t DataWidth=TFT_DATASIZE) {} - static void DataTransferEnd() {}; + static void dataTransferBegin(uint16_t dataWidth=TFT_DATASIZE) {} + static void dataTransferEnd() {}; - static void WriteData(uint16_t Data); - static void WriteReg(uint16_t Reg); + static void writeData(uint16_t data); + static void writeReg(uint16_t reg); // Non-blocking DMA data transfer is not implemented for LTDC interface - inline static void WriteSequence_DMA(uint16_t *Data, uint16_t Count) { WriteSequence(Data, Count); } - inline static void WriteMultiple_DMA(uint16_t Color, uint16_t Count) { WriteMultiple(Color, Count); } + inline static void writeSequence_DMA(uint16_t *data, uint16_t count) { writeSequence(data, count); } + inline static void writeMultiple_DMA(uint16_t color, uint16_t count) { writeMultiple(color, count); } - static void WriteSequence(uint16_t *Data, uint16_t Count) { Transmit(DMA_PINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - while (Count > 0) { - Transmit(DMA_PINC_DISABLE, &Color, Count > DMA_MAX_SIZE ? DMA_MAX_SIZE : Count); - Count = Count > DMA_MAX_SIZE ? Count - DMA_MAX_SIZE : 0; + static void writeSequence(uint16_t *data, uint16_t count) { transmit(DMA_PINC_ENABLE, data, count); } + static void writeMultiple(uint16_t color, uint32_t count) { + while (count > 0) { + transmit(DMA_PINC_DISABLE, &color, count > DMA_MAX_SIZE ? DMA_MAX_SIZE : count); + count = count > DMA_MAX_SIZE ? count - DMA_MAX_SIZE : 0; } } }; -const PinMap PinMap_LTDC[] = { +const PinMap pinMap_LTDC[] = { {PF_10, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_DE {PG_7, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_CLK {PI_9, LTDC, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_LTDC)}, // LCD_VSYNC @@ -104,7 +104,7 @@ const PinMap PinMap_LTDC[] = { {NC, NP, 0} }; -const PinMap PinMap_SDRAM[] = { +const PinMap pinMap_SDRAM[] = { {PC_0, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDNWE {PC_2, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDNE0 {PC_3, FMC_Bank1_R, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_FMC)}, // FMC_SDCKE0 diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp index 6ee4dc3364..eebf366b8c 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -34,7 +34,7 @@ SPI_HandleTypeDef TFT_SPI::SPIx; DMA_HandleTypeDef TFT_SPI::DMAtx; -void TFT_SPI::Init() { +void TFT_SPI::init() { SPI_TypeDef *spiInstance; OUT_WRITE(TFT_A0_PIN, HIGH); @@ -122,8 +122,8 @@ void TFT_SPI::Init() { #endif } -void TFT_SPI::DataTransferBegin(uint16_t DataSize) { - SPIx.Init.DataSize = DataSize == DATASIZE_8BIT ? SPI_DATASIZE_8BIT : SPI_DATASIZE_16BIT; +void TFT_SPI::dataTransferBegin(uint16_t dataSize) { + SPIx.Init.DataSize = dataSize == DATASIZE_8BIT ? SPI_DATASIZE_8BIT : SPI_DATASIZE_16BIT; HAL_SPI_Init(&SPIx); WRITE(TFT_CS_PIN, LOW); } @@ -132,11 +132,11 @@ void TFT_SPI::DataTransferBegin(uint16_t DataSize) { #include "../../../lcd/tft_io/tft_ids.h" #endif -uint32_t TFT_SPI::GetID() { +uint32_t TFT_SPI::getID() { uint32_t id; - id = ReadID(LCD_READ_ID); + id = readID(LCD_READ_ID); if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) { - id = ReadID(LCD_READ_ID4); + id = readID(LCD_READ_ID4); #ifdef TFT_DEFAULT_DRIVER if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) id = TFT_DEFAULT_DRIVER; @@ -145,15 +145,15 @@ uint32_t TFT_SPI::GetID() { return id; } -uint32_t TFT_SPI::ReadID(uint16_t Reg) { - uint32_t Data = 0; +uint32_t TFT_SPI::readID(uint16_t reg) { + uint32_t data = 0; #if PIN_EXISTS(TFT_MISO) uint32_t BaudRatePrescaler = SPIx.Init.BaudRatePrescaler; uint32_t i; SPIx.Init.BaudRatePrescaler = SPIx.Instance == SPI1 ? SPI_BAUDRATEPRESCALER_8 : SPI_BAUDRATEPRESCALER_4; - DataTransferBegin(DATASIZE_8BIT); - WriteReg(Reg); + dataTransferBegin(DATASIZE_8BIT); + writeReg(reg); if (SPIx.Init.Direction == SPI_DIRECTION_1LINE) SPI_1LINE_RX(&SPIx); __HAL_SPI_ENABLE(&SPIx); @@ -164,15 +164,15 @@ uint32_t TFT_SPI::ReadID(uint16_t Reg) { SPIx.Instance->DR = 0; #endif while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_RXNE)) {} - Data = (Data << 8) | SPIx.Instance->DR; + data = (data << 8) | SPIx.Instance->DR; } - DataTransferEnd(); + dataTransferEnd(); SPIx.Init.BaudRatePrescaler = BaudRatePrescaler; #endif - return Data >> 7; + return data >> 7; } bool TFT_SPI::isBusy() { @@ -197,27 +197,27 @@ bool TFT_SPI::isBusy() { if ((!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) || (__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY))) return true; } - Abort(); + abort(); return false; } -void TFT_SPI::Abort() { +void TFT_SPI::abort() { HAL_DMA_Abort(&DMAtx); // Abort DMA transfer if any HAL_DMA_DeInit(&DMAtx); CLEAR_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); - DataTransferEnd(); // Stop SPI and deselect CS + dataTransferEnd(); // Stop SPI and deselect CS } -void TFT_SPI::Transmit(uint16_t Data) { +void TFT_SPI::transmit(uint16_t data) { #if TFT_MISO_PIN == TFT_MOSI_PIN SPI_1LINE_TX(&SPIx); #endif __HAL_SPI_ENABLE(&SPIx); - SPIx.Instance->DR = Data; + SPIx.Instance->DR = data; while (!__HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_TXE)) {} while ( __HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {} @@ -227,17 +227,17 @@ void TFT_SPI::Transmit(uint16_t Data) { #endif } -void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DMAtx.Init.MemInc = MemoryIncrease; +void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { + DMAtx.Init.MemInc = memoryIncrease; HAL_DMA_Init(&DMAtx); #if TFT_MISO_PIN == TFT_MOSI_PIN SPI_1LINE_TX(&SPIx); #endif - DataTransferBegin(); + dataTransferBegin(); - HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(SPIx.Instance->DR), Count); + 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 @@ -245,40 +245,39 @@ void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Coun TERN_(TFT_SHARED_IO, while (isBusy())); } - -void TFT_SPI::Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DMAtx.Init.MemInc = MemoryIncrease; +void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { + DMAtx.Init.MemInc = memoryIncrease; HAL_DMA_Init(&DMAtx); if (TFT_MISO_PIN == TFT_MOSI_PIN) SPI_1LINE_TX(&SPIx); - DataTransferBegin(); + dataTransferBegin(); - HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(SPIx.Instance->DR), Count); + 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 HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); while ( __HAL_SPI_GET_FLAG(&SPIx, SPI_FLAG_BSY)) {} - Abort(); + abort(); } #if ENABLED(USE_SPI_DMA_TC) - void TFT_SPI::TransmitDMA_IT(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { + void TFT_SPI::TransmitDMA_IT(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { - DMAtx.Init.MemInc = MemoryIncrease; + DMAtx.Init.MemInc = memoryIncrease; HAL_DMA_Init(&DMAtx); if (TFT_MISO_PIN == TFT_MOSI_PIN) SPI_1LINE_TX(&SPIx); - DataTransferBegin(); + dataTransferBegin(); HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); - HAL_DMA_Start_IT(&DMAtx, (uint32_t)Data, (uint32_t)&(SPIx.Instance->DR), Count); + HAL_DMA_Start_IT(&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 diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.h b/Marlin/src/HAL/STM32/tft/tft_spi.h index 4825b65c68..09f0e08107 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.h +++ b/Marlin/src/HAL/STM32/tft/tft_spi.h @@ -46,40 +46,40 @@ private: static SPI_HandleTypeDef SPIx; static DMA_HandleTypeDef DMAtx; - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + static uint32_t readID(uint16_t reg); + static void transmit(uint16_t data); + static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count); + static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count); #if ENABLED(USE_SPI_DMA_TC) - static void TransmitDMA_IT(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + static void TransmitDMA_IT(uint32_t memoryIncrease, uint16_t *data, uint16_t count); #endif public: - static void Init(); - static uint32_t GetID(); + static void init(); + static uint32_t getID(); static bool isBusy(); - static void Abort(); + static void abort(); - static void DataTransferBegin(uint16_t DataWidth=DATASIZE_16BIT); - static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); __HAL_SPI_DISABLE(&SPIx); }; - static void DataTransferAbort(); + static void dataTransferBegin(uint16_t dataWidth=DATASIZE_16BIT); + static void dataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); __HAL_SPI_DISABLE(&SPIx); }; + static void dataTransferAbort(); - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg) { WRITE(TFT_A0_PIN, LOW); Transmit(Reg); WRITE(TFT_A0_PIN, HIGH); } + static void writeData(uint16_t data) { transmit(data); } + static void writeReg(uint16_t reg) { WRITE(TFT_A0_PIN, LOW); transmit(reg); WRITE(TFT_A0_PIN, HIGH); } - static void WriteSequence_DMA(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } - static void WriteMultiple_DMA(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + static void writeSequence_DMA(uint16_t *data, uint16_t count) { transmitDMA(DMA_MINC_ENABLE, data, count); } + static void writeMultiple_DMA(uint16_t color, uint16_t count) { static uint16_t data; data = color; transmitDMA(DMA_MINC_DISABLE, &data, count); } #if ENABLED(USE_SPI_DMA_TC) - static void WriteSequenceIT(uint16_t *Data, uint16_t Count) { TransmitDMA_IT(DMA_MINC_ENABLE, Data, Count); } + static void writeSequenceIT(uint16_t *data, uint16_t count) { TransmitDMA_IT(DMA_MINC_ENABLE, data, count); } inline static void DMA_IRQHandler() { HAL_DMA_IRQHandler(&TFT_SPI::DMAtx); } #endif - static void WriteSequence(uint16_t *Data, uint16_t Count) { Transmit(DMA_MINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - while (Count > 0) { - Transmit(DMA_MINC_DISABLE, &Color, Count > DMA_MAX_SIZE ? DMA_MAX_SIZE : Count); - Count = Count > DMA_MAX_SIZE ? Count - DMA_MAX_SIZE : 0; + static void writeSequence(uint16_t *data, uint16_t count) { transmit(DMA_MINC_ENABLE, data, count); } + static void writeMultiple(uint16_t color, uint32_t count) { + while (count > 0) { + transmit(DMA_MINC_DISABLE, &color, count > DMA_MAX_SIZE ? DMA_MAX_SIZE : count); + count = count > DMA_MAX_SIZE ? count - DMA_MAX_SIZE : 0; } } }; diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.cpp b/Marlin/src/HAL/STM32/tft/xpt2046.cpp index cf4a8f18e9..8efbfb84f8 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32/tft/xpt2046.cpp @@ -35,7 +35,7 @@ uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } SPI_HandleTypeDef XPT2046::SPIx; -void XPT2046::Init() { +void XPT2046::init() { SPI_TypeDef *spiInstance; OUT_WRITE(TOUCH_CS_PIN, HIGH); @@ -117,14 +117,14 @@ bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { uint16_t data[3]; - DataTransferBegin(); + dataTransferBegin(); for (uint16_t i = 0; i < 3 ; i++) { IO(coordinate); data[i] = (IO() << 4) | (IO() >> 4); } - DataTransferEnd(); + dataTransferEnd(); uint16_t delta01 = delta(data[0], data[1]); uint16_t delta02 = delta(data[0], data[2]); @@ -140,7 +140,7 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { return (data[0] + data[1]) >> 1; } -uint16_t XPT2046::HardwareIO(uint16_t data) { +uint16_t XPT2046::hardwareIO(uint16_t data) { __HAL_SPI_ENABLE(&SPIx); while ((SPIx.Instance->SR & SPI_FLAG_TXE) != SPI_FLAG_TXE) {} SPIx.Instance->DR = data; @@ -150,7 +150,7 @@ uint16_t XPT2046::HardwareIO(uint16_t data) { return SPIx.Instance->DR; } -uint16_t XPT2046::SoftwareIO(uint16_t data) { +uint16_t XPT2046::softwareIO(uint16_t data) { uint16_t result = 0; for (uint8_t j = 0x80; j > 0; j >>= 1) { diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h index 71de6b0025..6b2492c339 100644 --- a/Marlin/src/HAL/STM32/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32/tft/xpt2046.h @@ -69,13 +69,13 @@ private: static uint16_t getRawData(const XPTCoordinate coordinate); static bool isTouched(); - static void DataTransferBegin() { if (SPIx.Instance) { HAL_SPI_Init(&SPIx); } WRITE(TOUCH_CS_PIN, LOW); }; - static void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; - static uint16_t HardwareIO(uint16_t data); - static uint16_t SoftwareIO(uint16_t data); - static uint16_t IO(uint16_t data = 0) { return SPIx.Instance ? HardwareIO(data) : SoftwareIO(data); } + static void dataTransferBegin() { if (SPIx.Instance) { HAL_SPI_Init(&SPIx); } WRITE(TOUCH_CS_PIN, LOW); }; + static void dataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + static uint16_t hardwareIO(uint16_t data); + static uint16_t softwareIO(uint16_t data); + static uint16_t IO(uint16_t data = 0) { return SPIx.Instance ? hardwareIO(data) : softwareIO(data); } public: - static void Init(); + static void init(); static bool getRawPoint(int16_t *x, int16_t *y); }; diff --git a/Marlin/src/HAL/STM32/timers.cpp b/Marlin/src/HAL/STM32/timers.cpp index e68b59c46f..54506cb451 100644 --- a/Marlin/src/HAL/STM32/timers.cpp +++ b/Marlin/src/HAL/STM32/timers.cpp @@ -292,9 +292,9 @@ static constexpr int get_timer_num_from_base_address(uintptr_t base_address) { // constexpr doesn't like using the base address pointers that timers evaluate to. // We can get away with casting them to uintptr_t, if we do so inside an array. // GCC will not currently do it directly to a uintptr_t. -IF_ENABLED(HAS_TMC_SW_SERIAL, static constexpr uintptr_t timer_serial[] = {uintptr_t(TIMER_SERIAL)}); -IF_ENABLED(SPEAKER, static constexpr uintptr_t timer_tone[] = {uintptr_t(TIMER_TONE)}); -IF_ENABLED(HAS_SERVOS, static constexpr uintptr_t timer_servo[] = {uintptr_t(TIMER_SERVO)}); +TERN_(HAS_TMC_SW_SERIAL, static constexpr uintptr_t timer_serial[] = {uintptr_t(TIMER_SERIAL)}); +TERN_(SPEAKER, static constexpr uintptr_t timer_tone[] = {uintptr_t(TIMER_TONE)}); +TERN_(HAS_SERVOS, static constexpr uintptr_t timer_servo[] = {uintptr_t(TIMER_SERVO)}); enum TimerPurpose { TP_SERIAL, TP_TONE, TP_SERVO, TP_STEP, TP_TEMP }; @@ -316,8 +316,8 @@ static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = { }; static constexpr bool verify_no_timer_conflicts() { - LOOP_L_N(i, COUNT(timers_in_use)) - LOOP_S_L_N(j, i + 1, COUNT(timers_in_use)) + for (uint8_t i = 0; i < COUNT(timers_in_use); ++i) + for (uint8_t j = i + 1; j < COUNT(timers_in_use); ++j) if (timers_in_use[i].t == timers_in_use[j].t) return false; return true; } diff --git a/Marlin/src/HAL/STM32/usb_host.cpp b/Marlin/src/HAL/STM32/usb_host.cpp index d77f0b28e9..afafe1d4f3 100644 --- a/Marlin/src/HAL/STM32/usb_host.cpp +++ b/Marlin/src/HAL/STM32/usb_host.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfig.h" -#if BOTH(USE_OTG_USB_HOST, USBHOST) +#if ALL(USE_OTG_USB_HOST, USBHOST) #include "usb_host.h" #include "../shared/Marduino.h" @@ -44,7 +44,7 @@ static void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id) { break; case HOST_USER_DISCONNECTION: //SERIAL_ECHOLNPGM("APPLICATION_DISCONNECT"); - //usb.setUsbTaskState(USB_STATE_RUNNING); + usb.setUsbTaskState(USB_STATE_INIT); break; case HOST_USER_CLASS_ACTIVE: //SERIAL_ECHOLNPGM("APPLICATION_READY"); diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 4d3140001e..373116ba39 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -224,7 +224,7 @@ void MarlinHAL::init() { #endif #if HAS_SD_HOST_DRIVE MSC_SD_init(); - #elif BOTH(SERIAL_USB, EMERGENCY_PARSER) + #elif ALL(SERIAL_USB, EMERGENCY_PARSER) usb_cdcacm_set_hooks(USB_CDCACM_HOOK_RX, my_rx_callback); #endif #if PIN_EXISTS(USB_CONNECT) @@ -307,6 +307,7 @@ enum ADCIndex : uint8_t { OPTITEM(HAS_TEMP_ADC_PROBE, TEMP_PROBE) OPTITEM(HAS_TEMP_COOLER, TEMP_COOLER) OPTITEM(HAS_TEMP_BOARD, TEMP_BOARD) + OPTITEM(HAS_TEMP_SOC, TEMP_SOC) OPTITEM(FILAMENT_WIDTH_SENSOR, FILWIDTH) OPTITEM(HAS_ADC_BUTTONS, ADC_KEY) OPTITEM(HAS_JOY_ADC_X, JOY_X) @@ -335,6 +336,7 @@ void MarlinHAL::adc_init() { OPTITEM(HAS_TEMP_ADC_PROBE, TEMP_PROBE_PIN) OPTITEM(HAS_TEMP_COOLER, TEMP_COOLER_PIN) OPTITEM(HAS_TEMP_BOARD, TEMP_BOARD_PIN) + OPTITEM(HAS_TEMP_SOC, TEMP_SOC_PIN) OPTITEM(FILAMENT_WIDTH_SENSOR, FILWIDTH_PIN) OPTITEM(HAS_ADC_BUTTONS, ADC_KEYPAD_PIN) OPTITEM(HAS_JOY_ADC_X, JOY_X_PIN) @@ -373,6 +375,7 @@ void MarlinHAL::adc_start(const pin_t pin) { _TCASE(HAS_TEMP_ADC_PROBE, TEMP_PROBE_PIN, TEMP_PROBE) _TCASE(HAS_TEMP_COOLER, TEMP_COOLER_PIN, TEMP_COOLER) _TCASE(HAS_TEMP_BOARD, TEMP_BOARD_PIN, TEMP_BOARD) + _TCASE(HAS_TEMP_SOC, TEMP_SOC_PIN, TEMP_SOC) _TCASE(HAS_JOY_ADC_X, JOY_X_PIN, JOY_X) _TCASE(HAS_JOY_ADC_Y, JOY_Y_PIN, JOY_Y) _TCASE(HAS_JOY_ADC_Z, JOY_Z_PIN, JOY_Z) diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index b14b5f7e79..b5f4d6fe8b 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -82,7 +82,7 @@ #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) +#if ANY(STM32_HIGH_DENSITY, STM32_XL_DENSITY) #define NUM_UARTS 5 #else #define NUM_UARTS 3 @@ -140,7 +140,7 @@ static_assert(false, "LCD_SERIAL_PORT must be from 1 to " STRINGIFY(NUM_UARTS) ". You can also use -1 if the board supports Native USB.") #endif #if HAS_DGUS_LCD - #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() + #define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() #endif #endif @@ -205,7 +205,9 @@ void analogWrite(const pin_t pin, int pwm_val8); // PWM only! mul by 257 in mapl #define JTAG_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY) #define JTAGSWD_DISABLE() afio_cfg_debug_ports(AFIO_DEBUG_NONE) -#define PLATFORM_M997_SUPPORT +#ifndef PLATFORM_M997_SUPPORT + #define PLATFORM_M997_SUPPORT +#endif void flashFirmware(const int16_t); #define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index 7898e9f2bc..568fc05d41 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -116,7 +116,7 @@ constexpr bool serial_handles_emergency(int port) { #endif DEFINE_HWSERIAL_MARLIN(MSerial2, 2); DEFINE_HWSERIAL_MARLIN(MSerial3, 3); -#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) +#if ANY(STM32_HIGH_DENSITY, STM32_XL_DENSITY) DEFINE_HWSERIAL_UART_MARLIN(MSerial4, 4); DEFINE_HWSERIAL_UART_MARLIN(MSerial5, 5); #endif diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index dda32fe7a2..53bcd48476 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -52,7 +52,7 @@ typedef Serial1Class MSerialT; extern MSerialT MSerial1; extern MSerialT MSerial2; extern MSerialT MSerial3; -#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) +#if ANY(STM32_HIGH_DENSITY, STM32_XL_DENSITY) extern MSerialT MSerial4; extern MSerialT MSerial5; #endif diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp index 26ea1ea19a..c57350aa2e 100644 --- a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp +++ b/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp @@ -24,7 +24,7 @@ #include "../../../inc/MarlinConfig.h" -#if BOTH(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) +#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) #include #include "../../shared/HAL_SPI.h" @@ -37,7 +37,7 @@ static uint8_t SPI_speed = LCD_SPI_SPEED; static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { if (spi_speed == 0) { WRITE(DOGLCD_MOSI, !!(b & 0x80)); WRITE(DOGLCD_SCK, HIGH); @@ -47,16 +47,16 @@ static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, c } else { const uint8_t state = (b & 0x80) ? HIGH : LOW; - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) WRITE(DOGLCD_MOSI, state); - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); ++j) WRITE(DOGLCD_SCK, HIGH); b <<= 1; if (miso_pin >= 0 && READ(miso_pin)) b |= 1; - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) WRITE(DOGLCD_SCK, LOW); } } @@ -64,7 +64,7 @@ static inline uint8_t swSpiTransfer_mode_0(uint8_t b, const uint8_t spi_speed, c } static inline uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t miso_pin=-1) { - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { const uint8_t state = (b & 0x80) ? HIGH : LOW; if (spi_speed == 0) { WRITE(DOGLCD_SCK, LOW); @@ -73,13 +73,13 @@ static inline uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, c WRITE(DOGLCD_SCK, HIGH); } else { - LOOP_L_N(j, spi_speed + (miso_pin >= 0 ? 0 : 1)) + for (uint8_t j = 0; j < spi_speed + (miso_pin >= 0 ? 0 : 1); ++j) WRITE(DOGLCD_SCK, LOW); - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) WRITE(DOGLCD_MOSI, state); - LOOP_L_N(j, spi_speed) + for (uint8_t j = 0; j < spi_speed; ++j) WRITE(DOGLCD_SCK, HIGH); } b <<= 1; diff --git a/Marlin/src/HAL/STM32F1/endstop_interrupts.h b/Marlin/src/HAL/STM32F1/endstop_interrupts.h index a1ef8a8c3a..6febcec5d0 100644 --- a/Marlin/src/HAL/STM32F1/endstop_interrupts.h +++ b/Marlin/src/HAL/STM32F1/endstop_interrupts.h @@ -54,33 +54,33 @@ void endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); - TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN)); - TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN)); - TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN)); - TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); - TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); - TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); - TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN)); - TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN)); - TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN)); - TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN)); - TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN)); - TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN)); + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN_PIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); } diff --git a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h index 5a4bde16a5..f130f5cad8 100644 --- a/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h +++ b/Marlin/src/HAL/STM32F1/inc/Conditionals_post.h @@ -24,7 +24,7 @@ // If no real EEPROM, Flash emulation, or SRAM emulation is available fall back to SD emulation #if USE_FALLBACK_EEPROM #define SDCARD_EEPROM_EMULATION -#elif EITHER(I2C_EEPROM, SPI_EEPROM) +#elif ANY(I2C_EEPROM, SPI_EEPROM) #define USE_SHARED_EEPROM 1 #endif diff --git a/Marlin/src/HAL/STM32F1/pinsDebug.h b/Marlin/src/HAL/STM32F1/pinsDebug.h index 7828479658..6f8e48f455 100644 --- a/Marlin/src/HAL/STM32F1/pinsDebug.h +++ b/Marlin/src/HAL/STM32F1/pinsDebug.h @@ -41,11 +41,9 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS]; #define NUMBER_PINS_TOTAL BOARD_NR_GPIO_PINS #define VALID_PIN(pin) (pin >= 0 && pin < BOARD_NR_GPIO_PINS) #define GET_ARRAY_PIN(p) pin_t(pin_array[p].pin) -#define pwm_status(pin) PWM_PIN(pin) #define digitalRead_mod(p) extDigitalRead(p) #define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%3hd "), int16_t(p)); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0) -#define PRINT_PORT(p) print_port(p) #define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) #define MULTI_NAME_PAD 21 // space needed to be pretty if not first name assigned to a pin @@ -54,20 +52,18 @@ extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS]; #define M43_NEVER_TOUCH(Q) (Q >= 9 && Q <= 12) // SERIAL/USB pins PA9(TX) PA10(RX) #endif -static int8_t get_pin_mode(pin_t pin) { - return VALID_PIN(pin) ? _GET_MODE(pin) : -1; -} +int8_t get_pin_mode(const pin_t pin) { return VALID_PIN(pin) ? _GET_MODE(pin) : -1; } -static pin_t DIGITAL_PIN_TO_ANALOG_PIN(pin_t pin) { +pin_t DIGITAL_PIN_TO_ANALOG_PIN(const pin_t pin) { if (!VALID_PIN(pin)) return -1; - int8_t adc_channel = int8_t(PIN_MAP[pin].adc_channel); + pin_t adc_channel = pin_t(PIN_MAP[pin].adc_channel); #ifdef NUM_ANALOG_INPUTS - if (adc_channel >= NUM_ANALOG_INPUTS) adc_channel = ADCx; + if (adc_channel >= NUM_ANALOG_INPUTS) adc_channel = (pin_t)ADCx; #endif - return pin_t(adc_channel); + return adc_channel; } -static bool IS_ANALOG(pin_t pin) { +bool IS_ANALOG(const pin_t pin) { if (!VALID_PIN(pin)) return false; if (PIN_MAP[pin].adc_channel != ADCx) { #ifdef NUM_ANALOG_INPUTS @@ -78,11 +74,11 @@ static bool IS_ANALOG(pin_t pin) { return false; } -static bool GET_PINMODE(const pin_t pin) { +bool GET_PINMODE(const pin_t pin) { return VALID_PIN(pin) && !IS_INPUT(pin); } -static bool GET_ARRAY_IS_DIGITAL(const int16_t array_pin) { +bool GET_ARRAY_IS_DIGITAL(const int16_t array_pin) { const pin_t pin = GET_ARRAY_PIN(array_pin); return (!IS_ANALOG(pin) #ifdef NUM_ANALOG_INPUTS @@ -93,12 +89,12 @@ static bool GET_ARRAY_IS_DIGITAL(const int16_t array_pin) { #include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density -static void pwm_details(const pin_t pin) { +void pwm_details(const pin_t pin) { if (PWM_PIN(pin)) { timer_dev * const tdev = PIN_MAP[pin].timer_device; const uint8_t channel = PIN_MAP[pin].timer_channel; const char num = ( - #if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) + #if ANY(STM32_HIGH_DENSITY, STM32_XL_DENSITY) tdev == &timer8 ? '8' : tdev == &timer5 ? '5' : #endif @@ -113,7 +109,9 @@ static void pwm_details(const pin_t pin) { } } -static void print_port(pin_t pin) { +bool pwm_status(const pin_t pin) { return PWM_PIN(pin); } + +void print_port(const pin_t pin) { const char port = 'A' + char(pin >> 4); // pin div 16 const int16_t gbit = PIN_MAP[pin].gpio_bit; char buffer[8]; diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp index b00be30217..1ab76440b7 100644 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfig.h" // Allow pins/pins.h to set density -#if EITHER(STM32_HIGH_DENSITY, STM32_XL_DENSITY) +#if ANY(STM32_HIGH_DENSITY, STM32_XL_DENSITY) #include "sdio.h" diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp index 1e4dfec8a6..a910cd5af0 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.cpp @@ -87,7 +87,7 @@ __attribute__((always_inline)) __STATIC_INLINE void __DSB() { #define FSMC_DATA_SETUP_TIME 15 // DataSetupTime static uint8_t fsmcInit = 0; -void TFT_FSMC::Init() { +void TFT_FSMC::init() { uint8_t cs = FSMC_CS_PIN, rs = FSMC_RS_PIN; uint32_t controllerAddress; @@ -181,35 +181,35 @@ void TFT_FSMC::Init() { LCD = (LCD_CONTROLLER_TypeDef*)controllerAddress; } -void TFT_FSMC::Transmit(uint16_t Data) { - LCD->RAM = Data; +void TFT_FSMC::transmit(uint16_t data) { + LCD->RAM = data; __DSB(); } -void TFT_FSMC::WriteReg(uint16_t Reg) { - LCD->REG = Reg; +void TFT_FSMC::writeReg(uint16_t reg) { + LCD->REG = reg; __DSB(); } -uint32_t TFT_FSMC::GetID() { +uint32_t TFT_FSMC::getID() { uint32_t id; - WriteReg(0x0000); + writeReg(0x0000); id = LCD->RAM; if (id == 0) - id = ReadID(LCD_READ_ID); + id = readID(LCD_READ_ID); if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) - id = ReadID(LCD_READ_ID4); + id = readID(LCD_READ_ID4); if ((id & 0xFF00) == 0 && (id & 0xFF) != 0) - id = ReadID(LCD_READ_ID4); + id = readID(LCD_READ_ID4); return id; } - uint32_t TFT_FSMC::ReadID(uint16_t Reg) { + uint32_t TFT_FSMC::readID(uint16_t reg) { uint32_t id; - WriteReg(Reg); + writeReg(reg); id = LCD->RAM; // dummy read - id = Reg << 24; + id = reg << 24; id |= (LCD->RAM & 0x00FF) << 16; id |= (LCD->RAM & 0x00FF) << 8; id |= LCD->RAM & 0x00FF; @@ -225,11 +225,11 @@ bool TFT_FSMC::isBusy() { if ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & (DMA_ISR_TCIF | DMA_ISR_TEIF)) == 0) return true; __DSB(); - Abort(); + abort(); return false; } -void TFT_FSMC::Abort() { +void TFT_FSMC::abort() { dma_channel_reg_map *channel_regs = dma_channel_regs(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); dma_disable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); // Abort DMA transfer if any @@ -241,25 +241,25 @@ void TFT_FSMC::Abort() { channel_regs->CPAR = 0U; } -void TFT_FSMC::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { +void TFT_FSMC::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { // TODO: HAL STM32 uses DMA2_Channel1 for FSMC on STM32F1 - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); + dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | memoryIncrease); + dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, count); dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); TERN_(TFT_SHARED_IO, while (isBusy())); } -void TFT_FSMC::Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { +void TFT_FSMC::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { #if defined(FSMC_DMA_DEV) && defined(FSMC_DMA_CHANNEL) - dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | MemoryIncrease); - dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, Count); + dma_setup_transfer(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, data, DMA_SIZE_16BITS, &LCD->RAM, DMA_SIZE_16BITS, DMA_MEM_2_MEM | memoryIncrease); + dma_set_num_transfers(FSMC_DMA_DEV, FSMC_DMA_CHANNEL, count); dma_clear_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); dma_enable(FSMC_DMA_DEV, FSMC_DMA_CHANNEL); while ((dma_get_isr_bits(FSMC_DMA_DEV, FSMC_DMA_CHANNEL) & (DMA_CCR_TEIE | DMA_CCR_TCIE)) == 0) {} - Abort(); + abort(); #endif } diff --git a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h index 0db7f559b6..0e74ce2c2b 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_fsmc.h @@ -54,31 +54,31 @@ class TFT_FSMC { private: static LCD_CONTROLLER_TypeDef *LCD; - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + static uint32_t readID(uint16_t reg); + static void transmit(uint16_t data); + static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count); + static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count); public: - static void Init(); - static uint32_t GetID(); + static void init(); + static uint32_t getID(); static bool isBusy(); - static void Abort(); + static void abort(); - static void DataTransferBegin(uint16_t DataWidth=DATASIZE_16BIT) {}; - static void DataTransferEnd() {}; + static void dataTransferBegin(uint16_t dataWidth=DATASIZE_16BIT) {}; + static void dataTransferEnd() {}; - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg); + static void writeData(uint16_t data) { transmit(data); } + static void writeReg(uint16_t reg); - static void WriteSequence_DMA(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_PINC_ENABLE, Data, Count); } - static void WriteMultiple_DMA(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_PINC_DISABLE, &Data, Count); } + static void writeSequence_DMA(uint16_t *data, uint16_t count) { transmitDMA(DMA_PINC_ENABLE, data, count); } + static void writeMultiple_DMA(uint16_t color, uint16_t count) { static uint16_t data; data = color; transmitDMA(DMA_PINC_DISABLE, &data, count); } - static void WriteSequence(uint16_t *Data, uint16_t Count) { Transmit(DMA_PINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - while (Count > 0) { - Transmit(DMA_PINC_DISABLE, &Color, Count > DMA_MAX_SIZE ? DMA_MAX_SIZE : Count); - Count = Count > DMA_MAX_SIZE ? Count - DMA_MAX_SIZE : 0; + static void writeSequence(uint16_t *data, uint16_t count) { transmit(DMA_PINC_ENABLE, data, count); } + static void writeMultiple(uint16_t color, uint32_t count) { + while (count > 0) { + transmit(DMA_PINC_DISABLE, &color, count > DMA_MAX_SIZE ? DMA_MAX_SIZE : count); + count = count > DMA_MAX_SIZE ? count - DMA_MAX_SIZE : 0; } } }; diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp index eed52f4e8a..18d5644437 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.cpp @@ -30,7 +30,7 @@ SPIClass TFT_SPI::SPIx(TFT_SPI_DEVICE); -void TFT_SPI::Init() { +void TFT_SPI::init() { #if PIN_EXISTS(TFT_RESET) OUT_WRITE(TFT_RESET_PIN, HIGH); delay(100); @@ -70,8 +70,8 @@ void TFT_SPI::Init() { SPIx.setDataMode(SPI_MODE0); } -void TFT_SPI::DataTransferBegin(uint16_t DataSize) { - SPIx.setDataSize(DataSize); +void TFT_SPI::dataTransferBegin(uint16_t dataSize) { + SPIx.setDataSize(dataSize); SPIx.begin(); WRITE(TFT_CS_PIN, LOW); } @@ -80,11 +80,11 @@ void TFT_SPI::DataTransferBegin(uint16_t DataSize) { #include "../../../lcd/tft_io/tft_ids.h" #endif -uint32_t TFT_SPI::GetID() { +uint32_t TFT_SPI::getID() { uint32_t id; - id = ReadID(LCD_READ_ID); + id = readID(LCD_READ_ID); if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) { - id = ReadID(LCD_READ_ID4); + id = readID(LCD_READ_ID4); #ifdef TFT_DEFAULT_DRIVER if ((id & 0xFFFF) == 0 || (id & 0xFFFF) == 0xFFFF) id = TFT_DEFAULT_DRIVER; @@ -93,26 +93,25 @@ uint32_t TFT_SPI::GetID() { return id; } -uint32_t TFT_SPI::ReadID(uint16_t Reg) { - #if !PIN_EXISTS(TFT_MISO) - return 0; - #else - uint8_t d = 0; - uint32_t data = 0; - SPIx.setClockDivider(SPI_CLOCK_DIV16); - DataTransferBegin(DATASIZE_8BIT); - WriteReg(Reg); +uint32_t TFT_SPI::readID(uint16_t reg) { + uint32_t data = 0; - LOOP_L_N(i, 4) { - SPIx.read((uint8_t*)&d, 1); + #if PIN_EXISTS(TFT_MISO) + SPIx.setClockDivider(SPI_CLOCK_DIV16); + dataTransferBegin(DATASIZE_8BIT); + writeReg(reg); + + for (uint8_t i = 0; i < 4; ++i) { + uint8_t d; + SPIx.read(&d, 1); data = (data << 8) | d; } - DataTransferEnd(); + dataTransferEnd(); SPIx.setClockDivider(SPI_CLOCK_MAX); - - return data >> 7; #endif + + return data >> 7; } bool TFT_SPI::isBusy() { @@ -131,11 +130,11 @@ bool TFT_SPI::isBusy() { if (!(SPIdev->regs->SR & SPI_SR_TXE) || (SPIdev->regs->SR & SPI_SR_BSY)) return true; } - Abort(); + abort(); return false; } -void TFT_SPI::Abort() { +void TFT_SPI::abort() { dma_channel_reg_map *channel_regs = dma_channel_regs(DMAx, DMA_CHx); dma_disable(DMAx, DMA_CHx); // Abort DMA transfer if any @@ -147,23 +146,23 @@ void TFT_SPI::Abort() { channel_regs->CMAR = 0U; channel_regs->CPAR = 0U; - DataTransferEnd(); + dataTransferEnd(); } -void TFT_SPI::Transmit(uint16_t Data) { SPIx.send(Data); } +void TFT_SPI::transmit(uint16_t data) { SPIx.send(data); } -void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { - DataTransferBegin(); - SPIx.dmaSendAsync(Data, Count, MemoryIncrease == DMA_MINC_ENABLE); +void TFT_SPI::transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { + dataTransferBegin(); + SPIx.dmaSendAsync(data, count, memoryIncrease == DMA_MINC_ENABLE); TERN_(TFT_SHARED_IO, while (isBusy())); } -void TFT_SPI::Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { +void TFT_SPI::transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count) { WRITE(TFT_DC_PIN, HIGH); - DataTransferBegin(); - SPIx.dmaSend(Data, Count, MemoryIncrease == DMA_MINC_ENABLE); - DataTransferEnd(); + dataTransferBegin(); + SPIx.dmaSend(data, count, memoryIncrease == DMA_MINC_ENABLE); + dataTransferEnd(); } #endif // HAS_SPI_TFT diff --git a/Marlin/src/HAL/STM32F1/tft/tft_spi.h b/Marlin/src/HAL/STM32F1/tft/tft_spi.h index 573077d21d..d0c2e50486 100644 --- a/Marlin/src/HAL/STM32F1/tft/tft_spi.h +++ b/Marlin/src/HAL/STM32F1/tft/tft_spi.h @@ -63,34 +63,34 @@ class TFT_SPI { private: - static uint32_t ReadID(uint16_t Reg); - static void Transmit(uint16_t Data); - static void Transmit(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); - static void TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count); + static uint32_t readID(uint16_t reg); + static void transmit(uint16_t data); + static void transmit(uint32_t memoryIncrease, uint16_t *data, uint16_t count); + static void transmitDMA(uint32_t memoryIncrease, uint16_t *data, uint16_t count); public: static SPIClass SPIx; - static void Init(); - static uint32_t GetID(); + static void init(); + static uint32_t getID(); static bool isBusy(); - static void Abort(); + static void abort(); - static void DataTransferBegin(uint16_t DataWidth=DATA_SIZE_16BIT); - static void DataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); SPIx.end(); }; - static void DataTransferAbort(); + static void dataTransferBegin(uint16_t dataWidth=DATA_SIZE_16BIT); + static void dataTransferEnd() { WRITE(TFT_CS_PIN, HIGH); SPIx.end(); }; + static void dataTransferAbort(); - static void WriteData(uint16_t Data) { Transmit(Data); } - static void WriteReg(uint16_t Reg) { WRITE(TFT_DC_PIN, LOW); Transmit(Reg); WRITE(TFT_DC_PIN, HIGH); } + static void writeData(uint16_t data) { transmit(data); } + static void writeReg(uint16_t reg) { WRITE(TFT_DC_PIN, LOW); transmit(reg); WRITE(TFT_DC_PIN, HIGH); } - static void WriteSequence_DMA(uint16_t *Data, uint16_t Count) { TransmitDMA(DMA_MINC_ENABLE, Data, Count); } - static void WriteMultiple_DMA(uint16_t Color, uint16_t Count) { static uint16_t Data; Data = Color; TransmitDMA(DMA_MINC_DISABLE, &Data, Count); } + static void writeSequence_DMA(uint16_t *data, uint16_t count) { transmitDMA(DMA_MINC_ENABLE, data, count); } + static void writeMultiple_DMA(uint16_t color, uint16_t count) { static uint16_t data; data = color; transmitDMA(DMA_MINC_DISABLE, &data, count); } - static void WriteSequence(uint16_t *Data, uint16_t Count) { Transmit(DMA_MINC_ENABLE, Data, Count); } - static void WriteMultiple(uint16_t Color, uint32_t Count) { - while (Count > 0) { - Transmit(DMA_MINC_DISABLE, &Color, Count > DMA_MAX_SIZE ? DMA_MAX_SIZE : Count); - Count = Count > DMA_MAX_SIZE ? Count - DMA_MAX_SIZE : 0; + static void writeSequence(uint16_t *data, uint16_t count) { transmit(DMA_MINC_ENABLE, data, count); } + static void writeMultiple(uint16_t color, uint32_t count) { + while (count > 0) { + transmit(DMA_MINC_DISABLE, &color, count > DMA_MAX_SIZE ? DMA_MAX_SIZE : count); + count = count > DMA_MAX_SIZE ? count - DMA_MAX_SIZE : 0; } } }; diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp index bf57ba0034..845a57a814 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.cpp @@ -59,7 +59,7 @@ uint16_t delta(uint16_t a, uint16_t b) { return a > b ? a - b : b - a; } } #endif // TOUCH_BUTTONS_HW_SPI -void XPT2046::Init() { +void XPT2046::init() { SET_INPUT(TOUCH_MISO_PIN); SET_OUTPUT(TOUCH_MOSI_PIN); SET_OUTPUT(TOUCH_SCK_PIN); @@ -97,7 +97,7 @@ bool XPT2046::getRawPoint(int16_t *x, int16_t *y) { uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { uint16_t data[3]; - DataTransferBegin(); + dataTransferBegin(); TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.begin()); for (uint16_t i = 0; i < 3 ; i++) { @@ -106,7 +106,7 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { } TERN_(TOUCH_BUTTONS_HW_SPI, SPIx.end()); - DataTransferEnd(); + dataTransferEnd(); uint16_t delta01 = delta(data[0], data[1]), delta02 = delta(data[0], data[2]), @@ -119,17 +119,17 @@ uint16_t XPT2046::getRawData(const XPTCoordinate coordinate) { } uint16_t XPT2046::IO(uint16_t data) { - return TERN(TOUCH_BUTTONS_HW_SPI, HardwareIO, SoftwareIO)(data); + return TERN(TOUCH_BUTTONS_HW_SPI, hardwareIO, softwareIO)(data); } #if ENABLED(TOUCH_BUTTONS_HW_SPI) - uint16_t XPT2046::HardwareIO(uint16_t data) { + uint16_t XPT2046::hardwareIO(uint16_t data) { uint16_t result = SPIx.transfer(data); return result; } #endif -uint16_t XPT2046::SoftwareIO(uint16_t data) { +uint16_t XPT2046::softwareIO(uint16_t data) { uint16_t result = 0; for (uint8_t j = 0x80; j; j >>= 1) { diff --git a/Marlin/src/HAL/STM32F1/tft/xpt2046.h b/Marlin/src/HAL/STM32F1/tft/xpt2046.h index 7c456cf00e..8fdcacf926 100644 --- a/Marlin/src/HAL/STM32F1/tft/xpt2046.h +++ b/Marlin/src/HAL/STM32F1/tft/xpt2046.h @@ -65,12 +65,12 @@ private: static uint16_t getRawData(const XPTCoordinate coordinate); static bool isTouched(); - static void DataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; - static void DataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; + static void dataTransferBegin() { WRITE(TOUCH_CS_PIN, LOW); }; + static void dataTransferEnd() { WRITE(TOUCH_CS_PIN, HIGH); }; #if ENABLED(TOUCH_BUTTONS_HW_SPI) - static uint16_t HardwareIO(uint16_t data); + static uint16_t hardwareIO(uint16_t data); #endif - static uint16_t SoftwareIO(uint16_t data); + static uint16_t softwareIO(uint16_t data); static uint16_t IO(uint16_t data = 0); public: @@ -78,6 +78,6 @@ public: static SPIClass SPIx; #endif - static void Init(); + static void init(); static bool getRawPoint(int16_t *x, int16_t *y); }; diff --git a/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h b/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h index c1bbcb121b..28510fb508 100644 --- a/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h +++ b/Marlin/src/HAL/TEENSY31_32/endstop_interrupts.h @@ -47,33 +47,33 @@ void endstop_ISR() { endstops.update(); } void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); - TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN)); - TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN)); - TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN)); - TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); - TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); - TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); - TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN)); - TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN)); - TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN)); - TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN)); - TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN)); - TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN)); + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN_PIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); } diff --git a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h index 48d3bbbfa1..505434cd89 100644 --- a/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h +++ b/Marlin/src/HAL/TEENSY35_36/endstop_interrupts.h @@ -46,33 +46,33 @@ void endstop_ISR() { endstops.update(); } */ void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); - TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN)); - TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN)); - TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN)); - TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); - TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); - TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); - TERN_(HAS_U_MAX, _ATTACH(U_MAX_PIN)); - TERN_(HAS_U_MIN, _ATTACH(U_MIN_PIN)); - TERN_(HAS_V_MAX, _ATTACH(V_MAX_PIN)); - TERN_(HAS_V_MIN, _ATTACH(V_MIN_PIN)); - TERN_(HAS_W_MAX, _ATTACH(W_MAX_PIN)); - TERN_(HAS_W_MIN, _ATTACH(W_MIN_PIN)); + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN_PIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); } diff --git a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h index ff6d772411..843905a851 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h @@ -26,7 +26,7 @@ */ #if HAS_SPI_TFT || HAS_FSMC_TFT - #error "Sorry! TFT displays are not available for Teensy 3.5/3.6. + #error "Sorry! TFT displays are not available for Teensy 3.5/3.6." #endif #if ENABLED(EMERGENCY_PARSER) diff --git a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h index 235c0e4a48..8526febf10 100644 --- a/Marlin/src/HAL/TEENSY35_36/pinsDebug.h +++ b/Marlin/src/HAL/TEENSY35_36/pinsDebug.h @@ -55,12 +55,12 @@ #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(9)) || ((P) >= analogInputToDigitalPin(12) && (P) <= analogInputToDigitalPin(20)) -void HAL_print_analog_pin(char buffer[], int8_t pin) { +void print_analog_pin(char buffer[], int8_t pin) { if (pin <= 23) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 14)); else if (pin <= 39) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 19)); } -void HAL_analog_pin_state(char buffer[], int8_t pin) { +void analog_pin_state(char buffer[], int8_t pin) { if (pin <= 23) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 14)); else if (pin <= 39) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 19)); } @@ -77,7 +77,7 @@ void HAL_analog_pin_state(char buffer[], int8_t pin) { * Print a pin's PWM status. * Return true if it's currently a PWM pin. */ -bool HAL_pwm_status(const int8_t pin) { +bool pwm_status(int8_t pin) { char buffer[20]; // for the sprintf statements switch (pin) { FTM_CASE(0,0); @@ -108,4 +108,4 @@ bool HAL_pwm_status(const int8_t pin) { SERIAL_ECHOPGM(" "); } -static void HAL_pwm_details(uint8_t pin) { /* TODO */ } +void pwm_details(uint8_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h index 4c3ddec9f1..325d97daeb 100644 --- a/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h +++ b/Marlin/src/HAL/TEENSY40_41/endstop_interrupts.h @@ -46,27 +46,33 @@ void endstop_ISR() { endstops.update(); } */ void setup_endstop_interrupts() { #define _ATTACH(P) attachInterrupt(digitalPinToInterrupt(P), endstop_ISR, CHANGE) - TERN_(HAS_X_MAX, _ATTACH(X_MAX_PIN)); - TERN_(HAS_X_MIN, _ATTACH(X_MIN_PIN)); - TERN_(HAS_Y_MAX, _ATTACH(Y_MAX_PIN)); - TERN_(HAS_Y_MIN, _ATTACH(Y_MIN_PIN)); - TERN_(HAS_Z_MAX, _ATTACH(Z_MAX_PIN)); - TERN_(HAS_Z_MIN, _ATTACH(Z_MIN_PIN)); - TERN_(HAS_X2_MAX, _ATTACH(X2_MAX_PIN)); - TERN_(HAS_X2_MIN, _ATTACH(X2_MIN_PIN)); - TERN_(HAS_Y2_MAX, _ATTACH(Y2_MAX_PIN)); - TERN_(HAS_Y2_MIN, _ATTACH(Y2_MIN_PIN)); - TERN_(HAS_Z2_MAX, _ATTACH(Z2_MAX_PIN)); - TERN_(HAS_Z2_MIN, _ATTACH(Z2_MIN_PIN)); - TERN_(HAS_Z3_MAX, _ATTACH(Z3_MAX_PIN)); - TERN_(HAS_Z3_MIN, _ATTACH(Z3_MIN_PIN)); - TERN_(HAS_Z4_MAX, _ATTACH(Z4_MAX_PIN)); - TERN_(HAS_Z4_MIN, _ATTACH(Z4_MIN_PIN)); - TERN_(HAS_Z_MIN_PROBE_PIN, _ATTACH(Z_MIN_PROBE_PIN)); - TERN_(HAS_I_MAX, _ATTACH(I_MAX_PIN)); - TERN_(HAS_I_MIN, _ATTACH(I_MIN_PIN)); - TERN_(HAS_J_MAX, _ATTACH(J_MAX_PIN)); - TERN_(HAS_J_MIN, _ATTACH(J_MIN_PIN)); - TERN_(HAS_K_MAX, _ATTACH(K_MAX_PIN)); - TERN_(HAS_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(HAS_Z_MIN_PIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); } diff --git a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h index c85a88c9ae..54f3cb5885 100644 --- a/Marlin/src/HAL/TEENSY40_41/pinsDebug.h +++ b/Marlin/src/HAL/TEENSY40_41/pinsDebug.h @@ -30,7 +30,6 @@ #define NUMBER_PINS_TOTAL NUM_DIGITAL_PINS #define digitalRead_mod(p) extDigitalRead(p) // AVR digitalRead disabled PWM before it read the pin -#define PRINT_PORT(p) #define PRINT_ARRAY_NAME(x) do{ sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN(p) do{ sprintf_P(buffer, PSTR("%02d"), p); SERIAL_ECHO(buffer); }while(0) #define PRINT_PIN_ANALOG(p) do{ sprintf_P(buffer, PSTR(" (A%2d) "), DIGITAL_PIN_TO_ANALOG_PIN(pin)); SERIAL_ECHO(buffer); }while(0) @@ -39,7 +38,6 @@ #define VALID_PIN(pin) (pin >= 0 && pin < int8_t(NUMBER_PINS_TOTAL)) #define DIGITAL_PIN_TO_ANALOG_PIN(p) int(p - analogInputToDigitalPin(0)) #define IS_ANALOG(P) ((P) >= analogInputToDigitalPin(0) && (P) <= analogInputToDigitalPin(13)) || ((P) >= analogInputToDigitalPin(14) && (P) <= analogInputToDigitalPin(17)) -#define pwm_status(pin) HAL_pwm_status(pin) #define GET_PINMODE(PIN) (VALID_PIN(pin) && IS_OUTPUT(pin)) #define MULTI_NAME_PAD 16 // space needed to be pretty if not first name assigned to a pin @@ -120,12 +118,12 @@ const struct pwm_pin_info_struct pwm_pin_info[] = { #endif }; -void HAL_print_analog_pin(char buffer[], int8_t pin) { +void print_analog_pin(char buffer[], const pin_t pin) { if (pin <= 23) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 14)); else if (pin <= 41) sprintf_P(buffer, PSTR("(A%2d) "), int(pin - 24)); } -void HAL_analog_pin_state(char buffer[], int8_t pin) { +void analog_pin_state(char buffer[], const pin_t pin) { if (pin <= 23) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 14)); else if (pin <= 41) sprintf_P(buffer, PSTR("Analog in =% 5d"), analogRead(pin - 24)); } @@ -136,14 +134,14 @@ void HAL_analog_pin_state(char buffer[], int8_t pin) { * Print a pin's PWM status. * Return true if it's currently a PWM pin. */ -bool HAL_pwm_status(const int8_t pin) { +bool pwm_status(const pin_t pin) { char buffer[20]; // for the sprintf statements const struct pwm_pin_info_struct *info; - if (pin >= CORE_NUM_DIGITAL) return 0; - info = pwm_pin_info + pin; + if (pin >= CORE_NUM_DIGITAL) return false; - if (info->type == 0) return 0; + info = pwm_pin_info + pin; + if (info->type == 0) return false; /* TODO decode pwm value from timers */ // for now just indicate if output is set as pwm @@ -151,4 +149,6 @@ bool HAL_pwm_status(const int8_t pin) { return (*(portConfigRegister(pin)) == info->muxval); } -static void pwm_details(uint8_t pin) { /* TODO */ } +void pwm_details(const pin_t) { /* TODO */ } + +void print_port(const pin_t) {} diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h index 488980ce09..84ba7087b0 100644 --- a/Marlin/src/HAL/platforms.h +++ b/Marlin/src/HAL/platforms.h @@ -24,34 +24,34 @@ #define XSTR(V...) #V #ifdef __AVR__ - #define HAL_PATH(PATH, NAME) XSTR(PATH/AVR/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/AVR/NAME) #elif defined(ARDUINO_ARCH_SAM) - #define HAL_PATH(PATH, NAME) XSTR(PATH/DUE/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/DUE/NAME) #elif defined(__MK20DX256__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY31_32/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/TEENSY31_32/NAME) #elif defined(__MK64FX512__) || defined(__MK66FX1M0__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY35_36/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/TEENSY35_36/NAME) #elif defined(__IMXRT1062__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/TEENSY40_41/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/TEENSY40_41/NAME) #elif defined(TARGET_LPC1768) - #define HAL_PATH(PATH, NAME) XSTR(PATH/LPC1768/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/LPC1768/NAME) #elif defined(__STM32F1__) || defined(TARGET_STM32F1) - #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32F1/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/STM32F1/NAME) #elif defined(ARDUINO_ARCH_STM32) #ifndef HAL_STM32 #define HAL_STM32 #endif - #define HAL_PATH(PATH, NAME) XSTR(PATH/STM32/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/STM32/NAME) #elif defined(ARDUINO_ARCH_ESP32) - #define HAL_PATH(PATH, NAME) XSTR(PATH/ESP32/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/ESP32/NAME) #elif defined(__PLAT_LINUX__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/LINUX/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/LINUX/NAME) #elif defined(__PLAT_NATIVE_SIM__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/NATIVE_SIM/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/NATIVE_SIM/NAME) #elif defined(__SAMD51__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/SAMD51/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/SAMD51/NAME) #elif defined(__SAMD21__) - #define HAL_PATH(PATH, NAME) XSTR(PATH/SAMD21/NAME) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/SAMD21/NAME) #else #error "Unsupported Platform!" #endif diff --git a/Marlin/src/HAL/shared/Delay.cpp b/Marlin/src/HAL/shared/Delay.cpp index c64376d25d..31c3f45765 100644 --- a/Marlin/src/HAL/shared/Delay.cpp +++ b/Marlin/src/HAL/shared/Delay.cpp @@ -109,13 +109,7 @@ #if ENABLED(MARLIN_DEV_MODE) void dump_delay_accuracy_check() { auto report_call_time = [](FSTR_P const name, FSTR_P const unit, const uint32_t cycles, const uint32_t total, const bool do_flush=true) { - SERIAL_ECHOPGM("Calling "); - SERIAL_ECHOF(name); - SERIAL_ECHOLNPGM(" for ", cycles); - SERIAL_ECHOF(unit); - SERIAL_ECHOLNPGM(" took: ", total); - SERIAL_CHAR(' '); - SERIAL_ECHOF(unit); + SERIAL_ECHOLN(F("Calling "), name, F(" for "), cycles, AS_CHAR(' '), unit, F(" took: "), total, AS_CHAR(' '), unit); if (do_flush) SERIAL_FLUSHTX(); }; diff --git a/Marlin/src/HAL/shared/HAL_ST7920.h b/Marlin/src/HAL/shared/HAL_ST7920.h index 4e362f96ba..305736c3a5 100644 --- a/Marlin/src/HAL/shared/HAL_ST7920.h +++ b/Marlin/src/HAL/shared/HAL_ST7920.h @@ -27,7 +27,7 @@ * (bypassing U8G), it will allow the LIGHTWEIGHT_UI to operate. */ -#if BOTH(HAS_MARLINUI_U8GLIB, LIGHTWEIGHT_UI) +#if ALL(HAS_MARLINUI_U8GLIB, LIGHTWEIGHT_UI) void ST7920_cs(); void ST7920_ncs(); void ST7920_set_cmd(); diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index a4151b38c2..da1cff4fcc 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -135,7 +135,7 @@ // 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_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 diff --git a/Marlin/src/HAL/shared/eeprom_api.cpp b/Marlin/src/HAL/shared/eeprom_api.cpp index 47cfa5a2db..083ccc70d7 100644 --- a/Marlin/src/HAL/shared/eeprom_api.cpp +++ b/Marlin/src/HAL/shared/eeprom_api.cpp @@ -22,7 +22,7 @@ */ #include "../../inc/MarlinConfigPre.h" -#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) +#if ANY(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) #include "eeprom_api.h" PersistentStore persistentStore; diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index 6b559e234b..bba9c626a4 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -33,13 +33,14 @@ #if ENABLED(SOFT_I2C_EEPROM) #include - SlowSoftWire Wire = SlowSoftWire(I2C_SDA_PIN, I2C_SCL_PIN, true); + SlowSoftWire eWire = SlowSoftWire(I2C_SDA_PIN, I2C_SCL_PIN, true); #else #include + #define eWire Wire #endif void eeprom_init() { - Wire.begin( + eWire.begin( #if PINS_EXIST(I2C_SCL, I2C_SDA) && DISABLED(SOFT_I2C_EEPROM) uint8_t(I2C_SDA_PIN), uint8_t(I2C_SCL_PIN) #endif @@ -75,16 +76,16 @@ static uint8_t _eeprom_calc_device_address(uint8_t * const pos) { static void _eeprom_begin(uint8_t * const pos) { const unsigned eeprom_address = (unsigned)pos; - Wire.beginTransmission(_eeprom_calc_device_address(pos)); + eWire.beginTransmission(_eeprom_calc_device_address(pos)); if (!SMALL_EEPROM) - Wire.write(uint8_t((eeprom_address >> 8) & 0xFF)); // Address High, if needed - Wire.write(uint8_t(eeprom_address & 0xFF)); // Address Low + eWire.write(uint8_t((eeprom_address >> 8) & 0xFF)); // Address High, if needed + eWire.write(uint8_t(eeprom_address & 0xFF)); // Address Low } void eeprom_write_byte(uint8_t *pos, uint8_t value) { _eeprom_begin(pos); - Wire.write(value); - Wire.endTransmission(); + eWire.write(value); + eWire.endTransmission(); // wait for write cycle to complete // this could be done more efficiently with "acknowledge polling" @@ -93,9 +94,9 @@ void eeprom_write_byte(uint8_t *pos, uint8_t value) { uint8_t eeprom_read_byte(uint8_t *pos) { _eeprom_begin(pos); - Wire.endTransmission(); - Wire.requestFrom(_eeprom_calc_device_address(pos), (byte)1); - return Wire.available() ? Wire.read() : 0xFF; + eWire.endTransmission(); + eWire.requestFrom(_eeprom_calc_device_address(pos), (byte)1); + return eWire.available() ? eWire.read() : 0xFF; } #endif // USE_SHARED_EEPROM diff --git a/Marlin/src/HAL/shared/fauxpins.h b/Marlin/src/HAL/shared/fauxpins.h new file mode 100644 index 0000000000..924bfba02a --- /dev/null +++ b/Marlin/src/HAL/shared/fauxpins.h @@ -0,0 +1,367 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 + +// +// Faux pins for Dependency Check +// + +// +// STM32 Pin Names +// +#define PA0 0x10 +#define PA1 0x11 +#define PA2 0x12 +#define PA3 0x13 +#define PA4 0x14 +#define PA5 0x15 +#define PA6 0x16 +#define PA7 0x17 +#define PA8 0x18 +#define PA9 0x19 +#define PA10 0x1A +#define PA11 0x1B +#define PA12 0x1C +#define PA13 0x1D +#define PA14 0x1E +#define PA15 0x1F + +#define PB0 0x20 +#define PB1 0x21 +#define PB2 0x22 +#define PB3 0x23 +#define PB4 0x24 +#define PB5 0x25 +#define PB6 0x26 +#define PB7 0x27 +#define PB8 0x28 +#define PB9 0x29 +#define PB10 0x2A +#define PB11 0x2B +#define PB12 0x2C +#define PB13 0x2D +#define PB14 0x2E +#define PB15 0x2F + +#define PC0 0x30 +#define PC1 0x31 +#define PC2 0x32 +#define PC3 0x33 +#define PC4 0x34 +#define PC5 0x35 +#define PC6 0x36 +#define PC7 0x37 +#define PC8 0x38 +#define PC9 0x39 +#define PC10 0x3A +#define PC11 0x3B +#define PC12 0x3C +#define PC13 0x3D +#define PC14 0x3E +#define PC15 0x3F + +#define PD0 0x40 +#define PD1 0x41 +#define PD2 0x42 +#define PD3 0x43 +#define PD4 0x44 +#define PD5 0x45 +#define PD6 0x46 +#define PD7 0x47 +#define PD8 0x48 +#define PD9 0x49 +#define PD10 0x4A +#define PD11 0x4B +#define PD12 0x4C +#define PD13 0x4D +#define PD14 0x4E +#define PD15 0x4F + +#define PE0 0x50 +#define PE1 0x51 +#define PE2 0x52 +#define PE3 0x53 +#define PE4 0x54 +#define PE5 0x55 +#define PE6 0x56 +#define PE7 0x57 +#define PE8 0x58 +#define PE9 0x59 +#define PE10 0x5A +#define PE11 0x5B +#define PE12 0x5C +#define PE13 0x5D +#define PE14 0x5E +#define PE15 0x5F + +#define PF0 0x60 +#define PF1 0x61 +#define PF2 0x62 +#define PF3 0x63 +#define PF4 0x64 +#define PF5 0x65 +#define PF6 0x66 +#define PF7 0x67 +#define PF8 0x68 +#define PF9 0x69 +#define PF10 0x6A +#define PF11 0x6B +#define PF12 0x6C +#define PF13 0x6D +#define PF14 0x6E +#define PF15 0x6F + +#define PG0 0x70 +#define PG1 0x71 +#define PG2 0x72 +#define PG3 0x73 +#define PG4 0x74 +#define PG5 0x75 +#define PG6 0x76 +#define PG7 0x77 +#define PG8 0x78 +#define PG9 0x79 +#define PG10 0x7A +#define PG11 0x7B +#define PG12 0x7C +#define PG13 0x7D +#define PG14 0x7E +#define PG15 0x7F + +#define PH0 0x80 +#define PH1 0x81 +#define PH2 0x82 +#define PH3 0x83 +#define PH4 0x84 +#define PH5 0x85 +#define PH6 0x86 +#define PH7 0x87 +#define PH8 0x88 +#define PH9 0x89 +#define PH10 0x8A +#define PH11 0x8B +#define PH12 0x8C +#define PH13 0x8D +#define PH14 0x8E +#define PH15 0x8F + +#define PI0 0x90 +#define PI1 0x91 +#define PI2 0x92 +#define PI3 0x93 +#define PI4 0x94 +#define PI5 0x95 +#define PI6 0x96 +#define PI7 0x97 +#define PI8 0x98 +#define PI9 0x99 +#define PI10 0x9A +#define PI11 0x9B +#define PI12 0x9C +#define PI13 0x9D +#define PI14 0x9E +#define PI15 0x9F + +#define PJ0 0xA0 +#define PJ1 0xA1 +#define PJ2 0xA2 +#define PJ3 0xA3 +#define PJ4 0xA4 +#define PJ5 0xA5 +#define PJ6 0xA6 +#define PJ7 0xA7 +#define PJ8 0xA8 +#define PJ9 0xA9 +#define PJ10 0xAA +#define PJ11 0xAB +#define PJ12 0xAC +#define PJ13 0xAD +#define PJ14 0xAE +#define PJ15 0xAF + +// +// LPC Pin Names +// +#define P0_00 100 +#define P0_01 101 +#define P0_02 102 +#define P0_03 103 +#define P0_04 104 +#define P0_05 105 +#define P0_06 106 +#define P0_07 107 +#define P0_08 108 +#define P0_09 109 +#define P0_10 110 +#define P0_11 111 +#define P0_12 112 +#define P0_13 113 +#define P0_14 114 +#define P0_15 115 +#define P0_16 116 +#define P0_17 117 +#define P0_18 118 +#define P0_19 119 +#define P0_20 120 +#define P0_21 121 +#define P0_22 122 +#define P0_23 123 +#define P0_24 124 +#define P0_25 125 +#define P0_26 126 +#define P0_27 127 +#define P0_28 128 +#define P0_29 129 +#define P0_30 130 +#define P0_31 131 + +#define P1_00 200 +#define P1_01 201 +#define P1_02 202 +#define P1_03 203 +#define P1_04 204 +#define P1_05 205 +#define P1_06 206 +#define P1_07 207 +#define P1_08 208 +#define P1_09 209 +#define P1_10 210 +#define P1_11 211 +#define P1_12 212 +#define P1_13 213 +#define P1_14 214 +#define P1_15 215 +#define P1_16 216 +#define P1_17 217 +#define P1_18 218 +#define P1_19 219 +#define P1_20 220 +#define P1_21 221 +#define P1_22 222 +#define P1_23 223 +#define P1_24 224 +#define P1_25 225 +#define P1_26 226 +#define P1_27 227 +#define P1_28 228 +#define P1_29 229 +#define P1_30 230 +#define P1_31 231 + +#define P2_00 300 +#define P2_01 301 +#define P2_02 302 +#define P2_03 303 +#define P2_04 304 +#define P2_05 305 +#define P2_06 306 +#define P2_07 307 +#define P2_08 308 +#define P2_09 309 +#define P2_10 310 +#define P2_11 311 +#define P2_12 312 +#define P2_13 313 +#define P2_14 314 +#define P2_15 315 +#define P2_16 316 +#define P2_17 317 +#define P2_18 318 +#define P2_19 319 +#define P2_20 320 +#define P2_21 321 +#define P2_22 322 +#define P2_23 323 +#define P2_24 324 +#define P2_25 325 +#define P2_26 326 +#define P2_27 327 +#define P2_28 328 +#define P2_29 329 +#define P2_30 330 +#define P2_31 331 + +#define P3_00 400 +#define P3_01 401 +#define P3_02 402 +#define P3_03 403 +#define P3_04 404 +#define P3_05 405 +#define P3_06 406 +#define P3_07 407 +#define P3_08 408 +#define P3_09 409 +#define P3_10 410 +#define P3_11 411 +#define P3_12 412 +#define P3_13 413 +#define P3_14 414 +#define P3_15 415 +#define P3_16 416 +#define P3_17 417 +#define P3_18 418 +#define P3_19 419 +#define P3_20 420 +#define P3_21 421 +#define P3_22 422 +#define P3_23 423 +#define P3_24 424 +#define P3_25 425 +#define P3_26 426 +#define P3_27 427 +#define P3_28 428 +#define P3_29 429 +#define P3_30 430 +#define P3_31 431 + +#define P4_00 500 +#define P4_01 501 +#define P4_02 502 +#define P4_03 503 +#define P4_04 504 +#define P4_05 505 +#define P4_06 506 +#define P4_07 507 +#define P4_08 508 +#define P4_09 509 +#define P4_10 510 +#define P4_11 511 +#define P4_12 512 +#define P4_13 513 +#define P4_14 514 +#define P4_15 515 +#define P4_16 516 +#define P4_17 517 +#define P4_18 518 +#define P4_19 519 +#define P4_20 520 +#define P4_21 521 +#define P4_22 522 +#define P4_23 523 +#define P4_24 524 +#define P4_25 525 +#define P4_26 526 +#define P4_27 527 +#define P4_28 528 +#define P4_29 529 +#define P4_30 530 +#define P4_31 531 diff --git a/Marlin/src/HAL/shared/servo.cpp b/Marlin/src/HAL/shared/servo.cpp index b838800de6..bb9d618018 100644 --- a/Marlin/src/HAL/shared/servo.cpp +++ b/Marlin/src/HAL/shared/servo.cpp @@ -67,7 +67,7 @@ uint8_t ServoCount = 0; // the total number of attached static bool anyTimerChannelActive(const timer16_Sequence_t timer) { // returns true if any servo is active on this timer - LOOP_L_N(channel, SERVOS_PER_TIMER) { + for (uint8_t channel = 0; channel < SERVOS_PER_TIMER; ++channel) { if (SERVO(timer, channel).Pin.isActive) return true; } diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e478a35445..e183a04359 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -199,7 +199,7 @@ #include "feature/runout.h" #endif -#if EITHER(PROBE_TARE, HAS_Z_SERVO_PROBE) +#if ANY(PROBE_TARE, HAS_Z_SERVO_PROBE) #include "module/probe.h" #endif @@ -321,7 +321,7 @@ bool pin_is_protected(const pin_t pin) { static constexpr size_t pincount = OnlyPins::size; static const pin_t (&sensitive_pins)[pincount] PROGMEM = OnlyPins::table; #endif - LOOP_L_N(i, pincount) { + for (uint8_t i = 0; i < pincount; ++i) { const pin_t * const pptr = &sensitive_pins[i]; if (pin == (sizeof(pin_t) == 2 ? (pin_t)pgm_read_word(pptr) : (pin_t)pgm_read_byte(pptr))) return true; } @@ -393,7 +393,7 @@ void startOrResumeJob() { if (queue.enqueue_one(F("M1001"))) { // Keep trying until it gets queued marlin_state = MF_RUNNING; // Signal to stop trying TERN_(PASSWORD_AFTER_SD_PRINT_END, password.lock_machine()); - TERN_(DGUS_LCD_UI_MKS, ScreenHandler.SDPrintingFinished()); + TERN_(DGUS_LCD_UI_MKS, screen.sdPrintingFinished()); } } @@ -676,28 +676,9 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { && ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) && !planner.has_blocks_queued() ) { - #if HAS_SWITCHING_EXTRUDER - bool oldstatus; - switch (active_extruder) { - default: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, 0); stepper.ENABLE_EXTRUDER(0); break; - #if E_STEPPERS > 1 - case 2: case 3: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, 1); stepper.ENABLE_EXTRUDER(1); break; - #if E_STEPPERS > 2 - case 4: case 5: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, 2); stepper.ENABLE_EXTRUDER(2); break; - #if E_STEPPERS > 3 - case 6: case 7: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, 3); stepper.ENABLE_EXTRUDER(3); break; - #endif // E_STEPPERS > 3 - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - } - #else // !HAS_SWITCHING_EXTRUDER - bool oldstatus; - switch (active_extruder) { - default: - #define _CASE_EN(N) case N: oldstatus = stepper.AXIS_IS_ENABLED(E_AXIS, N); stepper.ENABLE_EXTRUDER(N); break; - REPEAT(E_STEPPERS, _CASE_EN); - } - #endif + const int8_t e_stepper = TERN(HAS_SWITCHING_EXTRUDER, active_extruder >> 1, active_extruder); + const bool e_off = !stepper.AXIS_IS_ENABLED(E_AXIS, e_stepper); + if (e_off) stepper.ENABLE_EXTRUDER(e_stepper); const float olde = current_position.e; current_position.e += EXTRUDER_RUNOUT_EXTRUDE; @@ -706,22 +687,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { planner.set_e_position_mm(olde); planner.synchronize(); - #if HAS_SWITCHING_EXTRUDER - switch (active_extruder) { - default: if (oldstatus) stepper.ENABLE_EXTRUDER(0); else stepper.DISABLE_EXTRUDER(0); break; - #if E_STEPPERS > 1 - case 2: case 3: if (oldstatus) stepper.ENABLE_EXTRUDER(1); else stepper.DISABLE_EXTRUDER(1); break; - #if E_STEPPERS > 2 - case 4: case 5: if (oldstatus) stepper.ENABLE_EXTRUDER(2); else stepper.DISABLE_EXTRUDER(2); break; - #endif // E_STEPPERS > 2 - #endif // E_STEPPERS > 1 - } - #else // !HAS_SWITCHING_EXTRUDER - switch (active_extruder) { - #define _CASE_RESTORE(N) case N: if (oldstatus) stepper.ENABLE_EXTRUDER(N); else stepper.DISABLE_EXTRUDER(N); break; - REPEAT(E_STEPPERS, _CASE_RESTORE); - } - #endif // !HAS_SWITCHING_EXTRUDER + if (e_off) stepper.DISABLE_EXTRUDER(e_stepper); gcode.reset_stepper_timeout(ms); } @@ -760,6 +726,10 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { #endif } +#if ALL(EP_BABYSTEPPING, EMERGENCY_PARSER) + #include "feature/babystep.h" +#endif + /** * Standard idle routine keeps the machine alive: * - Core Marlin activities @@ -830,7 +800,7 @@ void idle(const bool no_stepper_sleep/*=false*/) { // Run StallGuard endstop checks #if ENABLED(SPI_ENDSTOPS) if (endstops.tmc_spi_homing.any && TERN1(IMPROVE_HOMING_RELIABILITY, ELAPSED(millis(), sg_guard_period))) - LOOP_L_N(i, 4) if (endstops.tmc_spi_homing_check()) break; // Read SGT 4 times per idle loop + for (uint8_t i = 0; i < 4; ++i) if (endstops.tmc_spi_homing_check()) break; // Read SGT 4 times per idle loop #endif // Handle SD Card insert / remove @@ -849,7 +819,7 @@ void idle(const bool no_stepper_sleep/*=false*/) { TERN_(HAS_BEEPER, buzzer.tick()); // Handle UI input / draw events - TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); + TERN(DWIN_CREALITY_LCD, dwinUpdate(), ui.update()); // Run i2c Position Encoders #if ENABLED(I2C_POSITION_ENCODERS) @@ -882,6 +852,11 @@ void idle(const bool no_stepper_sleep/*=false*/) { // Handle Joystick jogging TERN_(POLL_JOG, joystick.inject_jog_moves()); + // Async Babystepping via the Emergency Parser + #if ALL(EP_BABYSTEPPING, EMERGENCY_PARSER) + babystep.do_ep_steps(); + #endif + // Direct Stepping TERN_(DIRECT_STEPPING, page_manager.write_responses()); @@ -907,7 +882,7 @@ void kill(FSTR_P const lcd_error/*=nullptr*/, FSTR_P const lcd_component/*=nullp TERN_(HAS_CUTTER, cutter.kill()); // Full cutter shutdown including ISR control // Echo the LCD message to serial for extra context - if (lcd_error) { SERIAL_ECHO_START(); SERIAL_ECHOLNF(lcd_error); } + if (lcd_error) { SERIAL_ECHO_START(); SERIAL_ECHOLN(lcd_error); } #if HAS_DISPLAY ui.kill_screen(lcd_error ?: GET_TEXT_F(MSG_KILLED), lcd_component ?: FPSTR(NUL_STR)); @@ -949,7 +924,7 @@ void minkill(const bool steppers_off/*=false*/) { TERN_(HAS_SUICIDE, suicide()); - #if EITHER(HAS_KILL, SOFT_RESET_ON_KILL) + #if ANY(HAS_KILL, SOFT_RESET_ON_KILL) // Wait for both KILL and ENC to be released while (TERN0(HAS_KILL, kill_state()) || TERN0(SOFT_RESET_ON_KILL, ui.button_pressed())) @@ -978,7 +953,7 @@ void stop() { print_job_timer.stop(); - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) + #if ANY(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) thermalManager.set_fans_paused(false); // Un-pause fans for safety #endif @@ -1340,14 +1315,14 @@ void setup() { #endif #endif - #if BOTH(HAS_MEDIA, SDCARD_EEPROM_EMULATION) + #if ALL(HAS_MEDIA, SDCARD_EEPROM_EMULATION) SETUP_RUN(card.mount()); // Mount media with settings before first_load #endif SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults) // This also updates variables in the planner, elsewhere - #if BOTH(HAS_WIRED_LCD, SHOW_BOOTSCREEN) + #if ALL(HAS_WIRED_LCD, SHOW_BOOTSCREEN) SETUP_RUN(ui.show_bootscreen()); const millis_t bootscreen_ms = millis(); #endif @@ -1422,7 +1397,7 @@ void setup() { SETUP_RUN(stepper_dac.init()); #endif - #if EITHER(Z_PROBE_SLED, SOLENOID_PROBE) && HAS_SOLENOID_1 + #if ANY(Z_PROBE_SLED, SOLENOID_PROBE) && HAS_SOLENOID_1 OUT_WRITE(SOL1_PIN, LOW); // OFF #endif @@ -1608,7 +1583,7 @@ void setup() { #endif #if HAS_DWIN_E3V2_BASIC - SETUP_RUN(DWIN_InitScreen()); + SETUP_RUN(dwinInitScreen()); #endif #if HAS_SERVICE_INTERVALS && !HAS_DWIN_E3V2_BASIC @@ -1630,7 +1605,7 @@ void setup() { SETUP_RUN(tft_lvgl_init()); #endif - #if BOTH(HAS_WIRED_LCD, SHOW_BOOTSCREEN) + #if ALL(HAS_WIRED_LCD, SHOW_BOOTSCREEN) const millis_t elapsed = millis() - bootscreen_ms; #if ENABLED(MARLIN_DEV_MODE) SERIAL_ECHOLNPGM("elapsed=", elapsed); @@ -1642,7 +1617,7 @@ void setup() { SETUP_RUN(password.lock_machine()); // Will not proceed until correct password provided #endif - #if BOTH(HAS_MARLINUI_MENU, TOUCH_SCREEN_CALIBRATION) && EITHER(TFT_CLASSIC_UI, TFT_COLOR_UI) + #if ALL(HAS_MARLINUI_MENU, TOUCH_SCREEN_CALIBRATION) && ANY(TFT_CLASSIC_UI, TFT_COLOR_UI) SETUP_RUN(ui.check_touch_calibration()); #endif @@ -1658,6 +1633,10 @@ void setup() { SETUP_RUN(bdl.init(I2C_BD_SDA_PIN, I2C_BD_SCL_PIN, I2C_BD_DELAY)); #endif + #if ENABLED(FT_MOTION) + SETUP_RUN(fxdTiCtrl.init()); + #endif + marlin_state = MF_RUNNING; #ifdef STARTUP_TUNE @@ -1695,7 +1674,7 @@ void loop() { queue.advance(); - #if EITHER(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) + #if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) powerManager.checkAutoPowerOff(); #endif diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index a51d9a12e1..e9940fc344 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -54,6 +54,12 @@ #define BOARD_RAMPS_PLUS_EEF 1033 // RAMPS Plus 3DYMY (Power outputs: Hotend0, Hotend1, Fan) #define BOARD_RAMPS_PLUS_SF 1034 // RAMPS Plus 3DYMY (Power outputs: Spindle, Controller Fan) +#define BOARD_RAMPS_BTT_16_PLUS_EFB 1035 // RAMPS 1.6+ (Power outputs: Hotend, Fan, Bed) +#define BOARD_RAMPS_BTT_16_PLUS_EEB 1036 // RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Bed) +#define BOARD_RAMPS_BTT_16_PLUS_EFF 1037 // RAMPS 1.6+ (Power outputs: Hotend, Fan0, Fan1) +#define BOARD_RAMPS_BTT_16_PLUS_EEF 1038 // RAMPS 1.6+ (Power outputs: Hotend0, Hotend1, Fan) +#define BOARD_RAMPS_BTT_16_PLUS_SF 1039 // RAMPS 1.6+ (Power outputs: Spindle, Controller Fan) + // // RAMPS Derivatives - ATmega1280, ATmega2560 // @@ -191,12 +197,13 @@ #define BOARD_MELZI_V2 1503 // Melzi V2 #define BOARD_MELZI_MAKR3D 1504 // Melzi with ATmega1284 (MaKr3d version) #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 -#define BOARD_ANET_10 1510 // Anet 1.0 (Melzi clone) -#define BOARD_ZMIB_V2 1511 // ZoneStar ZMIB V2 +#define BOARD_MELZI_CREALITY_ENDER2 1506 // Melzi Creality3D (for Ender-2) +#define BOARD_MELZI_MALYAN 1507 // Melzi Malyan M150 +#define BOARD_MELZI_TRONXY 1508 // Tronxy X5S +#define BOARD_STB_11 1509 // STB V1.1 +#define BOARD_AZTEEG_X1 1510 // Azteeg X1 +#define BOARD_ANET_10 1511 // Anet 1.0 (Melzi clone) +#define BOARD_ZMIB_V2 1512 // ZoneStar ZMIB V2 // // Other ATmega644P, ATmega644, ATmega1284P @@ -390,6 +397,7 @@ #define BOARD_PANDA_PI_V29 5066 // Panda Pi V2.9 - Standalone (STM32F103RC) #define BOARD_SOVOL_V131 5067 // Sovol V1.3.1 (GD32F103RET6) #define BOARD_TRIGORILLA_V006 5068 // Trigorilla V0.0.6 (GD32F103RE) +#define BOARD_KEDI_CONTROLLER_V1_2 5069 // EDUTRONICS Kedi Controller V1.2 (STM32F103RC) // // ARM Cortex-M4F @@ -423,31 +431,33 @@ #define BOARD_LERDGE_K 5218 // Lerdge K (STM32F407ZG) #define BOARD_LERDGE_S 5219 // Lerdge S (STM32F407VE) #define BOARD_LERDGE_X 5220 // Lerdge X (STM32F407VE) -#define BOARD_VAKE403D 5221 // VAkE 403D (STM32F446VE) -#define BOARD_FYSETC_S6 5222 // FYSETC S6 (STM32F446VE) -#define BOARD_FYSETC_S6_V2_0 5223 // FYSETC S6 v2.0 (STM32F446VE) -#define BOARD_FYSETC_SPIDER 5224 // FYSETC Spider (STM32F446VE) -#define BOARD_FLYF407ZG 5225 // FLYmaker FLYF407ZG (STM32F407ZG) -#define BOARD_MKS_ROBIN2 5226 // MKS_ROBIN2 (STM32F407ZE) -#define BOARD_MKS_ROBIN_PRO_V2 5227 // MKS Robin Pro V2 (STM32F407VE) -#define BOARD_MKS_ROBIN_NANO_V3 5228 // MKS Robin Nano V3 (STM32F407VG) -#define BOARD_MKS_ROBIN_NANO_V3_1 5229 // MKS Robin Nano V3.1 (STM32F407VE) -#define BOARD_MKS_MONSTER8_V1 5230 // MKS Monster8 V1 (STM32F407VE) -#define BOARD_MKS_MONSTER8_V2 5231 // MKS Monster8 V2 (STM32F407VE) -#define BOARD_ANET_ET4 5232 // ANET ET4 V1.x (STM32F407VG) -#define BOARD_ANET_ET4P 5233 // ANET ET4P V1.x (STM32F407VG) -#define BOARD_FYSETC_CHEETAH_V20 5234 // FYSETC Cheetah V2.0 (STM32F401RC) -#define BOARD_TH3D_EZBOARD_V2 5235 // TH3D EZBoard v2.0 (STM32F405RG) -#define BOARD_OPULO_LUMEN_REV3 5236 // Opulo Lumen PnP Controller REV3 (STM32F407VE / STM32F407VG) -#define BOARD_MKS_ROBIN_NANO_V1_3_F4 5237 // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VE) -#define BOARD_MKS_EAGLE 5238 // MKS Eagle (STM32F407VE) -#define BOARD_ARTILLERY_RUBY 5239 // Artillery Ruby (STM32F401RC) -#define BOARD_FYSETC_SPIDER_V2_2 5240 // FYSETC Spider V2.2 (STM32F446VE) -#define BOARD_CREALITY_V24S1_301F4 5241 // Creality v2.4.S1_301F4 (STM32F401RC) as found in the Ender-3 S1 F4 -#define BOARD_OPULO_LUMEN_REV4 5242 // Opulo Lumen PnP Controller REV4 (STM32F407VE / STM32F407VG) -#define BOARD_FYSETC_SPIDER_KING407 5243 // FYSETC Spider King407 (STM32F407ZG) -#define BOARD_MKS_SKIPR_V1 5244 // MKS SKIPR v1.0 all-in-one board (STM32F407VE) -#define BOARD_TRONXY_V10 5245 // TRONXY V10 (STM32F446ZE) +#define BOARD_FYSETC_S6 5221 // FYSETC S6 (STM32F446VE) +#define BOARD_FYSETC_S6_V2_0 5222 // FYSETC S6 v2.0 (STM32F446VE) +#define BOARD_FYSETC_SPIDER 5223 // FYSETC Spider (STM32F446VE) +#define BOARD_FLYF407ZG 5224 // FLYmaker FLYF407ZG (STM32F407ZG) +#define BOARD_MKS_ROBIN2 5225 // MKS Robin2 V1.0 (STM32F407ZE) +#define BOARD_MKS_ROBIN_PRO_V2 5226 // MKS Robin Pro V2 (STM32F407VE) +#define BOARD_MKS_ROBIN_NANO_V3 5227 // MKS Robin Nano V3 (STM32F407VG) +#define BOARD_MKS_ROBIN_NANO_V3_1 5228 // MKS Robin Nano V3.1 (STM32F407VE) +#define BOARD_MKS_MONSTER8_V1 5229 // MKS Monster8 V1 (STM32F407VE) +#define BOARD_MKS_MONSTER8_V2 5230 // MKS Monster8 V2 (STM32F407VE) +#define BOARD_ANET_ET4 5231 // ANET ET4 V1.x (STM32F407VG) +#define BOARD_ANET_ET4P 5232 // ANET ET4P V1.x (STM32F407VG) +#define BOARD_FYSETC_CHEETAH_V20 5233 // FYSETC Cheetah V2.0 (STM32F401RC) +#define BOARD_TH3D_EZBOARD_V2 5234 // TH3D EZBoard v2.0 (STM32F405RG) +#define BOARD_OPULO_LUMEN_REV3 5235 // Opulo Lumen PnP Controller REV3 (STM32F407VE / STM32F407VG) +#define BOARD_MKS_ROBIN_NANO_V1_3_F4 5236 // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VE) +#define BOARD_MKS_EAGLE 5237 // MKS Eagle (STM32F407VE) +#define BOARD_ARTILLERY_RUBY 5238 // Artillery Ruby (STM32F401RC) +#define BOARD_FYSETC_SPIDER_V2_2 5239 // FYSETC Spider V2.2 (STM32F446VE) +#define BOARD_CREALITY_V24S1_301F4 5240 // Creality v2.4.S1_301F4 (STM32F401RC) as found in the Ender-3 S1 F4 +#define BOARD_OPULO_LUMEN_REV4 5241 // Opulo Lumen PnP Controller REV4 (STM32F407VE / STM32F407VG) +#define BOARD_FYSETC_SPIDER_KING407 5242 // FYSETC Spider King407 (STM32F407ZG) +#define BOARD_MKS_SKIPR_V1 5243 // MKS SKIPR v1.0 all-in-one board (STM32F407VE) +#define BOARD_TRONXY_V10 5244 // TRONXY V10 (STM32F446ZE) +#define BOARD_CREALITY_F401RE 5245 // Creality CR4NS200141C13 (STM32F401RE) as found in the Ender-5 S1 +#define BOARD_BLACKPILL_CUSTOM 5246 // Custom board based on STM32F401CDU6. +#define BOARD_I3DBEEZ9_V1 5247 // I3DBEEZ9 V1 (STM32F407ZG) // // ARM Cortex-M7 @@ -459,9 +469,9 @@ #define BOARD_NUCLEO_F767ZI 6003 // ST NUCLEO-F767ZI Dev Board #define BOARD_BTT_SKR_SE_BX_V2 6004 // BigTreeTech SKR SE BX V2.0 (STM32H743II) #define BOARD_BTT_SKR_SE_BX_V3 6005 // BigTreeTech SKR SE BX V3.0 (STM32H743II) -#define BOARD_BTT_SKR_V3_0 6006 // BigTreeTech SKR V3.0 (STM32H743VG) -#define BOARD_BTT_SKR_V3_0_EZ 6007 // BigTreeTech SKR V3.0 EZ (STM32H743VG) -#define BOARD_BTT_OCTOPUS_MAX_EZ_V1_0 6008 // BigTreeTech Octopus Max EZ V1.0 (STM32H723VE / STM32H723ZE) +#define BOARD_BTT_SKR_V3_0 6006 // BigTreeTech SKR V3.0 (STM32H743VI / STM32H723VG) +#define BOARD_BTT_SKR_V3_0_EZ 6007 // BigTreeTech SKR V3.0 EZ (STM32H743VI / STM32H723VG) +#define BOARD_BTT_OCTOPUS_MAX_EZ_V1_0 6008 // BigTreeTech Octopus Max EZ V1.0 (STM32H723ZE) // // Espressif ESP32 WiFi @@ -477,6 +487,7 @@ #define BOARD_PANDA_M4 7007 // Panda_M4 #define BOARD_MKS_TINYBEE 7008 // MKS TinyBee based on ESP32 (with I2S stepper stream) #define BOARD_ENWI_ESPNP 7009 // enwi ESPNP based on ESP32 (with I2S stepper stream) +#define BOARD_GODI_CONTROLLER_V1_0 7010 // Godi Controller based on ESP32 32-Bit V1.0 // // SAMD51 ARM Cortex-M4 diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index eb1c91e507..92ee233e03 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -31,19 +31,11 @@ #undef DEBUG_ERROR_START #undef DEBUG_CHAR #undef DEBUG_ECHO -#undef DEBUG_DECIMAL -#undef DEBUG_ECHO_F #undef DEBUG_ECHOLN #undef DEBUG_ECHOPGM #undef DEBUG_ECHOLNPGM -#undef DEBUG_ECHOF -#undef DEBUG_ECHOLNF #undef DEBUG_ECHOPGM_P #undef DEBUG_ECHOLNPGM_P -#undef DEBUG_ECHOPAIR_F -#undef DEBUG_ECHOPAIR_F_P -#undef DEBUG_ECHOLNPAIR_F -#undef DEBUG_ECHOLNPAIR_F_P #undef DEBUG_ECHO_MSG #undef DEBUG_ERROR_MSG #undef DEBUG_EOL @@ -62,21 +54,13 @@ #define DEBUG_ERROR_START SERIAL_ERROR_START #define DEBUG_CHAR SERIAL_CHAR #define DEBUG_ECHO SERIAL_ECHO - #define DEBUG_DECIMAL SERIAL_DECIMAL - #define DEBUG_ECHO_F SERIAL_ECHO_F #define DEBUG_ECHOLN SERIAL_ECHOLN #define DEBUG_ECHOPGM SERIAL_ECHOPGM #define DEBUG_ECHOLNPGM SERIAL_ECHOLNPGM - #define DEBUG_ECHOF SERIAL_ECHOF - #define DEBUG_ECHOLNF SERIAL_ECHOLNF #define DEBUG_ECHOPGM SERIAL_ECHOPGM #define DEBUG_ECHOPGM_P SERIAL_ECHOPGM_P - #define DEBUG_ECHOPAIR_F SERIAL_ECHOPAIR_F - #define DEBUG_ECHOPAIR_F_P SERIAL_ECHOPAIR_F_P #define DEBUG_ECHOLNPGM SERIAL_ECHOLNPGM #define DEBUG_ECHOLNPGM_P SERIAL_ECHOLNPGM_P - #define DEBUG_ECHOLNPAIR_F SERIAL_ECHOLNPAIR_F - #define DEBUG_ECHOLNPAIR_F_P SERIAL_ECHOLNPAIR_F_P #define DEBUG_ECHO_MSG SERIAL_ECHO_MSG #define DEBUG_ERROR_MSG SERIAL_ERROR_MSG #define DEBUG_EOL SERIAL_EOL @@ -93,19 +77,11 @@ #define DEBUG_ERROR_START() NOOP #define DEBUG_CHAR(...) NOOP #define DEBUG_ECHO(...) NOOP - #define DEBUG_DECIMAL(...) NOOP - #define DEBUG_ECHO_F(...) NOOP #define DEBUG_ECHOLN(...) NOOP #define DEBUG_ECHOPGM(...) NOOP #define DEBUG_ECHOLNPGM(...) NOOP - #define DEBUG_ECHOF(...) NOOP - #define DEBUG_ECHOLNF(...) NOOP #define DEBUG_ECHOPGM_P(...) NOOP #define DEBUG_ECHOLNPGM_P(...) NOOP - #define DEBUG_ECHOPAIR_F(...) NOOP - #define DEBUG_ECHOPAIR_F_P(...) NOOP - #define DEBUG_ECHOLNPAIR_F(...) NOOP - #define DEBUG_ECHOLNPAIR_F_P(...) NOOP #define DEBUG_ECHO_MSG(...) NOOP #define DEBUG_ERROR_MSG(...) NOOP #define DEBUG_EOL() NOOP diff --git a/Marlin/src/core/debug_section.h b/Marlin/src/core/debug_section.h index 6e23d9e4ed..dc4cc0143c 100644 --- a/Marlin/src/core/debug_section.h +++ b/Marlin/src/core/debug_section.h @@ -38,11 +38,8 @@ private: bool debug; void echo_msg(FSTR_P const fpre) { - SERIAL_ECHOF(fpre); - if (the_msg) { - SERIAL_CHAR(' '); - SERIAL_ECHOF(the_msg); - } + SERIAL_ECHO(fpre); + if (the_msg) SERIAL_ECHO(AS_CHAR(' '), the_msg); SERIAL_CHAR(' '); print_pos(current_position); } diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h index 72a7d1f4b7..fce8a5a9b2 100644 --- a/Marlin/src/core/drivers.h +++ b/Marlin/src/core/drivers.h @@ -64,7 +64,7 @@ #define AXIS_DRIVER_TYPE_W(T) _AXIS_DRIVER_TYPE(W,T) #define AXIS_DRIVER_TYPE_X2(T) (HAS_X2_STEPPER && _AXIS_DRIVER_TYPE(X2,T)) -#define AXIS_DRIVER_TYPE_Y2(T) (HAS_DUAL_Y_STEPPERS && _AXIS_DRIVER_TYPE(Y2,T)) +#define AXIS_DRIVER_TYPE_Y2(T) (HAS_Y2_STEPPER && _AXIS_DRIVER_TYPE(Y2,T)) #define AXIS_DRIVER_TYPE_Z2(T) (NUM_Z_STEPPERS >= 2 && _AXIS_DRIVER_TYPE(Z2,T)) #define AXIS_DRIVER_TYPE_Z3(T) (NUM_Z_STEPPERS >= 3 && _AXIS_DRIVER_TYPE(Z3,T)) #define AXIS_DRIVER_TYPE_Z4(T) (NUM_Z_STEPPERS >= 4 && _AXIS_DRIVER_TYPE(Z4,T)) diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index bf309293ac..b76a3d301c 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -193,6 +193,7 @@ #define STR_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented" #define STR_ERR_HOTEND_TOO_COLD "Hotend too cold" #define STR_ERR_EEPROM_WRITE "Error writing to EEPROM!" +#define STR_ERR_EEPROM_CORRUPT "EEPROM Corrupt" #define STR_FILAMENT_CHANGE_HEAT_LCD "Press button to heat nozzle" #define STR_FILAMENT_CHANGE_INSERT_LCD "Insert filament and press button" @@ -242,6 +243,7 @@ #define STR_HEATER_CHAMBER "chamber" #define STR_COOLER "cooler" #define STR_MOTHERBOARD "motherboard" +#define STR_SOC "soc" #define STR_PROBE "probe" #define STR_REDUNDANT "redundant " #define STR_LASER_TEMP "laser temperature" @@ -276,6 +278,7 @@ // Settings Report Strings #define STR_Z_AUTO_ALIGN "Z Auto-Align" #define STR_BACKLASH_COMPENSATION "Backlash compensation" +#define STR_FT_MOTION "Fixed-Time Motion" #define STR_S_SEG_PER_SEC "S" #define STR_DELTA_SETTINGS "Delta (L R H S XYZ ABC)" #define STR_SCARA_SETTINGS "SCARA" @@ -323,10 +326,12 @@ // // Endstop Names used by Endstops::report_states // -#define STR_X_MIN "x_min" -#define STR_X_MAX "x_max" -#define STR_X2_MIN "x2_min" -#define STR_X2_MAX "x2_max" +#if HAS_X_AXIS + #define STR_X_MIN "x_min" + #define STR_X_MAX "x_max" + #define STR_X2_MIN "x2_min" + #define STR_X2_MAX "x2_max" +#endif #if HAS_Y_AXIS #define STR_Y_MIN "y_min" @@ -503,7 +508,7 @@ #define STR_W "" #endif -#if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) +#if ANY(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) // Custom characters defined in the first 8 characters of the LCD #define LCD_STR_BEDTEMP "\x00" // Print only as a char. This will have 'unexpected' results when used in a string! diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index fec390b64b..565de2436c 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -33,51 +33,6 @@ #define _AXIS(A) (A##_AXIS) -#define _XSTOP_ 0x01 -#define _YSTOP_ 0x02 -#define _ZSTOP_ 0x03 -#define _ISTOP_ 0x04 -#define _JSTOP_ 0x05 -#define _KSTOP_ 0x06 -#define _USTOP_ 0x07 -#define _VSTOP_ 0x08 -#define _WSTOP_ 0x09 -#define _XMIN_ 0x11 -#define _YMIN_ 0x12 -#define _ZMIN_ 0x13 -#define _IMIN_ 0x14 -#define _JMIN_ 0x15 -#define _KMIN_ 0x16 -#define _UMIN_ 0x17 -#define _VMIN_ 0x18 -#define _WMIN_ 0x19 -#define _XMAX_ 0x21 -#define _YMAX_ 0x22 -#define _ZMAX_ 0x23 -#define _IMAX_ 0x24 -#define _JMAX_ 0x25 -#define _KMAX_ 0x26 -#define _UMAX_ 0x27 -#define _VMAX_ 0x28 -#define _WMAX_ 0x29 -#define _XDIAG_ 0x31 -#define _YDIAG_ 0x32 -#define _ZDIAG_ 0x33 -#define _IDIAG_ 0x34 -#define _JDIAG_ 0x35 -#define _KDIAG_ 0x36 -#define _UDIAG_ 0x37 -#define _VDIAG_ 0x38 -#define _WDIAG_ 0x39 -#define _E0DIAG_ 0xE0 -#define _E1DIAG_ 0xE1 -#define _E2DIAG_ 0xE2 -#define _E3DIAG_ 0xE3 -#define _E4DIAG_ 0xE4 -#define _E5DIAG_ 0xE5 -#define _E6DIAG_ 0xE6 -#define _E7DIAG_ 0xE7 - #define _FORCE_INLINE_ __attribute__((__always_inline__)) __inline__ #define FORCE_INLINE __attribute__((always_inline)) inline #define NO_INLINE __attribute__((noinline)) @@ -237,7 +192,11 @@ #define _DIS_1(O) NOT(_ENA_1(O)) #define ENABLED(V...) DO(ENA,&&,V) #define DISABLED(V...) DO(DIS,&&,V) +#define ANY(V...) !DISABLED(V) +#define ALL ENABLED +#define NONE DISABLED #define COUNT_ENABLED(V...) DO(ENA,+,V) +#define MANY(V...) (COUNT_ENABLED(V) > 1) #define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION ? 'A' : 'B' #define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION ? 'A' : '0' @@ -261,16 +220,8 @@ #define SUM_TERN(O,B,A) ((B) PLUS_TERN0(O,A)) // ((B) (OPTION ? '+ (A)' : '')) #define DIFF_TERN(O,B,A) ((B) MINUS_TERN0(O,A)) // ((B) (OPTION ? '- (A)' : '')) -#define IF_ENABLED TERN_ #define IF_DISABLED(O,A) TERN(O,,A) -#define ANY(V...) !DISABLED(V) -#define NONE(V...) DISABLED(V) -#define ALL(V...) ENABLED(V) -#define BOTH(V1,V2) ALL(V1,V2) -#define EITHER(V1,V2) ANY(V1,V2) -#define MANY(V...) (COUNT_ENABLED(V) > 1) - // Macros to support pins/buttons exist testing #define PIN_EXISTS(PN) (defined(PN##_PIN) && PN##_PIN >= 0) #define _PINEX_1 PIN_EXISTS @@ -375,11 +326,6 @@ #define _JOIN_1(O) (O) #define JOIN_N(N,C,V...) (DO(JOIN,C,LIST_N(N,V))) -#define LOOP_S_LE_N(VAR, S, N) for (uint8_t VAR=(S); VAR<=(N); VAR++) -#define LOOP_S_L_N(VAR, S, N) for (uint8_t VAR=(S); VAR<(N); VAR++) -#define LOOP_LE_N(VAR, N) LOOP_S_LE_N(VAR, 0, N) -#define LOOP_L_N(VAR, N) LOOP_S_L_N(VAR, 0, N) - #define NOOP (void(0)) #define CEILING(x,y) (((x) + (y) - 1) / (y)) diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h index 95bc40e1ec..e7032a2e55 100644 --- a/Marlin/src/core/millis_t.h +++ b/Marlin/src/core/millis_t.h @@ -28,6 +28,7 @@ typedef uint32_t millis_t; #define SEC_TO_MS(N) millis_t((N)*1000UL) #define MIN_TO_MS(N) SEC_TO_MS((N)*60UL) #define MS_TO_SEC(N) millis_t((N)/1000UL) +#define MS_TO_SEC_PRECISE(N) (float(N)/1000.0f) #define PENDING(NOW,SOON) ((int32_t)(NOW-(SOON))<0) #define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) diff --git a/Marlin/src/core/multi_language.h b/Marlin/src/core/multi_language.h index 05a713e435..2c0eb7aa72 100644 --- a/Marlin/src/core/multi_language.h +++ b/Marlin/src/core/multi_language.h @@ -64,6 +64,9 @@ typedef const char Language_Str[]; #if NUM_LANGUAGES > 1 #define HAS_MULTI_LANGUAGE 1 + #if HAS_MARLINUI_MENU + #define HAS_MENU_MULTI_LANGUAGE 1 + #endif #define GET_TEXT(MSG) ( \ ui.language == 4 ? GET_LANG(LCD_LANGUAGE_5)::MSG : \ ui.language == 3 ? GET_LANG(LCD_LANGUAGE_4)::MSG : \ diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 64704c1e6c..bda1527545 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -68,26 +68,51 @@ MAP(_N_LBL, LOGICAL_AXIS_NAMES); MAP(_SP_N_LBL, LOGICAL_AXIS_NAMES); #endif -void serial_print_P(PGM_P str) { - while (const char c = pgm_read_byte(str++)) SERIAL_CHAR(c); +// Specializations for float, p_float_t, w_float_t +template <> void SERIAL_ECHO(const float f) { SERIAL_IMPL.print(f); } +template <> void SERIAL_ECHO(const p_float_t pf) { SERIAL_IMPL.print(pf.value, pf.prec); } +template <> void SERIAL_ECHO(const w_float_t wf) { char f1[20]; SERIAL_IMPL.print(dtostrf(wf.value, wf.width, wf.prec, f1)); } + +// Specializations for F-string +template <> void SERIAL_ECHO(const FSTR_P fstr) { SERIAL_ECHO_P(FTOP(fstr)); } +template <> void SERIAL_ECHOLN(const FSTR_P fstr) { SERIAL_ECHOLN_P(FTOP(fstr)); } + +void SERIAL_CHAR(char a) { SERIAL_IMPL.write(a); } +void SERIAL_EOL() { SERIAL_CHAR('\n'); } + +void SERIAL_ECHO(serial_char_t x) { SERIAL_IMPL.write(x.c); } + +void SERIAL_FLUSH() { SERIAL_IMPL.flush(); } +void SERIAL_FLUSHTX() { SERIAL_IMPL.flushTX(); } + +void SERIAL_ECHO_P(PGM_P pstr) { + while (const char c = pgm_read_byte(pstr++)) SERIAL_CHAR(c); } +void SERIAL_ECHOLN_P(PGM_P pstr) { SERIAL_ECHO_P(pstr); SERIAL_EOL(); } -void serial_echo_start() { serial_print(F("echo:")); } -void serial_error_start() { serial_print(F("Error:")); } +void SERIAL_ECHO_START() { SERIAL_ECHO(F("echo:")); } +void SERIAL_ERROR_START() { SERIAL_ECHO(F("Error:")); } -void serial_spaces(uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR(' '); } +void SERIAL_ECHO_SP(uint8_t count) { count *= (PROPORTIONAL_FONT_RATIO); while (count--) SERIAL_CHAR(' '); } void serial_offset(const_float_t v, const uint8_t sp/*=0*/) { if (v == 0 && sp == 1) SERIAL_CHAR(' '); else if (v > 0 || (v == 0 && sp == 2)) SERIAL_CHAR('+'); - SERIAL_DECIMAL(v); + SERIAL_ECHO(v); } -void serialprint_onoff(const bool onoff) { serial_print(onoff ? F(STR_ON) : F(STR_OFF)); } +void serial_ternary(FSTR_P const pre, const bool onoff, FSTR_P const on, FSTR_P const off, FSTR_P const post/*=nullptr*/) { + if (pre) SERIAL_ECHO(pre); + if (onoff && on) SERIAL_ECHO(on); + if (!onoff && off) SERIAL_ECHO(off); + if (post) SERIAL_ECHO(post); +} + +void serialprint_onoff(const bool onoff) { SERIAL_ECHO(onoff ? F(STR_ON) : F(STR_OFF)); } void serialprintln_onoff(const bool onoff) { serialprint_onoff(onoff); SERIAL_EOL(); } -void serialprint_truefalse(const bool tf) { serial_print(tf ? F("true") : F("false")); } +void serialprint_truefalse(const bool tf) { SERIAL_ECHO(tf ? F("true") : F("false")); } void print_bin(uint16_t val) { for (uint8_t i = 16; i--;) { @@ -96,10 +121,12 @@ void print_bin(uint16_t val) { } } -void print_pos(NUM_AXIS_ARGS(const_float_t), FSTR_P const prefix/*=nullptr*/, FSTR_P const suffix/*=nullptr*/) { - if (prefix) serial_print(prefix); - SERIAL_ECHOPGM_P( - LIST_N(DOUBLE(NUM_AXES), SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z, SP_I_STR, i, SP_J_STR, j, SP_K_STR, k, SP_U_STR, u, SP_V_STR, v, SP_W_STR, w) - ); - if (suffix) serial_print(suffix); else SERIAL_EOL(); +void print_pos(NUM_AXIS_ARGS_(const_float_t) FSTR_P const prefix/*=nullptr*/, FSTR_P const suffix/*=nullptr*/) { + if (prefix) SERIAL_ECHO(prefix); + #if NUM_AXES + SERIAL_ECHOPGM_P( + LIST_N(DOUBLE(NUM_AXES), SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z, SP_I_STR, i, SP_J_STR, j, SP_K_STR, k, SP_U_STR, u, SP_V_STR, v, SP_W_STR, w) + ); + #endif + if (suffix) SERIAL_ECHO(suffix); else SERIAL_EOL(); } diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index a741d4b1e4..09f453d3b5 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -125,8 +125,6 @@ extern uint8_t marlin_debug_flags; #define SERIAL_IMPL SERIAL_LEAF_1 #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) SerialMask::from(P) @@ -134,65 +132,69 @@ extern uint8_t marlin_debug_flags; // // SERIAL_CHAR - Print one or more individual chars // -inline void SERIAL_CHAR(char a) { SERIAL_IMPL.write(a); } +void SERIAL_CHAR(char a); template void SERIAL_CHAR(char a, Args ... args) { SERIAL_IMPL.write(a); SERIAL_CHAR(args ...); } /** - * SERIAL_ECHO - Print a single string or value. + * SERIAL_ECHO / SERIAL_ECHOLN - Print a single string or value. * Any numeric parameter (including char) is printed as a base-10 number. * A string pointer or literal will be output as a string. * * NOTE: Use SERIAL_CHAR to print char as a single character. */ -template -void SERIAL_ECHO(T x) { SERIAL_IMPL.print(x); } +template void SERIAL_ECHO(T x) { SERIAL_IMPL.print(x); } +template void SERIAL_ECHOLN(T x) { SERIAL_IMPL.println(x); } // Wrapper for ECHO commands to interpret a char -typedef struct SerialChar { char c; SerialChar(char n) : c(n) { } } serial_char_t; -inline void SERIAL_ECHO(serial_char_t x) { SERIAL_IMPL.write(x.c); } -#define AS_CHAR(C) serial_char_t(C) +void SERIAL_ECHO(serial_char_t x); #define AS_DIGIT(C) AS_CHAR('0' + (C)) -template -void SERIAL_ECHOLN(T x) { SERIAL_IMPL.println(x); } - -// SERIAL_PRINT works like SERIAL_ECHO but also takes the numeric base -template -void SERIAL_PRINT(T x, U y) { SERIAL_IMPL.print(x, y); } - -template -void SERIAL_PRINTLN(T x, PrintBase y) { SERIAL_IMPL.println(x, y); } +// Print an integer with a numeric base such as PrintBase::Hex +template void SERIAL_PRINT(T x, PrintBase y) { SERIAL_IMPL.print(x, y); } +template void SERIAL_PRINTLN(T x, PrintBase y) { SERIAL_IMPL.println(x, y); } // Flush the serial port -inline void SERIAL_FLUSH() { SERIAL_IMPL.flush(); } -inline void SERIAL_FLUSHTX() { SERIAL_IMPL.flushTX(); } +void SERIAL_FLUSH(); +void SERIAL_FLUSHTX(); -// Serial echo and error prefixes -#define SERIAL_ECHO_START() serial_echo_start() -#define SERIAL_ERROR_START() serial_error_start() +// Start an echo: or error: output +void SERIAL_ECHO_START(); +void SERIAL_ERROR_START(); // Serial end-of-line -#define SERIAL_EOL() SERIAL_CHAR('\n') +void SERIAL_EOL(); // Print a single PROGMEM, PGM_P, or PSTR() string. -void serial_print_P(PGM_P str); -inline void serial_println_P(PGM_P str) { serial_print_P(str); SERIAL_EOL(); } +void SERIAL_ECHO_P(PGM_P pstr); +void SERIAL_ECHOLN_P(PGM_P pstr); -// Print a single FSTR_P, F(), or FPSTR() string. -inline void serial_print(FSTR_P const fstr) { serial_print_P(FTOP(fstr)); } -inline void serial_println(FSTR_P const fstr) { serial_println_P(FTOP(fstr)); } +// Specializations for float, p_float_t, and w_float_t +template<> void SERIAL_ECHO(const float f); +template<> void SERIAL_ECHO(const p_float_t pf); +template<> void SERIAL_ECHO(const w_float_t wf); + +// Specializations for F-string +template<> void SERIAL_ECHO(const FSTR_P fstr); +template<> void SERIAL_ECHOLN(const FSTR_P fstr); + +// Print any number of items with arbitrary types (except loose PROGMEM strings) +template +void SERIAL_ECHO(T arg1, Args ... args) { SERIAL_ECHO(arg1); SERIAL_ECHO(args ...); } +template +void SERIAL_ECHOLN(T arg1, Args ... args) { SERIAL_ECHO(arg1); SERIAL_ECHO(args ...); SERIAL_EOL(); } // -// SERIAL_ECHOPGM... macros are used to output string-value pairs. +// SERIAL_ECHOPGM... macros are used to output string-value pairs, wrapping +// all the odd loose string elements as PROGMEM strings. // // Print up to 20 pairs of values. Odd elements must be literal strings. #define __SEP_N(N,V...) _SEP_##N(V) #define _SEP_N(N,V...) __SEP_N(N,V) #define _SEP_N_REF() _SEP_N -#define _SEP_1(s) serial_print(F(s)); -#define _SEP_2(s,v) serial_echopair(F(s),v); +#define _SEP_1(s) SERIAL_ECHO(F(s)); +#define _SEP_2(s,v) SERIAL_ECHO(F(s),v); #define _SEP_3(s,v,V...) _SEP_2(s,v); DEFER2(_SEP_N_REF)()(TWO_ARGS(V),V); #define SERIAL_ECHOPGM(V...) do{ EVAL(_SEP_N(TWO_ARGS(V),V)); }while(0) @@ -200,8 +202,8 @@ inline void serial_println(FSTR_P const fstr) { serial_println_P(FTOP(fstr)); } #define __SELP_N(N,V...) _SELP_##N(V) #define _SELP_N(N,V...) __SELP_N(N,V) #define _SELP_N_REF() _SELP_N -#define _SELP_1(s) serial_print(F(s "\n")); -#define _SELP_2(s,v) serial_echolnpair(F(s),v); +#define _SELP_1(s) SERIAL_ECHO(F(s "\n")); +#define _SELP_2(s,v) SERIAL_ECHOLN(F(s),v); #define _SELP_3(s,v,V...) _SEP_2(s,v); DEFER2(_SELP_N_REF)()(TWO_ARGS(V),V); #define SERIAL_ECHOLNPGM(V...) do{ EVAL(_SELP_N(TWO_ARGS(V),V)); }while(0) @@ -209,8 +211,8 @@ inline void serial_println(FSTR_P const fstr) { serial_println_P(FTOP(fstr)); } #define __SEP_N_P(N,V...) _SEP_##N##_P(V) #define _SEP_N_P(N,V...) __SEP_N_P(N,V) #define _SEP_N_P_REF() _SEP_N_P -#define _SEP_1_P(p) serial_print_P(p); -#define _SEP_2_P(p,v) serial_echopair_P(p,v); +#define _SEP_1_P(p) SERIAL_ECHO(FPSTR(p)); +#define _SEP_2_P(p,v) SERIAL_ECHO(FPSTR(p),v); #define _SEP_3_P(p,v,V...) _SEP_2_P(p,v); DEFER2(_SEP_N_P_REF)()(TWO_ARGS(V),V); #define SERIAL_ECHOPGM_P(V...) do{ EVAL(_SEP_N_P(TWO_ARGS(V),V)); }while(0) @@ -218,132 +220,32 @@ inline void serial_println(FSTR_P const fstr) { serial_println_P(FTOP(fstr)); } #define __SELP_N_P(N,V...) _SELP_##N##_P(V) #define _SELP_N_P(N,V...) __SELP_N_P(N,V) #define _SELP_N_P_REF() _SELP_N_P -#define _SELP_1_P(p) serial_println_P(p) -#define _SELP_2_P(p,v) serial_echolnpair_P(p,v) +#define _SELP_1_P(p) SERIAL_ECHOLN(FPSTR(p)); +#define _SELP_2_P(p,v) SERIAL_ECHOLN(FPSTR(p),v); #define _SELP_3_P(p,v,V...) { _SEP_2_P(p,v); DEFER2(_SELP_N_P_REF)()(TWO_ARGS(V),V); } #define SERIAL_ECHOLNPGM_P(V...) do{ EVAL(_SELP_N_P(TWO_ARGS(V),V)); }while(0) -// Print up to 20 pairs of values. Odd elements must be FSTR_P, F(), or FPSTR(). -#define __SEP_N_F(N,V...) _SEP_##N##_F(V) -#define _SEP_N_F(N,V...) __SEP_N_F(N,V) -#define _SEP_N_F_REF() _SEP_N_F -#define _SEP_1_F(p) serial_print(p); -#define _SEP_2_F(p,v) serial_echopair(p,v); -#define _SEP_3_F(p,v,V...) _SEP_2_F(p,v); DEFER2(_SEP_N_F_REF)()(TWO_ARGS(V),V); -#define SERIAL_ECHOF(V...) do{ EVAL(_SEP_N_F(TWO_ARGS(V),V)); }while(0) +#define SERIAL_ECHO_MSG(V...) do{ SERIAL_ECHO_START(); SERIAL_ECHOLNPGM(V); }while(0) +#define SERIAL_ERROR_MSG(V...) do{ SERIAL_ERROR_START(); SERIAL_ECHOLNPGM(V); }while(0) -// Print up to 20 pairs of values followed by newline. Odd elements must be FSTR_P, F(), or FPSTR(). -#define __SELP_N_F(N,V...) _SELP_##N##_F(V) -#define _SELP_N_F(N,V...) __SELP_N_F(N,V) -#define _SELP_N_F_REF() _SELP_N_F -#define _SELP_1_F(p) serial_println(p) -#define _SELP_2_F(p,v) serial_echolnpair(p,v) -#define _SELP_3_F(p,v,V...) { _SEP_2_F(p,v); DEFER2(_SELP_N_F_REF)()(TWO_ARGS(V),V); } -#define SERIAL_ECHOLNF(V...) do{ EVAL(_SELP_N_F(TWO_ARGS(V),V)); }while(0) +// Print a prefix, conditional string, and suffix +void serial_ternary(FSTR_P const pre, const bool onoff, FSTR_P const on, FSTR_P const off, FSTR_P const post=nullptr); +// Shorthand to put loose strings in PROGMEM +#define SERIAL_ECHO_TERNARY(TF, PRE, ON, OFF, POST) serial_ternary(F(PRE), TF, F(ON), F(OFF), F(POST)) -#ifdef AllowDifferentTypeInList +// Print up to 255 spaces +void SERIAL_ECHO_SP(uint8_t count); - inline void SERIAL_ECHOLIST_IMPL() {} - template - void SERIAL_ECHOLIST_IMPL(T && t) { SERIAL_IMPL.print(t); } - - template - void SERIAL_ECHOLIST_IMPL(T && t, Args && ... args) { - SERIAL_IMPL.print(t); - serial_print(F(", ")); - SERIAL_ECHOLIST_IMPL(args...); - } - - template - void SERIAL_ECHOLIST(FSTR_P const str, Args && ... args) { - SERIAL_IMPL.print(FTOP(str)); - SERIAL_ECHOLIST_IMPL(args...); - } - -#else // Optimization if the listed type are all the same (seems to be the case in the codebase so use that instead) - - template - void SERIAL_ECHOLIST(FSTR_P const fstr, Args && ... args) { - serial_print(fstr); - typename Private::first_type_of::type values[] = { args... }; - constexpr size_t argsSize = sizeof...(args); - for (size_t i = 0; i < argsSize; i++) { - if (i) serial_print(F(", ")); - SERIAL_IMPL.print(values[i]); - } - } - -#endif - -// 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); } - -#define SERIAL_ECHOPAIR_F_P(P,V...) do{ serial_print_P(P); SERIAL_ECHO_F(V); }while(0) -#define SERIAL_ECHOLNPAIR_F_P(P,V...) do{ SERIAL_ECHOPAIR_F_P(P,V); SERIAL_EOL(); }while(0) - -#define SERIAL_ECHOPAIR_F_F(S,V...) do{ serial_print(S); SERIAL_ECHO_F(V); }while(0) -#define SERIAL_ECHOLNPAIR_F_F(S,V...) do{ SERIAL_ECHOPAIR_F_F(S,V); SERIAL_EOL(); }while(0) - -#define SERIAL_ECHOPAIR_F(S,V...) SERIAL_ECHOPAIR_F_F(F(S),V) -#define SERIAL_ECHOLNPAIR_F(V...) do{ SERIAL_ECHOPAIR_F(V); SERIAL_EOL(); }while(0) - -#define SERIAL_ECHO_MSG(V...) do{ SERIAL_ECHO_START(); SERIAL_ECHOLNPGM(V); }while(0) -#define SERIAL_ERROR_MSG(V...) do{ SERIAL_ERROR_START(); SERIAL_ECHOLNPGM(V); }while(0) - -#define SERIAL_ECHO_SP(C) serial_spaces(C) - -#define SERIAL_ECHO_TERNARY(TF, PRE, ON, OFF, POST) serial_ternary(TF, F(PRE), F(ON), F(OFF), F(POST)) - -#if SERIAL_FLOAT_PRECISION - #define SERIAL_DECIMAL(V) SERIAL_PRINT(V, SERIAL_FLOAT_PRECISION) -#else - #define SERIAL_DECIMAL(V) SERIAL_ECHO(V) -#endif - -// -// Functions for serial printing from PROGMEM. (Saves loads of SRAM.) -// -inline void serial_echopair_P(PGM_P const pstr, serial_char_t v) { serial_print_P(pstr); SERIAL_CHAR(v.c); } -inline void serial_echopair_P(PGM_P const pstr, float v) { serial_print_P(pstr); SERIAL_DECIMAL(v); } -inline void serial_echopair_P(PGM_P const pstr, double v) { serial_print_P(pstr); SERIAL_DECIMAL(v); } -//inline void serial_echopair_P(PGM_P const pstr, const char *v) { serial_print_P(pstr); SERIAL_ECHO(v); } -inline void serial_echopair_P(PGM_P const pstr, FSTR_P v) { serial_print_P(pstr); SERIAL_ECHOF(v); } - -// Default implementation for types without a specialization. Handles integers. -template -inline void serial_echopair_P(PGM_P const pstr, T v) { serial_print_P(pstr); SERIAL_ECHO(v); } - -// Add a newline. -template -inline void serial_echolnpair_P(PGM_P const pstr, T v) { serial_echopair_P(pstr, v); SERIAL_EOL(); } - -// Catch-all for __FlashStringHelper * -template -inline void serial_echopair(FSTR_P const fstr, T v) { serial_echopair_P(FTOP(fstr), v); } - -// Add a newline to the serial output -template -inline void serial_echolnpair(FSTR_P const fstr, T v) { serial_echolnpair_P(FTOP(fstr), v); } - -void serial_echo_start(); -void serial_error_start(); -inline void serial_ternary(const bool onoff, FSTR_P const pre, FSTR_P const on, FSTR_P const off, FSTR_P const post=nullptr) { - if (pre) serial_print(pre); - if (onoff && on) serial_print(on); - if (!onoff && off) serial_print(off); - if (post) serial_print(post); -} void serialprint_onoff(const bool onoff); void serialprintln_onoff(const bool onoff); void serialprint_truefalse(const bool tf); -void serial_spaces(uint8_t count); void serial_offset(const_float_t v, const uint8_t sp=0); // For v==0 draw space (sp==1) or plus (sp==2) void print_bin(const uint16_t val); -void print_pos(NUM_AXIS_ARGS(const_float_t), FSTR_P const prefix=nullptr, FSTR_P const suffix=nullptr); +void print_pos(NUM_AXIS_ARGS_(const_float_t) FSTR_P const prefix=nullptr, FSTR_P const suffix=nullptr); inline void print_pos(const xyze_pos_t &xyze, FSTR_P const prefix=nullptr, FSTR_P const suffix=nullptr) { - print_pos(NUM_AXIS_ELEM(xyze), prefix, suffix); + print_pos(NUM_AXIS_ELEM_(xyze) prefix, suffix); } #define SERIAL_POS(SUFFIX,VAR) do { print_pos(VAR, F(" " STRINGIFY(VAR) "="), F(" : " SUFFIX "\n")); }while(0) diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 059b424284..a2f49417b7 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -79,7 +79,7 @@ struct EnsureDouble { operator double() { return a; } // 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) + //SERIAL_PRINT(v, PrintBase::Hex) EnsureDouble(double a) : a(a) {} EnsureDouble(float a) : a(a) {} }; @@ -169,7 +169,6 @@ struct SerialBase { FORCE_INLINE void print(unsigned int c, PrintBase base) { printNumber_unsigned(c, base); } FORCE_INLINE void print(unsigned long c, PrintBase base) { printNumber_unsigned(c, base); } - void print(EnsureDouble c, int digits) { printFloat(c, digits); } // Forward the call to the former's method @@ -180,7 +179,7 @@ struct SerialBase { void print(T c) { print(c, PrintBase::Dec); } void print(float c) { print(c, 2); } - void print(double c) { print(c, 2); } + void print(double c) { print(c, 2); } void println(char *s) { print(s); println(); } void println(const char *s) { print(s); println(); } @@ -234,7 +233,7 @@ struct SerialBase { // Round correctly so that print(1.999, 2) prints as "2.00" double rounding = 0.5; - LOOP_L_N(i, digits) rounding *= 0.1; + for (uint8_t i = 0; i < digits; ++i) rounding *= 0.1; number += rounding; // Extract the integer part of the number and print it diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 15d572af60..6c0983694c 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -36,45 +36,90 @@ template struct IF { typedef L type; }; #define ALL_AXIS_NAMES X, X2, Y, Y2, Z, Z2, Z3, Z4, I, J, K, U, V, W, E0, E1, E2, E3, E4, E5, E6, E7 -#define NUM_AXIS_GANG(V...) GANG_N(NUM_AXES, V) -#define NUM_AXIS_CODE(V...) CODE_N(NUM_AXES, V) -#define NUM_AXIS_LIST(V...) LIST_N(NUM_AXES, V) -#define NUM_AXIS_LIST_1(V) LIST_N_1(NUM_AXES, V) -#define NUM_AXIS_ARRAY(V...) { NUM_AXIS_LIST(V) } -#define NUM_AXIS_ARRAY_1(V) { NUM_AXIS_LIST_1(V) } -#define NUM_AXIS_ARGS(T) NUM_AXIS_LIST(T x, T y, T z, T i, T j, T k, T u, T v, T w) -#define NUM_AXIS_ELEM(O) NUM_AXIS_LIST(O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w) -#define NUM_AXIS_DEFS(T,V) NUM_AXIS_LIST(T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V) -#define MAIN_AXIS_NAMES NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W) -#define MAIN_AXIS_MAP(F) MAP(F, MAIN_AXIS_NAMES) -#define STR_AXES_MAIN NUM_AXIS_GANG("X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W) +#define NUM_AXIS_GANG(V...) GANG_N(NUM_AXES, V) +#define NUM_AXIS_CODE(V...) CODE_N(NUM_AXES, V) +#define NUM_AXIS_LIST(V...) LIST_N(NUM_AXES, V) +#define NUM_AXIS_LIST_1(V) LIST_N_1(NUM_AXES, V) +#define NUM_AXIS_ARRAY(V...) { NUM_AXIS_LIST(V) } +#define NUM_AXIS_ARRAY_1(V) { NUM_AXIS_LIST_1(V) } +#define NUM_AXIS_ARGS(T) NUM_AXIS_LIST(T x, T y, T z, T i, T j, T k, T u, T v, T w) +#define NUM_AXIS_ELEM(O) NUM_AXIS_LIST(O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w) +#define NUM_AXIS_DECL(T,V) NUM_AXIS_LIST(T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V) +#define MAIN_AXIS_NAMES NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W) +#define STR_AXES_MAIN NUM_AXIS_GANG("X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W) -#define LOGICAL_AXIS_GANG(E,V...) NUM_AXIS_GANG(V) GANG_ITEM_E(E) -#define LOGICAL_AXIS_CODE(E,V...) NUM_AXIS_CODE(V) CODE_ITEM_E(E) -#define LOGICAL_AXIS_LIST(E,V...) NUM_AXIS_LIST(V) LIST_ITEM_E(E) -#define LOGICAL_AXIS_LIST_1(V) NUM_AXIS_LIST_1(V) LIST_ITEM_E(V) +#if NUM_AXES + #define NUM_AXES_SEP , + #define MAIN_AXIS_MAP(F) MAP(F, MAIN_AXIS_NAMES) + #define OPTARGS_NUM(T) , NUM_AXIS_ARGS(T) + #define OPTARGS_LOGICAL(T) , LOGICAL_AXIS_ARGS(T) +#else + #define NUM_AXES_SEP + #define MAIN_AXIS_MAP(F) + #define OPTARGS_NUM(T) + #define OPTARGS_LOGICAL(T) +#endif + +#define NUM_AXIS_GANG_(V...) NUM_AXIS_GANG(V) NUM_AXES_SEP +#define NUM_AXIS_LIST_(V...) NUM_AXIS_LIST(V) NUM_AXES_SEP +#define NUM_AXIS_LIST_1_(V...) NUM_AXIS_LIST_1(V) NUM_AXES_SEP +#define NUM_AXIS_ARGS_(T) NUM_AXIS_ARGS(T) NUM_AXES_SEP +#define NUM_AXIS_ELEM_(T) NUM_AXIS_ELEM(T) NUM_AXES_SEP +#define MAIN_AXIS_NAMES_ MAIN_AXIS_NAMES NUM_AXES_SEP + +#define LOGICAL_AXIS_GANG(E,V...) NUM_AXIS_GANG(V) GANG_ITEM_E(E) +#define LOGICAL_AXIS_CODE(E,V...) NUM_AXIS_CODE(V) CODE_ITEM_E(E) +#define LOGICAL_AXIS_LIST(E,V...) NUM_AXIS_LIST(V) LIST_ITEM_E(E) +#define LOGICAL_AXIS_LIST_1(V) NUM_AXIS_LIST_1(V) LIST_ITEM_E(V) #define LOGICAL_AXIS_ARRAY(E,V...) { LOGICAL_AXIS_LIST(E,V) } #define LOGICAL_AXIS_ARRAY_1(V) { LOGICAL_AXIS_LIST_1(V) } -#define LOGICAL_AXIS_ARGS(T) LOGICAL_AXIS_LIST(T e, T x, T y, T z, T i, T j, T k, T u, T v, T w) -#define LOGICAL_AXIS_ELEM(O) LOGICAL_AXIS_LIST(O.e, O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w) -#define LOGICAL_AXIS_DECL(T,V) LOGICAL_AXIS_LIST(T e=V, T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V) -#define LOGICAL_AXIS_NAMES LOGICAL_AXIS_LIST(E, X, Y, Z, I, J, K, U, V, W) -#define LOGICAL_AXIS_MAP(F) MAP(F, LOGICAL_AXIS_NAMES) -#define STR_AXES_LOGICAL LOGICAL_AXIS_GANG("E", "X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W) - -#define XYZ_GANG(V...) GANG_N(PRIMARY_LINEAR_AXES, V) -#define XYZ_CODE(V...) CODE_N(PRIMARY_LINEAR_AXES, V) +#define LOGICAL_AXIS_ARGS(T) LOGICAL_AXIS_LIST(T e, T x, T y, T z, T i, T j, T k, T u, T v, T w) +#define LOGICAL_AXIS_ELEM(O) LOGICAL_AXIS_LIST(O.e, O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w) +#define LOGICAL_AXIS_DECL(T,V) LOGICAL_AXIS_LIST(T e=V, T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V) +#define LOGICAL_AXIS_NAMES LOGICAL_AXIS_LIST(E, X, Y, Z, I, J, K, U, V, W) +#define LOGICAL_AXIS_MAP(F) MAP(F, LOGICAL_AXIS_NAMES) +#define STR_AXES_LOGICAL LOGICAL_AXIS_GANG("E", "X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W) #define SECONDARY_AXIS_GANG(V...) GANG_N(SECONDARY_AXES, V) #define SECONDARY_AXIS_CODE(V...) CODE_N(SECONDARY_AXES, V) +#define SECONDARY_AXIS_LIST(V...) LIST_N(SECONDARY_AXES, V) +#define SECONDARY_AXIS_ARGS(T) SECONDARY_AXIS_LIST(T i, T j, T k, T u, T v, T w) + +// Just the XY or XYZ elements +#if HAS_Z_AXIS + #define XYZ_COUNT 3 + #define XY_COUNT 2 +#elif HAS_Y_AXIS + #define XY_COUNT 2 +#elif HAS_X_AXIS + #define XY_COUNT 1 +#else + #define XY_COUNT 0 +#endif +#ifndef XYZ_COUNT + #define XYZ_COUNT XY_COUNT +#endif +#define XY_LIST(V...) LIST_N(XY_COUNT, V) +#define XY_ARRAY(V...) ARRAY_N(XY_COUNT, V) +#define XY_CODE(V...) CODE_N(XY_COUNT, V) +#define XY_GANG(V...) GANG_N(XY_COUNT, V) +#define XYZ_LIST(V...) LIST_N(XYZ_COUNT, V) +#define XYZ_ARRAY(V...) ARRAY_N(XYZ_COUNT, V) +#define XYZ_CODE(V...) CODE_N(XYZ_COUNT, V) +#define XYZ_GANG(V...) GANG_N(XYZ_COUNT, V) #if HAS_ROTATIONAL_AXES #define ROTATIONAL_AXIS_GANG(V...) GANG_N(ROTATIONAL_AXES, V) #endif #if HAS_EXTRUDERS - #define LIST_ITEM_E(N) , N - #define CODE_ITEM_E(N) ; N + #if NUM_AXES + #define LIST_ITEM_E(N) , N + #define CODE_ITEM_E(N) ; N + #else + #define LIST_ITEM_E(N) N + #define CODE_ITEM_E(N) N + #endif #define GANG_ITEM_E(N) N #else #define LIST_ITEM_E(N) @@ -87,8 +132,10 @@ template struct IF { typedef L type; }; // Helpers #define _RECIP(N) ((N) ? 1.0f / static_cast(N) : 0.0f) #define _ABS(N) ((N) < 0 ? -(N) : (N)) -#define _LS(N) (N = (T)(uint32_t(N) << p)) -#define _RS(N) (N = (T)(uint32_t(N) >> p)) +#define _LS(N) T(uint32_t(N) << p) +#define _RS(N) T(uint32_t(N) >> p) +#define _LSE(N) N = T(uint32_t(N) << p) +#define _RSE(N) N = T(uint32_t(N) >> p) #define FI FORCE_INLINE // Define types based on largest bit width stored value required @@ -164,49 +211,48 @@ typedef struct AxisFlags { enum AxisEnum : uint8_t { // Linear axes may be controlled directly or indirectly - NUM_AXIS_LIST(X_AXIS, Y_AXIS, Z_AXIS, I_AXIS, J_AXIS, K_AXIS, U_AXIS, V_AXIS, W_AXIS) + NUM_AXIS_LIST_(X_AXIS, Y_AXIS, Z_AXIS, I_AXIS, J_AXIS, K_AXIS, U_AXIS, V_AXIS, W_AXIS) - // Extruder axes may be considered distinctly - #define _EN_ITEM(N) , E##N##_AXIS + #define _EN_ITEM(N) E##N##_AXIS, REPEAT(EXTRUDERS, _EN_ITEM) #undef _EN_ITEM // Core also keeps toolhead directions #if ANY(IS_CORE, MARKFORGED_XY, MARKFORGED_YX) - , X_HEAD, Y_HEAD, Z_HEAD + X_HEAD, Y_HEAD, Z_HEAD, #endif // Distinct axes, including all E and Core - , NUM_AXIS_ENUMS + NUM_AXIS_ENUMS, // Most of the time we refer only to the single E_AXIS #if HAS_EXTRUDERS - , E_AXIS = E0_AXIS + E_AXIS = E0_AXIS, #endif // A, B, and C are for DELTA, SCARA, etc. - , A_AXIS = X_AXIS + #if HAS_X_AXIS + A_AXIS = X_AXIS, + #endif #if HAS_Y_AXIS - , B_AXIS = Y_AXIS + B_AXIS = Y_AXIS, #endif #if HAS_Z_AXIS - , C_AXIS = Z_AXIS + C_AXIS = Z_AXIS, #endif // To refer to all or none - , ALL_AXES_ENUM = 0xFE, NO_AXIS_ENUM = 0xFF + ALL_AXES_ENUM = 0xFE, NO_AXIS_ENUM = 0xFF }; -typedef bits_t(NUM_AXIS_ENUMS) axis_bits_t; - // // Loop over axes // -#define LOOP_ABC(VAR) LOOP_S_LE_N(VAR, A_AXIS, C_AXIS) -#define LOOP_NUM_AXES(VAR) LOOP_S_L_N(VAR, 0, NUM_AXES) -#define LOOP_LOGICAL_AXES(VAR) LOOP_S_L_N(VAR, 0, LOGICAL_AXES) -#define LOOP_DISTINCT_AXES(VAR) LOOP_S_L_N(VAR, 0, DISTINCT_AXES) -#define LOOP_DISTINCT_E(VAR) LOOP_L_N(VAR, DISTINCT_E) +#define LOOP_ABC(VAR) for (uint8_t VAR = A_AXIS; VAR <= C_AXIS; ++VAR) +#define LOOP_NUM_AXES(VAR) for (uint8_t VAR = 0; VAR < NUM_AXES; ++VAR) +#define LOOP_LOGICAL_AXES(VAR) for (uint8_t VAR = 0; VAR < LOGICAL_AXES; ++VAR) +#define LOOP_DISTINCT_AXES(VAR) for (uint8_t VAR = 0; VAR < DISTINCT_AXES; ++VAR) +#define LOOP_DISTINCT_E(VAR) for (uint8_t VAR = 0; VAR < DISTINCT_E; ++VAR) // // feedRate_t is just a humble float @@ -232,10 +278,43 @@ typedef float celsius_float_t; typedef const_float_t const_feedRate_t; typedef const_float_t const_celsius_float_t; +// Type large enough to count leveling grid points +typedef IF 255)), uint16_t, uint8_t>::type grid_count_t; + // Conversion macros #define MMM_TO_MMS(MM_M) feedRate_t(static_cast(MM_M) / 60.0f) #define MMS_TO_MMM(MM_S) (static_cast(MM_S) * 60.0f) +// Packaged character for AS_CHAR macro and other usage +typedef struct SerialChar { char c; SerialChar(char n) : c(n) { } } serial_char_t; +#define AS_CHAR(C) serial_char_t(C) + +// Packaged types: float with precision and/or width; a repeated space/character +typedef struct WFloat { float value; char width; char prec; + WFloat(float v, char w, char p) : value(v), width(w), prec(p) {} + } w_float_t; +typedef struct PFloat { float value; char prec; + PFloat(float v, char p) : value(v), prec(p) {} + } p_float_t; +typedef struct RepChr { char asc; uint8_t count; + RepChr(char a, uint8_t c) : asc(a), count(c) {} + } repchr_t; +typedef struct Spaces { uint8_t count; + Spaces(uint8_t c) : count(c) {} + } spaces_t; + +#ifdef __AVR__ + typedef w_float_t w_double_t; + typedef p_float_t p_double_t; +#else + typedef struct WDouble { double value; char width; char prec; + WDouble(double v, char w, char p) : value(v), width(w), prec(p) {} + } w_double_t; + typedef struct PDouble { double value; char prec; + PDouble(double v, char p) : value(v), prec(p) {} + } p_double_t; +#endif + // // Coordinates structures for XY, XYZ, XYZE... // @@ -323,6 +402,7 @@ void toNative(xyze_pos_t &lpos); // // Paired XY coordinates, counters, flags, etc. +// Always has XY elements regardless of the number of configured axes. // template struct XYval { @@ -333,157 +413,144 @@ struct XYval { }; // Set all to 0 - FI void reset() { x = y = 0; } + FI void reset() { x = y = 0; } // Setters taking struct types and arrays - FI void set(const T px) { x = px; } + #if HAS_X_AXIS + FI void set(const T px) { x = px; } + #endif #if HAS_Y_AXIS - FI void set(const T px, const T py) { x = px; y = py; } - FI void set(const T (&arr)[XY]) { x = arr[0]; y = arr[1]; } + FI void set(const T px, const T py) { x = px; y = py; } + FI void set(const T (&arr)[XY]) { x = arr[0]; y = arr[1]; } #endif #if NUM_AXES > XY - FI void set(const T (&arr)[NUM_AXES]) { x = arr[0]; y = arr[1]; } + FI void set(const T (&arr)[NUM_AXES]) { x = arr[0]; y = arr[1]; } #endif #if LOGICAL_AXES > NUM_AXES - FI void set(const T (&arr)[LOGICAL_AXES]) { x = arr[0]; y = arr[1]; } + FI void set(const T (&arr)[LOGICAL_AXES]) { x = arr[0]; y = arr[1]; } #if DISTINCT_AXES > LOGICAL_AXES - FI void set(const T (&arr)[DISTINCT_AXES]) { x = arr[0]; y = arr[1]; } + FI void set(const T (&arr)[DISTINCT_AXES]) { x = arr[0]; y = arr[1]; } #endif #endif // Length reduced to one dimension - FI T magnitude() const { return (T)sqrtf(x*x + y*y); } + FI constexpr T magnitude() const { return (T)sqrtf(x*x + y*y); } // Pointer to the data as a simple array - FI operator T* () { return pos; } + FI operator T* () { return pos; } // If any element is true then it's true - FI operator bool() { return x || y; } + FI constexpr operator bool() const { return x || y; } // Smallest element - FI T small() const { return _MIN(x, y); } + FI constexpr T small() const { return _MIN(x, y); } // Largest element - FI T large() const { return _MAX(x, y); } + FI constexpr T large() const { return _MAX(x, y); } // Explicit copy and copies with conversion - FI XYval copy() const { return *this; } - FI XYval ABS() const { return { T(_ABS(x)), T(_ABS(y)) }; } - FI XYval asInt() { return { int16_t(x), int16_t(y) }; } - FI XYval asInt() const { return { int16_t(x), int16_t(y) }; } - FI XYval asLong() { return { int32_t(x), int32_t(y) }; } - FI XYval asLong() const { return { int32_t(x), int32_t(y) }; } - FI XYval ROUNDL() { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } - FI XYval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } - FI XYval asFloat() { return { static_cast(x), static_cast(y) }; } - FI XYval asFloat() const { return { static_cast(x), static_cast(y) }; } - FI XYval reciprocal() const { return { _RECIP(x), _RECIP(y) }; } + FI constexpr XYval copy() const { return *this; } + FI constexpr XYval ABS() const { return { T(_ABS(x)), T(_ABS(y)) }; } + FI constexpr XYval asInt() const { return { int16_t(x), int16_t(y) }; } + FI constexpr XYval asLong() const { return { int32_t(x), int32_t(y) }; } + FI constexpr XYval ROUNDL() const { return { int32_t(LROUND(x)), int32_t(LROUND(y)) }; } + FI constexpr XYval asFloat() const { return { static_cast(x), static_cast(y) }; } + FI constexpr XYval reciprocal() const { return { _RECIP(x), _RECIP(y) }; } // Marlin workspace shifting is done with G92 and M206 - FI XYval asLogical() const { XYval o = asFloat(); toLogical(o); return o; } - FI XYval asNative() const { XYval o = asFloat(); toNative(o); return o; } + FI XYval asLogical() const { XYval o = asFloat(); toLogical(o); return o; } + FI XYval asNative() const { XYval o = asFloat(); toNative(o); return o; } // Cast to a type with more fields by making a new object - FI operator XYZval() { return { x, y }; } - FI operator XYZval() const { return { x, y }; } - FI operator XYZEval() { return { x, y }; } - FI operator XYZEval() const { return { x, y }; } + FI constexpr operator XYZval() const { return { x, y }; } + FI constexpr operator XYZEval() const { return { x, y }; } // Accessor via an AxisEnum (or any integer) [index] - FI T& operator[](const int n) { return pos[n]; } - FI const T& operator[](const int n) const { return pos[n]; } + FI T& operator[](const int n) { return pos[n]; } + FI const T& operator[](const int n) const { return pos[n]; } // Assignment operator overrides do the expected thing - FI XYval& operator= (const T v) { set(v, v ); return *this; } - FI XYval& operator= (const XYZval &rs) { set(rs.x, rs.y); return *this; } - FI XYval& operator= (const XYZEval &rs) { set(rs.x, rs.y); return *this; } + FI XYval& operator= (const T v) { set(v, v); return *this; } + FI XYval& operator= (const XYZval &rs) { set(XY_LIST(rs.x, rs.y)); return *this; } + FI XYval& operator= (const XYZEval &rs) { set(XY_LIST(rs.x, rs.y)); return *this; } // Override other operators to get intuitive behaviors - FI XYval operator+ (const XYval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator+ (const XYval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator- (const XYval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator- (const XYval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator* (const XYval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator* (const XYval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator/ (const XYval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator/ (const XYval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator+ (const XYZval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator+ (const XYZval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator- (const XYZval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator- (const XYZval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator* (const XYZval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator* (const XYZval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator/ (const XYZval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator/ (const XYZval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator+ (const XYZEval &rs) const { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator+ (const XYZEval &rs) { XYval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYval operator- (const XYZEval &rs) const { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator- (const XYZEval &rs) { XYval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYval operator* (const XYZEval &rs) const { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator* (const XYZEval &rs) { XYval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYval operator/ (const XYZEval &rs) const { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator/ (const XYZEval &rs) { XYval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYval operator* (const float &p) const { XYval ls = *this; ls.x *= p; ls.y *= p; return ls; } - FI XYval operator* (const float &p) { XYval ls = *this; ls.x *= p; ls.y *= p; return ls; } - FI XYval operator* (const int &p) const { XYval ls = *this; ls.x *= p; ls.y *= p; return ls; } - FI XYval operator* (const int &p) { XYval ls = *this; ls.x *= p; ls.y *= p; return ls; } - FI XYval operator/ (const float &p) const { XYval ls = *this; ls.x /= p; ls.y /= p; return ls; } - FI XYval operator/ (const float &p) { XYval ls = *this; ls.x /= p; ls.y /= p; return ls; } - FI XYval operator/ (const int &p) const { XYval ls = *this; ls.x /= p; ls.y /= p; return ls; } - FI XYval operator/ (const int &p) { XYval ls = *this; ls.x /= p; ls.y /= p; return ls; } - FI XYval operator>>(const int &p) const { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; } - FI XYval operator>>(const int &p) { XYval ls = *this; _RS(ls.x); _RS(ls.y); return ls; } - FI XYval operator<<(const int &p) const { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; } - FI XYval operator<<(const int &p) { XYval ls = *this; _LS(ls.x); _LS(ls.y); return ls; } - FI const XYval operator-() const { XYval o = *this; o.x = -x; o.y = -y; return o; } - FI XYval operator-() { XYval o = *this; o.x = -x; o.y = -y; return o; } + #define XY_OP(OP) { x TERN_(HAS_X_AXIS, OP rs.x), y TERN_(HAS_Y_AXIS, OP rs.y) } + FI constexpr XYval operator+ (const XYval &rs) const { return { x + rs.x, y + rs.y }; } + FI constexpr XYval operator- (const XYval &rs) const { return { x - rs.x, y - rs.y }; } + FI constexpr XYval operator* (const XYval &rs) const { return { x * rs.x, y * rs.y }; } + FI constexpr XYval operator/ (const XYval &rs) const { return { x / rs.x, y / rs.y }; } + FI constexpr XYval operator+ (const XYZval &rs) const { return { XY_OP(+) }; } + FI constexpr XYval operator- (const XYZval &rs) const { return { XY_OP(-) }; } + FI constexpr XYval operator* (const XYZval &rs) const { return { XY_OP(*) }; } + FI constexpr XYval operator/ (const XYZval &rs) const { return { XY_OP(/) }; } + FI constexpr XYval operator+ (const XYZEval &rs) const { return { XY_OP(+) }; } + FI constexpr XYval operator- (const XYZEval &rs) const { return { XY_OP(-) }; } + FI constexpr XYval operator* (const XYZEval &rs) const { return { XY_OP(*) }; } + FI constexpr XYval operator/ (const XYZEval &rs) const { return { XY_OP(/) }; } + FI constexpr XYval operator* (const float &p) const { return { (T)(x * p), (T)(y * p) }; } + FI constexpr XYval operator* (const int &p) const { return { x * p, y * p }; } + FI constexpr XYval operator/ (const float &p) const { return { (T)(x / p), (T)(y / p) }; } + FI constexpr XYval operator/ (const int &p) const { return { x / p, y / p }; } + FI constexpr XYval operator>>(const int &p) const { return { _RS(x), _RS(y) }; } + FI constexpr XYval operator<<(const int &p) const { return { _LS(x), _LS(y) }; } + FI constexpr XYval operator-() const { return { -x, -y }; } + #undef XY_OP // Modifier operators - FI XYval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } - FI XYval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } - FI XYval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } - FI XYval& operator/=(const XYval &rs) { x /= rs.x; y /= rs.y; return *this; } - FI XYval& operator+=(const XYZval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y,,,,,,, ); return *this; } - FI XYval& operator-=(const XYZval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y,,,,,,, ); return *this; } - FI XYval& operator*=(const XYZval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y,,,,,,, ); return *this; } - FI XYval& operator/=(const XYZval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y,,,,,,, ); return *this; } - FI XYval& operator+=(const XYZEval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y,,,,,,, ); return *this; } - FI XYval& operator-=(const XYZEval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y,,,,,,, ); return *this; } - FI XYval& operator*=(const XYZEval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y,,,,,,, ); return *this; } - FI XYval& operator/=(const XYZEval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y,,,,,,, ); return *this; } - FI XYval& operator*=(const float &p) { x *= p; y *= p; return *this; } - FI XYval& operator*=(const int &p) { x *= p; y *= p; return *this; } - FI XYval& operator>>=(const int &p) { _RS(x); _RS(y); return *this; } - FI XYval& operator<<=(const int &p) { _LS(x); _LS(y); return *this; } + FI XYval& operator+=(const XYval &rs) { x += rs.x; y += rs.y; return *this; } + FI XYval& operator-=(const XYval &rs) { x -= rs.x; y -= rs.y; return *this; } + FI XYval& operator*=(const XYval &rs) { x *= rs.x; y *= rs.y; return *this; } + FI XYval& operator/=(const XYval &rs) { x /= rs.x; y /= rs.y; return *this; } + FI XYval& operator+=(const XYZval &rs) { XY_CODE(x += rs.x, y += rs.y); return *this; } + FI XYval& operator-=(const XYZval &rs) { XY_CODE(x -= rs.x, y -= rs.y); return *this; } + FI XYval& operator*=(const XYZval &rs) { XY_CODE(x *= rs.x, y *= rs.y); return *this; } + FI XYval& operator/=(const XYZval &rs) { XY_CODE(x /= rs.x, y /= rs.y); return *this; } + FI XYval& operator+=(const XYZEval &rs) { XY_CODE(x += rs.x, y += rs.y); return *this; } + FI XYval& operator-=(const XYZEval &rs) { XY_CODE(x -= rs.x, y -= rs.y); return *this; } + FI XYval& operator*=(const XYZEval &rs) { XY_CODE(x *= rs.x, y *= rs.y); return *this; } + FI XYval& operator/=(const XYZEval &rs) { XY_CODE(x /= rs.x, y /= rs.y); return *this; } + FI XYval& operator*=(const float &p) { x *= p; y *= p; return *this; } + FI XYval& operator*=(const int &p) { x *= p; y *= p; return *this; } + FI XYval& operator>>=(const int &p) { _RSE(x); _RSE(y); return *this; } + FI XYval& operator<<=(const int &p) { _LSE(x); _LSE(y); return *this; } + + // Absolute difference between two objects + FI constexpr XYval diff(const XYZEval &rs) const { return { TERN(HAS_X_AXIS, T(_ABS(x - rs.x)), x), TERN(HAS_Y_AXIS, T(_ABS(y - rs.y)), y) }; } + FI constexpr XYval diff(const XYZval &rs) const { return { TERN(HAS_X_AXIS, T(_ABS(x - rs.x)), x), TERN(HAS_Y_AXIS, T(_ABS(y - rs.y)), y) }; } + FI constexpr XYval diff(const XYval &rs) const { return { T(_ABS(x - rs.x)), T(_ABS(y - rs.y)) }; } // Exact comparisons. For floats a "NEAR" operation may be better. - FI bool operator==(const XYval &rs) const { return NUM_AXIS_GANG(x == rs.x, && y == rs.y,,,,,,, ); } - FI bool operator==(const XYZval &rs) const { return NUM_AXIS_GANG(x == rs.x, && y == rs.y,,,,,,, ); } - FI bool operator==(const XYZEval &rs) const { return NUM_AXIS_GANG(x == rs.x, && y == rs.y,,,,,,, ); } - FI bool operator!=(const XYval &rs) const { return !operator==(rs); } - FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } - FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } + FI bool operator==(const XYval &rs) const { return x == rs.x && y == rs.y; } + FI bool operator==(const XYZval &rs) const { return ENABLED(HAS_X_AXIS) XY_GANG(&& x == rs.x, && y == rs.y); } + FI bool operator==(const XYZEval &rs) const { return ENABLED(HAS_X_AXIS) XY_GANG(&& x == rs.x, && y == rs.y); } + FI bool operator!=(const XYval &rs) const { return !operator==(rs); } + FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } + FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } }; // // Linear Axes coordinates, counters, flags, etc. +// May have any number of axes according to configuration, including zero axes. // template struct XYZval { union { - struct { T NUM_AXIS_ARGS(); }; - struct { T NUM_AXIS_LIST(a, b, c, _i, _j, _k, _u, _v, _w); }; + #if NUM_AXES + struct { NUM_AXIS_CODE(T x, T y, T z, T i, T j, T k, T u, T v, T w); }; + struct { NUM_AXIS_CODE(T a, T b, T c, T _i, T _j, T _k, T _u, T _v, T _w); }; + #endif T pos[NUM_AXES]; }; // Set all to 0 - FI void reset() { NUM_AXIS_GANG(x =, y =, z =, i =, j =, k =, u =, v =, w =) 0; } + FI void reset() { NUM_AXIS_CODE(x = 0, y = 0, z = 0, i = 0, j = 0, k = 0, u = 0, v = 0, w = 0); } // Setters taking struct types and arrays - FI void set(const XYval pxy) { NUM_AXIS_CODE(x = pxy.x, y = pxy.y,,,,,,,); } - FI void set(const XYval pxy, const T pz) { NUM_AXIS_CODE(x = pxy.x, y = pxy.y, z = pz,,,,,,); } - FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); } + FI void set(const XYval pxy) { XY_CODE(x = pxy.x, y = pxy.y); } + FI void set(const XYval pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); } + FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); } #if LOGICAL_AXES > NUM_AXES - FI void set(const T (&arr)[LOGICAL_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); } - FI void set(LOGICAL_AXIS_ARGS(const T)) { NUM_AXIS_CODE(a = x, b = y, c = z, _i = i, _j = j, _k = k, _u = u, _v = v, _w = w ); } + FI void set(const T (&arr)[LOGICAL_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); } + FI void set(LOGICAL_AXIS_ARGS(const T)) { NUM_AXIS_CODE(a = x, b = y, c = z, _i = i, _j = j, _k = k, _u = u, _v = v, _w = w); } #if DISTINCT_AXES > LOGICAL_AXES - FI void set(const T (&arr)[DISTINCT_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); } + FI void set(const T (&arr)[DISTINCT_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); } #endif #endif @@ -517,114 +584,98 @@ struct XYZval { #endif // Length reduced to one dimension - FI T magnitude() const { return (T)sqrtf(NUM_AXIS_GANG(x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)); } + FI constexpr T magnitude() const { return (T)TERN(HAS_X_AXIS, sqrtf(NUM_AXIS_GANG(x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)), 0); } // Pointer to the data as a simple array - FI operator T* () { return pos; } + FI operator T* () { return pos; } // If any element is true then it's true - FI operator bool() { return NUM_AXIS_GANG(x, || y, || z, || i, || j, || k, || u, || v, || w); } + FI constexpr operator bool() const { return 0 NUM_AXIS_GANG(|| x, || y, || z, || i, || j, || k, || u, || v, || w); } // Smallest element - FI T small() const { return _MIN(NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w)); } + FI constexpr T small() const { return TERN(HAS_X_AXIS, _MIN(NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w)), 0); } // Largest element - FI T large() const { return _MAX(NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w)); } + FI constexpr T large() const { return TERN(HAS_X_AXIS, _MAX(NUM_AXIS_LIST(x, y, z, i, j, k, u, v, w)), 0); } // Explicit copy and copies with conversion - FI XYZval copy() const { XYZval o = *this; return o; } - FI XYZval ABS() const { return NUM_AXIS_ARRAY(T(_ABS(x)), T(_ABS(y)), T(_ABS(z)), T(_ABS(i)), T(_ABS(j)), T(_ABS(k)), T(_ABS(u)), T(_ABS(v)), T(_ABS(w))); } - FI XYZval asInt() { return NUM_AXIS_ARRAY(int16_t(x), int16_t(y), int16_t(z), int16_t(i), int16_t(j), int16_t(k), int16_t(u), int16_t(v), int16_t(w)); } - FI XYZval asInt() const { return NUM_AXIS_ARRAY(int16_t(x), int16_t(y), int16_t(z), int16_t(i), int16_t(j), int16_t(k), int16_t(u), int16_t(v), int16_t(w)); } - FI XYZval asLong() { return NUM_AXIS_ARRAY(int32_t(x), int32_t(y), int32_t(z), int32_t(i), int32_t(j), int32_t(k), int32_t(u), int32_t(v), int32_t(w)); } - FI XYZval asLong() const { return NUM_AXIS_ARRAY(int32_t(x), int32_t(y), int32_t(z), int32_t(i), int32_t(j), int32_t(k), int32_t(u), int32_t(v), int32_t(w)); } - FI XYZval ROUNDL() { return NUM_AXIS_ARRAY(int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(i)), int32_t(LROUND(j)), int32_t(LROUND(k)), int32_t(LROUND(u)), int32_t(LROUND(v)), int32_t(LROUND(w))); } - FI XYZval ROUNDL() const { return NUM_AXIS_ARRAY(int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(i)), int32_t(LROUND(j)), int32_t(LROUND(k)), int32_t(LROUND(u)), int32_t(LROUND(v)), int32_t(LROUND(w))); } - FI XYZval asFloat() { return NUM_AXIS_ARRAY(static_cast(x), static_cast(y), static_cast(z), static_cast(i), static_cast(j), static_cast(k), static_cast(u), static_cast(v), static_cast(w)); } - FI XYZval asFloat() const { return NUM_AXIS_ARRAY(static_cast(x), static_cast(y), static_cast(z), static_cast(i), static_cast(j), static_cast(k), static_cast(u), static_cast(v), static_cast(w)); } - FI XYZval reciprocal() const { return NUM_AXIS_ARRAY(_RECIP(x), _RECIP(y), _RECIP(z), _RECIP(i), _RECIP(j), _RECIP(k), _RECIP(u), _RECIP(v), _RECIP(w)); } + FI constexpr XYZval copy() const { XYZval o = *this; return o; } + FI constexpr XYZval ABS() const { return NUM_AXIS_ARRAY(T(_ABS(x)), T(_ABS(y)), T(_ABS(z)), T(_ABS(i)), T(_ABS(j)), T(_ABS(k)), T(_ABS(u)), T(_ABS(v)), T(_ABS(w))); } + FI constexpr XYZval asInt() const { return NUM_AXIS_ARRAY(int16_t(x), int16_t(y), int16_t(z), int16_t(i), int16_t(j), int16_t(k), int16_t(u), int16_t(v), int16_t(w)); } + FI constexpr XYZval asLong() const { return NUM_AXIS_ARRAY(int32_t(x), int32_t(y), int32_t(z), int32_t(i), int32_t(j), int32_t(k), int32_t(u), int32_t(v), int32_t(w)); } + FI constexpr XYZval ROUNDL() const { return NUM_AXIS_ARRAY(int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(i)), int32_t(LROUND(j)), int32_t(LROUND(k)), int32_t(LROUND(u)), int32_t(LROUND(v)), int32_t(LROUND(w))); } + FI constexpr XYZval asFloat() const { return NUM_AXIS_ARRAY(static_cast(x), static_cast(y), static_cast(z), static_cast(i), static_cast(j), static_cast(k), static_cast(u), static_cast(v), static_cast(w)); } + FI constexpr XYZval reciprocal() const { return NUM_AXIS_ARRAY(_RECIP(x), _RECIP(y), _RECIP(z), _RECIP(i), _RECIP(j), _RECIP(k), _RECIP(u), _RECIP(v), _RECIP(w)); } // Marlin workspace shifting is done with G92 and M206 - FI XYZval asLogical() const { XYZval o = asFloat(); toLogical(o); return o; } - FI XYZval asNative() const { XYZval o = asFloat(); toNative(o); return o; } + FI XYZval asLogical() const { XYZval o = asFloat(); toLogical(o); return o; } + FI XYZval asNative() const { XYZval o = asFloat(); toNative(o); return o; } // In-place cast to types having fewer fields - FI operator XYval&() { return *(XYval*)this; } - FI operator const XYval&() const { return *(const XYval*)this; } + FI operator XYval&() { return *(XYval*)this; } + FI operator const XYval&() const { return *(const XYval*)this; } // Cast to a type with more fields by making a new object - FI operator XYZEval() const { return NUM_AXIS_ARRAY(x, y, z, i, j, k, u, v, w); } + FI constexpr operator XYZEval() const { return NUM_AXIS_ARRAY(x, y, z, i, j, k, u, v, w); } // Accessor via an AxisEnum (or any integer) [index] - FI T& operator[](const int n) { return pos[n]; } - FI const T& operator[](const int n) const { return pos[n]; } + FI T& operator[](const int n) { return pos[n]; } + FI const T& operator[](const int n) const { return pos[n]; } // Assignment operator overrides do the expected thing - FI XYZval& operator= (const T v) { set(ARRAY_N_1(NUM_AXES, v)); return *this; } - FI XYZval& operator= (const XYval &rs) { set(rs.x, rs.y ); return *this; } - FI XYZval& operator= (const XYZEval &rs) { set(NUM_AXIS_ELEM(rs)); return *this; } + FI XYZval& operator= (const T v) { set(ARRAY_N_1(NUM_AXES, v)); return *this; } + FI XYZval& operator= (const XYval &rs) { set(rs.x, rs.y); return *this; } + FI XYZval& operator= (const XYZEval &rs) { set(NUM_AXIS_ELEM(rs)); return *this; } // Override other operators to get intuitive behaviors - FI XYZval operator+ (const XYval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x += rs.x, ls.y += rs.y,,,,,,, ); return ls; } - FI XYZval operator+ (const XYval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x += rs.x, ls.y += rs.y,,,,,,, ); return ls; } - FI XYZval operator- (const XYval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x -= rs.x, ls.y -= rs.y,,,,,,, ); return ls; } - FI XYZval operator- (const XYval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x -= rs.x, ls.y -= rs.y,,,,,,, ); return ls; } - FI XYZval operator* (const XYval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= rs.x, ls.y *= rs.y,,,,,,, ); return ls; } - FI XYZval operator* (const XYval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= rs.x, ls.y *= rs.y,,,,,,, ); return ls; } - FI XYZval operator/ (const XYval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= rs.x, ls.y /= rs.y,,,,,,, ); return ls; } - FI XYZval operator/ (const XYval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= rs.x, ls.y /= rs.y,,,,,,, ); return ls; } - FI XYZval operator+ (const XYZval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x += rs.x, ls.y += rs.y, ls.z += rs.z, ls.i += rs.i, ls.j += rs.j, ls.k += rs.k, ls.u += rs.u, ls.v += rs.v, ls.w += rs.w); return ls; } - FI XYZval operator+ (const XYZval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x += rs.x, ls.y += rs.y, ls.z += rs.z, ls.i += rs.i, ls.j += rs.j, ls.k += rs.k, ls.u += rs.u, ls.v += rs.v, ls.w += rs.w); return ls; } - FI XYZval operator- (const XYZval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x -= rs.x, ls.y -= rs.y, ls.z -= rs.z, ls.i -= rs.i, ls.j -= rs.j, ls.k -= rs.k, ls.u -= rs.u, ls.v -= rs.v, ls.w -= rs.w); return ls; } - FI XYZval operator- (const XYZval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x -= rs.x, ls.y -= rs.y, ls.z -= rs.z, ls.i -= rs.i, ls.j -= rs.j, ls.k -= rs.k, ls.u -= rs.u, ls.v -= rs.v, ls.w -= rs.w); return ls; } - FI XYZval operator* (const XYZval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= rs.x, ls.y *= rs.y, ls.z *= rs.z, ls.i *= rs.i, ls.j *= rs.j, ls.k *= rs.k, ls.u *= rs.u, ls.v *= rs.v, ls.w *= rs.w); return ls; } - FI XYZval operator* (const XYZval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= rs.x, ls.y *= rs.y, ls.z *= rs.z, ls.i *= rs.i, ls.j *= rs.j, ls.k *= rs.k, ls.u *= rs.u, ls.v *= rs.v, ls.w *= rs.w); return ls; } - FI XYZval operator/ (const XYZval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= rs.x, ls.y /= rs.y, ls.z /= rs.z, ls.i /= rs.i, ls.j /= rs.j, ls.k /= rs.k, ls.u /= rs.u, ls.v /= rs.v, ls.w /= rs.w); return ls; } - FI XYZval operator/ (const XYZval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= rs.x, ls.y /= rs.y, ls.z /= rs.z, ls.i /= rs.i, ls.j /= rs.j, ls.k /= rs.k, ls.u /= rs.u, ls.v /= rs.v, ls.w /= rs.w); return ls; } - FI XYZval operator+ (const XYZEval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x += rs.x, ls.y += rs.y, ls.z += rs.z, ls.i += rs.i, ls.j += rs.j, ls.k += rs.k, ls.u += rs.u, ls.v += rs.v, ls.w += rs.w); return ls; } - FI XYZval operator+ (const XYZEval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x += rs.x, ls.y += rs.y, ls.z += rs.z, ls.i += rs.i, ls.j += rs.j, ls.k += rs.k, ls.u += rs.u, ls.v += rs.v, ls.w += rs.w); return ls; } - FI XYZval operator- (const XYZEval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x -= rs.x, ls.y -= rs.y, ls.z -= rs.z, ls.i -= rs.i, ls.j -= rs.j, ls.k -= rs.k, ls.u -= rs.u, ls.v -= rs.v, ls.w -= rs.w); return ls; } - FI XYZval operator- (const XYZEval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x -= rs.x, ls.y -= rs.y, ls.z -= rs.z, ls.i -= rs.i, ls.j -= rs.j, ls.k -= rs.k, ls.u -= rs.u, ls.v -= rs.v, ls.w -= rs.w); return ls; } - FI XYZval operator* (const XYZEval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= rs.x, ls.y *= rs.y, ls.z *= rs.z, ls.i *= rs.i, ls.j *= rs.j, ls.k *= rs.k, ls.u *= rs.u, ls.v *= rs.v, ls.w *= rs.w); return ls; } - FI XYZval operator* (const XYZEval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= rs.x, ls.y *= rs.y, ls.z *= rs.z, ls.i *= rs.i, ls.j *= rs.j, ls.k *= rs.k, ls.u *= rs.u, ls.v *= rs.v, ls.w *= rs.w); return ls; } - FI XYZval operator/ (const XYZEval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= rs.x, ls.y /= rs.y, ls.z /= rs.z, ls.i /= rs.i, ls.j /= rs.j, ls.k /= rs.k, ls.u /= rs.u, ls.v /= rs.v, ls.w /= rs.w); return ls; } - FI XYZval operator/ (const XYZEval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= rs.x, ls.y /= rs.y, ls.z /= rs.z, ls.i /= rs.i, ls.j /= rs.j, ls.k /= rs.k, ls.u /= rs.u, ls.v /= rs.v, ls.w /= rs.w); return ls; } - FI XYZval operator* (const float &p) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= p, ls.y *= p, ls.z *= p, ls.i *= p, ls.j *= p, ls.k *= p, ls.u *= p, ls.v *= p, ls.w *= p ); return ls; } - FI XYZval operator* (const float &p) { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= p, ls.y *= p, ls.z *= p, ls.i *= p, ls.j *= p, ls.k *= p, ls.u *= p, ls.v *= p, ls.w *= p ); return ls; } - FI XYZval operator* (const int &p) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= p, ls.y *= p, ls.z *= p, ls.i *= p, ls.j *= p, ls.k *= p, ls.u *= p, ls.v *= p, ls.w *= p ); return ls; } - FI XYZval operator* (const int &p) { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= p, ls.y *= p, ls.z *= p, ls.i *= p, ls.j *= p, ls.k *= p, ls.u *= p, ls.v *= p, ls.w *= p ); return ls; } - FI XYZval operator/ (const float &p) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= p, ls.y /= p, ls.z /= p, ls.i /= p, ls.j /= p, ls.k /= p, ls.u /= p, ls.v /= p, ls.w /= p ); return ls; } - FI XYZval operator/ (const float &p) { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= p, ls.y /= p, ls.z /= p, ls.i /= p, ls.j /= p, ls.k /= p, ls.u /= p, ls.v /= p, ls.w /= p ); return ls; } - FI XYZval operator/ (const int &p) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= p, ls.y /= p, ls.z /= p, ls.i /= p, ls.j /= p, ls.k /= p, ls.u /= p, ls.v /= p, ls.w /= p ); return ls; } - FI XYZval operator/ (const int &p) { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= p, ls.y /= p, ls.z /= p, ls.i /= p, ls.j /= p, ls.k /= p, ls.u /= p, ls.v /= p, ls.w /= p ); return ls; } - FI XYZval operator>>(const int &p) const { XYZval ls = *this; NUM_AXIS_CODE(_RS(ls.x), _RS(ls.y), _RS(ls.z), _RS(ls.i), _RS(ls.j), _RS(ls.k), _RS(ls.u), _RS(ls.v), _RS(ls.w) ); return ls; } - FI XYZval operator>>(const int &p) { XYZval ls = *this; NUM_AXIS_CODE(_RS(ls.x), _RS(ls.y), _RS(ls.z), _RS(ls.i), _RS(ls.j), _RS(ls.k), _RS(ls.u), _RS(ls.v), _RS(ls.w) ); return ls; } - FI XYZval operator<<(const int &p) const { XYZval ls = *this; NUM_AXIS_CODE(_LS(ls.x), _LS(ls.y), _LS(ls.z), _LS(ls.i), _LS(ls.j), _LS(ls.k), _LS(ls.u), _LS(ls.v), _LS(ls.w) ); return ls; } - FI XYZval operator<<(const int &p) { XYZval ls = *this; NUM_AXIS_CODE(_LS(ls.x), _LS(ls.y), _LS(ls.z), _LS(ls.i), _LS(ls.j), _LS(ls.k), _LS(ls.u), _LS(ls.v), _LS(ls.w) ); return ls; } - FI const XYZval operator-() const { XYZval o = *this; NUM_AXIS_CODE(o.x = -x, o.y = -y, o.z = -z, o.i = -i, o.j = -j, o.k = -k, o.u = -u, o.v = -v, o.w = -w); return o; } - FI XYZval operator-() { XYZval o = *this; NUM_AXIS_CODE(o.x = -x, o.y = -y, o.z = -z, o.i = -i, o.j = -j, o.k = -k, o.u = -u, o.v = -v, o.w = -w); return o; } + FI constexpr XYZval operator+ (const XYval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z, i, j, k, u, v, w ); } + FI constexpr XYZval operator- (const XYval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z, i, j, k, u, v, w ); } + FI constexpr XYZval operator* (const XYval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z, i, j, k, u, v, w ); } + FI constexpr XYZval operator/ (const XYval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z, i, j, k, u, v, w ); } + FI constexpr XYZval operator+ (const XYZval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w ); } + FI constexpr XYZval operator- (const XYZval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w ); } + FI constexpr XYZval operator* (const XYZval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w ); } + FI constexpr XYZval operator/ (const XYZval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w ); } + FI constexpr XYZval operator+ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w ); } + FI constexpr XYZval operator- (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w ); } + FI constexpr XYZval operator* (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w ); } + FI constexpr XYZval operator/ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w ); } + FI constexpr XYZval operator* (const float &p) const { return NUM_AXIS_ARRAY((T)(x * p), (T)(y * p), (T)(z * p), (T)(i * p), (T)(j * p), (T)(k * p), (T)(u * p), (T)(v * p), (T)(w * p)); } + FI constexpr XYZval operator* (const int &p) const { return NUM_AXIS_ARRAY(x * p, y * p, z * p, i * p, j * p, k * p, u * p, v * p, w * p); } + FI constexpr XYZval operator/ (const float &p) const { return NUM_AXIS_ARRAY((T)(x / p), (T)(y / p), (T)(z / p), (T)(i / p), (T)(j / p), (T)(k / p), (T)(u / p), (T)(v / p), (T)(w / p)); } + FI constexpr XYZval operator/ (const int &p) const { return NUM_AXIS_ARRAY(x / p, y / p, z / p, i / p, j / p, k / p, u / p, v / p, w / p); } + FI constexpr XYZval operator>>(const int &p) const { return NUM_AXIS_ARRAY(_RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); } + FI constexpr XYZval operator<<(const int &p) const { return NUM_AXIS_ARRAY(_LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); } + FI constexpr XYZval operator-() const { return NUM_AXIS_ARRAY(-x, -y, -z, -i, -j, -k, -u, -v, -w); } + + // Absolute difference between two objects + FI constexpr XYZval diff(const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } + FI constexpr XYZval diff(const XYZval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } + FI constexpr XYZval diff(const XYval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), z, i, j, k, u, v, w ); } // Modifier operators - FI XYZval& operator+=(const XYval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y,,,,,,, ); return *this; } - FI XYZval& operator-=(const XYval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y,,,,,,, ); return *this; } - FI XYZval& operator*=(const XYval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y,,,,,,, ); return *this; } - FI XYZval& operator/=(const XYval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y,,,,,,, ); return *this; } - FI XYZval& operator+=(const XYZval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y, z += rs.z, i += rs.i, j += rs.j, k += rs.k, u += rs.u, v += rs.v, w += rs.w); return *this; } - FI XYZval& operator-=(const XYZval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y, z -= rs.z, i -= rs.i, j -= rs.j, k -= rs.k, u -= rs.u, v -= rs.v, w -= rs.w); return *this; } - FI XYZval& operator*=(const XYZval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y, z *= rs.z, i *= rs.i, j *= rs.j, k *= rs.k, u *= rs.u, v *= rs.v, w *= rs.w); return *this; } - FI XYZval& operator/=(const XYZval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y, z /= rs.z, i /= rs.i, j /= rs.j, k /= rs.k, u /= rs.u, v /= rs.v, w /= rs.w); return *this; } - FI XYZval& operator+=(const XYZEval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y, z += rs.z, i += rs.i, j += rs.j, k += rs.k, u += rs.u, v += rs.v, w += rs.w); return *this; } - FI XYZval& operator-=(const XYZEval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y, z -= rs.z, i -= rs.i, j -= rs.j, k -= rs.k, u -= rs.u, v -= rs.v, w -= rs.w); return *this; } - FI XYZval& operator*=(const XYZEval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y, z *= rs.z, i *= rs.i, j *= rs.j, k *= rs.k, u *= rs.u, v *= rs.v, w *= rs.w); return *this; } - FI XYZval& operator/=(const XYZEval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y, z /= rs.z, i /= rs.i, j /= rs.j, k /= rs.k, u /= rs.u, v /= rs.v, w /= rs.w); return *this; } - FI XYZval& operator*=(const float &p) { NUM_AXIS_CODE(x *= p, y *= p, z *= p, i *= p, j *= p, k *= p, u *= p, v *= p, w *= p); return *this; } - FI XYZval& operator*=(const int &p) { NUM_AXIS_CODE(x *= p, y *= p, z *= p, i *= p, j *= p, k *= p, u *= p, v *= p, w *= p); return *this; } - FI XYZval& operator>>=(const int &p) { NUM_AXIS_CODE(_RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); return *this; } - FI XYZval& operator<<=(const int &p) { NUM_AXIS_CODE(_LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); return *this; } + FI XYZval& operator+=(const XYval &rs) { XY_CODE(x += rs.x, y += rs.y); return *this; } + FI XYZval& operator-=(const XYval &rs) { XY_CODE(x -= rs.x, y -= rs.y); return *this; } + FI XYZval& operator*=(const XYval &rs) { XY_CODE(x *= rs.x, y *= rs.y); return *this; } + FI XYZval& operator/=(const XYval &rs) { XY_CODE(x /= rs.x, y /= rs.y); return *this; } + FI XYZval& operator+=(const XYZval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y, z += rs.z, i += rs.i, j += rs.j, k += rs.k, u += rs.u, v += rs.v, w += rs.w); return *this; } + FI XYZval& operator-=(const XYZval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y, z -= rs.z, i -= rs.i, j -= rs.j, k -= rs.k, u -= rs.u, v -= rs.v, w -= rs.w); return *this; } + FI XYZval& operator*=(const XYZval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y, z *= rs.z, i *= rs.i, j *= rs.j, k *= rs.k, u *= rs.u, v *= rs.v, w *= rs.w); return *this; } + FI XYZval& operator/=(const XYZval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y, z /= rs.z, i /= rs.i, j /= rs.j, k /= rs.k, u /= rs.u, v /= rs.v, w /= rs.w); return *this; } + FI XYZval& operator+=(const XYZEval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y, z += rs.z, i += rs.i, j += rs.j, k += rs.k, u += rs.u, v += rs.v, w += rs.w); return *this; } + FI XYZval& operator-=(const XYZEval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y, z -= rs.z, i -= rs.i, j -= rs.j, k -= rs.k, u -= rs.u, v -= rs.v, w -= rs.w); return *this; } + FI XYZval& operator*=(const XYZEval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y, z *= rs.z, i *= rs.i, j *= rs.j, k *= rs.k, u *= rs.u, v *= rs.v, w *= rs.w); return *this; } + FI XYZval& operator/=(const XYZEval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y, z /= rs.z, i /= rs.i, j /= rs.j, k /= rs.k, u /= rs.u, v /= rs.v, w /= rs.w); return *this; } + FI XYZval& operator*=(const float &p) { NUM_AXIS_CODE(x *= p, y *= p, z *= p, i *= p, j *= p, k *= p, u *= p, v *= p, w *= p); return *this; } + FI XYZval& operator*=(const int &p) { NUM_AXIS_CODE(x *= p, y *= p, z *= p, i *= p, j *= p, k *= p, u *= p, v *= p, w *= p); return *this; } + FI XYZval& operator>>=(const int &p) { NUM_AXIS_CODE(_RSE(x), _RSE(y), _RSE(z), _RSE(i), _RSE(j), _RSE(k), _RSE(u), _RSE(v), _RSE(w)); return *this; } + FI XYZval& operator<<=(const int &p) { NUM_AXIS_CODE(_LSE(x), _LSE(y), _LSE(z), _LSE(i), _LSE(j), _LSE(k), _LSE(u), _LSE(v), _LSE(w)); return *this; } // Exact comparisons. For floats a "NEAR" operation may be better. - FI bool operator==(const XYZEval &rs) const { return true NUM_AXIS_GANG(&& x == rs.x, && y == rs.y, && z == rs.z, && i == rs.i, && j == rs.j, && k == rs.k, && u == rs.u, && v == rs.v, && w == rs.w); } - FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } + FI bool operator==(const XYZEval &rs) const { return true NUM_AXIS_GANG(&& x == rs.x, && y == rs.y, && z == rs.z, && i == rs.i, && j == rs.j, && k == rs.k, && u == rs.u, && v == rs.v, && w == rs.w); } + FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } }; // // Logical Axes coordinates, counters, etc. +// May have any number of axes according to configuration, including zero axes. +// When there is no extruder, essentially identical to XYZval. // template struct XYZEval { @@ -634,12 +685,12 @@ struct XYZEval { T pos[LOGICAL_AXES]; }; // Reset all to 0 - FI void reset() { LOGICAL_AXIS_GANG(e =, x =, y =, z =, i =, j =, k =, u =, v =, w =) 0; } + FI void reset() { LOGICAL_AXIS_GANG(e =, x =, y =, z =, i =, j =, k =, u =, v =, w =) 0; } // Setters taking struct types and arrays - FI void set(const XYval pxy) { x = pxy.x; OPTCODE(HAS_Y_AXIS, y = pxy.y) } + FI void set(const XYval pxy) { XY_CODE(x = pxy.x, y = pxy.y); } + FI void set(const XYval pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); } FI void set(const XYZval pxyz) { set(NUM_AXIS_ELEM(pxyz)); } - FI void set(const XYval pxy, const T pz) { set(pxy); TERN_(HAS_Z_AXIS, z = pz); } FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); } #if LOGICAL_AXES > NUM_AXES FI void set(const T (&arr)[LOGICAL_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); } @@ -681,32 +732,28 @@ struct XYZEval { #endif // Length reduced to one dimension - FI T magnitude() const { return (T)sqrtf(LOGICAL_AXIS_GANG(+ e*e, + x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)); } + FI constexpr T magnitude() const { return (T)sqrtf(LOGICAL_AXIS_GANG(+ e*e, + x*x, + y*y, + z*z, + i*i, + j*j, + k*k, + u*u, + v*v, + w*w)); } // Pointer to the data as a simple array - FI operator T* () { return pos; } + FI operator T* () { return pos; } // If any element is true then it's true - FI operator bool() { return 0 LOGICAL_AXIS_GANG(|| e, || x, || y, || z, || i, || j, || k, || u, || v, || w); } + FI constexpr operator bool() const { return 0 LOGICAL_AXIS_GANG(|| e, || x, || y, || z, || i, || j, || k, || u, || v, || w); } // Smallest element - FI T small() const { return _MIN(LOGICAL_AXIS_LIST(e, x, y, z, i, j, k, u, v, w)); } + FI constexpr T small() const { return _MIN(LOGICAL_AXIS_LIST(e, x, y, z, i, j, k, u, v, w)); } // Largest element - FI T large() const { return _MAX(LOGICAL_AXIS_LIST(e, x, y, z, i, j, k, u, v, w)); } + FI constexpr T large() const { return _MAX(LOGICAL_AXIS_LIST(e, x, y, z, i, j, k, u, v, w)); } // Explicit copy and copies with conversion - FI XYZEval copy() const { XYZEval v = *this; return v; } - FI XYZEval ABS() const { return LOGICAL_AXIS_ARRAY(T(_ABS(e)), T(_ABS(x)), T(_ABS(y)), T(_ABS(z)), T(_ABS(i)), T(_ABS(j)), T(_ABS(k)), T(_ABS(u)), T(_ABS(v)), T(_ABS(w))); } - FI XYZEval asInt() { return LOGICAL_AXIS_ARRAY(int16_t(e), int16_t(x), int16_t(y), int16_t(z), int16_t(i), int16_t(j), int16_t(k), int16_t(u), int16_t(v), int16_t(w)); } - FI XYZEval asInt() const { return LOGICAL_AXIS_ARRAY(int16_t(e), int16_t(x), int16_t(y), int16_t(z), int16_t(i), int16_t(j), int16_t(k), int16_t(u), int16_t(v), int16_t(w)); } - FI XYZEval asLong() { return LOGICAL_AXIS_ARRAY(int32_t(e), int32_t(x), int32_t(y), int32_t(z), int32_t(i), int32_t(j), int32_t(k), int32_t(u), int32_t(v), int32_t(w)); } - FI XYZEval asLong() const { return LOGICAL_AXIS_ARRAY(int32_t(e), int32_t(x), int32_t(y), int32_t(z), int32_t(i), int32_t(j), int32_t(k), int32_t(u), int32_t(v), int32_t(w)); } - FI XYZEval ROUNDL() { return LOGICAL_AXIS_ARRAY(int32_t(LROUND(e)), int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(i)), int32_t(LROUND(j)), int32_t(LROUND(k)), int32_t(LROUND(u)), int32_t(LROUND(v)), int32_t(LROUND(w))); } - FI XYZEval ROUNDL() const { return LOGICAL_AXIS_ARRAY(int32_t(LROUND(e)), int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(i)), int32_t(LROUND(j)), int32_t(LROUND(k)), int32_t(LROUND(u)), int32_t(LROUND(v)), int32_t(LROUND(w))); } - FI XYZEval asFloat() { return LOGICAL_AXIS_ARRAY(static_cast(e), static_cast(x), static_cast(y), static_cast(z), static_cast(i), static_cast(j), static_cast(k), static_cast(u), static_cast(v), static_cast(w)); } - FI XYZEval asFloat() const { return LOGICAL_AXIS_ARRAY(static_cast(e), static_cast(x), static_cast(y), static_cast(z), static_cast(i), static_cast(j), static_cast(k), static_cast(u), static_cast(v), static_cast(w)); } - FI XYZEval reciprocal() const { return LOGICAL_AXIS_ARRAY(_RECIP(e), _RECIP(x), _RECIP(y), _RECIP(z), _RECIP(i), _RECIP(j), _RECIP(k), _RECIP(u), _RECIP(v), _RECIP(w)); } + FI constexpr XYZEval copy() const { XYZEval v = *this; return v; } + FI constexpr XYZEval ABS() const { return LOGICAL_AXIS_ARRAY(T(_ABS(e)), T(_ABS(x)), T(_ABS(y)), T(_ABS(z)), T(_ABS(i)), T(_ABS(j)), T(_ABS(k)), T(_ABS(u)), T(_ABS(v)), T(_ABS(w))); } + FI constexpr XYZEval asInt() const { return LOGICAL_AXIS_ARRAY(int16_t(e), int16_t(x), int16_t(y), int16_t(z), int16_t(i), int16_t(j), int16_t(k), int16_t(u), int16_t(v), int16_t(w)); } + FI constexpr XYZEval asLong() const { return LOGICAL_AXIS_ARRAY(int32_t(e), int32_t(x), int32_t(y), int32_t(z), int32_t(i), int32_t(j), int32_t(k), int32_t(u), int32_t(v), int32_t(w)); } + FI constexpr XYZEval ROUNDL() const { return LOGICAL_AXIS_ARRAY(int32_t(LROUND(e)), int32_t(LROUND(x)), int32_t(LROUND(y)), int32_t(LROUND(z)), int32_t(LROUND(i)), int32_t(LROUND(j)), int32_t(LROUND(k)), int32_t(LROUND(u)), int32_t(LROUND(v)), int32_t(LROUND(w))); } + FI constexpr XYZEval asFloat() const { return LOGICAL_AXIS_ARRAY(static_cast(e), static_cast(x), static_cast(y), static_cast(z), static_cast(i), static_cast(j), static_cast(k), static_cast(u), static_cast(v), static_cast(w)); } + FI constexpr XYZEval reciprocal() const { return LOGICAL_AXIS_ARRAY(_RECIP(e), _RECIP(x), _RECIP(y), _RECIP(z), _RECIP(i), _RECIP(j), _RECIP(k), _RECIP(u), _RECIP(v), _RECIP(w)); } // Marlin workspace shifting is done with G92 and M206 - FI XYZEval asLogical() const { XYZEval o = asFloat(); toLogical(o); return o; } - FI XYZEval asNative() const { XYZEval o = asFloat(); toNative(o); return o; } + FI XYZEval asLogical() const { XYZEval o = asFloat(); toLogical(o); return o; } + FI XYZEval asNative() const { XYZEval o = asFloat(); toNative(o); return o; } // In-place cast to types having fewer fields FI operator XYval&() { return *(XYval*)this; } @@ -715,80 +762,349 @@ struct XYZEval { FI operator const XYZval&() const { return *(const XYZval*)this; } // Accessor via an AxisEnum (or any integer) [index] - FI T& operator[](const int n) { return pos[n]; } - FI const T& operator[](const int n) const { return pos[n]; } + FI T& operator[](const int n) { return pos[n]; } + FI const T& operator[](const int n) const { return pos[n]; } // Assignment operator overrides do the expected thing - FI XYZEval& operator= (const T v) { set(LOGICAL_AXIS_LIST_1(v)); return *this; } - FI XYZEval& operator= (const XYval &rs) { set(rs.x, rs.y); return *this; } - FI XYZEval& operator= (const XYZval &rs) { set(NUM_AXIS_ELEM(rs)); return *this; } + FI XYZEval& operator= (const T v) { set(LOGICAL_AXIS_LIST_1(v)); return *this; } + FI XYZEval& operator= (const XYval &rs) { set(rs.x, rs.y); return *this; } + FI XYZEval& operator= (const XYZval &rs) { set(NUM_AXIS_ELEM(rs)); return *this; } // Override other operators to get intuitive behaviors - FI XYZEval operator+ (const XYval &rs) const { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYZEval operator+ (const XYval &rs) { XYZEval ls = *this; ls.x += rs.x; ls.y += rs.y; return ls; } - FI XYZEval operator- (const XYval &rs) const { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYZEval operator- (const XYval &rs) { XYZEval ls = *this; ls.x -= rs.x; ls.y -= rs.y; return ls; } - FI XYZEval operator* (const XYval &rs) const { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYZEval operator* (const XYval &rs) { XYZEval ls = *this; ls.x *= rs.x; ls.y *= rs.y; return ls; } - FI XYZEval operator/ (const XYval &rs) const { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYZEval operator/ (const XYval &rs) { XYZEval ls = *this; ls.x /= rs.x; ls.y /= rs.y; return ls; } - FI XYZEval operator+ (const XYZval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x += rs.x, ls.y += rs.y, ls.z += rs.z, ls.i += rs.i, ls.j += rs.j, ls.k += rs.k, ls.u += rs.u, ls.v += rs.v, ls.w += rs.w); return ls; } - FI XYZEval operator+ (const XYZval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x += rs.x, ls.y += rs.y, ls.z += rs.z, ls.i += rs.i, ls.j += rs.j, ls.k += rs.k, ls.u += rs.u, ls.v += rs.v, ls.w += rs.w); return ls; } - FI XYZEval operator- (const XYZval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x -= rs.x, ls.y -= rs.y, ls.z -= rs.z, ls.i -= rs.i, ls.j -= rs.j, ls.k -= rs.k, ls.u -= rs.u, ls.v -= rs.v, ls.w -= rs.w); return ls; } - FI XYZEval operator- (const XYZval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x -= rs.x, ls.y -= rs.y, ls.z -= rs.z, ls.i -= rs.i, ls.j -= rs.j, ls.k -= rs.k, ls.u -= rs.u, ls.v -= rs.v, ls.w -= rs.w); return ls; } - FI XYZEval operator* (const XYZval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= rs.x, ls.y *= rs.y, ls.z *= rs.z, ls.i *= rs.i, ls.j *= rs.j, ls.k *= rs.k, ls.u *= rs.u, ls.v *= rs.v, ls.w *= rs.w); return ls; } - FI XYZEval operator* (const XYZval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x *= rs.x, ls.y *= rs.y, ls.z *= rs.z, ls.i *= rs.i, ls.j *= rs.j, ls.k *= rs.k, ls.u *= rs.u, ls.v *= rs.v, ls.w *= rs.w); return ls; } - FI XYZEval operator/ (const XYZval &rs) const { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= rs.x, ls.y /= rs.y, ls.z /= rs.z, ls.i /= rs.i, ls.j /= rs.j, ls.k /= rs.k, ls.u /= rs.u, ls.v /= rs.v, ls.w /= rs.w); return ls; } - FI XYZEval operator/ (const XYZval &rs) { XYZval ls = *this; NUM_AXIS_CODE(ls.x /= rs.x, ls.y /= rs.y, ls.z /= rs.z, ls.i /= rs.i, ls.j /= rs.j, ls.k /= rs.k, ls.u /= rs.u, ls.v /= rs.v, ls.w /= rs.w); return ls; } - FI XYZEval operator+ (const XYZEval &rs) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e += rs.e, ls.x += rs.x, ls.y += rs.y, ls.z += rs.z, ls.i += rs.i, ls.j += rs.j, ls.k += rs.k, ls.u += rs.u, ls.v += rs.v, ls.w += rs.w); return ls; } - FI XYZEval operator+ (const XYZEval &rs) { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e += rs.e, ls.x += rs.x, ls.y += rs.y, ls.z += rs.z, ls.i += rs.i, ls.j += rs.j, ls.k += rs.k, ls.u += rs.u, ls.v += rs.v, ls.w += rs.w); return ls; } - FI XYZEval operator- (const XYZEval &rs) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e -= rs.e, ls.x -= rs.x, ls.y -= rs.y, ls.z -= rs.z, ls.i -= rs.i, ls.j -= rs.j, ls.k -= rs.k, ls.u -= rs.u, ls.v -= rs.v, ls.w -= rs.w); return ls; } - FI XYZEval operator- (const XYZEval &rs) { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e -= rs.e, ls.x -= rs.x, ls.y -= rs.y, ls.z -= rs.z, ls.i -= rs.i, ls.j -= rs.j, ls.k -= rs.k, ls.u -= rs.u, ls.v -= rs.v, ls.w -= rs.w); return ls; } - FI XYZEval operator* (const XYZEval &rs) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e *= rs.e, ls.x *= rs.x, ls.y *= rs.y, ls.z *= rs.z, ls.i *= rs.i, ls.j *= rs.j, ls.k *= rs.k, ls.u *= rs.u, ls.v *= rs.v, ls.w *= rs.w); return ls; } - FI XYZEval operator* (const XYZEval &rs) { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e *= rs.e, ls.x *= rs.x, ls.y *= rs.y, ls.z *= rs.z, ls.i *= rs.i, ls.j *= rs.j, ls.k *= rs.k, ls.u *= rs.u, ls.v *= rs.v, ls.w *= rs.w); return ls; } - FI XYZEval operator/ (const XYZEval &rs) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e /= rs.e, ls.x /= rs.x, ls.y /= rs.y, ls.z /= rs.z, ls.i /= rs.i, ls.j /= rs.j, ls.k /= rs.k, ls.u /= rs.u, ls.v /= rs.v, ls.w /= rs.w); return ls; } - FI XYZEval operator/ (const XYZEval &rs) { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e /= rs.e, ls.x /= rs.x, ls.y /= rs.y, ls.z /= rs.z, ls.i /= rs.i, ls.j /= rs.j, ls.k /= rs.k, ls.u /= rs.u, ls.v /= rs.v, ls.w /= rs.w); return ls; } - FI XYZEval operator* (const float &p) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e *= p, ls.x *= p, ls.y *= p, ls.z *= p, ls.i *= p, ls.j *= p, ls.k *= p, ls.u *= p, ls.v *= p, ls.w *= p ); return ls; } - FI XYZEval operator* (const float &p) { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e *= p, ls.x *= p, ls.y *= p, ls.z *= p, ls.i *= p, ls.j *= p, ls.k *= p, ls.u *= p, ls.v *= p, ls.w *= p ); return ls; } - FI XYZEval operator* (const int &p) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e *= p, ls.x *= p, ls.y *= p, ls.z *= p, ls.i *= p, ls.j *= p, ls.k *= p, ls.u *= p, ls.v *= p, ls.w *= p ); return ls; } - FI XYZEval operator* (const int &p) { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e *= p, ls.x *= p, ls.y *= p, ls.z *= p, ls.i *= p, ls.j *= p, ls.k *= p, ls.u *= p, ls.v *= p, ls.w *= p ); return ls; } - FI XYZEval operator/ (const float &p) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e /= p, ls.x /= p, ls.y /= p, ls.z /= p, ls.i /= p, ls.j /= p, ls.k /= p, ls.u /= p, ls.v /= p, ls.w /= p ); return ls; } - FI XYZEval operator/ (const float &p) { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e /= p, ls.x /= p, ls.y /= p, ls.z /= p, ls.i /= p, ls.j /= p, ls.k /= p, ls.u /= p, ls.v /= p, ls.w /= p ); return ls; } - FI XYZEval operator/ (const int &p) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e /= p, ls.x /= p, ls.y /= p, ls.z /= p, ls.i /= p, ls.j /= p, ls.k /= p, ls.u /= p, ls.v /= p, ls.w /= p ); return ls; } - FI XYZEval operator/ (const int &p) { XYZEval ls = *this; LOGICAL_AXIS_CODE(ls.e /= p, ls.x /= p, ls.y /= p, ls.z /= p, ls.i /= p, ls.j /= p, ls.k /= p, ls.u /= p, ls.v /= p, ls.w /= p ); return ls; } - FI XYZEval operator>>(const int &p) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(_RS(ls.e), _RS(ls.x), _RS(ls.y), _RS(ls.z), _RS(ls.i), _RS(ls.j), _RS(ls.k), _RS(ls.u), _RS(ls.v), _RS(ls.w) ); return ls; } - FI XYZEval operator>>(const int &p) { XYZEval ls = *this; LOGICAL_AXIS_CODE(_RS(ls.e), _RS(ls.x), _RS(ls.y), _RS(ls.z), _RS(ls.i), _RS(ls.j), _RS(ls.k), _RS(ls.u), _RS(ls.v), _RS(ls.w) ); return ls; } - FI XYZEval operator<<(const int &p) const { XYZEval ls = *this; LOGICAL_AXIS_CODE(_LS(ls.e), _LS(ls.x), _LS(ls.y), _LS(ls.z), _LS(ls.i), _LS(ls.j), _LS(ls.k), _LS(ls.u), _LS(ls.v), _LS(ls.w) ); return ls; } - FI XYZEval operator<<(const int &p) { XYZEval ls = *this; LOGICAL_AXIS_CODE(_LS(ls.e), _LS(ls.x), _LS(ls.y), _LS(ls.z), _LS(ls.i), _LS(ls.j), _LS(ls.k), _LS(ls.u), _LS(ls.v), _LS(ls.w) ); return ls; } - FI const XYZEval operator-() const { return LOGICAL_AXIS_ARRAY(-e, -x, -y, -z, -i, -j, -k, -u, -v, -w); } - FI XYZEval operator-() { return LOGICAL_AXIS_ARRAY(-e, -x, -y, -z, -i, -j, -k, -u, -v, -w); } + FI constexpr XYZEval operator+ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x + rs.x, y + rs.y, z, i, j, k, u, v, w); } + FI constexpr XYZEval operator- (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x - rs.x, y - rs.y, z, i, j, k, u, v, w); } + FI constexpr XYZEval operator* (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x * rs.x, y * rs.y, z, i, j, k, u, v, w); } + FI constexpr XYZEval operator/ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x / rs.x, y / rs.y, z, i, j, k, u, v, w); } + FI constexpr XYZEval operator+ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w); } + FI constexpr XYZEval operator- (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w); } + FI constexpr XYZEval operator* (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w); } + FI constexpr XYZEval operator/ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w); } + FI constexpr XYZEval operator+ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e + rs.e, x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w); } + FI constexpr XYZEval operator- (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e - rs.e, x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w); } + FI constexpr XYZEval operator* (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e * rs.e, x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w); } + FI constexpr XYZEval operator/ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e / rs.e, x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w); } + FI constexpr XYZEval operator* (const float &p) const { return LOGICAL_AXIS_ARRAY((T)(e * p), (T)(x * p), (T)(y * p), (T)(z * p), (T)(i * p), (T)(j * p), (T)(k * p), (T)(u * p), (T)(v * p), (T)(w * p)); } + FI constexpr XYZEval operator* (const int &p) const { return LOGICAL_AXIS_ARRAY(e * p, x * p, y * p, z * p, i * p, j * p, k * p, u * p, v * p, w * p); } + FI constexpr XYZEval operator/ (const float &p) const { return LOGICAL_AXIS_ARRAY((T)(e / p), (T)(x / p), (T)(y / p), (T)(z / p), (T)(i / p), (T)(j / p), (T)(k / p), (T)(u / p), (T)(v / p), (T)(w / p)); } + FI constexpr XYZEval operator/ (const int &p) const { return LOGICAL_AXIS_ARRAY(e / p, x / p, y / p, z / p, i / p, j / p, k / p, u / p, v / p, w / p); } + FI constexpr XYZEval operator>>(const int &p) const { return LOGICAL_AXIS_ARRAY(_RS(e), _RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); } + FI constexpr XYZEval operator<<(const int &p) const { return LOGICAL_AXIS_ARRAY(_LS(e), _LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); } + FI constexpr XYZEval operator-() const { return LOGICAL_AXIS_ARRAY(-e, -x, -y, -z, -i, -j, -k, -u, -v, -w); } + + // Absolute difference between two objects + FI constexpr XYZEval diff(const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(_ABS(e - rs.e)), T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } + FI constexpr XYZEval diff(const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(0 , T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); } + FI constexpr XYZEval diff(const XYval &rs) const { return LOGICAL_AXIS_ARRAY(0 , T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), z, i, j, k, u, v, w ); } // Modifier operators - FI XYZEval& operator+=(const XYval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y,,,,,,, ); return *this; } - FI XYZEval& operator-=(const XYval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y,,,,,,, ); return *this; } - FI XYZEval& operator*=(const XYval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y,,,,,,, ); return *this; } - FI XYZEval& operator/=(const XYval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y,,,,,,, ); return *this; } - FI XYZEval& operator+=(const XYZval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y, z += rs.z, i += rs.i, j += rs.j, k += rs.k, u += rs.u, v += rs.v, w += rs.w); return *this; } - FI XYZEval& operator-=(const XYZval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y, z -= rs.z, i -= rs.i, j -= rs.j, k -= rs.k, u -= rs.u, v -= rs.v, w -= rs.w); return *this; } - FI XYZEval& operator*=(const XYZval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y, z *= rs.z, i *= rs.i, j *= rs.j, k *= rs.k, u *= rs.u, v *= rs.v, w *= rs.w); return *this; } - FI XYZEval& operator/=(const XYZval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y, z /= rs.z, i /= rs.i, j /= rs.j, k /= rs.k, u /= rs.u, v /= rs.v, w /= rs.w); return *this; } - FI XYZEval& operator+=(const XYZEval &rs) { LOGICAL_AXIS_CODE(e += rs.e, x += rs.x, y += rs.y, z += rs.z, i += rs.i, j += rs.j, k += rs.k, u += rs.u, v += rs.v, w += rs.w); return *this; } - FI XYZEval& operator-=(const XYZEval &rs) { LOGICAL_AXIS_CODE(e -= rs.e, x -= rs.x, y -= rs.y, z -= rs.z, i -= rs.i, j -= rs.j, k -= rs.k, u -= rs.u, v -= rs.v, w -= rs.w); return *this; } - FI XYZEval& operator*=(const XYZEval &rs) { LOGICAL_AXIS_CODE(e *= rs.e, x *= rs.x, y *= rs.y, z *= rs.z, i *= rs.i, j *= rs.j, k *= rs.k, u *= rs.u, v *= rs.v, w *= rs.w); return *this; } - FI XYZEval& operator/=(const XYZEval &rs) { LOGICAL_AXIS_CODE(e /= rs.e, x /= rs.x, y /= rs.y, z /= rs.z, i /= rs.i, j /= rs.j, k /= rs.k, u /= rs.u, v /= rs.v, w /= rs.w); return *this; } - FI XYZEval& operator*=(const T &p) { LOGICAL_AXIS_CODE(e *= p, x *= p, y *= p, z *= p, i *= p, j *= p, k *= p, u *= p, v *= p, w *= p); return *this; } - FI XYZEval& operator>>=(const int &p) { LOGICAL_AXIS_CODE(_RS(e), _RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); return *this; } - FI XYZEval& operator<<=(const int &p) { LOGICAL_AXIS_CODE(_LS(e), _LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); return *this; } + FI XYZEval& operator+=(const XYval &rs) { XY_CODE(x += rs.x, y += rs.y); return *this; } + FI XYZEval& operator-=(const XYval &rs) { XY_CODE(x -= rs.x, y -= rs.y); return *this; } + FI XYZEval& operator*=(const XYval &rs) { XY_CODE(x *= rs.x, y *= rs.y); return *this; } + FI XYZEval& operator/=(const XYval &rs) { XY_CODE(x /= rs.x, y /= rs.y); return *this; } + FI XYZEval& operator+=(const XYZval &rs) { NUM_AXIS_CODE(x += rs.x, y += rs.y, z += rs.z, i += rs.i, j += rs.j, k += rs.k, u += rs.u, v += rs.v, w += rs.w); return *this; } + FI XYZEval& operator-=(const XYZval &rs) { NUM_AXIS_CODE(x -= rs.x, y -= rs.y, z -= rs.z, i -= rs.i, j -= rs.j, k -= rs.k, u -= rs.u, v -= rs.v, w -= rs.w); return *this; } + FI XYZEval& operator*=(const XYZval &rs) { NUM_AXIS_CODE(x *= rs.x, y *= rs.y, z *= rs.z, i *= rs.i, j *= rs.j, k *= rs.k, u *= rs.u, v *= rs.v, w *= rs.w); return *this; } + FI XYZEval& operator/=(const XYZval &rs) { NUM_AXIS_CODE(x /= rs.x, y /= rs.y, z /= rs.z, i /= rs.i, j /= rs.j, k /= rs.k, u /= rs.u, v /= rs.v, w /= rs.w); return *this; } + FI XYZEval& operator+=(const XYZEval &rs) { LOGICAL_AXIS_CODE(e += rs.e, x += rs.x, y += rs.y, z += rs.z, i += rs.i, j += rs.j, k += rs.k, u += rs.u, v += rs.v, w += rs.w); return *this; } + FI XYZEval& operator-=(const XYZEval &rs) { LOGICAL_AXIS_CODE(e -= rs.e, x -= rs.x, y -= rs.y, z -= rs.z, i -= rs.i, j -= rs.j, k -= rs.k, u -= rs.u, v -= rs.v, w -= rs.w); return *this; } + FI XYZEval& operator*=(const XYZEval &rs) { LOGICAL_AXIS_CODE(e *= rs.e, x *= rs.x, y *= rs.y, z *= rs.z, i *= rs.i, j *= rs.j, k *= rs.k, u *= rs.u, v *= rs.v, w *= rs.w); return *this; } + FI XYZEval& operator/=(const XYZEval &rs) { LOGICAL_AXIS_CODE(e /= rs.e, x /= rs.x, y /= rs.y, z /= rs.z, i /= rs.i, j /= rs.j, k /= rs.k, u /= rs.u, v /= rs.v, w /= rs.w); return *this; } + FI XYZEval& operator*=(const T &p) { LOGICAL_AXIS_CODE(e *= p, x *= p, y *= p, z *= p, i *= p, j *= p, k *= p, u *= p, v *= p, w *= p); return *this; } + FI XYZEval& operator>>=(const int &p) { LOGICAL_AXIS_CODE(_RSE(e), _RSE(x), _RSE(y), _RSE(z), _RSE(i), _RSE(j), _RSE(k), _RSE(u), _RSE(v), _RSE(w)); return *this; } + FI XYZEval& operator<<=(const int &p) { LOGICAL_AXIS_CODE(_LSE(e), _LSE(x), _LSE(y), _LSE(z), _LSE(i), _LSE(j), _LSE(k), _LSE(u), _LSE(v), _LSE(w)); return *this; } // Exact comparisons. For floats a "NEAR" operation may be better. - FI bool operator==(const XYZval &rs) const { return true NUM_AXIS_GANG(&& x == rs.x, && y == rs.y, && z == rs.z, && i == rs.i, && j == rs.j, && k == rs.k, && u == rs.u, && v == rs.v, && w == rs.w); } - FI bool operator==(const XYZEval &rs) const { return true LOGICAL_AXIS_GANG(&& e == rs.e, && x == rs.x, && y == rs.y, && z == rs.z, && i == rs.i, && j == rs.j, && k == rs.k, && u == rs.u, && v == rs.v, && w == rs.w); } - FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } - FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } + FI bool operator==(const XYZval &rs) const { return true NUM_AXIS_GANG(&& x == rs.x, && y == rs.y, && z == rs.z, && i == rs.i, && j == rs.j, && k == rs.k, && u == rs.u, && v == rs.v, && w == rs.w); } + FI bool operator==(const XYZEval &rs) const { return true LOGICAL_AXIS_GANG(&& e == rs.e, && x == rs.x, && y == rs.y, && z == rs.z, && i == rs.i, && j == rs.j, && k == rs.k, && u == rs.u, && v == rs.v, && w == rs.w); } + FI bool operator!=(const XYZval &rs) const { return !operator==(rs); } + FI bool operator!=(const XYZEval &rs) const { return !operator==(rs); } +}; + +#include // for memset + +template +struct XYZarray { + typedef T el[SIZE]; + union { + el data[LOGICAL_AXES]; + struct { NUM_AXIS_CODE(T x, T y, T z, T i, T j, T k, T u, T v, T w); }; + struct { NUM_AXIS_CODE(T a, T b, T c, T _i, T _j, T _k, T _u, T _v, T _w); }; + }; + FI void reset() { ZERO(data); } + + FI void set(const int n, const XYval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); } + FI void set(const int n, const XYZval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); } + FI void set(const int n, const XYZEval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); } + + // Setter for all individual args + FI void set(const int n OPTARGS_NUM(const T)) { NUM_AXIS_CODE(a[n] = x, b[n] = y, c[n] = z, _i[n] = i, _j[n] = j, _k[n] = k, _u[n] = u, _v[n] = v, _w[n] = w); } + + // Setters with fewer elements leave the rest untouched + #if HAS_Y_AXIS + FI void set(const int n, const T px) { x[n] = px; } + #endif + #if HAS_Z_AXIS + FI void set(const int n, const T px, const T py) { x[n] = px; y[n] = py; } + #endif + #if HAS_I_AXIS + FI void set(const int n, const T px, const T py, const T pz) { x[n] = px; y[n] = py; z[n] = pz; } + #endif + #if HAS_J_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; } + #endif + #if HAS_K_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi, const T pj) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; j[n] = pj; } + #endif + #if HAS_U_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi, const T pj, const T pk) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; j[n] = pj; k[n] = pk; } + #endif + #if HAS_V_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi, const T pj, const T pk, const T pu) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; j[n] = pj; k[n] = pk; u[n] = pu; } + #endif + #if HAS_W_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi, const T pj, const T pk, const T pu, const T pv) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; j[n] = pj; k[n] = pk; u[n] = pu; v[n] = pv; } + #endif + + FI XYZval operator[](const int n) const { return XYZval(NUM_AXIS_ARRAY(x[n], y[n], z[n], i[n], j[n], k[n], u[n], v[n], w[n])); } +}; + +template +struct XYZEarray { + typedef T el[SIZE]; + union { + el data[LOGICAL_AXES]; + struct { el LOGICAL_AXIS_ARGS(); }; + struct { el LOGICAL_AXIS_LIST(_e, a, b, c, _i, _j, _k, _u, _v, _w); }; + }; + FI void reset() { ZERO(data); } + + FI void set(const int n, const XYval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); } + FI void set(const int n, const XYZval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); } + FI void set(const int n, const XYZEval p) { LOGICAL_AXIS_CODE(e[n]=p.e, x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); } + + // Setter for all individual args + FI void set(const int n OPTARGS_NUM(const T)) { NUM_AXIS_CODE(a[n] = x, b[n] = y, c[n] = z, _i[n] = i, _j[n] = j, _k[n] = k, _u[n] = u, _v[n] = v, _w[n] = w); } + #if LOGICAL_AXES > NUM_AXES + FI void set(const int n, LOGICAL_AXIS_ARGS(const T)) { LOGICAL_AXIS_CODE(_e[n] = e, a[n] = x, b[n] = y, c[n] = z, _i[n] = i, _j[n] = j, _k[n] = k, _u[n] = u, _v[n] = v, _w[n] = w); } + #endif + + // Setters with fewer elements leave the rest untouched + #if HAS_Y_AXIS + FI void set(const int n, const T px) { x[n] = px; } + #endif + #if HAS_Z_AXIS + FI void set(const int n, const T px, const T py) { x[n] = px; y[n] = py; } + #endif + #if HAS_I_AXIS + FI void set(const int n, const T px, const T py, const T pz) { x[n] = px; y[n] = py; z[n] = pz; } + #endif + #if HAS_J_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; } + #endif + #if HAS_K_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi, const T pj) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; j[n] = pj; } + #endif + #if HAS_U_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi, const T pj, const T pk) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; j[n] = pj; k[n] = pk; } + #endif + #if HAS_V_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi, const T pj, const T pk, const T pu) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; j[n] = pj; k[n] = pk; u[n] = pu; } + #endif + #if HAS_W_AXIS + FI void set(const int n, const T px, const T py, const T pz, const T pi, const T pj, const T pk, const T pu, const T pv) { x[n] = px; y[n] = py; z[n] = pz; i[n] = pi; j[n] = pj; k[n] = pk; u[n] = pu; v[n] = pv; } + #endif + + FI XYZEval operator[](const int n) const { return XYZval(LOGICAL_AXIS_ARRAY(e[n], x[n], y[n], z[n], i[n], j[n], k[n], u[n], v[n], w[n])); } +}; + +class AxisBits; + +class AxisBits { +public: + typedef bits_t(NUM_AXIS_ENUMS) el; + union { + el bits; + // x, y, z ... e0, e1, e2 ... hx, hy, hz + struct { + #if NUM_AXES + bool NUM_AXIS_LIST(x:1, y:1, z:1, i:1, j:1, k:1, u:1, v:1, w:1); + #endif + #define _EN_ITEM(N) bool e##N:1; + REPEAT(EXTRUDERS,_EN_ITEM) + #undef _EN_ITEM + #if ANY(IS_CORE, MARKFORGED_XY, MARKFORGED_YX) + bool hx:1, hy:1, hz:1; + #endif + }; + // X, Y, Z ... E0, E1, E2 ... HX, HY, HZ + struct { + #if NUM_AXES + bool NUM_AXIS_LIST(X:1, Y:1, Z:1, I:1, J:1, K:1, U:1, V:1, W:1); + #endif + #define _EN_ITEM(N) bool E##N:1; + REPEAT(EXTRUDERS,_EN_ITEM) + #undef _EN_ITEM + #if ANY(IS_CORE, MARKFORGED_XY, MARKFORGED_YX) + bool HX:1, HY:1, HZ:1; + #endif + }; + // a, b, c, e ... ha, hb, hc + struct { + bool LOGICAL_AXIS_LIST(e:1, a:1, b:1, c:1, _i:1, _j:1, _k:1, _u:1, _v:1, _w:1); + #if EXTRUDERS > 1 + #define _EN_ITEM(N) bool _e##N:1; + REPEAT_S(1,EXTRUDERS,_EN_ITEM) + #undef _EN_ITEM + #endif + #if ANY(IS_CORE, MARKFORGED_XY, MARKFORGED_YX) + bool ha:1, hb:1, hc:1; + #endif + }; + // A, B, C, E ... HA, HB, HC + struct { + bool LOGICAL_AXIS_LIST(E:1, A:1, B:1, C:1, _I:1, _J:1, _K:1, _U:1, _V:1, _W:1); + #if EXTRUDERS > 1 + #define _EN_ITEM(N) bool _E##N:1; + REPEAT_S(1,EXTRUDERS,_EN_ITEM) + #undef _EN_ITEM + #endif + #if ANY(IS_CORE, MARKFORGED_XY, MARKFORGED_YX) + bool HA:1, HB:1, HC:1; + #endif + }; + }; + + AxisBits() { reset(); } + + // Constructor, setter, and operator= for bit mask + AxisBits(const el p) { set(p); } + FI void set(const el p) { bits = el(p); } + FI AxisBits& operator=(const el p) { set(p); return *this; } + + FI void reset() { set(0); } + FI void fill() { set(_BV(NUM_AXIS_ENUMS) - 1); } + + #define MSET(pE,pX,pY,pZ,pI,pJ,pK,pU,pV,pW) LOGICAL_AXIS_CODE(e=pE, x=pX, y=pY, z=pZ, i=pI, j=pJ, k=pK, u=pU, v=pV, w=pW) + + // Constructor, setter, and operator= for XYZE type + AxisBits(const xyze_bool_t &p) { set(p); } + FI void set(const xyze_bool_t &p) { + MSET(p.e, p.x, p.y, p.z, p.i, p.j, p.k, p.u, p.v, p.w); + } + FI AxisBits& operator=(const xyze_bool_t &p) { set(p); return *this; } + + // Constructor, setter, and operator= for bool array + AxisBits(const bool (&p)[LOGICAL_AXES]) { set(p); } + FI void set(const bool (&p)[LOGICAL_AXES]) { + MSET(p[E_AXIS], p[X_AXIS], p[Y_AXIS], p[Z_AXIS], + p[I_AXIS], p[J_AXIS], p[K_AXIS], + p[U_AXIS], p[V_AXIS], p[W_AXIS]); + } + FI AxisBits& operator=(const bool (&p)[LOGICAL_AXES]) { set(p); return *this; } + + // Constructor, setter, and operator= for undersized bool arrays + #if LOGICAL_AXES > 1 + AxisBits(const bool (&p)[1]) { set(p); } + FI void set(const bool (&p)[1]) { + MSET(0, p[X_AXIS], 0, 0, 0, 0, 0, 0, 0, 0); + } + FI AxisBits& operator=(const bool (&p)[1]) { set(p); return *this; } + #endif + #if LOGICAL_AXES > 2 + AxisBits(const bool (&p)[2]) { set(p); } + FI void set(const bool (&p)[2]) { + MSET(0, p[X_AXIS], p[Y_AXIS], 0, 0, 0, 0, 0, 0, 0); + } + FI AxisBits& operator=(const bool (&p)[2]) { set(p); return *this; } + #endif + #if LOGICAL_AXES > 3 + AxisBits(const bool (&p)[3]) { set(p); } + FI void set(const bool (&p)[3]) { + MSET(0, p[X_AXIS], p[Y_AXIS], p[Z_AXIS], 0, 0, 0, 0, 0, 0); + } + FI AxisBits& operator=(const bool (&p)[3]) { set(p); return *this; } + #endif + #if LOGICAL_AXES > 4 + AxisBits(const bool (&p)[4]) { set(p); } + FI void set(const bool (&p)[4]) { + MSET(0, p[X_AXIS], p[Y_AXIS], p[Z_AXIS], p[I_AXIS], 0, 0, 0, 0, 0); + } + FI AxisBits& operator=(const bool (&p)[4]) { set(p); return *this; } + #endif + #if LOGICAL_AXES > 5 + AxisBits(const bool (&p)[5]) { set(p); } + FI void set(const bool (&p)[5]) { + MSET(0, p[X_AXIS], p[Y_AXIS], p[Z_AXIS], p[I_AXIS], p[J_AXIS], 0, 0, 0, 0); + } + FI AxisBits& operator=(const bool (&p)[5]) { set(p); return *this; } + #endif + #if LOGICAL_AXES > 6 + AxisBits(const bool (&p)[6]) { set(p); } + FI void set(const bool (&p)[6]) { + MSET(0, p[X_AXIS], p[Y_AXIS], p[Z_AXIS], p[I_AXIS], p[J_AXIS], p[K_AXIS], 0, 0, 0); + } + FI AxisBits& operator=(const bool (&p)[6]) { set(p); return *this; } + #endif + #if LOGICAL_AXES > 7 + AxisBits(const bool (&p)[7]) { set(p); } + FI void set(const bool (&p)[7]) { + MSET(0, p[X_AXIS], p[Y_AXIS], p[Z_AXIS], p[I_AXIS], p[J_AXIS], p[K_AXIS], p[U_AXIS], 0, 0); + } + FI AxisBits& operator=(const bool (&p)[7]) { set(p); return *this; } + #endif + #if LOGICAL_AXES > 8 + AxisBits(const bool (&p)[8]) { set(p); } + FI void set(const bool (&p)[8]) { + MSET(0, p[X_AXIS], p[Y_AXIS], p[Z_AXIS], p[I_AXIS], p[J_AXIS], p[K_AXIS], p[U_AXIS], p[V_AXIS], 0); + } + FI AxisBits& operator=(const bool (&p)[8]) { set(p); return *this; } + #endif + #if LOGICAL_AXES > 9 + AxisBits(const bool (&p)[9]) { set(p); } + FI void set(const bool (&p)[9]) { + MSET(0, p[X_AXIS], p[Y_AXIS], p[Z_AXIS], p[I_AXIS], p[J_AXIS], p[K_AXIS], p[U_AXIS], p[V_AXIS], p[W_AXIS]); + } + FI AxisBits& operator=(const bool (&p)[9]) { set(p); return *this; } + #endif + #undef MSET + + FI bool toggle(const AxisEnum n) { TBI(bits, n); return TEST(bits, n); } + FI void bset(const AxisEnum n) { SBI(bits, n); } + FI void bclr(const AxisEnum n) { CBI(bits, n); } + + // Accessor via an AxisEnum (or any integer) [index] + FI bool operator[](const int n) const { return TEST(bits, n); } + FI bool operator[](const AxisEnum n) const { return TEST(bits, n); } + + FI AxisBits& operator|=(const el &p) { bits |= el(p); return *this; } + FI AxisBits& operator&=(const el &p) { bits &= el(p); return *this; } + FI AxisBits& operator^=(const el &p) { bits ^= el(p); return *this; } + + FI AxisBits& operator|=(const AxisBits &p) { bits |= p.bits; return *this; } + FI AxisBits& operator&=(const AxisBits &p) { bits &= p.bits; return *this; } + FI AxisBits& operator^=(const AxisBits &p) { bits ^= p.bits; return *this; } + + FI bool operator==(const AxisBits &p) const { return p.bits == bits; } + FI bool operator!=(const AxisBits &p) const { return p.bits != bits; } + + FI el operator|(const el &p) const { return bits | el(p); } + FI el operator&(const el &p) const { return bits & el(p); } + FI el operator^(const el &p) const { return bits ^ el(p); } + + FI AxisBits operator|(const AxisBits &p) const { return AxisBits(bits | p.bits); } + FI AxisBits operator&(const AxisBits &p) const { return AxisBits(bits & p.bits); } + FI AxisBits operator^(const AxisBits &p) const { return AxisBits(bits ^ p.bits); } + + FI operator bool() const { return !!bits; } + FI operator uint16_t() const { return uint16_t(bits & 0xFFFF); } + FI operator uint32_t() const { return uint32_t(bits); } + }; #undef _RECIP #undef _ABS #undef _LS #undef _RS +#undef _LSE +#undef _RSE #undef FI diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index 64f083e197..8476591d4b 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -25,6 +25,10 @@ #include "../MarlinCore.h" #include "../module/temperature.h" +#if ENABLED(MARLIN_DEV_MODE) + MarlinError marlin_error_number; // Error Number - Marlin can beep X times periodically, display, and emit... +#endif + void safe_delay(millis_t ms) { while (ms > 50) { ms -= 50; @@ -95,9 +99,9 @@ void safe_delay(millis_t ms) { SERIAL_ECHOPGM(" (Aligned With"); if (probe.offset_xy.y > 0) - SERIAL_ECHOF(F(TERN(IS_SCARA, "-Distal", "-Back"))); + SERIAL_ECHO(F(TERN(IS_SCARA, "-Distal", "-Back"))); else if (probe.offset_xy.y < 0) - SERIAL_ECHOF(F(TERN(IS_SCARA, "-Proximal", "-Front"))); + SERIAL_ECHO(F(TERN(IS_SCARA, "-Proximal", "-Front"))); else if (probe.offset_xy.x != 0) SERIAL_ECHOPGM("-Center"); @@ -105,7 +109,7 @@ void safe_delay(millis_t ms) { #endif - SERIAL_ECHOF(probe.offset.z < 0 ? F("Below") : probe.offset.z > 0 ? F("Above") : F("Same Z as")); + SERIAL_ECHO(probe.offset.z < 0 ? F("Below") : probe.offset.z > 0 ? F("Above") : F("Same Z as")); SERIAL_ECHOLNPGM(" Nozzle)"); #endif diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index c4bb3c2a8a..891a4e4383 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -92,3 +92,22 @@ const xyze_char_t axis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', AXIS4_NAME, #define AXIS_CHAR(A) axis_codes[A] #define IAXIS_CHAR(A) iaxis_codes[A] #endif + +#if ENABLED(MARLIN_DEV_MODE) + enum MarlinError : uint8_t { + ERR_NONE, + ERR_STRING_RANGE, // A string buffer was too small to set the whole blob + ERR_ASSERTION, // An assertion was triggered + ERR_MALFUNCTION, + ERR_MEMORY_LEAK, + ERR_COMMS_SERIAL, + ERR_COMMS_SPI, + ERR_PLANNER_STARVED, + ERR_TMC_SHUTDOWN, + ERR_PROCEDURE_FAILED, + ERR_TOO_WACK, + ERR_PLAID_IN_SUMMER + }; + extern MarlinError marlin_error_number; // Error Number - Marlin can beep, display, and emit... + inline void error(const MarlinError err) { marlin_error_number = err; } +#endif diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp index 2e3d6a9fd2..e431e40165 100644 --- a/Marlin/src/feature/babystep.cpp +++ b/Marlin/src/feature/babystep.cpp @@ -26,7 +26,7 @@ #include "babystep.h" #include "../MarlinCore.h" -#include "../module/motion.h" // for axes_should_home() +#include "../module/motion.h" // for axes_should_home(), BABYSTEP_ALLOWED #include "../module/planner.h" // for axis_steps_per_mm[] #include "../module/stepper.h" @@ -42,6 +42,10 @@ volatile int16_t Babystep::steps[BS_AXIS_IND(Z_AXIS) + 1]; #endif int16_t Babystep::accum; +#if ALL(EP_BABYSTEPPING, EMERGENCY_PARSER) + int16_t Babystep::ep_babysteps; +#endif + void Babystep::step_axis(const AxisEnum axis) { const int16_t curTodo = steps[BS_AXIS_IND(axis)]; // get rid of volatile for performance if (curTodo) { @@ -76,4 +80,10 @@ void Babystep::add_steps(const AxisEnum axis, const int16_t distance) { TERN_(INTEGRATED_BABYSTEPPING, if (has_steps()) stepper.initiateBabystepping()); } +#if ENABLED(EP_BABYSTEPPING) + // Step Z for M293 / M294 + void Babystep::z_up() { if (BABYSTEP_ALLOWED()) add_steps(Z_AXIS, +BABYSTEP_SIZE_Z); } + void Babystep::z_down() { if (BABYSTEP_ALLOWED()) add_steps(Z_AXIS, -BABYSTEP_SIZE_Z); } +#endif + #endif // BABYSTEPPING diff --git a/Marlin/src/feature/babystep.h b/Marlin/src/feature/babystep.h index bbf0c5a260..df88da6e14 100644 --- a/Marlin/src/feature/babystep.h +++ b/Marlin/src/feature/babystep.h @@ -31,7 +31,7 @@ #define BABYSTEP_TICKS ((TEMP_TIMER_RATE) / (BABYSTEPS_PER_SEC)) #endif -#if IS_CORE || EITHER(BABYSTEP_XY, I2C_POSITION_ENCODERS) +#if ANY(IS_CORE, BABYSTEP_XY, I2C_POSITION_ENCODERS) #define BS_AXIS_IND(A) A #define BS_AXIS(I) AxisEnum(I) #else @@ -52,6 +52,10 @@ public: static volatile int16_t steps[BS_AXIS_IND(Z_AXIS) + 1]; static int16_t accum; // Total babysteps in current edit + #if ALL(EP_BABYSTEPPING, EMERGENCY_PARSER) + static int16_t ep_babysteps; + #endif + #if ENABLED(BABYSTEP_DISPLAY_TOTAL) static int16_t axis_total[BS_TOTAL_IND(Z_AXIS) + 1]; // Total babysteps since G28 static void reset_total(const AxisEnum axis) { @@ -63,6 +67,21 @@ public: static void add_steps(const AxisEnum axis, const int16_t distance); static void add_mm(const AxisEnum axis, const_float_t mm); + #if ENABLED(EP_BABYSTEPPING) + // Step Z for M293 / M294 + static void z_up(); + static void z_down(); + #if ENABLED(EMERGENCY_PARSER) + // Step Z according to steps accumulated by the EP + FORCE_INLINE static void do_ep_steps() { + if (ep_babysteps) { + if (ep_babysteps > 0) { z_up(); ep_babysteps--; } + else { z_down(); ep_babysteps++; } + } + } + #endif + #endif // EP_BABYSTEPPING + #if ENABLED(BD_SENSOR) static void set_mm(const AxisEnum axis, const_float_t mm); #endif @@ -76,7 +95,7 @@ public: // apply accumulated babysteps to the axes. // static void task() { - LOOP_LE_N(i, BS_AXIS_IND(Z_AXIS)) step_axis(BS_AXIS(i)); + for (uint8_t i = 0; i <= BS_AXIS_IND(Z_AXIS); ++i) step_axis(BS_AXIS(i)); } private: diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp index 13e2cd99ec..c6eb0d33f3 100644 --- a/Marlin/src/feature/backlash.cpp +++ b/Marlin/src/feature/backlash.cpp @@ -29,7 +29,7 @@ #include "../module/motion.h" #include "../module/planner.h" -axis_bits_t Backlash::last_direction_bits; +AxisBits Backlash::last_direction_bits; xyz_long_t Backlash::residual_error{0}; #ifdef BACKLASH_DISTANCE_MM @@ -63,25 +63,25 @@ Backlash backlash; * spread over multiple segments, smoothing out artifacts even more. */ -void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const axis_bits_t dm, block_t * const block) { - axis_bits_t changed_dir = last_direction_bits ^ dm; +void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const AxisBits dm, block_t * const block) { + AxisBits changed_dir = last_direction_bits ^ dm; // Ignore direction change unless steps are taken in that direction - #if DISABLED(CORE_BACKLASH) || EITHER(MARKFORGED_XY, MARKFORGED_YX) - if (!da) CBI(changed_dir, X_AXIS); - if (!db) CBI(changed_dir, Y_AXIS); - if (!dc) CBI(changed_dir, Z_AXIS); + #if DISABLED(CORE_BACKLASH) || ANY(MARKFORGED_XY, MARKFORGED_YX) + if (!da) changed_dir.x = false; + if (!db) changed_dir.y = false; + if (!dc) changed_dir.z = false; #elif CORE_IS_XY - if (!(da + db)) CBI(changed_dir, X_AXIS); - if (!(da - db)) CBI(changed_dir, Y_AXIS); - if (!dc) CBI(changed_dir, Z_AXIS); + if (!(da + db)) changed_dir.x = false; + if (!(da - db)) changed_dir.y = false; + if (!dc) changed_dir.z = false; #elif CORE_IS_XZ - if (!(da + dc)) CBI(changed_dir, X_AXIS); - if (!(da - dc)) CBI(changed_dir, Z_AXIS); - if (!db) CBI(changed_dir, Y_AXIS); + if (!(da + dc)) changed_dir.x = false; + if (!(da - dc)) changed_dir.z = false; + if (!db) changed_dir.y = false; #elif CORE_IS_YZ - if (!(db + dc)) CBI(changed_dir, Y_AXIS); - if (!(db - dc)) CBI(changed_dir, Z_AXIS); - if (!da) CBI(changed_dir, X_AXIS); + if (!(db + dc)) changed_dir.y = false; + if (!(db - dc)) changed_dir.z = false; + if (!da) changed_dir.x = false; #endif last_direction_bits ^= changed_dir; @@ -99,15 +99,15 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const LOOP_NUM_AXES(axis) { if (distance_mm[axis]) { - const bool reverse = TEST(dm, axis); + const bool forward = dm[axis]; // When an axis changes direction, add axis backlash to the residual error - if (TEST(changed_dir, axis)) - residual_error[axis] += (reverse ? -f_corr : f_corr) * distance_mm[axis] * planner.settings.axis_steps_per_mm[axis]; + if (changed_dir[axis]) + residual_error[axis] += (forward ? f_corr : -f_corr) * distance_mm[axis] * planner.settings.axis_steps_per_mm[axis]; // Decide how much of the residual error to correct in this segment int32_t error_correction = residual_error[axis]; - if (reverse != (error_correction < 0)) + if (forward == (error_correction < 0)) error_correction = 0; // Don't take up any backlash in this segment, as it would subtract steps #ifdef BACKLASH_SMOOTHING_MM @@ -147,14 +147,14 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const int32_t Backlash::get_applied_steps(const AxisEnum axis) { if (axis >= NUM_AXES) return 0; - const bool reverse = TEST(last_direction_bits, axis); + const bool forward = last_direction_bits[axis]; const int32_t residual_error_axis = residual_error[axis]; // At startup it is assumed the last move was forwards. So the applied // steps will always be a non-positive number. - if (!reverse) return -residual_error_axis; + if (forward) return -residual_error_axis; const float f_corr = float(correction) / all_on; const int32_t full_error_axis = -f_corr * distance_mm[axis] * planner.settings.axis_steps_per_mm[axis]; diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h index 0bace526e5..14c0fe20e3 100644 --- a/Marlin/src/feature/backlash.h +++ b/Marlin/src/feature/backlash.h @@ -29,7 +29,7 @@ public: static constexpr uint8_t all_on = 0xFF, all_off = 0x00; private: - static axis_bits_t last_direction_bits; + static AxisBits last_direction_bits; static xyz_long_t residual_error; #if ENABLED(BACKLASH_GCODE) @@ -72,7 +72,7 @@ public: return has_measurement(X_AXIS) || has_measurement(Y_AXIS) || has_measurement(Z_AXIS); } - static void add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const axis_bits_t dm, block_t * const block); + static void add_correction_steps(const int32_t &da, const int32_t &db, const int32_t &dc, const AxisBits dm, block_t * const block); static int32_t get_applied_steps(const AxisEnum axis); #if ENABLED(BACKLASH_GCODE) diff --git a/Marlin/src/feature/bedlevel/abl/bbl.cpp b/Marlin/src/feature/bedlevel/abl/bbl.cpp index 6ef3945fa5..14c4bd24bc 100644 --- a/Marlin/src/feature/bedlevel/abl/bbl.cpp +++ b/Marlin/src/feature/bedlevel/abl/bbl.cpp @@ -133,8 +133,8 @@ void LevelingBilinear::extrapolate_unprobed_bed_level() { yend = ctry1; #endif - LOOP_LE_N(xo, xend) - LOOP_LE_N(yo, yend) { + for (uint8_t xo = 0; xo <= xend; ++xo) + for (uint8_t yo = 0; yo <= yend; ++yo) { uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo; #ifndef HALF_IN_X const uint8_t x1 = ctrx1 - xo; @@ -231,8 +231,8 @@ void LevelingBilinear::print_leveling_grid(const bed_mesh_t* _z_values/*=nullptr float LevelingBilinear::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) { + for (uint8_t i = 0; i < 4; ++i) { + for (uint8_t j = 0; j < 4; ++j) { column[j] = virt_coord(i + x - 1, j + y - 1); } row[i] = virt_cmr(column, 1, ty); @@ -243,10 +243,10 @@ void LevelingBilinear::print_leveling_grid(const bed_mesh_t* _z_values/*=nullptr void LevelingBilinear::subdivide_mesh() { grid_spacing_virt = grid_spacing / (BILINEAR_SUBDIVISIONS); grid_factor_virt = grid_spacing_virt.reciprocal(); - LOOP_L_N(y, GRID_MAX_POINTS_Y) - LOOP_L_N(x, GRID_MAX_POINTS_X) - LOOP_L_N(ty, BILINEAR_SUBDIVISIONS) - LOOP_L_N(tx, BILINEAR_SUBDIVISIONS) { + for (uint8_t y = 0; y < GRID_MAX_POINTS_Y; ++y) + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; ++x) + for (uint8_t ty = 0; ty < BILINEAR_SUBDIVISIONS; ++ty) + for (uint8_t tx = 0; tx < BILINEAR_SUBDIVISIONS; ++tx) { if ((ty && y == (GRID_MAX_POINTS_Y) - 1) || (tx && x == (GRID_MAX_POINTS_X) - 1)) continue; z_values_virt[x * (BILINEAR_SUBDIVISIONS) + tx][y * (BILINEAR_SUBDIVISIONS) + ty] = diff --git a/Marlin/src/feature/bedlevel/bdl/bdl.cpp b/Marlin/src/feature/bedlevel/bdl/bdl.cpp index 5ce5e894ca..14989a07d3 100644 --- a/Marlin/src/feature/bedlevel/bdl/bdl.cpp +++ b/Marlin/src/feature/bedlevel/bdl/bdl.cpp @@ -34,6 +34,7 @@ #include "../../../module/temperature.h" #include "../../../module/endstops.h" #include "../../babystep.h" +#include "../../../lcd/marlinui.h" // I2C software Master library for segment bed heating and bed distance sensor #include @@ -42,6 +43,8 @@ BDS_Leveling bdl; //#define DEBUG_OUT_BD +#define DEBUG_OUT ENABLED(DEBUG_OUT_BD) +#include "../../../core/debug_out.h" // M102 S-5 Read raw Calibrate data // M102 S-6 Start Calibrate @@ -49,144 +52,196 @@ BDS_Leveling bdl; // M102 S-1 Read sensor information #define MAX_BD_HEIGHT 4.0f +#define CMD_READ_VERSION 1016 #define CMD_START_READ_CALIBRATE_DATA 1017 #define CMD_END_READ_CALIBRATE_DATA 1018 #define CMD_START_CALIBRATE 1019 #define CMD_END_CALIBRATE 1021 -#define CMD_READ_VERSION 1016 - -I2C_SegmentBED BD_I2C_SENSOR; - #define BD_SENSOR_I2C_ADDR 0x3C +I2C_SegmentBED BD_I2C_SENSOR; +float BDS_Leveling::pos_zero_offset; int8_t BDS_Leveling::config_state; -uint8_t BDS_Leveling::homing; - -void BDS_Leveling::echo_name() { SERIAL_ECHOPGM("Bed Distance Leveling"); } void BDS_Leveling::init(uint8_t _sda, uint8_t _scl, uint16_t delay_s) { - int ret = BD_I2C_SENSOR.i2c_init(_sda, _scl, BD_SENSOR_I2C_ADDR, delay_s); - if (ret != 1) SERIAL_ECHOLNPGM("BD_I2C_SENSOR Init Fail return code:", ret); - config_state = 0; + config_state = BDS_IDLE; + const int ret = BD_I2C_SENSOR.i2c_init(_sda, _scl, BD_SENSOR_I2C_ADDR, delay_s); + if (ret != 1) SERIAL_ECHOLNPGM("BD Sensor Init Fail (", ret, ")"); + sync_plan_position(); + pos_zero_offset = planner.get_axis_position_mm(Z_AXIS) - current_position.z; + SERIAL_ECHOLNPGM("BD Sensor Zero Offset:", pos_zero_offset); +} + +bool BDS_Leveling::check(const uint16_t data, const bool raw_data/*=false*/, const bool hicheck/*=false*/) { + if (BD_I2C_SENSOR.BD_Check_OddEven(data) == 0) { + SERIAL_ECHOLNPGM("Read Error."); + return true; // error + } + if (raw_data == true) { + if (hicheck && (data & 0x3FF) > 550) + SERIAL_ECHOLNPGM("BD Sensor mounted too high!"); + else if (!good_data(data)) + SERIAL_ECHOLNPGM("Invalid data, please calibrate."); + else + return false; + } + else { + if ((data & 0x3FF) >= (MAX_BD_HEIGHT) * 100 - 10) + SERIAL_ECHOLNPGM("Out of Range."); + else + return false; + } + return true; // error +} + +float BDS_Leveling::interpret(const uint16_t data) { + return (data & 0x3FF) / 100.0f; } float BDS_Leveling::read() { - const uint16_t tmp = BD_I2C_SENSOR.BD_i2c_read(); - float BD_z = NAN; - if (BD_I2C_SENSOR.BD_Check_OddEven(tmp) && (tmp & 0x3FF) < 1020) - BD_z = (tmp & 0x3FF) / 100.0f; - return BD_z; + const uint16_t data = BD_I2C_SENSOR.BD_i2c_read(); + return check(data) ? NAN : interpret(data); } void BDS_Leveling::process() { - //if (config_state == 0) return; - static millis_t next_check_ms = 0; // starting at T=0 - static float z_pose = 0.0f; - const millis_t ms = millis(); - if (ELAPSED(ms, next_check_ms)) { // timed out (or first run) - next_check_ms = ms + (config_state < 0 ? 1000 : 100); // check at 1Hz or 10Hz - - unsigned short tmp = 0; - const float cur_z = planner.get_axis_position_mm(Z_AXIS); //current_position.z - static float old_cur_z = cur_z, - old_buf_z = current_position.z; + if (config_state == BDS_IDLE && printingIsActive()) return; + static millis_t next_check_ms = 0; // starting at T=0 + static float zpos = 0.0f; + const millis_t ms = millis(); + if (ELAPSED(ms, next_check_ms)) { // timed out (or first run) + next_check_ms = ms + (config_state < BDS_IDLE ? 200 : 50); // check at 5Hz or 20Hz + uint16_t tmp = 0; + const float cur_z = planner.get_axis_position_mm(Z_AXIS) - pos_zero_offset; + static float old_cur_z = cur_z, old_buf_z = current_position.z; tmp = BD_I2C_SENSOR.BD_i2c_read(); - if (BD_I2C_SENSOR.BD_Check_OddEven(tmp) && (tmp & 0x3FF) < 1020) { - const float z_sensor = (tmp & 0x3FF) / 100.0f; - if (cur_z < 0) config_state = 0; - //float abs_z = current_position.z > cur_z ? (current_position.z - cur_z) : (cur_z - current_position.z); + if (BD_I2C_SENSOR.BD_Check_OddEven(tmp) && good_data(tmp)) { + const float z_sensor = interpret(tmp); #if ENABLED(BABYSTEPPING) - if (cur_z < config_state * 0.1f - && config_state > 0 - && old_cur_z == cur_z - && old_buf_z == current_position.z - && z_sensor < (MAX_BD_HEIGHT) - ) { - babystep.set_mm(Z_AXIS, cur_z - z_sensor); - #if ENABLED(DEBUG_OUT_BD) - SERIAL_ECHOLNPGM("BD:", z_sensor, ", Z:", cur_z, "|", current_position.z); - #endif - } - else { - babystep.set_mm(Z_AXIS, 0); //if (old_cur_z <= cur_z) Z_DIR_WRITE(INVERT_DIR(Z, HIGH)); - stepper.apply_directions(); + if (config_state > 0) { + if (cur_z < config_state * 0.1f + && old_cur_z == cur_z + && old_buf_z == current_position.z + && z_sensor < (MAX_BD_HEIGHT) - 0.1f + ) { + babystep.set_mm(Z_AXIS, cur_z - z_sensor); + DEBUG_ECHOLNPGM("BD:", z_sensor, ", Z:", cur_z, "|", current_position.z); + } + else { + babystep.set_mm(Z_AXIS, 0); //if (old_cur_z <= cur_z) Z_DIR_WRITE(HIGH); + //stepper.apply_directions(); // TODO: Remove this line as probably not needed + } } #endif + old_cur_z = cur_z; old_buf_z = current_position.z; endstops.bdp_state_update(z_sensor <= 0.01f); - //endstops.update(); + + #if HAS_STATUS_MESSAGE + static float old_z_sensor = 0; + if (old_z_sensor != z_sensor) { + old_z_sensor = z_sensor; + char tmp_1[32]; + sprintf_P(tmp_1, PSTR("BD:%d.%02dmm"), int(z_sensor), int(z_sensor * 100) % 100); + //SERIAL_ECHOLNPGM("Bed Dis:", z_sensor, "mm"); + ui.set_status(tmp_1, true); + } + #endif } else stepper.apply_directions(); - #if ENABLED(DEBUG_OUT_BD) - SERIAL_ECHOLNPGM("BD:", tmp & 0x3FF, ", Z:", cur_z, "|", current_position.z); - if (BD_I2C_SENSOR.BD_Check_OddEven(tmp) == 0) SERIAL_ECHOLNPGM("errorCRC"); - #endif + DEBUG_ECHOLNPGM("BD:", tmp & 0x3FF, " Z:", cur_z, "|", current_position.z); + if (TERN0(DEBUG_OUT_BD, BD_I2C_SENSOR.BD_Check_OddEven(tmp) == 0)) DEBUG_ECHOLNPGM("CRC error"); - if ((tmp & 0x3FF) > 1020) { + if (!good_data(tmp)) { BD_I2C_SENSOR.BD_i2c_stop(); safe_delay(10); } + // Read version. Usually used as a connection check + if (config_state == BDS_VERSION) { + config_state = BDS_IDLE; + BD_I2C_SENSOR.BD_i2c_write(CMD_READ_VERSION); + safe_delay(100); + char tmp_1[21]; + for (int i = 0; i < 19; i++) { + tmp_1[i] = BD_I2C_SENSOR.BD_i2c_read() & 0xFF; + safe_delay(50); + } + BD_I2C_SENSOR.BD_i2c_write(CMD_END_READ_CALIBRATE_DATA); + SERIAL_ECHOLNPGM("BD Sensor version:", tmp_1); + if (tmp_1[0] != 'V') SERIAL_ECHOLNPGM("Read Error. Check connection and delay."); + safe_delay(50); + } // read raw calibrate data - if (config_state == -5) { + else if (config_state == BDS_READ_RAW) { BD_I2C_SENSOR.BD_i2c_write(CMD_START_READ_CALIBRATE_DATA); - safe_delay(1000); + safe_delay(100); for (int i = 0; i < MAX_BD_HEIGHT * 10; i++) { tmp = BD_I2C_SENSOR.BD_i2c_read(); - SERIAL_ECHOLNPGM("Calibrate data:", i, ",", tmp & 0x3FF, ", check:", BD_I2C_SENSOR.BD_Check_OddEven(tmp)); - safe_delay(500); + SERIAL_ECHOLNPGM("Calibrate data:", i, ",", tmp & 0x3FF); + (void)check(tmp, true, i == 0); + safe_delay(50); } - config_state = 0; BD_I2C_SENSOR.BD_i2c_write(CMD_END_READ_CALIBRATE_DATA); - safe_delay(500); + safe_delay(50); + config_state = BDS_IDLE; } - else if (config_state <= -6) { // Start Calibrate - safe_delay(100); - if (config_state == -6) { - //BD_I2C_SENSOR.BD_i2c_write(1019); // begin calibrate - //delay(1000); - gcode.stepper_inactive_time = SEC_TO_MS(60 * 5); - gcode.process_subcommands_now(F("M17 Z")); - gcode.process_subcommands_now(F("G1 Z0.0")); - z_pose = 0; - safe_delay(1000); + else if (config_state <= BDS_CALIBRATE_START) { // Start Calibrate + safe_delay(10); + if (config_state == BDS_CALIBRATE_START) { + config_state = BDS_CALIBRATING; + REMEMBER(gsit, gcode.stepper_inactive_time, SEC_TO_MS(60 * 5)); + SERIAL_ECHOLNPGM("c_z0:", planner.get_axis_position_mm(Z_AXIS), "-", pos_zero_offset); + + // Move the z axis instead of enabling the Z axis with M17 + // TODO: Use do_blocking_move_to_z for synchronized move. + current_position.z = 0; + sync_plan_position(); + gcode.process_subcommands_now(F("G1Z0.05")); + safe_delay(300); + gcode.process_subcommands_now(F("G1Z0.00")); + safe_delay(300); + current_position.z = 0; + sync_plan_position(); + //safe_delay(1000); + + while ((planner.get_axis_position_mm(Z_AXIS) - pos_zero_offset) > 0.00001f) { + safe_delay(200); + SERIAL_ECHOLNPGM("waiting cur_z:", planner.get_axis_position_mm(Z_AXIS)); + } + zpos = 0.00001f; + safe_delay(100); BD_I2C_SENSOR.BD_i2c_write(CMD_START_CALIBRATE); // Begin calibrate - SERIAL_ECHOLNPGM("Begin calibrate"); - safe_delay(2000); - config_state = -7; + SERIAL_ECHOLNPGM("BD Sensor Calibrating..."); + safe_delay(200); } - else if (planner.get_axis_position_mm(Z_AXIS) < 10.0f) { - if (z_pose >= MAX_BD_HEIGHT) { + else if ((planner.get_axis_position_mm(Z_AXIS) - pos_zero_offset) < 10.0f) { + if (zpos >= MAX_BD_HEIGHT) { + config_state = BDS_IDLE; BD_I2C_SENSOR.BD_i2c_write(CMD_END_CALIBRATE); // End calibrate - SERIAL_ECHOLNPGM("End calibrate data"); - z_pose = 7; - config_state = 0; - safe_delay(1000); + SERIAL_ECHOLNPGM("BD Sensor calibrated."); + zpos = 7.0f; + safe_delay(500); } else { - float tmp_k = 0; - char tmp_1[30]; - sprintf_P(tmp_1, PSTR("G1 Z%d.%d"), int(z_pose), int(int(z_pose * 10) % 10)); + char tmp_1[32]; + // TODO: Use prepare_internal_move_to_destination to guarantee machine space + sprintf_P(tmp_1, PSTR("G1Z%d.%d"), int(zpos), int(zpos * 10) % 10); gcode.process_subcommands_now(tmp_1); - - SERIAL_ECHO(tmp_1); - SERIAL_ECHOLNPGM(" ,Z:", current_position.z); - - while (tmp_k < (z_pose - 0.1f)) { - tmp_k = planner.get_axis_position_mm(Z_AXIS); - safe_delay(1); + SERIAL_ECHO(tmp_1); SERIAL_ECHOLNPGM(", Z:", current_position.z); + for (float tmp_k = 0; abs(zpos - tmp_k) > 0.004f;) { + tmp_k = planner.get_axis_position_mm(Z_AXIS) - pos_zero_offset; + safe_delay(10); } - safe_delay(800); - tmp = (z_pose + 0.0001f) * 10; + safe_delay(zpos <= 0.4f ? 600 : 100); + tmp = uint16_t((zpos + 0.00001f) * 10); BD_I2C_SENSOR.BD_i2c_write(tmp); - SERIAL_ECHOLNPGM("w:", tmp, ",Zpose:", z_pose); - z_pose += 0.1001f; - //queue.enqueue_now_P(PSTR("G90")); + SERIAL_ECHOLNPGM("w:", tmp, ", Z:", zpos); + zpos += 0.1001f; } } } diff --git a/Marlin/src/feature/bedlevel/bdl/bdl.h b/Marlin/src/feature/bedlevel/bdl/bdl.h index 6307b1ab28..b3037bc1c2 100644 --- a/Marlin/src/feature/bedlevel/bdl/bdl.h +++ b/Marlin/src/feature/bedlevel/bdl/bdl.h @@ -23,14 +23,26 @@ #include +enum BDS_State : int8_t { + BDS_IDLE, + BDS_VERSION = -1, + BDS_READ_MM = -2, + BDS_HOMING_Z = -3, + BDS_READ_RAW = -5, + BDS_CALIBRATE_START = -6, + BDS_CALIBRATING = -7 +}; + class BDS_Leveling { public: static int8_t config_state; - static uint8_t homing; - static void echo_name(); + static float pos_zero_offset; static void init(uint8_t _sda, uint8_t _scl, uint16_t delay_s); static void process(); static float read(); + static float interpret(const uint16_t data); + static float good_data(const uint16_t data) { return (data & 0x3FF) < 1016; } + static bool check(const uint16_t data, const bool raw_data=false, const bool hicheck=false); }; extern BDS_Leveling bdl; diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 03b67745ec..a76c6cdd26 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -27,7 +27,7 @@ #include "bedlevel.h" #include "../../module/planner.h" -#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) +#if ANY(MESH_BED_LEVELING, PROBE_MANUALLY) #include "../../module/motion.h" #endif @@ -120,7 +120,7 @@ void reset_bed_level() { TERN_(ABL_PLANAR, planner.bed_level_matrix.set_to_identity()); } -#if EITHER(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) +#if ANY(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) /** * Enable to produce output in JSON format suitable @@ -137,8 +137,8 @@ void reset_bed_level() { */ void print_2d_array(const uint8_t sx, const uint8_t sy, const uint8_t precision, const float *values) { #ifndef SCAD_MESH_OUTPUT - LOOP_L_N(x, sx) { - serial_spaces(precision + (x < 10 ? 3 : 2)); + for (uint8_t x = 0; x < sx; ++x) { + SERIAL_ECHO_SP(precision + (x < 10 ? 3 : 2)); SERIAL_ECHO(x); } SERIAL_EOL(); @@ -146,19 +146,19 @@ void reset_bed_level() { #ifdef SCAD_MESH_OUTPUT SERIAL_ECHOLNPGM("measured_z = ["); // open 2D array #endif - LOOP_L_N(y, sy) { + for (uint8_t y = 0; y < sy; ++y) { #ifdef SCAD_MESH_OUTPUT SERIAL_ECHOPGM(" ["); // open sub-array #else if (y < 10) SERIAL_CHAR(' '); SERIAL_ECHO(y); #endif - LOOP_L_N(x, sx) { + for (uint8_t x = 0; x < sx; ++x) { SERIAL_CHAR(' '); const float offset = values[x * sy + y]; if (!isnan(offset)) { if (offset >= 0) SERIAL_CHAR('+'); - SERIAL_ECHO_F(offset, int(precision)); + SERIAL_ECHO(p_float_t(offset, precision)); } else { #ifdef SCAD_MESH_OUTPUT @@ -166,7 +166,7 @@ void reset_bed_level() { SERIAL_CHAR(' '); SERIAL_ECHOPGM("NAN"); #else - LOOP_L_N(i, precision + 3) + for (uint8_t i = 0; i < precision + 3; ++i) SERIAL_CHAR(i ? '=' : ' '); #endif } @@ -188,7 +188,7 @@ void reset_bed_level() { #endif // AUTO_BED_LEVELING_BILINEAR || MESH_BED_LEVELING -#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) +#if ANY(MESH_BED_LEVELING, PROBE_MANUALLY) void _manual_goto_xy(const xy_pos_t &pos) { diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index aeafec10d6..ccb9543e72 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -23,7 +23,7 @@ #include "../../inc/MarlinConfigPre.h" -#if EITHER(RESTORE_LEVELING_AFTER_G28, ENABLE_LEVELING_AFTER_G28) +#if ANY(RESTORE_LEVELING_AFTER_G28, ENABLE_LEVELING_AFTER_G28) #define CAN_SET_LEVELING_AFTER_G28 1 #endif @@ -41,7 +41,7 @@ void reset_bed_level(); void set_z_fade_height(const_float_t zfh, const bool do_report=true); #endif -#if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) +#if ANY(MESH_BED_LEVELING, PROBE_MANUALLY) void _manual_goto_xy(const xy_pos_t &pos); #endif @@ -69,7 +69,7 @@ class TemporaryBedLevelingState { #include "mbl/mesh_bed_leveling.h" #endif - #if EITHER(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) + #if ANY(AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) #include diff --git a/Marlin/src/feature/bedlevel/hilbert_curve.cpp b/Marlin/src/feature/bedlevel/hilbert_curve.cpp index 7474123e3f..57cbdfb34d 100644 --- a/Marlin/src/feature/bedlevel/hilbert_curve.cpp +++ b/Marlin/src/feature/bedlevel/hilbert_curve.cpp @@ -28,8 +28,8 @@ 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 log2(uint8_t n) { return (n > 1) ? 1 + log2(uint8_t(n >> 1)) : 0; } +constexpr uint8_t order(uint8_t n) { return uint8_t(log2(uint8_t(n - 1))) + 1; } constexpr uint8_t ord = order(_MAX(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y)); constexpr uint8_t dim = _BV(ord); diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index 193cbbf765..f40cbccadd 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -40,9 +40,9 @@ mesh_bed_leveling::index_to_ypos[GRID_MAX_POINTS_Y]; mesh_bed_leveling::mesh_bed_leveling() { - LOOP_L_N(i, GRID_MAX_POINTS_X) + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; ++i) index_to_xpos[i] = MESH_MIN_X + i * (MESH_X_DIST); - LOOP_L_N(i, GRID_MAX_POINTS_Y) + for (uint8_t i = 0; i < GRID_MAX_POINTS_Y; ++i) index_to_ypos[i] = MESH_MIN_Y + i * (MESH_Y_DIST); reset(); } @@ -123,8 +123,7 @@ #endif // IS_CARTESIAN && !SEGMENT_LEVELED_MOVES void mesh_bed_leveling::report_mesh() { - SERIAL_ECHOPAIR_F(STRINGIFY(GRID_MAX_POINTS_X) "x" STRINGIFY(GRID_MAX_POINTS_Y) " mesh. Z offset: ", z_offset, 5); - SERIAL_ECHOLNPGM("\nMeasured points:"); + SERIAL_ECHOLN(F(STRINGIFY(GRID_MAX_POINTS_X) "x" STRINGIFY(GRID_MAX_POINTS_Y) " mesh. Z offset: "), p_float_t(z_offset, 5), F("\nMeasured points:")); print_2d_array(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y, 5, z_values[0]); } diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index 0193b4f43e..cb4f36cd59 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -72,18 +72,18 @@ public: static float get_mesh_x(const uint8_t i) { return index_to_xpos[i]; } static float get_mesh_y(const uint8_t i) { return index_to_ypos[i]; } - static int8_t cell_index_x(const_float_t x) { + static uint8_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_CELLS_X - 1); } - static int8_t cell_index_y(const_float_t y) { + static uint8_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_CELLS_Y - 1); } - static xy_int8_t cell_indexes(const_float_t x, const_float_t y) { + static xy_uint8_t cell_indexes(const_float_t x, const_float_t y) { return { cell_index_x(x), cell_index_y(y) }; } - static xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } + static xy_uint8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } 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); @@ -107,7 +107,7 @@ public: static float get_z_offset() { return z_offset; } static float get_z_correction(const xy_pos_t &pos) { - const xy_int8_t ind = cell_indexes(pos); + const xy_uint8_t ind = cell_indexes(pos); const float x1 = index_to_xpos[ind.x], x2 = index_to_xpos[ind.x+1], y1 = index_to_ypos[ind.y], y2 = index_to_ypos[ind.y+1], z1 = calc_z0(pos.x, x1, z_values[ind.x][ind.y ], x2, z_values[ind.x+1][ind.y ]), diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index b7ee6aeef8..0228bd247e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -51,15 +51,14 @@ void unified_bed_leveling::report_current_mesh() { GRID_LOOP(x, y) if (!isnan(z_values[x][y])) { SERIAL_ECHO_START(); - SERIAL_ECHOPGM(" M421 I", x, " J", y); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); + SERIAL_ECHOLN(F(" M421 I"), x, F(" J"), y, FPSTR(SP_Z_STR), p_float_t(z_values[x][y], 4)); serial_delay(75); // Prevent Printrun from exploding } } void unified_bed_leveling::report_state() { echo_name(); - serial_ternary(planner.leveling_active, F(" System v" UBL_VERSION " "), nullptr, F("in"), F("active\n")); + serial_ternary(F(" System v" UBL_VERSION " "), planner.leveling_active, nullptr, F("in"), F("active\n")); serial_delay(50); } @@ -149,7 +148,7 @@ 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) { + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; ++i) { if (i < 10) SERIAL_CHAR(' '); SERIAL_ECHO(i); SERIAL_ECHO_SP(sp); @@ -199,7 +198,7 @@ void unified_bed_leveling::display_map(const uint8_t map_type) { } // Row Values (I indexes) - LOOP_L_N(i, GRID_MAX_POINTS_X) { + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; ++i) { // Opening Brace or Space const bool is_current = i == curr.x && j == curr.y; @@ -211,10 +210,10 @@ void unified_bed_leveling::display_map(const uint8_t map_type) { // TODO: Display on Graphical LCD } else if (isnan(f)) - SERIAL_ECHOF(human ? F(" . ") : F("NAN")); + SERIAL_ECHO(human ? F(" . ") : F("NAN")); else if (human || csv) { if (human && f >= 0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) - SERIAL_DECIMAL(f); // Positive: 5 digits, Negative: 6 digits + SERIAL_ECHO(p_float_t(f, 3)); // Positive: 5 digits, Negative: 6 digits } if (csv && i < (GRID_MAX_POINTS_X) - 1) SERIAL_CHAR('\t'); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 05a937c985..f751ce40d0 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -48,8 +48,8 @@ struct mesh_index_pair; typedef struct { bool C_seen; int8_t KLS_storage_slot; - uint8_t R_repetition, - V_verbosity, + grid_count_t R_repetition; + uint8_t V_verbosity, P_phase, T_map_type; float B_shim_thickness, @@ -141,26 +141,26 @@ public: return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)); } - static int8_t cell_index_x_valid(const_float_t x) { + static bool cell_index_x_valid(const_float_t x) { return WITHIN(cell_index_x_raw(x), 0, GRID_MAX_CELLS_X - 1); } - static int8_t cell_index_y_valid(const_float_t y) { + static bool cell_index_y_valid(const_float_t y) { return WITHIN(cell_index_y_raw(y), 0, GRID_MAX_CELLS_Y - 1); } - static int8_t cell_index_x(const_float_t x) { + static uint8_t cell_index_x(const_float_t x) { return constrain(cell_index_x_raw(x), 0, GRID_MAX_CELLS_X - 1); } - static int8_t cell_index_y(const_float_t y) { + static uint8_t cell_index_y(const_float_t y) { return constrain(cell_index_y_raw(y), 0, GRID_MAX_CELLS_Y - 1); } - static xy_int8_t cell_indexes(const_float_t x, const_float_t y) { + static xy_uint8_t cell_indexes(const_float_t x, const_float_t y) { return { cell_index_x(x), cell_index_y(y) }; } - static xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } + static xy_uint8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } 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); @@ -279,10 +279,8 @@ public: if (DEBUGGING(MESH_ADJUST)) DEBUG_ECHOLNPGM("??? Yikes! NAN in "); } - if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPGM("get_z_correction(", rx0, ", ", ry0); - DEBUG_ECHOLNPAIR_F(") => ", z0, 6); - } + if (DEBUGGING(MESH_ADJUST)) + DEBUG_ECHOLN(F("get_z_correction("), rx0, F(", "), ry0, F(") => "), p_float_t(z0, 6)); return z0; } diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 7277b293aa..3b8ee33730 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -112,7 +112,7 @@ * 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. + * If omitted, Z_TWEEN_SAFE_CLEARANCE 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 @@ -310,8 +310,14 @@ void unified_bed_leveling::G29() { // 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_test('N')) gcode.home_all_axes(); + #if ALL(DWIN_LCD_PROUI, ZHOME_BEFORE_LEVELING) + save_ubl_active_state_and_disable(); + gcode.process_subcommands_now(F("G28Z")); + restore_ubl_active_state_and_leave(); + #else + // Send 'N' to force homing before G29 (internal only) + if (axes_should_home() || parser.seen_test('N')) gcode.home_all_axes(); + #endif probe.use_probing_tool(); // Position bed horizontally and Z probe vertically. @@ -351,7 +357,7 @@ void unified_bed_leveling::G29() { // Invalidate one or more nearby mesh points, possibly all. if (parser.seen('I')) { - uint8_t count = parser.has_value() ? parser.value_byte() : 1; + grid_count_t count = parser.has_value() ? parser.value_ushort() : 1; bool invalidate_all = count >= GRID_MAX_POINTS; if (!invalidate_all) { while (count--) { @@ -396,7 +402,7 @@ void unified_bed_leveling::G29() { break; case 1: - LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised + for (uint8_t x = 0; x < GRID_MAX_POINTS_X; ++x) { // Create a diagonal line several Mesh cells thick that is raised const uint8_t x2 = x + (x < (GRID_MAX_POINTS_Y) - 1 ? 1 : -1); z_values[x][x] += 9.999f; z_values[x][x2] += 9.999f; // We want the altered line several mesh points thick @@ -458,12 +464,8 @@ void unified_bed_leveling::G29() { invalidate(); SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); } - if (param.V_verbosity > 1) { - SERIAL_ECHOPGM("Probing around (", param.XY_pos.x); - SERIAL_CHAR(','); - SERIAL_DECIMAL(param.XY_pos.y); - SERIAL_ECHOLNPGM(").\n"); - } + if (param.V_verbosity > 1) + SERIAL_ECHOLN(F("Probing around ("), param.XY_pos.x, AS_CHAR(','), param.XY_pos.y, F(").\n")); probe_entire_mesh(param.XY_pos, parser.seen_test('T'), parser.seen_test('E'), parser.seen_test('U')); report_current_position(); @@ -722,10 +724,10 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t o sum_of_diff_squared += sq(z_values[x][y] - mean); SERIAL_ECHOLNPGM("# of samples: ", n); - SERIAL_ECHOLNPAIR_F("Mean Mesh Height: ", mean, 6); + SERIAL_ECHOLNPGM("Mean Mesh Height: ", p_float_t(mean, 6)); const float sigma = SQRT(sum_of_diff_squared / (n + 1)); - SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); + SERIAL_ECHOLNPGM("Standard Deviation: ", p_float_t(sigma, 6)); if (cflag) GRID_LOOP(x, y) @@ -760,14 +762,14 @@ void unified_bed_leveling::shift_mesh_height() { TERN_(DWIN_LCD_PROUI, DWIN_LevelingStart()); save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained - uint8_t count = GRID_MAX_POINTS; + grid_count_t count = GRID_MAX_POINTS; mesh_index_pair best; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::G29_START)); do { if (do_ubl_mesh_map) display_map(param.T_map_type); - const uint8_t point_num = (GRID_MAX_POINTS - count) + 1; + const grid_count_t point_num = (GRID_MAX_POINTS - count) + 1; SERIAL_ECHOLNPGM("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), point_num, int(GRID_MAX_POINTS))); @@ -790,10 +792,7 @@ void unified_bed_leveling::shift_mesh_height() { if (best.pos.x >= 0) { // mesh point found and is reachable by probe TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::G29_POINT_START)); - const float measured_z = probe.probe_at_point( - best.meshpos(), - stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity - ); + const float measured_z = probe.probe_at_point(best.meshpos(), 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) ExtUI::onMeshUpdate(best.pos, ExtUI::G29_POINT_FINISH); @@ -927,10 +926,8 @@ void set_message_with_feedback(FSTR_P const fstr) { const float thickness = ABS(z1 - z2); - if (param.V_verbosity > 1) { - SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); - SERIAL_ECHOLNPGM("mm thick."); - } + if (param.V_verbosity > 1) + SERIAL_ECHOLNPGM("Business Card is ", p_float_t(thickness, 4), "mm thick."); restore_ubl_active_state_and_leave(); @@ -996,7 +993,7 @@ void set_message_with_feedback(FSTR_P const fstr) { TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); if (param.V_verbosity > 2) - SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); + SERIAL_ECHOLNPGM("Mesh Point Measured at: ", p_float_t(z_values[lpos.x][lpos.y], 6)); SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } while (location.valid()); @@ -1034,9 +1031,9 @@ void set_message_with_feedback(FSTR_P const fstr) { save_ubl_active_state_and_disable(); LCD_MESSAGE(MSG_UBL_FINE_TUNE_MESH); - ui.capture(); // Take over control of the LCD encoder + 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 + do_blocking_move_to_xy_z(pos, Z_TWEEN_SAFE_CLEARANCE); // Move to the given XY with probe clearance MeshFlags done_flags{0}; const xy_int8_t &lpos = location.pos; @@ -1053,7 +1050,7 @@ void set_message_with_feedback(FSTR_P const fstr) { done_flags.mark(lpos); // Mark this location as 'adjusted' so a new // location is used on the next loop - const xyz_pos_t raw = { get_mesh_x(lpos.x), get_mesh_y(lpos.y), Z_CLEARANCE_BETWEEN_PROBES }; + const xyz_pos_t raw = { get_mesh_x(lpos.x), get_mesh_y(lpos.y), Z_TWEEN_SAFE_CLEARANCE }; if (!position_is_reachable(raw)) break; // SHOULD NOT OCCUR (find_closest_mesh_point_of_type only returns reachable) @@ -1063,7 +1060,7 @@ void set_message_with_feedback(FSTR_P const fstr) { KEEPALIVE_STATE(PAUSED_FOR_USER); - if (do_ubl_mesh_map) display_map(param.T_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 @@ -1093,7 +1090,7 @@ void set_message_with_feedback(FSTR_P const fstr) { // Button held down? Abort editing if (_click_and_hold([]{ ui.return_to_status(); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + do_z_clearance(Z_TWEEN_SAFE_CLEARANCE); set_message_with_feedback(GET_TEXT_F(MSG_EDITING_STOPPED)); })) break; @@ -1113,7 +1110,7 @@ void set_message_with_feedback(FSTR_P const fstr) { 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); + do_blocking_move_to_xy_z(pos, Z_TWEEN_SAFE_CLEARANCE); LCD_MESSAGE(MSG_UBL_DONE_EDITING_MESH); SERIAL_ECHOLNPGM("Done Editing Mesh"); @@ -1138,7 +1135,7 @@ bool unified_bed_leveling::G29_parse_parameters() { param.R_repetition = 0; if (parser.seen('R')) { - param.R_repetition = parser.has_value() ? parser.value_byte() : GRID_MAX_POINTS; + param.R_repetition = parser.has_value() ? parser.value_ushort() : GRID_MAX_POINTS; NOMORE(param.R_repetition, GRID_MAX_POINTS); if (param.R_repetition < 1) { SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); @@ -1448,7 +1445,7 @@ void unified_bed_leveling::smart_fill_mesh() { 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)) { + for (uint8_t i = 0; i < COUNT(info); ++i) { 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); @@ -1487,7 +1484,7 @@ void unified_bed_leveling::smart_fill_mesh() { #if ENABLED(UBL_TILT_ON_MESH_POINTS_3POINT) mesh_index_pair cpos[3]; - LOOP_L_N(ix, 3) { // Convert points to coordinates of mesh points + for (uint8_t ix = 0; ix < 3; ++ix) { // Convert points to coordinates of mesh points cpos[ix] = find_closest_mesh_point_of_type(REAL, points[ix], true); points[ix] = cpos[ix].meshpos(); } @@ -1497,7 +1494,7 @@ void unified_bed_leveling::smart_fill_mesh() { float gotz[3]; // Used for algorithm validation below #endif - LOOP_L_N(i, 3) { + for (uint8_t i = 0; i < 3; ++i) { SERIAL_ECHOLNPGM("Tilting mesh (", i + 1, "/3)"); TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/3"), GET_TEXT(MSG_LCD_TILTING_MESH), i + 1)); @@ -1507,7 +1504,7 @@ void unified_bed_leveling::smart_fill_mesh() { measured_z -= TERN(UBL_TILT_ON_MESH_POINTS_3POINT, z_values[cpos[i].pos.x][cpos[i].pos.y], get_z_correction(points[i])); TERN_(VALIDATE_MESH_TILT, gotz[i] = measured_z); - if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPGM("Corrected_Z=", measured_z); } + if (param.V_verbosity > 3) { SERIAL_ECHO_SP(16); SERIAL_ECHOLNPGM("Corrected_Z=", measured_z); } incremental_LSF(&lsf_results, points[i], measured_z); } @@ -1537,10 +1534,10 @@ void unified_bed_leveling::smart_fill_mesh() { const uint16_t total_points = sq(param.J_grid_size); uint16_t point_num = 1; - LOOP_L_N(ix, param.J_grid_size) { + for (uint8_t ix = 0; ix < param.J_grid_size; ++ix) { xy_pos_t rpos; rpos.x = x_min + ix * dx; - LOOP_L_N(iy, param.J_grid_size) { + for (uint8_t iy = 0; iy < param.J_grid_size; ++iy) { rpos.y = y_min + dy * (zig_zag ? param.J_grid_size - 1 - iy : iy); #if ENABLED(UBL_TILT_ON_MESH_POINTS) @@ -1565,26 +1562,28 @@ void unified_bed_leveling::smart_fill_mesh() { #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) { - const xy_pos_t lpos = rpos.asLogical(); #if ENABLED(UBL_TILT_ON_MESH_POINTS) const xy_pos_t oldLpos = oldRpos.asLogical(); - DEBUG_ECHOPGM("Calculated point: ("); DEBUG_ECHO_F(oldRpos.x, 7); DEBUG_CHAR(','); DEBUG_ECHO_F(oldRpos.y, 7); - DEBUG_ECHOPAIR_F(") logical: (", oldLpos.x, 7); DEBUG_CHAR(','); DEBUG_ECHO_F(oldLpos.y, 7); - DEBUG_ECHOPGM(")\nSelected mesh point: "); + DEBUG_ECHO(F("Calculated point: ("), p_float_t(oldRpos.x, 7), AS_CHAR(','), p_float_t(oldRpos.y, 7), + F(") logical: ("), p_float_t(oldLpos.x, 7), AS_CHAR(','), p_float_t(oldLpos.y, 7), + F(")\nSelected mesh point: ") + ); #endif - 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: ", zcorr, 7); + const xy_pos_t lpos = rpos.asLogical(); + DEBUG_ECHO( AS_CHAR('('), p_float_t(rpos.x, 7), AS_CHAR(','), p_float_t(rpos.y, 7), + F(") logical: ("), p_float_t(lpos.x, 7), AS_CHAR(','), p_float_t(lpos.y, 7), + F(") measured: "), p_float_t(measured_z, 7), + F(" correction: "), p_float_t(zcorr, 7) + ); } #endif measured_z -= zcorr; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM(" final >>>---> ", p_float_t(measured_z, 7)); if (param.V_verbosity > 3) { - serial_spaces(16); + SERIAL_ECHO_SP(16); SERIAL_ECHOLNPGM("Corrected_Z=", measured_z); } incremental_LSF(&lsf_results, rpos, measured_z); @@ -1600,20 +1599,14 @@ void unified_bed_leveling::smart_fill_mesh() { probe.move_z_after_probing(); if (abort_flag || finish_incremental_LSF(&lsf_results)) { - SERIAL_ECHOPGM("Could not complete LSF!"); + SERIAL_ECHOLNPGM("Could not complete LSF!"); return; } vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); - if (param.V_verbosity > 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("]"); - } + if (param.V_verbosity > 2) + SERIAL_ECHOLN(F("bed plane normal = ["), p_float_t(normal.x, 7), AS_CHAR(','), p_float_t(normal.y, 7), AS_CHAR(','), p_float_t(normal.z, 7), AS_CHAR(']')); matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); @@ -1621,24 +1614,14 @@ void unified_bed_leveling::smart_fill_mesh() { float mx = get_mesh_x(i), my = get_mesh_y(j), mz = z_values[i][j]; 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_ECHOLN(F("before rotation = ["), p_float_t(mx, 7), AS_CHAR(','), p_float_t(my, 7), AS_CHAR(','), p_float_t(mz, 7), F("] ---> ")); DEBUG_DELAY(20); } rotation.apply_rotation_xyz(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_ECHOLN(F("after rotation = ["), p_float_t(mx, 7), AS_CHAR(','), p_float_t(my, 7), AS_CHAR(','), p_float_t(mz, 7), F("] ---> ")); DEBUG_DELAY(20); } @@ -1648,17 +1631,9 @@ void unified_bed_leveling::smart_fill_mesh() { if (DEBUGGING(LEVELING)) { rotation.debug(F("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_ECHOLN(F("LSF Results A="), p_float_t(lsf_results.A, 7), F(" B="), p_float_t(lsf_results.B, 7), F(" D="), p_float_t(lsf_results.D, 7)); DEBUG_DELAY(55); - - 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_ECHOLN(F("bed plane normal = ["), p_float_t(normal.x, 7), AS_CHAR(','), p_float_t(normal.y, 7), AS_CHAR(','), p_float_t(normal.z, 7), AS_CHAR(']')); DEBUG_EOL(); /** @@ -1675,21 +1650,17 @@ void unified_bed_leveling::smart_fill_mesh() { return normal.x * pos.x + normal.y * pos.y + zadd; }; auto debug_pt = [](const int num, const xy_pos_t &pos, const_float_t zadd) { - d_from(); DEBUG_ECHOPGM("Point ", num, ":"); - DEBUG_ECHO_F(normed(pos, zadd), 6); - DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); + d_from(); + DEBUG_ECHOLN(F("Point "), num, AS_CHAR(':'), p_float_t(normed(pos, zadd), 6), F(" Z error = "), p_float_t(zadd - get_z_correction(pos), 6)); }; debug_pt(1, probe_pt[0], normal.z * gotz[0]); debug_pt(2, probe_pt[1], normal.z * gotz[1]); debug_pt(3, probe_pt[2], normal.z * gotz[2]); #if ENABLED(Z_SAFE_HOMING) constexpr xy_float_t safe_xy = { Z_SAFE_HOMING_X_POINT, Z_SAFE_HOMING_Y_POINT }; - d_from(); DEBUG_ECHOPGM("safe home with Z="); - DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_xy, 0), 6); - d_from(); DEBUG_ECHOPGM("safe home with Z="); - DEBUG_ECHOLNPAIR_F("mesh value ", normed(safe_xy, get_z_correction(safe_xy)), 6); - DEBUG_ECHOPGM(" Z error = (", Z_SAFE_HOMING_X_POINT, ",", Z_SAFE_HOMING_Y_POINT); - DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(safe_xy), 6); + d_from(); DEBUG_ECHOLN(F("safe home with Z="), F("0 : "), p_float_t(normed(safe_xy, 0), 6)); + d_from(); DEBUG_ECHOLN(F("safe home with Z="), F("mesh value "), p_float_t(normed(safe_xy, get_z_correction(safe_xy)), 6)); + DEBUG_ECHO(F(" Z error = ("), Z_SAFE_HOMING_X_POINT, AS_CHAR(','), Z_SAFE_HOMING_Y_POINT, F(") = "), p_float_t(get_z_correction(safe_xy), 6)); #endif #endif } // DEBUGGING(LEVELING) @@ -1717,17 +1688,17 @@ void unified_bed_leveling::smart_fill_mesh() { 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) { + for (uint8_t ix = 0; ix < GRID_MAX_POINTS_X; ++ix) { ppos.x = get_mesh_x(ix); - LOOP_L_N(iy, GRID_MAX_POINTS_Y) { + for (uint8_t iy = 0; iy < GRID_MAX_POINTS_Y; ++iy) { ppos.y = get_mesh_y(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) { + for (uint8_t jx = 0; jx < GRID_MAX_POINTS_X; ++jx) { rpos.x = get_mesh_x(jx); - LOOP_L_N(jy, GRID_MAX_POINTS_Y) { + for (uint8_t jy = 0; jy < GRID_MAX_POINTS_Y; ++jy) { if (TEST(bitmap[jx], jy)) { rpos.y = get_mesh_y(jy); const float rz = z_values[jx][jy], @@ -1737,7 +1708,7 @@ void unified_bed_leveling::smart_fill_mesh() { } } if (finish_incremental_LSF(&lsf_results)) { - SERIAL_ECHOLNPGM("Insufficient data"); + SERIAL_ECHOLNPGM(" Insufficient data"); return; } const float ez = -lsf_results.D - lsf_results.A * ppos.x - lsf_results.B * ppos.y; @@ -1748,7 +1719,7 @@ void unified_bed_leveling::smart_fill_mesh() { } } - SERIAL_ECHOLNPGM("done"); + SERIAL_ECHOLNPGM(" done."); } #endif // UBL_G29_P31 @@ -1761,20 +1732,19 @@ void unified_bed_leveling::smart_fill_mesh() { report_state(); if (storage_slot == -1) - SERIAL_ECHOPGM("No Mesh Loaded."); + SERIAL_ECHOLNPGM("No Mesh Loaded."); else - SERIAL_ECHOPGM("Mesh ", storage_slot, " Loaded."); - SERIAL_EOL(); + SERIAL_ECHOLNPGM("Mesh ", storage_slot, " Loaded."); serial_delay(50); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); + SERIAL_ECHOLN(F("Fade Height M420 Z"), p_float_t(planner.z_fade_height, 4)); #endif 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); + SERIAL_ECHOLNPGM("Probe Offset M851 Z", p_float_t(probe.offset.z, 7)); #endif SERIAL_ECHOLNPGM("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); serial_delay(50); @@ -1787,17 +1757,15 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPGM("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(get_mesh_x(i)), 3); - SERIAL_ECHOPGM(" "); + for (uint8_t i = 0; i < GRID_MAX_POINTS_X; ++i) { + SERIAL_ECHO(p_float_t(LOGICAL_X_POSITION(get_mesh_x(i)), 3), F(" ")); 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(get_mesh_y(i)), 3); - SERIAL_ECHOPGM(" "); + for (uint8_t i = 0; i < GRID_MAX_POINTS_Y; ++i) { + SERIAL_ECHO(p_float_t(LOGICAL_Y_POSITION(get_mesh_y(i)), 3), F(" ")); serial_delay(25); } SERIAL_EOL(); @@ -1809,23 +1777,21 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_EOL(); serial_delay(50); - #if ENABLED(UBL_DEVEL_DEBUGGING) - SERIAL_ECHOLNPGM("ubl_state_at_invocation :", ubl_state_at_invocation, "\nubl_state_recursion_chk :", ubl_state_recursion_chk); - serial_delay(50); + SERIAL_ECHOLNPGM("ubl_state_at_invocation :", ubl_state_at_invocation, "\nubl_state_recursion_chk :", ubl_state_recursion_chk); + serial_delay(50); - SERIAL_ECHOLNPGM("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); - serial_delay(50); + SERIAL_ECHOLNPGM("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); + serial_delay(50); - SERIAL_ECHOLNPGM("sizeof(ubl) : ", sizeof(ubl)); SERIAL_EOL(); - SERIAL_ECHOLNPGM("z_value[][] size: ", sizeof(z_values)); SERIAL_EOL(); - serial_delay(25); + SERIAL_ECHOLNPGM("sizeof(ubl) : ", sizeof(ubl)); SERIAL_EOL(); + SERIAL_ECHOLNPGM("z_value[][] size: ", sizeof(z_values)); SERIAL_EOL(); + serial_delay(25); - SERIAL_ECHOLNPGM("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); - serial_delay(50); + SERIAL_ECHOLNPGM("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); + serial_delay(50); - SERIAL_ECHOLNPGM("EEPROM can hold ", settings.calc_num_meshes(), " meshes.\n"); - serial_delay(25); - #endif // UBL_DEVEL_DEBUGGING + SERIAL_ECHOLNPGM("EEPROM can hold ", settings.calc_num_meshes(), " meshes.\n"); + serial_delay(25); if (!sanity_check()) { echo_name(); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 1a2b6eb23a..053a68b77d 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -61,7 +61,7 @@ const xyze_pos_t &start = current_position, &end = destination; #endif - const xy_int8_t istart = cell_indexes(start), iend = cell_indexes(end); + const xy_uint8_t istart = cell_indexes(start), iend = cell_indexes(end); // A move within the same cell needs no splitting if (istart == iend) { @@ -108,7 +108,7 @@ const xy_float_t dist = end - start; const xy_bool_t neg { dist.x < 0, dist.y < 0 }; - const xy_int8_t ineg { int8_t(neg.x), int8_t(neg.y) }; + const xy_uint8_t ineg { uint8_t(neg.x), uint8_t(neg.y) }; const xy_float_t sign { neg.x ? -1.0f : 1.0f, neg.y ? -1.0f : 1.0f }; const xy_int8_t iadd { int8_t(iend.x == istart.x ? 0 : sign.x), int8_t(iend.y == istart.y ? 0 : sign.y) }; @@ -131,7 +131,7 @@ const bool inf_normalized_flag = isinf(e_normalized_dist); #endif - xy_int8_t icell = istart; + xy_uint8_t icell = istart; const float ratio = dist.y / dist.x, // Allow divide by zero c = start.y - ratio * start.x; @@ -252,7 +252,7 @@ * Generic case of a line crossing both X and Y Mesh lines. */ - xy_int8_t cnt = (istart - iend).ABS(); + xy_uint8_t cnt = istart.diff(iend); icell += ineg; diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index bffd2bb720..9b658315ed 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -44,7 +44,7 @@ void CancelObject::set_active_object(const int8_t obj) { else skipping = false; - #if BOTH(HAS_STATUS_MESSAGE, CANCEL_OBJECTS_REPORTING) + #if ALL(HAS_STATUS_MESSAGE, CANCEL_OBJECTS_REPORTING) if (active_object >= 0) ui.status_printf(0, F(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object)); else diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index 6e5278ce74..816ffb23b7 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -38,6 +38,10 @@ uint8_t ControllerFan::speed; const controllerFan_settings_t &ControllerFan::settings = controllerFan_defaults; #endif +#if ENABLED(FAN_SOFT_PWM) + uint8_t ControllerFan::soft_pwm_speed; +#endif + void ControllerFan::setup() { SET_OUTPUT(CONTROLLER_FAN_PIN); #ifdef CONTROLLER_FAN2_PIN @@ -61,10 +65,16 @@ void ControllerFan::update() { // - At least one stepper driver is enabled // - The heated bed is enabled // - TEMP_SENSOR_BOARD is reporting >= CONTROLLER_FAN_MIN_BOARD_TEMP + // - TEMP_SENSOR_SOC is reporting >= CONTROLLER_FAN_MIN_SOC_TEMP const ena_mask_t axis_mask = TERN(CONTROLLER_FAN_USE_Z_ONLY, _BV(Z_AXIS), (ena_mask_t)~TERN0(CONTROLLER_FAN_IGNORE_Z, _BV(Z_AXIS))); if ( (stepper.axis_enabled.bits & axis_mask) || TERN0(HAS_HEATED_BED, thermalManager.temp_bed.soft_pwm_amount > 0) - || TERN0(HAS_CONTROLLER_FAN_MIN_BOARD_TEMP, thermalManager.wholeDegBoard() >= CONTROLLER_FAN_MIN_BOARD_TEMP) + #ifdef CONTROLLER_FAN_MIN_BOARD_TEMP + || thermalManager.wholeDegBoard() >= CONTROLLER_FAN_MIN_BOARD_TEMP + #endif + #ifdef CONTROLLER_FAN_MIN_SOC_TEMP + || thermalManager.wholeDegSoc() >= CONTROLLER_FAN_MIN_SOC_TEMP + #endif ) lastMotorOn = ms; //... set time to NOW so the fan will turn on // Fan Settings. Set fan > 0: @@ -92,7 +102,7 @@ void ControllerFan::update() { #endif #if ENABLED(FAN_SOFT_PWM) - thermalManager.soft_pwm_controller_speed = speed; + soft_pwm_speed = speed; #else if (PWM_PIN(CONTROLLER_FAN_PIN)) hal.set_pwm_duty(pin_t(CONTROLLER_FAN_PIN), speed); diff --git a/Marlin/src/feature/controllerfan.h b/Marlin/src/feature/controllerfan.h index 55eb2359b0..68502afa66 100644 --- a/Marlin/src/feature/controllerfan.h +++ b/Marlin/src/feature/controllerfan.h @@ -60,6 +60,9 @@ class ControllerFan { #else static const controllerFan_settings_t &settings; #endif + #if ENABLED(FAN_SOFT_PWM) + static uint8_t soft_pwm_speed; + #endif static bool state() { return speed > 0; } static void init() { reset(); } static void reset() { TERN_(CONTROLLER_FAN_EDITABLE, settings = controllerFan_defaults); } diff --git a/Marlin/src/feature/cooler.cpp b/Marlin/src/feature/cooler.cpp index e0f99777d1..6c45e99226 100644 --- a/Marlin/src/feature/cooler.cpp +++ b/Marlin/src/feature/cooler.cpp @@ -22,7 +22,7 @@ #include "../inc/MarlinConfig.h" -#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) +#if ANY(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "cooler.h" Cooler cooler; diff --git a/Marlin/src/feature/digipot/digipot_mcp4018.cpp b/Marlin/src/feature/digipot/digipot_mcp4018.cpp index 3f2ecbfcdc..f776c5a339 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4018.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4018.cpp @@ -89,7 +89,7 @@ void DigipotI2C::set_current(const uint8_t channel, const float current) { } void DigipotI2C::init() { - LOOP_L_N(i, DIGIPOT_I2C_NUM_CHANNELS) pots[i].i2c_init(); + for (uint8_t i = 0; i < DIGIPOT_I2C_NUM_CHANNELS; ++i) pots[i].i2c_init(); // Init currents according to Configuration_adv.h static const float digipot_motor_current[] PROGMEM = @@ -99,7 +99,7 @@ void DigipotI2C::init() { DIGIPOT_I2C_MOTOR_CURRENTS #endif ; - LOOP_L_N(i, COUNT(digipot_motor_current)) + for (uint8_t i = 0; i < COUNT(digipot_motor_current); ++i) set_current(i, pgm_read_float(&digipot_motor_current[i])); } diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index ba5ecdad05..7416fe9f8d 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -94,7 +94,7 @@ void DigipotI2C::init() { DIGIPOT_I2C_MOTOR_CURRENTS #endif ; - LOOP_L_N(i, COUNT(digipot_motor_current)) + for (uint8_t i = 0; i < COUNT(digipot_motor_current); ++i) set_current(i, pgm_read_float(&digipot_motor_current[i])); } diff --git a/Marlin/src/feature/e_parser.cpp b/Marlin/src/feature/e_parser.cpp index b50a12d1af..da193ed30a 100644 --- a/Marlin/src/feature/e_parser.cpp +++ b/Marlin/src/feature/e_parser.cpp @@ -24,7 +24,7 @@ * e_parser.cpp - Intercept special commands directly in the serial stream */ -#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" #if ENABLED(EMERGENCY_PARSER) @@ -39,10 +39,193 @@ bool EmergencyParser::killed_by_M112, // = false EmergencyParser::enabled; #if ENABLED(HOST_PROMPT_SUPPORT) + #include "host_actions.h" uint8_t EmergencyParser::M876_reason; // = 0 #endif // Global instance EmergencyParser emergency_parser; +// External references +extern bool wait_for_user, wait_for_heatup; + +#if ENABLED(EP_BABYSTEPPING) + #include "babystep.h" +#endif + +#if ENABLED(REALTIME_REPORTING_COMMANDS) + // From motion.h, which cannot be included here + void report_current_position_moving(); + void quickpause_stepper(); + void quickresume_stepper(); +#endif + +void EmergencyParser::update(EmergencyParser::State &state, const uint8_t c) { + switch (state) { + case EP_RESET: + switch (c) { + case ' ': case '\n': case '\r': break; + case 'N': state = EP_N; break; + case 'M': state = EP_M; break; + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case 'S': state = EP_S; break; + case 'P': state = EP_P; break; + case 'R': state = EP_R; break; + #endif + #if ENABLED(SOFT_RESET_VIA_SERIAL) + case '^': state = EP_ctrl; break; + case 'K': state = EP_K; break; + #endif + default: state = EP_IGNORE; + } + break; + + case EP_N: + switch (c) { + case '0' ... '9': + case '-': case ' ': break; + case 'M': state = EP_M; break; + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case 'S': state = EP_S; break; + case 'P': state = EP_P; break; + case 'R': state = EP_R; break; + #endif + default: state = EP_IGNORE; + } + break; + + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case EP_S: state = (c == '0') ? EP_S0 : EP_IGNORE; break; + case EP_S0: state = (c == '0') ? EP_S00 : EP_IGNORE; break; + case EP_S00: state = (c == '0') ? EP_GRBL_STATUS : EP_IGNORE; break; + + case EP_R: state = (c == '0') ? EP_R0 : EP_IGNORE; break; + case EP_R0: state = (c == '0') ? EP_R00 : EP_IGNORE; break; + case EP_R00: state = (c == '0') ? EP_GRBL_RESUME : EP_IGNORE; break; + + case EP_P: state = (c == '0') ? EP_P0 : EP_IGNORE; break; + case EP_P0: state = (c == '0') ? EP_P00 : EP_IGNORE; break; + case EP_P00: state = (c == '0') ? EP_GRBL_PAUSE : EP_IGNORE; break; + #endif + + #if ENABLED(SOFT_RESET_VIA_SERIAL) + case EP_ctrl: state = (c == 'X') ? EP_KILL : EP_IGNORE; break; + case EP_K: state = (c == 'I') ? EP_KI : EP_IGNORE; break; + case EP_KI: state = (c == 'L') ? EP_KIL : EP_IGNORE; break; + case EP_KIL: state = (c == 'L') ? EP_KILL : EP_IGNORE; break; + #endif + + case EP_M: + switch (c) { + case ' ': break; + case '1': state = EP_M1; break; + #if ENABLED(EP_BABYSTEPPING) + case '2': state = EP_M2; break; + #endif + case '4': state = EP_M4; break; + #if HAS_MEDIA + case '5': state = EP_M5; break; + #endif + #if ENABLED(HOST_PROMPT_SUPPORT) + case '8': state = EP_M8; break; + #endif + default: state = EP_IGNORE; + } + break; + + case EP_M1: + switch (c) { + case '0': state = EP_M10; break; + case '1': state = EP_M11; break; + default: state = EP_IGNORE; + } + break; + + case EP_M10: state = (c == '8') ? EP_M108 : EP_IGNORE; break; + case EP_M11: state = (c == '2') ? EP_M112 : EP_IGNORE; break; + case EP_M4: state = (c == '1') ? EP_M41 : EP_IGNORE; break; + case EP_M41: state = (c == '0') ? EP_M410 : EP_IGNORE; break; + + #if HAS_MEDIA + case EP_M5: state = (c == '2') ? EP_M52 : EP_IGNORE; break; + case EP_M52: state = (c == '4') ? EP_M524 : EP_IGNORE; break; + #endif + + #if ENABLED(EP_BABYSTEPPING) + case EP_M2: + switch (c) { + case '9': state = EP_M29; break; + default: state = EP_IGNORE; + } + break; + + case EP_M29: + switch (c) { + case '3': state = EP_M293; break; + case '4': state = EP_M294; break; + default: state = EP_IGNORE; + } + break; + #endif + + #if ENABLED(HOST_PROMPT_SUPPORT) + + case EP_M8: state = (c == '7') ? EP_M87 : EP_IGNORE; break; + case EP_M87: state = (c == '6') ? EP_M876 : EP_IGNORE; break; + + case EP_M876: + switch (c) { + case ' ': break; + case 'S': state = EP_M876S; break; + default: state = EP_IGNORE; break; + } + break; + + case EP_M876S: + switch (c) { + case ' ': break; + case '0' ... '9': + state = EP_M876SN; + M876_reason = uint8_t(c - '0'); + break; + } + break; + + #endif + + case EP_IGNORE: + if (ISEOL(c)) state = EP_RESET; + break; + + default: + if (ISEOL(c)) { + if (enabled) switch (state) { + case EP_M108: wait_for_user = wait_for_heatup = false; break; + case EP_M112: killed_by_M112 = true; break; + case EP_M410: quickstop_by_M410 = true; break; + #if ENABLED(EP_BABYSTEPPING) + case EP_M293: babystep.ep_babysteps++; break; + case EP_M294: babystep.ep_babysteps--; break; + #endif + #if HAS_MEDIA + case EP_M524: sd_abort_by_M524 = true; break; + #endif + #if ENABLED(HOST_PROMPT_SUPPORT) + case EP_M876SN: hostui.handle_response(M876_reason); break; + #endif + #if ENABLED(REALTIME_REPORTING_COMMANDS) + case EP_GRBL_STATUS: report_current_position_moving(); break; + case EP_GRBL_PAUSE: quickpause_stepper(); break; + case EP_GRBL_RESUME: quickresume_stepper(); break; + #endif + #if ENABLED(SOFT_RESET_VIA_SERIAL) + case EP_KILL: hal.reboot(); break; + #endif + default: break; + } + state = EP_RESET; + } + } +} + #endif // EMERGENCY_PARSER diff --git a/Marlin/src/feature/e_parser.h b/Marlin/src/feature/e_parser.h index df4456d8d3..8dacb0581c 100644 --- a/Marlin/src/feature/e_parser.h +++ b/Marlin/src/feature/e_parser.h @@ -27,24 +27,6 @@ #include "../inc/MarlinConfigPre.h" -#if ENABLED(HOST_PROMPT_SUPPORT) - #include "host_actions.h" -#endif - -// External references -extern bool wait_for_user, wait_for_heatup; - -#if ENABLED(REALTIME_REPORTING_COMMANDS) - // From motion.h, which cannot be included here - void report_current_position_moving(); - void quickpause_stepper(); - void quickresume_stepper(); -#endif - -#if ENABLED(SOFT_RESET_VIA_SERIAL) - void HAL_reboot(); -#endif - class EmergencyParser { public: @@ -61,6 +43,9 @@ public: #if HAS_MEDIA EP_M5, EP_M52, EP_M524, #endif + #if ENABLED(EP_BABYSTEPPING) + EP_M2, EP_M29, EP_M293, EP_M294, + #endif #if ENABLED(HOST_PROMPT_SUPPORT) EP_M8, EP_M87, EP_M876, EP_M876S, EP_M876SN, #endif @@ -92,149 +77,7 @@ public: FORCE_INLINE static void enable() { enabled = true; } FORCE_INLINE static void disable() { enabled = false; } - FORCE_INLINE static void update(State &state, const uint8_t c) { - switch (state) { - case EP_RESET: - switch (c) { - case ' ': case '\n': case '\r': break; - case 'N': state = EP_N; break; - case 'M': state = EP_M; break; - #if ENABLED(REALTIME_REPORTING_COMMANDS) - case 'S': state = EP_S; break; - case 'P': state = EP_P; break; - case 'R': state = EP_R; break; - #endif - #if ENABLED(SOFT_RESET_VIA_SERIAL) - case '^': state = EP_ctrl; break; - case 'K': state = EP_K; break; - #endif - default: state = EP_IGNORE; - } - break; - - case EP_N: - switch (c) { - case '0' ... '9': - case '-': case ' ': break; - case 'M': state = EP_M; break; - #if ENABLED(REALTIME_REPORTING_COMMANDS) - case 'S': state = EP_S; break; - case 'P': state = EP_P; break; - case 'R': state = EP_R; break; - #endif - default: state = EP_IGNORE; - } - break; - - #if ENABLED(REALTIME_REPORTING_COMMANDS) - case EP_S: state = (c == '0') ? EP_S0 : EP_IGNORE; break; - case EP_S0: state = (c == '0') ? EP_S00 : EP_IGNORE; break; - case EP_S00: state = (c == '0') ? EP_GRBL_STATUS : EP_IGNORE; break; - - case EP_R: state = (c == '0') ? EP_R0 : EP_IGNORE; break; - case EP_R0: state = (c == '0') ? EP_R00 : EP_IGNORE; break; - case EP_R00: state = (c == '0') ? EP_GRBL_RESUME : EP_IGNORE; break; - - case EP_P: state = (c == '0') ? EP_P0 : EP_IGNORE; break; - case EP_P0: state = (c == '0') ? EP_P00 : EP_IGNORE; break; - case EP_P00: state = (c == '0') ? EP_GRBL_PAUSE : EP_IGNORE; break; - #endif - - #if ENABLED(SOFT_RESET_VIA_SERIAL) - case EP_ctrl: state = (c == 'X') ? EP_KILL : EP_IGNORE; break; - case EP_K: state = (c == 'I') ? EP_KI : EP_IGNORE; break; - case EP_KI: state = (c == 'L') ? EP_KIL : EP_IGNORE; break; - case EP_KIL: state = (c == 'L') ? EP_KILL : EP_IGNORE; break; - #endif - - case EP_M: - switch (c) { - case ' ': break; - case '1': state = EP_M1; break; - case '4': state = EP_M4; break; - #if HAS_MEDIA - case '5': state = EP_M5; break; - #endif - #if ENABLED(HOST_PROMPT_SUPPORT) - case '8': state = EP_M8; break; - #endif - default: state = EP_IGNORE; - } - break; - - case EP_M1: - switch (c) { - case '0': state = EP_M10; break; - case '1': state = EP_M11; break; - default: state = EP_IGNORE; - } - break; - - case EP_M10: state = (c == '8') ? EP_M108 : EP_IGNORE; break; - case EP_M11: state = (c == '2') ? EP_M112 : EP_IGNORE; break; - case EP_M4: state = (c == '1') ? EP_M41 : EP_IGNORE; break; - case EP_M41: state = (c == '0') ? EP_M410 : EP_IGNORE; break; - - #if HAS_MEDIA - case EP_M5: state = (c == '2') ? EP_M52 : EP_IGNORE; break; - case EP_M52: state = (c == '4') ? EP_M524 : EP_IGNORE; break; - #endif - - #if ENABLED(HOST_PROMPT_SUPPORT) - - case EP_M8: state = (c == '7') ? EP_M87 : EP_IGNORE; break; - case EP_M87: state = (c == '6') ? EP_M876 : EP_IGNORE; break; - - case EP_M876: - switch (c) { - case ' ': break; - case 'S': state = EP_M876S; break; - default: state = EP_IGNORE; break; - } - break; - - case EP_M876S: - switch (c) { - case ' ': break; - case '0' ... '9': - state = EP_M876SN; - M876_reason = uint8_t(c - '0'); - break; - } - break; - - #endif - - case EP_IGNORE: - if (ISEOL(c)) state = EP_RESET; - break; - - default: - if (ISEOL(c)) { - if (enabled) switch (state) { - case EP_M108: wait_for_user = wait_for_heatup = false; break; - case EP_M112: killed_by_M112 = true; break; - case EP_M410: quickstop_by_M410 = true; break; - #if HAS_MEDIA - case EP_M524: sd_abort_by_M524 = true; break; - #endif - #if ENABLED(HOST_PROMPT_SUPPORT) - case EP_M876SN: hostui.handle_response(M876_reason); break; - #endif - #if ENABLED(REALTIME_REPORTING_COMMANDS) - case EP_GRBL_STATUS: report_current_position_moving(); break; - case EP_GRBL_PAUSE: quickpause_stepper(); break; - case EP_GRBL_RESUME: quickresume_stepper(); break; - #endif - #if ENABLED(SOFT_RESET_VIA_SERIAL) - case EP_KILL: HAL_reboot(); break; - #endif - default: break; - } - state = EP_RESET; - } - } - } + static void update(State &state, const uint8_t c); private: static bool enabled; diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index 092ce0f8b8..a367cea48d 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -106,10 +106,7 @@ void I2CPositionEncoder::update() { SERIAL_ECHOLNPGM("Current position is ", pos); SERIAL_ECHOLNPGM("Position in encoder ticks is ", positionInTicks); SERIAL_ECHOLNPGM("New zero-offset of ", zeroOffset); - SERIAL_ECHOPGM("New position reads as ", get_position()); - SERIAL_CHAR('('); - SERIAL_DECIMAL(mm_from_count(get_position())); - SERIAL_ECHOLNPGM(")"); + SERIAL_ECHOLN(F("New position reads as "), get_position(), AS_CHAR('('), mm_from_count(get_position()), AS_CHAR(')')); #endif } #endif @@ -138,7 +135,7 @@ void I2CPositionEncoder::update() { errIdx = (errIdx >= I2CPE_ERR_ARRAY_SIZE - 1) ? 0 : errIdx + 1; err[errIdx] = get_axis_error_steps(false); - LOOP_L_N(i, I2CPE_ERR_ARRAY_SIZE) { + for (uint8_t i = 0; i < I2CPE_ERR_ARRAY_SIZE; ++i) { sum += err[i]; if (i) diffSum += ABS(err[i-1] - err[i]); } @@ -170,7 +167,7 @@ void I2CPositionEncoder::update() { errPrst[errPrstIdx++] = error; // Error must persist for I2CPE_ERR_PRST_ARRAY_SIZE error cycles. This also serves to improve the average accuracy if (errPrstIdx >= I2CPE_ERR_PRST_ARRAY_SIZE) { float sumP = 0; - LOOP_L_N(i, I2CPE_ERR_PRST_ARRAY_SIZE) sumP += errPrst[i]; + for (uint8_t i = 0; i < I2CPE_ERR_PRST_ARRAY_SIZE; ++i) sumP += errPrst[i]; const int32_t errorP = int32_t(sumP * RECIPROCAL(I2CPE_ERR_PRST_ARRAY_SIZE)); SERIAL_CHAR(AXIS_CHAR(encoderAxis)); SERIAL_ECHOLNPGM(" : CORRECT ERR ", errorP * planner.mm_per_step[encoderAxis], "mm"); @@ -232,7 +229,7 @@ bool I2CPositionEncoder::passes_test(const bool report) { if (report) { if (H != I2CPE_MAG_SIG_GOOD) SERIAL_ECHOPGM("Warning. "); SERIAL_CHAR(AXIS_CHAR(encoderAxis)); - serial_ternary(H == I2CPE_MAG_SIG_BAD, F(" axis "), F("magnetic strip "), F("encoder ")); + serial_ternary(F(" axis "), H == I2CPE_MAG_SIG_BAD, F("magnetic strip "), F("encoder ")); switch (H) { case I2CPE_MAG_SIG_GOOD: case I2CPE_MAG_SIG_MID: @@ -404,7 +401,7 @@ void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) { planner.synchronize(); - LOOP_L_N(i, iter) { + for (uint8_t i = 0; i < iter; ++i) { TERN_(HAS_EXTRUDERS, startCoord.e = planner.get_axis_position_mm(E_AXIS)); planner.buffer_line(startCoord, fr_mm_s, 0); planner.synchronize(); diff --git a/Marlin/src/feature/encoder_i2c.h b/Marlin/src/feature/encoder_i2c.h index f25fe2ea6b..1ae05d1433 100644 --- a/Marlin/src/feature/encoder_i2c.h +++ b/Marlin/src/feature/encoder_i2c.h @@ -90,7 +90,7 @@ #define I2CPE_PARSE_ERR 1 #define I2CPE_PARSE_OK 0 -#define LOOP_PE(VAR) LOOP_L_N(VAR, I2CPE_ENCODER_CNT) +#define LOOP_PE(VAR) for (uint8_t VAR = 0; VAR < I2CPE_ENCODER_CNT; ++VAR) #define CHECK_IDX() do{ if (!WITHIN(idx, 0, I2CPE_ENCODER_CNT - 1)) return; }while(0) typedef union { diff --git a/Marlin/src/feature/fancheck.cpp b/Marlin/src/feature/fancheck.cpp index 126b79b0a4..844191e7e4 100644 --- a/Marlin/src/feature/fancheck.cpp +++ b/Marlin/src/feature/fancheck.cpp @@ -72,7 +72,7 @@ void FanCheck::update_tachometers() { bool status; #define _TACHO_CASE(N) case N: status = READ(E##N##_FAN_TACHO_PIN); break; - LOOP_L_N(f, TACHO_COUNT) { + for (uint8_t f = 0; f < TACHO_COUNT; ++f) { switch (f) { #if HAS_E0_FAN_TACHO _TACHO_CASE(0) @@ -113,7 +113,7 @@ void FanCheck::compute_speed(uint16_t elapsedTime) { static uint8_t fan_reported_errors_msk = 0; uint8_t fan_error_msk = 0; - LOOP_L_N(f, TACHO_COUNT) { + for (uint8_t f = 0; f < TACHO_COUNT; ++f) { switch (f) { TERN_(HAS_E0_FAN_TACHO, case 0:) TERN_(HAS_E1_FAN_TACHO, case 1:) @@ -150,7 +150,7 @@ void FanCheck::compute_speed(uint16_t elapsedTime) { if (fan_error_msk & ~fan_reported_errors_msk) { // Handle new faults only - LOOP_L_N(f, TACHO_COUNT) if (TEST(fan_error_msk, f)) report_speed_error(f); + for (uint8_t f = 0; f < TACHO_COUNT; ++f) if (TEST(fan_error_msk, f)) report_speed_error(f); } fan_reported_errors_msk = fan_error_msk; } @@ -176,8 +176,8 @@ void FanCheck::report_speed_error(uint8_t fan) { } void FanCheck::print_fan_states() { - LOOP_L_N(s, 2) { - LOOP_L_N(f, TACHO_COUNT) { + for (uint8_t s = 0; s < 2; ++s) { + for (uint8_t f = 0; f < TACHO_COUNT; ++f) { switch (f) { TERN_(HAS_E0_FAN_TACHO, case 0:) TERN_(HAS_E1_FAN_TACHO, case 1:) diff --git a/Marlin/src/feature/filwidth.cpp b/Marlin/src/feature/filwidth.cpp index 2bd9c78980..3befd7752a 100644 --- a/Marlin/src/feature/filwidth.cpp +++ b/Marlin/src/feature/filwidth.cpp @@ -42,7 +42,7 @@ int8_t FilamentWidthSensor::ratios[MAX_MEASUREMENT_DELAY + 1], // Ring void FilamentWidthSensor::init() { const int8_t ratio = sample_to_size_ratio(); - LOOP_L_N(i, COUNT(ratios)) ratios[i] = ratio; + for (uint8_t i = 0; i < COUNT(ratios); ++i) ratios[i] = ratio; index_r = index_w = 0; } diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index 28355640d2..b4ef18a9b9 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -195,8 +195,6 @@ void FWRetract::retract(const bool retracting E_OPTARG(bool swapping/*=false*/)) //*/ } -//extern const char SP_Z_STR[]; - /** * M207: Set firmware retraction values * diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index a1c1bad5bb..cc5face259 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -41,8 +41,7 @@ HostUI hostui; void HostUI::action(FSTR_P const fstr, const bool eol) { PORT_REDIRECT(SerialMask::All); - SERIAL_ECHOPGM("//action:"); - SERIAL_ECHOF(fstr); + SERIAL_ECHOPGM("//action:", fstr); if (eol) SERIAL_EOL(); } @@ -107,7 +106,7 @@ void HostUI::action(FSTR_P const fstr, const bool eol) { void HostUI::prompt(FSTR_P const ptype, const bool eol/*=true*/) { PORT_REDIRECT(SerialMask::All); action(F("prompt_"), false); - SERIAL_ECHOF(ptype); + SERIAL_ECHO(ptype); if (eol) SERIAL_EOL(); } @@ -187,13 +186,13 @@ void HostUI::action(FSTR_P const fstr, const bool eol) { switch (response) { case 0: // "Purge More" button - #if BOTH(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) + #if ALL(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more) #endif break; case 1: // "Continue" / "Disable Runout" button - #if BOTH(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) + #if ALL(M600_PURGE_MORE_RESUMABLE, ADVANCED_PAUSE_FEATURE) pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; // Simulate menu selection #endif #if HAS_FILAMENT_SENSOR @@ -209,7 +208,7 @@ void HostUI::action(FSTR_P const fstr, const bool eol) { TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); break; case PROMPT_PAUSE_RESUME: - #if BOTH(ADVANCED_PAUSE_FEATURE, HAS_MEDIA) + #if ALL(ADVANCED_PAUSE_FEATURE, HAS_MEDIA) extern const char M24_STR[]; queue.inject_P(M24_STR); #endif diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index 94900445dc..7305581cd0 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -30,7 +30,7 @@ #include "leds.h" -#if EITHER(CASE_LIGHT_USE_RGB_LED, CASE_LIGHT_USE_NEOPIXEL) +#if ANY(CASE_LIGHT_USE_RGB_LED, CASE_LIGHT_USE_NEOPIXEL) #include "../../feature/caselight.h" #endif @@ -50,7 +50,7 @@ LEDLights leds; void LEDLights::setup() { - #if EITHER(RGB_LED, RGBW_LED) + #if ANY(RGB_LED, RGBW_LED) if (PWM_PIN(RGB_LED_R_PIN)) SET_PWM(RGB_LED_R_PIN); else SET_OUTPUT(RGB_LED_R_PIN); if (PWM_PIN(RGB_LED_G_PIN)) SET_PWM(RGB_LED_G_PIN); else SET_OUTPUT(RGB_LED_G_PIN); if (PWM_PIN(RGB_LED_B_PIN)) SET_PWM(RGB_LED_B_PIN); else SET_OUTPUT(RGB_LED_B_PIN); @@ -76,8 +76,8 @@ void LEDLights::setup() { #endif delay(200); - LOOP_L_N(i, led_pin_count) { - LOOP_LE_N(b, 200) { + for (uint8_t i = 0; i < led_pin_count; ++i) { + for (uint8_t b = 0; b <= 200; ++b) { const uint16_t led_pwm = b <= 100 ? b : 200 - b; if (i == 0 && PWM_PIN(RGB_LED_R_PIN)) hal.set_pwm_duty(pin_t(RGB_LED_R_PIN), led_pwm); else WRITE(RGB_LED_R_PIN, b < 100 ? HIGH : LOW); if (i == 1 && PWM_PIN(RGB_LED_G_PIN)) hal.set_pwm_duty(pin_t(RGB_LED_G_PIN), led_pwm); else WRITE(RGB_LED_G_PIN, b < 100 ? HIGH : LOW); @@ -96,7 +96,7 @@ void LEDLights::setup() { } #endif // RGB_STARTUP_TEST - #elif BOTH(PCA9632, RGB_STARTUP_TEST) // PCA9632 RGB_STARTUP_TEST + #elif ALL(PCA9632, RGB_STARTUP_TEST) // PCA9632 RGB_STARTUP_TEST constexpr int8_t led_pin_count = TERN(HAS_WHITE_LED, 4, 3); @@ -118,7 +118,7 @@ void LEDLights::setup() { while (led_pin_counters[0] != 99 || !canEnd) { if (led_pin_counters[0] == 99) // End loop next time pin0 counter is 99 canEnd = true; - LOOP_L_N(i, led_pin_count) { + for (uint8_t i = 0; i < led_pin_count; ++i) { if (led_pin_counters[i] > 0) { if (++led_pin_counters[i] == 400) // turn off current pin counter in led_pin_counters led_pin_counters[i] = 0; @@ -140,7 +140,7 @@ void LEDLights::setup() { } // Fade to white - LOOP_LE_N(led_pwm, 100) { + for (uint8_t led_pwm = 0; led_pwm <= 100; ++led_pwm) { NOLESS(curColor.r, led_pwm); NOLESS(curColor.g, led_pwm); NOLESS(curColor.b, led_pwm); @@ -176,7 +176,7 @@ void LEDLights::set_color(const LEDColor &incol #endif #endif - #if BOTH(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) + #if ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) // Update brightness only if caselight is ON or switching leds off if (caselight.on || incol.is_off()) #endif @@ -191,7 +191,7 @@ void LEDLights::set_color(const LEDColor &incol } #endif - #if BOTH(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) + #if ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) // Update color only if caselight is ON or switching leds off if (caselight.on || incol.is_off()) #endif @@ -206,7 +206,7 @@ void LEDLights::set_color(const LEDColor &incol #endif - #if EITHER(RGB_LED, RGBW_LED) + #if ANY(RGB_LED, RGBW_LED) // This variant uses 3-4 separate pins for the RGB(W) components. // If the pins can do PWM then their intensity will be set. @@ -228,7 +228,7 @@ void LEDLights::set_color(const LEDColor &incol TERN_(PCA9632, PCA9632_set_led_color(incol)); TERN_(PCA9533, PCA9533_set_rgb(incol.r, incol.g, incol.b)); - #if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) + #if ANY(LED_CONTROL_MENU, PRINTER_EVENT_LEDS) // Don't update the color when OFF lights_on = !incol.is_off(); if (lights_on) color = incol; diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index c6137b45c3..7a31ca685d 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -30,7 +30,7 @@ #include // A white component can be passed -#if EITHER(RGBW_LED, PCA9632_RGBW) +#if ANY(RGBW_LED, PCA9632_RGBW) #define HAS_WHITE_LED 1 #endif @@ -164,7 +164,7 @@ public: #if ENABLED(LED_CONTROL_MENU) static void toggle(); // swap "off" with color #endif - #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_USE_RGB_LED) || LED_POWEROFF_TIMEOUT > 0 + #if ANY(LED_CONTROL_MENU, CASE_LIGHT_USE_RGB_LED) || LED_POWEROFF_TIMEOUT > 0 static void update() { set_color(color); } #endif diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 2193217df0..1b0772c2f9 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -30,7 +30,7 @@ #include "leds.h" -#if EITHER(NEOPIXEL_STARTUP_TEST, NEOPIXEL2_STARTUP_TEST) +#if ANY(NEOPIXEL_STARTUP_TEST, NEOPIXEL2_STARTUP_TEST) #include "../../core/utility.h" #endif diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 3801ded6aa..6cc8b6157e 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -58,7 +58,7 @@ #define MULTIPLE_NEOPIXEL_TYPES 1 #endif -#if EITHER(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) +#if ANY(MULTIPLE_NEOPIXEL_TYPES, NEOPIXEL2_INSERIES) #define CONJOINED_NEOPIXEL 1 #endif diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index efc992f80f..991f3e79db 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -136,9 +136,7 @@ uint8_t Max7219::suspended; // = 0; void Max7219::error(FSTR_P const func, const int32_t v1, const int32_t v2/*=-1*/) { #if ENABLED(MAX7219_ERRORS) - SERIAL_ECHOPGM("??? Max7219::"); - SERIAL_ECHOF(func, AS_CHAR('(')); - SERIAL_ECHO(v1); + SERIAL_ECHO(F("??? Max7219::"), func, AS_CHAR('('), v1); if (v2 > 0) SERIAL_ECHOPGM(", ", v2); SERIAL_CHAR(')'); SERIAL_EOL(); @@ -156,7 +154,7 @@ void Max7219::error(FSTR_P const func, const int32_t v1, const int32_t v2/*=-1*/ */ inline uint32_t flipped(const uint32_t bits, const uint8_t n_bytes) { uint32_t mask = 1, outbits = 0; - LOOP_L_N(b, n_bytes * 8) { + for (uint8_t b = 0; b < n_bytes * 8; ++b) { outbits <<= 1; if (bits & mask) outbits |= 1; mask <<= 1; @@ -339,13 +337,13 @@ void Max7219::fill() { void Max7219::clear_row(const uint8_t row) { if (row >= MAX7219_Y_LEDS) return error(F("clear_row"), row); - LOOP_L_N(x, MAX7219_X_LEDS) CLR_7219(x, row); + for (uint8_t x = 0; x < MAX7219_X_LEDS; ++x) CLR_7219(x, row); send_row(row); } void Max7219::clear_column(const uint8_t col) { if (col >= MAX7219_X_LEDS) return error(F("set_column"), col); - LOOP_L_N(y, MAX7219_Y_LEDS) CLR_7219(col, y); + for (uint8_t y = 0; y < MAX7219_Y_LEDS; ++y) CLR_7219(col, y); send_column(col); } @@ -357,7 +355,7 @@ void Max7219::clear_column(const uint8_t col) { void Max7219::set_row(const uint8_t row, const uint32_t val) { if (row >= MAX7219_Y_LEDS) return error(F("set_row"), row); uint32_t mask = _BV32(MAX7219_X_LEDS - 1); - LOOP_L_N(x, MAX7219_X_LEDS) { + for (uint8_t x = 0; x < MAX7219_X_LEDS; ++x) { if (val & mask) SET_7219(x, row); else CLR_7219(x, row); mask >>= 1; } @@ -372,7 +370,7 @@ void Max7219::set_row(const uint8_t row, const uint32_t val) { void Max7219::set_column(const uint8_t col, const uint32_t val) { if (col >= MAX7219_X_LEDS) return error(F("set_column"), col); uint32_t mask = _BV32(MAX7219_Y_LEDS - 1); - LOOP_L_N(y, MAX7219_Y_LEDS) { + for (uint8_t y = 0; y < MAX7219_Y_LEDS; ++y) { if (val & mask) SET_7219(col, y); else CLR_7219(col, y); mask >>= 1; } @@ -437,23 +435,23 @@ void Max7219::set_columns_32bits(const uint8_t x, uint32_t val) { // Initialize the Max7219 void Max7219::register_setup() { - LOOP_L_N(i, MAX7219_NUMBER_UNITS) + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; ++i) send(max7219_reg_scanLimit, 0x07); pulse_load(); // Tell the chips to load the clocked out data - LOOP_L_N(i, MAX7219_NUMBER_UNITS) + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; ++i) send(max7219_reg_decodeMode, 0x00); // Using an led matrix (not digits) pulse_load(); // Tell the chips to load the clocked out data - LOOP_L_N(i, MAX7219_NUMBER_UNITS) + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; ++i) send(max7219_reg_shutdown, 0x01); // Not in shutdown mode pulse_load(); // Tell the chips to load the clocked out data - LOOP_L_N(i, MAX7219_NUMBER_UNITS) + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; ++i) send(max7219_reg_displayTest, 0x00); // No display test pulse_load(); // Tell the chips to load the clocked out data - LOOP_L_N(i, MAX7219_NUMBER_UNITS) + for (uint8_t i = 0; i < MAX7219_NUMBER_UNITS; ++i) send(max7219_reg_intensity, 0x01 & 0x0F); // The first 0x0F is the value you can set // Range: 0x00 to 0x0F pulse_load(); // Tell the chips to load the clocked out data @@ -740,7 +738,7 @@ void Max7219::idle_tasks() { // batch line updates suspended--; if (!suspended) - LOOP_L_N(i, 8) if (row_change_mask & _BV(i)) + for (uint8_t i = 0; i < 8; ++i) if (row_change_mask & _BV(i)) refresh_line(i); // After resume() automatically do a refresh() diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 07ff41e5be..5d2d112967 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -171,7 +171,7 @@ void MeatPack::report_state() { // should not contain the "PV' substring, as this is used to indicate protocol version SERIAL_ECHOPGM("[MP] " MeatPack_ProtocolVersion " "); serialprint_onoff(TEST(state, MPConfig_Bit_Active)); - SERIAL_ECHOF(TEST(state, MPConfig_Bit_NoSpaces) ? F(" NSP\n") : F(" ESP\n")); + SERIAL_ECHO(TEST(state, MPConfig_Bit_NoSpaces) ? F(" NSP\n") : F(" ESP\n")); } /** diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index cf88b806f5..6cf59fdb56 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -42,7 +42,7 @@ int_fast8_t Mixer::runner = 0; mixer_comp_t Mixer::s_color[MIXING_STEPPERS]; mixer_accu_t Mixer::accu[MIXING_STEPPERS] = { 0 }; -#if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) +#if ANY(HAS_DUAL_MIXING, GRADIENT_MIX) mixer_perc_t Mixer::mix[MIXING_STEPPERS]; #endif @@ -60,10 +60,7 @@ void Mixer::normalize(const uint8_t tool_index) { } #ifdef MIXER_NORMALIZER_DEBUG SERIAL_ECHOPGM("Mixer: Old relation : [ "); - MIXER_STEPPER_LOOP(i) { - SERIAL_DECIMAL(collector[i] / csum); - SERIAL_CHAR(' '); - } + MIXER_STEPPER_LOOP(i) SERIAL_ECHO(collector[i] / csum, AS_CHAR(' ')); SERIAL_ECHOLNPGM("]"); #endif @@ -75,16 +72,12 @@ void Mixer::normalize(const uint8_t tool_index) { csum = 0; SERIAL_ECHOPGM("Mixer: Normalize to : [ "); MIXER_STEPPER_LOOP(i) { - SERIAL_ECHO(uint16_t(color[tool_index][i])); - SERIAL_CHAR(' '); + SERIAL_ECHO(uint16_t(color[tool_index][i]), AS_CHAR(' ')); csum += color[tool_index][i]; } SERIAL_ECHOLNPGM("]"); SERIAL_ECHOPGM("Mixer: New relation : [ "); - MIXER_STEPPER_LOOP(i) { - SERIAL_ECHO_F(uint16_t(color[tool_index][i]) / csum, 3); - SERIAL_CHAR(' '); - } + MIXER_STEPPER_LOOP(i) SERIAL_ECHO(p_float_t(uint16_t(color[tool_index][i]) / csum, 3), AS_CHAR(' ')); SERIAL_ECHOLNPGM("]"); #endif @@ -94,13 +87,13 @@ void Mixer::normalize(const uint8_t tool_index) { void Mixer::reset_vtools() { // Virtual Tools 0, 1, 2, 3 = Filament 1, 2, 3, 4, etc. // Every virtual tool gets a pure filament - LOOP_L_N(t, _MIN(MIXING_VIRTUAL_TOOLS, MIXING_STEPPERS)) + for (uint8_t t = 0; t < _MIN(MIXING_VIRTUAL_TOOLS, MIXING_STEPPERS); ++t) MIXER_STEPPER_LOOP(i) color[t][i] = (t == i) ? COLOR_A_MASK : 0; // Remaining virtual tools are 100% filament 1 #if MIXING_VIRTUAL_TOOLS > MIXING_STEPPERS - LOOP_S_L_N(t, MIXING_STEPPERS, MIXING_VIRTUAL_TOOLS) + for (uint8_t t = MIXING_STEPPERS; t < MIXING_VIRTUAL_TOOLS; ++t) MIXER_STEPPER_LOOP(i) color[t][i] = (i == 0) ? COLOR_A_MASK : 0; #endif @@ -138,7 +131,7 @@ void Mixer::init() { color[MIXER_AUTORETRACT_TOOL][i] = COLOR_A_MASK; #endif - #if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) + #if ANY(HAS_DUAL_MIXING, GRADIENT_MIX) update_mix_from_vtool(); #endif diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 3a14fdad59..4340a510a5 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -108,7 +108,7 @@ class Mixer { } // Used when dealing with blocks - FORCE_INLINE static void populate_block(mixer_comp_t b_color[MIXING_STEPPERS]) { + FORCE_INLINE static void populate_block(mixer_comp_t (&b_color)[MIXING_STEPPERS]) { #if ENABLED(GRADIENT_MIX) if (gradient.enabled) { MIXER_STEPPER_LOOP(i) b_color[i] = gradient.color[i]; @@ -118,11 +118,11 @@ class Mixer { MIXER_STEPPER_LOOP(i) b_color[i] = color[selected_vtool][i]; } - FORCE_INLINE static void stepper_setup(mixer_comp_t b_color[MIXING_STEPPERS]) { + FORCE_INLINE static void stepper_setup(mixer_comp_t (&b_color)[MIXING_STEPPERS]) { MIXER_STEPPER_LOOP(i) s_color[i] = b_color[i]; } - #if EITHER(HAS_DUAL_MIXING, GRADIENT_MIX) + #if ANY(HAS_DUAL_MIXING, GRADIENT_MIX) static mixer_perc_t mix[MIXING_STEPPERS]; // Scratch array for the Mix in proportion to 100 @@ -137,11 +137,11 @@ class Mixer { MIXER_STEPPER_LOOP(i) tcolor[i] = mix[i] * scale; #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOPGM("Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]); - SERIAL_ECHOPGM(" ] to Color [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, tcolor[0], tcolor[1], tcolor[2], tcolor[3], tcolor[4], tcolor[5]); - SERIAL_ECHOLNPGM(" ]"); + SERIAL_ECHOLN( + F("Mix [ "), LIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]), + F(" ] to Color [ "), LIST_N(MIXING_STEPPERS, tcolor[0], tcolor[1], tcolor[2], tcolor[3], tcolor[4], tcolor[5]), + F(" ]") + ); #endif } @@ -151,11 +151,10 @@ class Mixer { MIXER_STEPPER_LOOP(i) mix[i] = mixer_perc_t(100.0f * color[j][i] / ctot + 0.5f); #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOPGM("V-tool ", j, " [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, color[j][0], color[j][1], color[j][2], color[j][3], color[j][4], color[j][5]); - SERIAL_ECHOPGM(" ] to Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]); - SERIAL_ECHOLNPGM(" ]"); + SERIAL_ECHOLN(F("V-tool "), j, + F(" [ "), LIST_N(MIXING_STEPPERS, color[j][0], color[j][1], color[j][2], color[j][3], color[j][4], color[j][5]), + F(" ] to Mix [ "), LIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]), F(" ]") + ); #endif } @@ -196,11 +195,10 @@ class Mixer { MIXER_STEPPER_LOOP(i) mix[i] = (mixer_perc_t)CEIL(100.0f * gradient.color[i] / ctot); #ifdef MIXER_NORMALIZER_DEBUG - SERIAL_ECHOPGM("Gradient [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, gradient.color[0], gradient.color[1], gradient.color[2], gradient.color[3], gradient.color[4], gradient.color[5]); - SERIAL_ECHOPGM(" ] to Mix [ "); - SERIAL_ECHOLIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]); - SERIAL_ECHOLNPGM(" ]"); + SERIAL_ECHOLN( + F("Gradient [ "), LIST_N(MIXING_STEPPERS, gradient.color[0], gradient.color[1], gradient.color[2], gradient.color[3], gradient.color[4], gradient.color[5]), + F(" ] to Mix [ "), LIST_N(MIXING_STEPPERS, mix[0], mix[1], mix[2], mix[3], mix[4], mix[5]), F(" ]") + ); #endif } @@ -233,13 +231,7 @@ class Mixer { for (;;) { if (--runner < 0) runner = MIXING_STEPPERS - 1; accu[runner] += s_color[runner]; - if ( - #ifdef MIXER_ACCU_SIGNED - accu[runner] < 0 - #else - accu[runner] & COLOR_A_MASK - #endif - ) { + if (TERN(MIXER_ACCU_SIGNED, accu[runner] < 0, accu[runner] & COLOR_A_MASK)) { accu[runner] &= COLOR_MASK; return runner; } diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index ea58c2859b..19aae7b7d7 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -84,7 +84,7 @@ uint8_t MMU2::cmd, MMU2::cmd_arg, MMU2::last_cmd, MMU2::extruder; int8_t MMU2::state = 0; volatile int8_t MMU2::finda = 1; volatile bool MMU2::finda_runout_valid; -int16_t MMU2::version = -1, MMU2::buildnr = -1; +uint16_t MMU2::version = 0, MMU2::buildnr = 0; millis_t MMU2::prev_request, MMU2::prev_P0_request; char MMU2::rx_buffer[MMU_RX_SIZE], MMU2::tx_buffer[MMU_TX_SIZE]; @@ -93,14 +93,11 @@ struct E_Step { feedRate_t feedRate; //!< feed rate in mm/s }; -static constexpr E_Step - ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE } - , load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE } - #if HAS_PRUSA_MMU2S - , can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE } - , can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE } - #endif -; +inline void unscaled_mmu2_e_move(const float &dist, const feedRate_t fr_mm_s, const bool sync=true) { + current_position.e += dist / planner.e_factor[active_extruder]; + line_to_current_position(fr_mm_s); + if (sync) planner.synchronize(); +} MMU2::MMU2() { rx_buffer[0] = '\0'; @@ -136,12 +133,12 @@ void MMU2::reset() { #endif } -uint8_t MMU2::get_current_tool() { - return extruder == MMU2_NO_TOOL ? -1 : extruder; -} +int8_t MMU2::get_current_tool() { return extruder == MMU2_NO_TOOL ? -1 : extruder; } -#if EITHER(HAS_PRUSA_MMU2S, MMU_EXTRUDER_SENSOR) +#if ANY(HAS_PRUSA_MMU2S, MMU_EXTRUDER_SENSOR) #define FILAMENT_PRESENT() (READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE) +#else + #define FILAMENT_PRESENT() true #endif void mmu2_attn_buzz(const bool two=false) { @@ -200,15 +197,15 @@ void MMU2::mmu_loop() { break; #if ENABLED(MMU2_MODE_12V) - case -5: - // response to M1 - if (rx_ok()) { - DEBUG_ECHOLNPGM("MMU => ok"); - DEBUG_ECHOLNPGM("MMU <= 'P0'"); - MMU2_SEND("P0"); // Read FINDA - state = -4; - } - break; + case -5: + // response to M1 + if (rx_ok()) { + DEBUG_ECHOLNPGM("MMU => ok"); + DEBUG_ECHOLNPGM("MMU <= 'P0'"); + MMU2_SEND("P0"); // Read FINDA + state = -4; + } + break; #endif case -4: @@ -289,7 +286,7 @@ void MMU2::mmu_loop() { sscanf(rx_buffer, "%hhuok\n", &finda); // This is super annoying. Only activate if necessary - // if (finda_runout_valid) DEBUG_ECHOLNPAIR_F("MMU <= 'P0'\nMMU => ", finda, 6); + //if (finda_runout_valid) DEBUG_ECHOLNPGM("MMU <= 'P0'\nMMU => ", p_float_t(finda, 6)); if (!finda && finda_runout_valid) filament_runout(); if (cmd == MMU_CMD_NONE) ready = true; @@ -406,7 +403,7 @@ void MMU2::tx_str(FSTR_P fstr) { void MMU2::tx_printf(FSTR_P format, int argument = -1) { clear_rx_buffer(); const uint8_t len = sprintf_P(tx_buffer, FTOP(format), argument); - LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); + for (uint8_t i = 0; i < len; ++i) MMU2_SERIAL.write(tx_buffer[i]); prev_request = millis(); } @@ -416,7 +413,7 @@ void MMU2::tx_printf(FSTR_P format, int argument = -1) { void MMU2::tx_printf(FSTR_P format, int argument1, int argument2) { clear_rx_buffer(); const uint8_t len = sprintf_P(tx_buffer, FTOP(format), argument1, argument2); - LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); + for (uint8_t i = 0; i < len; ++i) MMU2_SERIAL.write(tx_buffer[i]); prev_request = millis(); } @@ -458,12 +455,19 @@ static void mmu2_not_responding() { BUZZ(100, 659); } +inline void beep_bad_cmd() { BUZZ(400, 40); } + #if HAS_PRUSA_MMU2S + /** + * Load filament until the sensor at the gears is triggered + * and give up after a number of attempts set with MMU2_C0_RETRY. + * Each try has a timeout before returning a fail state. + */ bool MMU2::load_to_gears() { command(MMU_CMD_C0); manage_response(true, true); - LOOP_L_N(i, MMU2_C0_RETRY) { // Keep loading until filament reaches gears + for (uint8_t i = 0; i < MMU2_C0_RETRY; ++i) { // Keep loading until filament reaches gears if (mmu2s_triggered) break; command(MMU_CMD_C0); manage_response(true, true); @@ -484,6 +488,11 @@ static void mmu2_not_responding() { set_runout_valid(false); if (index != extruder) { + if (ENABLED(MMU_IR_UNLOAD_MOVE) && FILAMENT_PRESENT()) { + DEBUG_ECHOLNPGM("Unloading\n"); + while (FILAMENT_PRESENT()) // Filament present? Keep unloading. + unscaled_mmu2_e_move(-0.25, MMM_TO_MMS(120)); // 0.25mm is a guessed value. Adjust to preference. + } stepper.disable_extruder(); ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); @@ -520,9 +529,9 @@ static void mmu2_not_responding() { #if ENABLED(MMU2_MENUS) const uint8_t index = mmu2_choose_filament(); while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_filament_to_nozzle(index); + load_to_nozzle(index); #else - ERR_BUZZ(); + beep_bad_cmd(); #endif } break; @@ -541,13 +550,13 @@ static void mmu2_not_responding() { active_extruder = 0; } #else - ERR_BUZZ(); + beep_bad_cmd(); #endif } break; case 'c': { while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_to_nozzle(); + load_to_nozzle_sequence(); } break; } @@ -608,9 +617,9 @@ static void mmu2_not_responding() { #if ENABLED(MMU2_MENUS) uint8_t index = mmu2_choose_filament(); while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_filament_to_nozzle(index); + load_to_nozzle(index); #else - ERR_BUZZ(); + beep_bad_cmd(); #endif } break; @@ -630,14 +639,14 @@ static void mmu2_not_responding() { extruder = index; active_extruder = 0; #else - ERR_BUZZ(); + beep_bad_cmd(); #endif } break; case 'c': { DEBUG_ECHOLNPGM("case c\n"); while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); + load_to_nozzle_sequence(); } break; } @@ -723,9 +732,9 @@ static void mmu2_not_responding() { #if ENABLED(MMU2_MENUS) uint8_t index = mmu2_choose_filament(); while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - load_filament_to_nozzle(index); + load_to_nozzle(index); #else - ERR_BUZZ(); + beep_bad_cmd(); #endif } break; @@ -744,14 +753,14 @@ static void mmu2_not_responding() { extruder = index; active_extruder = 0; #else - ERR_BUZZ(); + beep_bad_cmd(); #endif } break; case 'c': { DEBUG_ECHOLNPGM("case c\n"); while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(100); - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); + load_to_nozzle_sequence(); } break; } @@ -823,13 +832,12 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { } } else if (mmu_print_saved) { - SERIAL_ECHOLNPGM("MMU starts responding\n"); + SERIAL_ECHOLNPGM("\nMMU starts responding"); if (turn_off_nozzle && resume_hotend_temp) { thermalManager.setTargetHotend(resume_hotend_temp, active_extruder); LCD_MESSAGE(MSG_HEATING); ERR_BUZZ(); - while (!thermalManager.wait_for_hotend(active_extruder, false)) safe_delay(1000); } @@ -842,7 +850,6 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { if (move_axes && all_axes_homed()) { // Move XY to starting position, then Z do_blocking_move_to_xy(resume_position, feedRate_t(NOZZLE_PARK_XY_FEEDRATE)); - // Move Z_AXIS to saved position do_blocking_move_to_z(resume_position.z, feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); } @@ -877,23 +884,24 @@ void MMU2::filament_runout() { } // Slowly spin the extruder during C0 else { - while (planner.movesplanned() < 3) { - current_position.e += 0.25; - line_to_current_position(MMM_TO_MMS(120)); - } + while (planner.movesplanned() < 3) + unscaled_mmu2_e_move(0.25, MMM_TO_MMS(120), false); } } mmu2s_triggered = present; } bool MMU2::can_load() { - execute_extruder_sequence((const E_Step *)can_load_sequence, COUNT(can_load_sequence)); + static const E_Step can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE }, + can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE }; + + execute_extruder_sequence(can_load_sequence, COUNT(can_load_sequence)); int filament_detected_count = 0; const int steps = (MMU2_CAN_LOAD_RETRACT) / (MMU2_CAN_LOAD_INCREMENT); DEBUG_ECHOLNPGM("MMU can_load:"); - LOOP_L_N(i, steps) { - execute_extruder_sequence((const E_Step *)can_load_increment_sequence, COUNT(can_load_increment_sequence)); + for (uint8_t i = 0; i < steps; ++i) { + execute_extruder_sequence(can_load_increment_sequence, COUNT(can_load_increment_sequence)); check_filament(); // Don't trust the idle function DEBUG_CHAR(mmu2s_triggered ? 'O' : 'o'); if (mmu2s_triggered) ++filament_detected_count; @@ -911,7 +919,7 @@ void MMU2::filament_runout() { #endif // Load filament into MMU2 -void MMU2::load_filament(const uint8_t index) { +void MMU2::load_to_feeder(const uint8_t index) { if (!_enabled) return; command(MMU_CMD_L0 + index); @@ -922,8 +930,7 @@ void MMU2::load_filament(const uint8_t index) { /** * Switch material and load to nozzle */ -bool MMU2::load_filament_to_nozzle(const uint8_t index) { - +bool MMU2::load_to_nozzle(const uint8_t index) { if (!_enabled) return false; if (thermalManager.tooColdToExtrude(active_extruder)) { @@ -932,6 +939,13 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) { return false; } + if (TERN0(MMU_IR_UNLOAD_MOVE, index != extruder) && FILAMENT_PRESENT()) { + DEBUG_ECHOLNPGM("Unloading\n"); + ramming_sequence(); // Unloading instructions from printer side when operating LCD + while (FILAMENT_PRESENT()) // Filament present? Keep unloading. + unscaled_mmu2_e_move(-0.25, MMM_TO_MMS(120)); // 0.25mm is a guessed value. Adjust to preference. + } + stepper.disable_extruder(); command(MMU_CMD_T0 + index); manage_response(true, true); @@ -941,23 +955,12 @@ bool MMU2::load_filament_to_nozzle(const uint8_t index) { mmu_loop(); extruder = index; active_extruder = 0; - load_to_nozzle(); + load_to_nozzle_sequence(); mmu2_attn_buzz(); } return success; } -/** - * Load filament to nozzle of multimaterial printer - * - * This function is used only after T? (user select filament) and M600 (change filament). - * It is not used after T0 .. T4 command (select filament), in such case, G-code is responsible for loading - * filament to nozzle. - */ -void MMU2::load_to_nozzle() { - execute_extruder_sequence((const E_Step *)load_to_nozzle_sequence, COUNT(load_to_nozzle_sequence)); -} - bool MMU2::eject_filament(const uint8_t index, const bool recover) { if (!_enabled) return false; @@ -970,10 +973,7 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) { LCD_MESSAGE(MSG_MMU2_EJECTING_FILAMENT); - stepper.enable_extruder(); - current_position.e -= MMU2_FILAMENTCHANGE_EJECT_FEED; - line_to_current_position(MMM_TO_MMS(2500)); - planner.synchronize(); + unscaled_mmu2_e_move(-(MMU2_FILAMENTCHANGE_EJECT_FEED), MMM_TO_MMS(2500)); command(MMU_CMD_E0 + index); manage_response(false, false); @@ -983,7 +983,7 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) { TERN_(HOST_PROMPT_SUPPORT, hostui.continue_prompt(GET_TEXT_F(MSG_MMU2_EJECT_RECOVER))); TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_MMU2_EJECT_RECOVER))); TERN_(HAS_RESUME_CONTINUE, wait_for_user_response()); - mmu2_attn_buzz(true); + mmu2_attn_buzz(); command(MMU_CMD_R0); manage_response(false, false); @@ -1017,7 +1017,7 @@ bool MMU2::unload() { } // Unload sequence to optimize shape of the tip of the unloaded filament - execute_extruder_sequence((const E_Step *)ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step)); + ramming_sequence(); command(MMU_CMD_U0); manage_response(false, true); @@ -1032,23 +1032,26 @@ bool MMU2::unload() { return true; } +void MMU2::ramming_sequence() { + static const E_Step sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE }; + execute_extruder_sequence(sequence, COUNT(sequence)); +} + +void MMU2::load_to_nozzle_sequence() { + static const E_Step sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE }; + execute_extruder_sequence(sequence, COUNT(sequence)); +} + void MMU2::execute_extruder_sequence(const E_Step * sequence, int steps) { - planner.synchronize(); - stepper.enable_extruder(); - const E_Step* step = sequence; + const E_Step *step = sequence; - LOOP_L_N(i, steps) { + for (uint8_t i = 0; i < steps; ++i) { const float es = pgm_read_float(&(step->extrude)); const feedRate_t fr_mm_m = pgm_read_float(&(step->feedRate)); - DEBUG_ECHO_MSG("E step ", es, "/", fr_mm_m); - - current_position.e += es; - line_to_current_position(MMM_TO_MMS(fr_mm_m)); - planner.synchronize(); - + unscaled_mmu2_e_move(es, MMM_TO_MMS(fr_mm_m)); step++; } diff --git a/Marlin/src/feature/mmu/mmu2.h b/Marlin/src/feature/mmu/mmu2.h index 18d6d38a35..bebbae667e 100644 --- a/Marlin/src/feature/mmu/mmu2.h +++ b/Marlin/src/feature/mmu/mmu2.h @@ -47,13 +47,12 @@ public: static void mmu_loop(); static void tool_change(const uint8_t index); static void tool_change(const char *special); - static uint8_t get_current_tool(); + static int8_t get_current_tool(); static void set_filament_type(const uint8_t index, const uint8_t type); static bool unload(); - static void load_filament(uint8_t); - static void load_all(); - static bool load_filament_to_nozzle(const uint8_t index); + static void load_to_feeder(const uint8_t index); + static bool load_to_nozzle(const uint8_t index); static bool eject_filament(const uint8_t index, const bool recover); private: @@ -71,8 +70,9 @@ private: static bool get_response(); static void manage_response(const bool move_axes, const bool turn_off_nozzle); - static void load_to_nozzle(); static void execute_extruder_sequence(const E_Step * sequence, int steps); + static void ramming_sequence(); + static void load_to_nozzle_sequence(); static void filament_runout(); @@ -96,7 +96,7 @@ private: static int8_t state; static volatile int8_t finda; static volatile bool finda_runout_valid; - static int16_t version, buildnr; + static uint16_t version, buildnr; static millis_t prev_request, prev_P0_request; static char rx_buffer[MMU_RX_SIZE], tx_buffer[MMU_TX_SIZE]; diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 7b814e57f7..02287a51b8 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -210,7 +210,7 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load while (wait_for_user) { impatient_beep(max_beep_count); - #if BOTH(FILAMENT_CHANGE_RESUME_ON_INSERT, FILAMENT_RUNOUT_SENSOR) + #if ALL(FILAMENT_CHANGE_RESUME_ON_INSERT, FILAMENT_RUNOUT_SENSOR) #if MULTI_FILAMENT_SENSOR #define _CASE_INSERTED(N) case N-1: if (READ(FIL_RUNOUT##N##_PIN) != FIL_RUNOUT##N##_STATE) wait_for_user = false; break; switch (active_extruder) { @@ -286,7 +286,7 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load // Show "Purge More" / "Resume" menu and wait for reply KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = false; - #if EITHER(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) + #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) ui.pause_show_message(PAUSE_MESSAGE_OPTION); // Also sets PAUSE_RESPONSE_WAIT_FOR #else pause_menu_response = PAUSE_RESPONSE_WAIT_FOR; @@ -331,18 +331,18 @@ inline void disable_active_extruder() { */ 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) + #if ALL(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) , const_float_t mix_multiplier/*=1.0*/ #endif ) { DEBUG_SECTION(uf, "unload_filament", true); DEBUG_ECHOLNPGM("... unloadlen:", unload_length, " showlcd:", show_lcd, " mode:", mode - #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) + #if ALL(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) , " mixmult:", mix_multiplier #endif ); - #if !BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) + #if !ALL(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) constexpr float mix_multiplier = 1.0f; #endif @@ -402,8 +402,6 @@ bool pause_print(const_float_t retract, const xyz_pos_t &park_point, const bool DEBUG_SECTION(pp, "pause_print", true); DEBUG_ECHOLNPGM("... park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", show_lcd DXC_SAY); - UNUSED(show_lcd); - if (did_pause_print) return false; // already paused #if ENABLED(HOST_ACTION_COMMANDS) @@ -445,7 +443,7 @@ bool pause_print(const_float_t retract, const xyz_pos_t &park_point, const bool // Wait for buffered blocks to complete planner.synchronize(); - #if ENABLED(ADVANCED_PAUSE_FANS_PAUSE) && HAS_FAN + #if ALL(ADVANCED_PAUSE_FANS_PAUSE, HAS_FAN) thermalManager.set_fans_paused(true); #endif @@ -504,7 +502,7 @@ void show_continue_prompt(const bool is_reload) { ui.pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING); SERIAL_ECHO_START(); - SERIAL_ECHOF(is_reload ? F(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : F(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); + SERIAL_ECHO(is_reload ? F(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : F(_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/pause.h b/Marlin/src/feature/pause.h index 134b1d1b32..7ea0c03b6b 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -117,7 +117,7 @@ bool unload_filament( const_float_t unload_length, // (mm) Filament Unload Length - 0 to skip const bool show_lcd=false, // Set LCD status messages? const PauseMode mode=PAUSE_MODE_PAUSE_PRINT // Pause Mode to apply - #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) + #if ALL(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) , const_float_t mix_multiplier=1.0f // Extrusion multiplier (for a Mixing Extruder) #endif ); diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index 8a16628bac..d0f8a66fec 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -26,7 +26,7 @@ #include "../inc/MarlinConfigPre.h" -#if EITHER(PSU_CONTROL, AUTO_POWER_CONTROL) +#if ANY(PSU_CONTROL, AUTO_POWER_CONTROL) #include "power.h" #include "../module/planner.h" @@ -49,7 +49,7 @@ bool Power::psu_on; #include "../module/stepper.h" #include "../module/temperature.h" - #if BOTH(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) + #if ALL(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) #include "controllerfan.h" #endif @@ -78,7 +78,7 @@ void Power::power_on() { if (psu_on) return; - #if EITHER(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) + #if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) cancelAutoPowerOff(); #endif @@ -115,12 +115,12 @@ void Power::power_off() { OUT_WRITE(PS_ON_PIN, !PSU_ACTIVE_STATE); psu_on = false; - #if EITHER(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) + #if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) cancelAutoPowerOff(); #endif } -#if EITHER(AUTO_POWER_CONTROL, POWER_OFF_WAIT_FOR_COOLDOWN) +#if ANY(AUTO_POWER_CONTROL, POWER_OFF_WAIT_FOR_COOLDOWN) bool Power::is_cooling_needed() { #if HAS_HOTEND && AUTO_POWER_E_TEMP @@ -140,7 +140,7 @@ void Power::power_off() { #endif -#if EITHER(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) +#if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) #if ENABLED(POWER_OFF_TIMER) millis_t Power::power_off_time = 0; @@ -192,7 +192,7 @@ void Power::power_off() { HOTEND_LOOP() if (thermalManager.autofan_speed[e]) return true; #endif - #if BOTH(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) + #if ALL(USE_CONTROLLER_FAN, AUTO_POWER_CONTROLLERFAN) if (controllerFan.state()) return true; #endif diff --git a/Marlin/src/feature/power.h b/Marlin/src/feature/power.h index 839366ca60..fdbb7126ce 100644 --- a/Marlin/src/feature/power.h +++ b/Marlin/src/feature/power.h @@ -25,7 +25,7 @@ * power.h - power control */ -#if EITHER(AUTO_POWER_CONTROL, POWER_OFF_TIMER) +#if ANY(AUTO_POWER_CONTROL, POWER_OFF_TIMER) #include "../core/millis_t.h" #endif @@ -37,7 +37,7 @@ class Power { static void power_on(); static void power_off(); - #if EITHER(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) + #if ANY(POWER_OFF_TIMER, POWER_OFF_WAIT_FOR_COOLDOWN) #if ENABLED(POWER_OFF_TIMER) static millis_t power_off_time; static void setPowerOffTimer(const millis_t delay_ms); diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 29c4695ca4..a8dfadc1f6 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -613,14 +613,13 @@ void PrintJobRecovery::resume() { #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) void PrintJobRecovery::debug(FSTR_P const prefix) { - DEBUG_ECHOF(prefix); - DEBUG_ECHOLNPGM(" Job Recovery Info...\nvalid_head:", info.valid_head, " valid_foot:", info.valid_foot); + DEBUG_ECHOLN(prefix, F(" Job Recovery Info...\nvalid_head:"), info.valid_head, F(" valid_foot:"), info.valid_foot); if (info.valid_head) { if (info.valid_head == info.valid_foot) { DEBUG_ECHOPGM("current_position: "); LOOP_LOGICAL_AXES(i) { if (i) DEBUG_CHAR(','); - DEBUG_DECIMAL(info.current_position[i]); + DEBUG_ECHO(info.current_position[i]); } DEBUG_EOL(); @@ -630,7 +629,7 @@ void PrintJobRecovery::resume() { #if ENABLED(GCODE_REPEAT_MARKERS) DEBUG_ECHOLNPGM("repeat index: ", info.stored_repeat.index); - LOOP_L_N(i, info.stored_repeat.index) + for (uint8_t i = 0; i < info.stored_repeat.index; ++i) DEBUG_ECHOLNPGM("..... sdpos: ", info.stored_repeat.marker.sdpos, " count: ", info.stored_repeat.marker.counter); #endif @@ -638,7 +637,7 @@ void PrintJobRecovery::resume() { DEBUG_ECHOPGM("home_offset: "); LOOP_NUM_AXES(i) { if (i) DEBUG_CHAR(','); - DEBUG_DECIMAL(info.home_offset[i]); + DEBUG_ECHO(info.home_offset[i]); } DEBUG_EOL(); #endif @@ -647,7 +646,7 @@ void PrintJobRecovery::resume() { DEBUG_ECHOPGM("position_shift: "); LOOP_NUM_AXES(i) { if (i) DEBUG_CHAR(','); - DEBUG_DECIMAL(info.position_shift[i]); + DEBUG_ECHO(info.position_shift[i]); } DEBUG_EOL(); #endif @@ -699,7 +698,7 @@ void PrintJobRecovery::resume() { #endif // Mixing extruder and gradient - #if BOTH(MIXING_EXTRUDER, GRADIENT_MIX) + #if ALL(MIXING_EXTRUDER, GRADIENT_MIX) DEBUG_ECHOLNPGM("gradient: ", info.gradient.enabled ? "ON" : "OFF"); #endif diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index d241fdb74c..df46545825 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -113,7 +113,7 @@ typedef struct { millis_t print_job_elapsed; // Relative axis modes - uint8_t axis_relative; + relative_t axis_relative; // Misc. Marlin flags struct { diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index b5f636e698..f640a9fd2f 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -66,13 +66,13 @@ float ProbeTempComp::init_measurement; // = 0.0 bool ProbeTempComp::enabled = true; void ProbeTempComp::reset() { - TERN_(PTC_PROBE, LOOP_L_N(i, PTC_PROBE_COUNT) z_offsets_probe[i] = z_offsets_probe_default[i]); - TERN_(PTC_BED, LOOP_L_N(i, PTC_BED_COUNT) z_offsets_bed[i] = z_offsets_bed_default[i]); - TERN_(PTC_HOTEND, LOOP_L_N(i, PTC_HOTEND_COUNT) z_offsets_hotend[i] = z_offsets_hotend_default[i]); + TERN_(PTC_PROBE, for (uint8_t i = 0; i < PTC_PROBE_COUNT; ++i) z_offsets_probe[i] = z_offsets_probe_default[i]); + TERN_(PTC_BED, for (uint8_t i = 0; i < PTC_BED_COUNT; ++i) z_offsets_bed[i] = z_offsets_bed_default[i]); + TERN_(PTC_HOTEND, for (uint8_t i = 0; i < PTC_HOTEND_COUNT; ++i) z_offsets_hotend[i] = z_offsets_hotend_default[i]); } void ProbeTempComp::clear_offsets(const TempSensorID tsi) { - LOOP_L_N(i, cali_info[tsi].measurements) + for (uint8_t i = 0; i < cali_info[tsi].measurements; ++i) sensor_z_offsets[tsi][i] = 0; calib_idx = 0; } @@ -84,17 +84,12 @@ bool ProbeTempComp::set_offset(const TempSensorID tsi, const uint8_t idx, const } void ProbeTempComp::print_offsets() { - LOOP_L_N(s, TSI_COUNT) { + for (uint8_t s = 0; s < TSI_COUNT; ++s) { celsius_t temp = cali_info[s].start_temp; for (int16_t i = -1; i < cali_info[s].measurements; ++i) { - SERIAL_ECHOF( - TERN_(PTC_BED, s == TSI_BED ? F("Bed") :) - TERN_(PTC_HOTEND, s == TSI_EXT ? F("Extruder") :) - F("Probe") - ); - SERIAL_ECHOLNPGM( - " temp: ", temp, - "C; Offset: ", i < 0 ? 0.0f : sensor_z_offsets[s][i], " um" + SERIAL_ECHOLN( + TERN_(PTC_BED, s == TSI_BED ? F("Bed") :) TERN_(PTC_HOTEND, s == TSI_EXT ? F("Extruder") :) F("Probe"), + F(" temp: "), temp, F("C; Offset: "), i < 0 ? 0.0f : sensor_z_offsets[s][i], F(" um") ); temp += cali_info[s].temp_resolution; } @@ -232,7 +227,7 @@ bool ProbeTempComp::linear_regression(const TempSensorID tsi, float &k, float &d sum_xy = 0, sum_y = 0; float xi = static_cast(start_temp); - LOOP_L_N(i, calib_idx) { + for (uint8_t i = 0; i < calib_idx; ++i) { const float yi = static_cast(data[i]); xi += res_temp; sum_x += xi; diff --git a/Marlin/src/feature/repeat.cpp b/Marlin/src/feature/repeat.cpp index fed7ac0908..4484dab95b 100644 --- a/Marlin/src/feature/repeat.cpp +++ b/Marlin/src/feature/repeat.cpp @@ -66,7 +66,7 @@ void Repeat::loop() { } } -void Repeat::cancel() { LOOP_L_N(i, index) marker[i].counter = 0; } +void Repeat::cancel() { for (uint8_t i = 0; i < index; ++i) marker[i].counter = 0; } void Repeat::early_parse_M808(char * const cmd) { if (is_command_M808(cmd)) { diff --git a/Marlin/src/feature/repeat.h b/Marlin/src/feature/repeat.h index fc11e4a9e2..8a54149b3d 100644 --- a/Marlin/src/feature/repeat.h +++ b/Marlin/src/feature/repeat.h @@ -40,7 +40,7 @@ private: public: static void reset() { index = 0; } static bool is_active() { - LOOP_L_N(i, index) if (marker[i].counter) return true; + for (uint8_t i = 0; i < index; ++i) if (marker[i].counter) return true; return false; } static bool is_command_M808(char * const cmd) { return cmd[0] == 'M' && cmd[1] == '8' && cmd[2] == '0' && cmd[3] == '8' && !NUMERIC(cmd[4]); } diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index e839db3f5e..a001459e9d 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -50,6 +50,8 @@ #define HAS_FILAMENT_SWITCH 1 #endif +typedef Flags<8> runout_flags_t; + void event_filament_runout(const uint8_t extruder); template @@ -130,39 +132,29 @@ class TFilamentMonitor : public FilamentMonitorBase { TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, cli()); // Prevent RunoutResponseDelayed::block_completed from accumulating here response.run(); sensor.run(); - const uint8_t runout_flags = response.has_run_out(); + const runout_flags_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 + const bool ran_out = bool(runout_flags); // any sensor triggers uint8_t extruder = 0; - if (ran_out) { - uint8_t bitmask = runout_flags; - while (!(bitmask & 1)) { - bitmask >>= 1; - extruder++; - } - } + if (ran_out) while (!runout_flags.test(extruder)) extruder++; #else - const bool ran_out = TEST(runout_flags, active_extruder); // suppress non active extruders + const bool ran_out = runout_flags[active_extruder]; // suppress non active extruders uint8_t extruder = active_extruder; #endif #else - const bool ran_out = !!runout_flags; + const bool ran_out = bool(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_ECHOPGM(" -> ", extruder); - if (ran_out) SERIAL_ECHOPGM(" RUN OUT"); - SERIAL_EOL(); - } - #endif - if (ran_out) { + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + SERIAL_ECHOPGM("Runout Sensors: "); + for (uint8_t i = 0; i < 8; ++i) SERIAL_ECHO('0' + char(runout_flags[i])); + SERIAL_ECHOLNPGM(" -> ", extruder, " RUN OUT"); + #endif + filament_ran_out = true; event_filament_runout(extruder); planner.synchronize(); @@ -191,13 +183,13 @@ class FilamentSensorBase { public: static void setup() { #define _INIT_RUNOUT_PIN(P,S,U,D) do{ if (ENABLED(U)) SET_INPUT_PULLUP(P); else if (ENABLED(D)) SET_INPUT_PULLDOWN(P); else SET_INPUT(P); }while(0); - #define INIT_RUNOUT_PIN(N) _INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN, FIL_RUNOUT##N##_STATE, FIL_RUNOUT##N##_PULLUP, FIL_RUNOUT##N##_PULLDOWN) - REPEAT_1(NUM_RUNOUT_SENSORS, INIT_RUNOUT_PIN); + #define INIT_RUNOUT_PIN(N) _INIT_RUNOUT_PIN(FIL_RUNOUT##N##_PIN, FIL_RUNOUT##N##_STATE, FIL_RUNOUT##N##_PULLUP, FIL_RUNOUT##N##_PULLDOWN); + REPEAT_1(NUM_RUNOUT_SENSORS, INIT_RUNOUT_PIN) #undef INIT_RUNOUT_PIN #if ENABLED(FILAMENT_SWITCH_AND_MOTION) - #define INIT_MOTION_PIN(N) _INIT_RUNOUT_PIN(FIL_MOTION##N##_PIN, FIL_MOTION##N##_STATE, FIL_MOTION##N##_PULLUP, FIL_MOTION##N##_PULLDOWN) - REPEAT_1(NUM_MOTION_SENSORS, INIT_MOTION_PIN); + #define INIT_MOTION_PIN(N) _INIT_RUNOUT_PIN(FIL_MOTION##N##_PIN, FIL_MOTION##N##_STATE, FIL_MOTION##N##_PULLUP, FIL_MOTION##N##_PULLDOWN); + REPEAT_1(NUM_MOTION_SENSORS, INIT_MOTION_PIN) #undef INIT_MOTION_PIN #endif #undef _INIT_RUNOUT_PIN @@ -212,9 +204,9 @@ class FilamentSensorBase { // Return a bitmask of runout flag states (1 bits always indicates runout) static uint8_t poll_runout_states() { - #define _OR_RUNOUT(N) | (FIL_RUNOUT##N##_STATE ? 0 : _BV(N - 1)) - return poll_runout_pins() ^ uint8_t(0 REPEAT_1(NUM_RUNOUT_SENSORS, _OR_RUNOUT)); - #undef _OR_RUNOUT + #define _INVERT_BIT(N) | (FIL_RUNOUT##N##_STATE ? 0 : _BV(N - 1)) + return poll_runout_pins() ^ uint8_t(0 REPEAT_1(NUM_RUNOUT_SENSORS, _INVERT_BIT)); + #undef _INVERT_BIT } #if ENABLED(FILAMENT_SWITCH_AND_MOTION) @@ -255,7 +247,7 @@ class FilamentSensorBase { #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) if (change) { SERIAL_ECHOPGM("Motion detected:"); - LOOP_L_N(e, TERN(FILAMENT_SWITCH_AND_MOTION, NUM_MOTION_SENSORS, NUM_RUNOUT_SENSORS)) + for (uint8_t e = 0; e < TERN(FILAMENT_SWITCH_AND_MOTION, NUM_MOTION_SENSORS, NUM_RUNOUT_SENSORS); ++e) if (TEST(change, e)) SERIAL_CHAR(' ', '0' + e); SERIAL_EOL(); } @@ -304,14 +296,14 @@ class FilamentSensorBase { static void block_completed(const block_t * const) {} static void run() { - LOOP_L_N(s, NUM_RUNOUT_SENSORS) { + for (uint8_t s = 0; s < NUM_RUNOUT_SENSORS; ++s) { 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_ECHOLNF(F("Filament Sensor "), AS_DIGIT(s), out ? F(" OUT") : F(" IN")); + SERIAL_ECHOLN(F("Filament Sensor "), AS_DIGIT(s), out ? F(" OUT") : F(" IN")); } #endif } @@ -364,9 +356,9 @@ class FilamentSensorBase { static float runout_distance_mm; static void reset() { - LOOP_L_N(i, NUM_RUNOUT_SENSORS) filament_present(i); + for (uint8_t i = 0; i < NUM_RUNOUT_SENSORS; ++i) filament_present(i); #if ENABLED(FILAMENT_SWITCH_AND_MOTION) - LOOP_L_N(i, NUM_MOTION_SENSORS) filament_motion_present(i); + for (uint8_t i = 0; i < NUM_MOTION_SENSORS; ++i) filament_motion_present(i); #endif } @@ -376,22 +368,22 @@ class FilamentSensorBase { const millis_t ms = millis(); if (ELAPSED(ms, t)) { t = millis() + 1000UL; - LOOP_L_N(i, NUM_RUNOUT_SENSORS) - SERIAL_ECHOF(i ? F(", ") : F("Runout remaining mm: "), mm_countdown.runout[i]); + for (uint8_t i = 0; i < NUM_RUNOUT_SENSORS; ++i) + SERIAL_ECHO(i ? F(", ") : F("Runout remaining mm: "), mm_countdown.runout[i]); #if ENABLED(FILAMENT_SWITCH_AND_MOTION) - LOOP_L_N(i, NUM_MOTION_SENSORS) - SERIAL_ECHOF(i ? F(", ") : F("Motion remaining mm: "), mm_countdown.motion[i]); + for (uint8_t i = 0; i < NUM_MOTION_SENSORS; ++i) + SERIAL_ECHO(i ? F(", ") : F("Motion remaining mm: "), mm_countdown.motion[i]); #endif SERIAL_EOL(); } #endif } - static uint8_t has_run_out() { - uint8_t runout_flags = 0; - LOOP_L_N(i, NUM_RUNOUT_SENSORS) if (mm_countdown.runout[i] < 0) SBI(runout_flags, i); + static runout_flags_t has_run_out() { + runout_flags_t runout_flags{0}; + for (uint8_t i = 0; i < NUM_RUNOUT_SENSORS; ++i) if (mm_countdown.runout[i] < 0) runout_flags.set(i); #if ENABLED(FILAMENT_SWITCH_AND_MOTION) - LOOP_L_N(i, NUM_MOTION_SENSORS) if (mm_countdown.motion[i] < 0) SBI(runout_flags, i); + for (uint8_t i = 0; i < NUM_MOTION_SENSORS; ++i) if (mm_countdown.motion[i] < 0) runout_flags.set(i); #endif return runout_flags; } @@ -411,7 +403,7 @@ class FilamentSensorBase { // Only trigger on extrusion with XYZ movement to allow filament change and retract/recover. const uint8_t e = b->extruder; const int32_t steps = b->steps.e; - const float mm = (TEST(b->direction_bits, E_AXIS) ? -steps : steps) * planner.mm_per_step[E_AXIS_N(e)]; + const float mm = (b->direction_bits.e ? steps : -steps) * planner.mm_per_step[E_AXIS_N(e)]; if (e < NUM_RUNOUT_SENSORS) mm_countdown.runout[e] -= mm; #if ENABLED(FILAMENT_SWITCH_AND_MOTION) if (e < NUM_MOTION_SENSORS) mm_countdown.motion[e] -= mm; @@ -432,16 +424,16 @@ class FilamentSensorBase { public: static void reset() { - LOOP_L_N(i, NUM_RUNOUT_SENSORS) filament_present(i); + for (uint8_t i = 0; i < NUM_RUNOUT_SENSORS; ++i) filament_present(i); } static void run() { - LOOP_L_N(i, NUM_RUNOUT_SENSORS) if (runout_count[i] >= 0) runout_count[i]--; + for (uint8_t i = 0; i < NUM_RUNOUT_SENSORS; ++i) if (runout_count[i] >= 0) runout_count[i]--; } - static 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); + static runout_flags_t has_run_out() { + runout_flags_t runout_flags{0}; + for (uint8_t i = 0; i < NUM_RUNOUT_SENSORS; ++i) if (runout_count[i] < 0) runout_flags.set(i); return runout_flags; } diff --git a/Marlin/src/feature/solenoid.cpp b/Marlin/src/feature/solenoid.cpp index 861e44ed05..46364eaf8f 100644 --- a/Marlin/src/feature/solenoid.cpp +++ b/Marlin/src/feature/solenoid.cpp @@ -22,7 +22,7 @@ #include "../inc/MarlinConfig.h" -#if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) +#if ANY(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) #include "solenoid.h" diff --git a/Marlin/src/feature/stepper_driver_safety.cpp b/Marlin/src/feature/stepper_driver_safety.cpp index d3fc161486..acdd695909 100644 --- a/Marlin/src/feature/stepper_driver_safety.cpp +++ b/Marlin/src/feature/stepper_driver_safety.cpp @@ -30,8 +30,7 @@ static uint32_t axis_plug_backward = 0; void stepper_driver_backward_error(FSTR_P const fstr) { SERIAL_ERROR_START(); - SERIAL_ECHOF(fstr); - SERIAL_ECHOLNPGM(" driver is backward!"); + SERIAL_ECHOLN(fstr, F(" driver is backward!")); ui.status_printf(2, F(S_FMT S_FMT), FTOP(fstr), GET_TEXT(MSG_DRIVER_BACKWARD)); } diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 2e5a5c5585..556a608914 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -562,7 +562,7 @@ }; template - static void print_vsense(TMC &st) { SERIAL_ECHOF(st.vsense() ? F("1=.18") : F("0=.325")); } + static void print_vsense(TMC &st) { SERIAL_ECHO(st.vsense() ? F("1=.18") : F("0=.325")); } #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130) static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { @@ -680,7 +680,7 @@ case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break; case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; - case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; + case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break; case TMC_IRUN: SERIAL_ECHO(st.irun()); SERIAL_ECHOPGM("/31"); @@ -728,12 +728,12 @@ case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break; case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break; - case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; + case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break; case TMC_IRUN: SERIAL_ECHO(st.cs()); SERIAL_ECHOPGM("/31"); break; - case TMC_VSENSE: SERIAL_ECHOF(st.vsense() ? F("1=.165") : F("0=.310")); break; + case TMC_VSENSE: SERIAL_ECHO(st.vsense() ? F("1=.165") : F("0=.310")); break; case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; //case TMC_OTPW: serialprint_truefalse(st.otpw()); break; //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; @@ -773,8 +773,8 @@ } } - static void tmc_debug_loop(const TMC_debug_enum n, LOGICAL_AXIS_ARGS(const bool)) { - if (x) { + static void tmc_debug_loop(const TMC_debug_enum n OPTARGS_LOGICAL(const bool)) { + if (TERN0(HAS_X_AXIS, x)) { #if AXIS_IS_TMC(X) tmc_status(stepperX, n); #endif @@ -856,8 +856,8 @@ SERIAL_EOL(); } - static void drv_status_loop(const TMC_drv_status_enum n, LOGICAL_AXIS_ARGS(const bool)) { - if (x) { + static void drv_status_loop(const TMC_drv_status_enum n OPTARGS_LOGICAL(const bool)) { + if (TERN0(HAS_X_AXIS, x)) { #if AXIS_IS_TMC(X) tmc_parse_drv_status(stepperX, n); #endif @@ -944,8 +944,8 @@ */ void tmc_report_all(LOGICAL_AXIS_ARGS(const bool)) { - #define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM, LOGICAL_AXIS_ARGS()); }while(0) - #define DRV_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); drv_status_loop(ITEM, LOGICAL_AXIS_ARGS()); }while(0) + #define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM OPTARGS_LOGICAL()); }while(0) + #define DRV_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); drv_status_loop(ITEM OPTARGS_LOGICAL()); }while(0) TMC_REPORT("\t", TMC_CODES); #if HAS_DRIVER(TMC2209) @@ -1070,8 +1070,8 @@ } #endif - static void tmc_get_registers(TMC_get_registers_enum n, LOGICAL_AXIS_ARGS(const bool)) { - if (x) { + static void tmc_get_registers(TMC_get_registers_enum n OPTARGS_LOGICAL(const bool)) { + if (TERN0(HAS_X_AXIS, x)) { #if AXIS_IS_TMC(X) tmc_get_registers(stepperX, n); #endif @@ -1154,7 +1154,7 @@ } void tmc_get_registers(LOGICAL_AXIS_ARGS(bool)) { - #define _TMC_GET_REG(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_get_registers(ITEM, LOGICAL_AXIS_ARGS()); }while(0) + #define _TMC_GET_REG(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_get_registers(ITEM OPTARGS_LOGICAL()); }while(0) #define TMC_GET_REG(NAME, TABS) _TMC_GET_REG(STRINGIFY(NAME) TABS, TMC_GET_##NAME) _TMC_GET_REG("\t", TMC_AXIS_CODES); TMC_GET_REG(GCONF, "\t\t"); @@ -1228,7 +1228,7 @@ static bool test_connection(TMC &st) { case 1: stat = F("HIGH"); break; case 2: stat = F("LOW"); break; } - SERIAL_ECHOLNF(stat); + SERIAL_ECHOLN(stat); return test_result; } @@ -1236,7 +1236,7 @@ static bool test_connection(TMC &st) { void test_tmc_connection(LOGICAL_AXIS_ARGS(const bool)) { uint8_t axis_connection = 0; - if (x) { + if (TERN0(HAS_X_AXIS, x)) { #if AXIS_IS_TMC(X) axis_connection += test_connection(stepperX); #endif diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index c10bab6274..a0a72058aa 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -144,7 +144,7 @@ class TMCMarlin : public TMC, public TMCStorage { #endif #endif - #if HAS_MARLINUI_MENU + #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) void refresh_stepper_current() { rms_current(this->val_mA); } #if ENABLED(HYBRID_THRESHOLD) @@ -207,7 +207,7 @@ class TMCMarlin : public TMC220 } #endif - #if HAS_MARLINUI_MENU + #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) void refresh_stepper_current() { rms_current(this->val_mA); } #if ENABLED(HYBRID_THRESHOLD) @@ -269,7 +269,7 @@ class TMCMarlin : public TMC220 } #endif - #if HAS_MARLINUI_MENU + #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) void refresh_stepper_current() { rms_current(this->val_mA); } #if ENABLED(HYBRID_THRESHOLD) @@ -315,7 +315,7 @@ class TMCMarlin : public TMC266 } #endif - #if HAS_MARLINUI_MENU + #if ANY(HAS_MARLINUI_MENU, DWIN_LCD_PROUI) void refresh_stepper_current() { rms_current(this->val_mA); } #if USE_SENSORLESS @@ -348,7 +348,7 @@ void test_tmc_connection(LOGICAL_AXIS_DECL(const bool, true)); #if USE_SENSORLESS // Track enabled status of stealthChop and only re-enable where applicable - struct sensorless_t { bool NUM_AXIS_ARGS(), x2, y2, z2, z3, z4; }; + struct sensorless_t { bool NUM_AXIS_ARGS_() x2, y2, z2, z3, z4; }; #if ENABLED(IMPROVE_HOMING_RELIABILITY) extern millis_t sg_guard_period; @@ -378,6 +378,7 @@ void test_tmc_connection(LOGICAL_AXIS_DECL(const bool, true)); return drv_status.stallGuard; } + #endif // SPI_ENDSTOPS #endif // USE_SENSORLESS diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp index 9aec6b0305..5cfe9f9421 100644 --- a/Marlin/src/feature/twibus.cpp +++ b/Marlin/src/feature/twibus.cpp @@ -93,8 +93,7 @@ void TWIBus::send() { // static void TWIBus::echoprefix(uint8_t bytes, FSTR_P const pref, uint8_t adr) { SERIAL_ECHO_START(); - SERIAL_ECHOF(pref); - SERIAL_ECHOPGM(": from:", adr, " bytes:", bytes, " data:"); + SERIAL_ECHO(pref, F(": from:"), adr, F(" bytes:"), bytes, F(" data:")); } // static @@ -145,7 +144,7 @@ void TWIBus::echodata(uint8_t bytes, FSTR_P const pref, uint8_t adr, const uint8 void TWIBus::echobuffer(FSTR_P const prefix, uint8_t adr) { echoprefix(buffer_s, prefix, adr); - LOOP_L_N(i, buffer_s) SERIAL_CHAR(buffer[i]); + for (uint8_t i = 0; i < buffer_s; ++i) SERIAL_CHAR(buffer[i]); SERIAL_EOL(); } diff --git a/Marlin/src/feature/x_twist.cpp b/Marlin/src/feature/x_twist.cpp index b5ad25cba8..b8f7e52ab6 100644 --- a/Marlin/src/feature/x_twist.cpp +++ b/Marlin/src/feature/x_twist.cpp @@ -43,12 +43,12 @@ void XATC::reset() { void XATC::print_points() { SERIAL_ECHOLNPGM(" X-Twist Correction:"); - LOOP_L_N(x, XATC_MAX_POINTS) { + for (uint8_t x = 0; x < XATC_MAX_POINTS; ++x) { SERIAL_CHAR(' '); if (!isnan(z_offset[x])) serial_offset(z_offset[x]); else - LOOP_L_N(i, 6) SERIAL_CHAR(i ? '=' : ' '); + for (uint8_t i = 0; i < 6; ++i) SERIAL_CHAR(i ? '=' : ' '); } SERIAL_EOL(); } diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index fe20423b8d..30643cb84e 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -628,7 +628,7 @@ void GcodeSuite::G26() { } // Get repeat from 'R', otherwise do one full circuit - int16_t g26_repeats; + grid_count_t g26_repeats; #if HAS_MARLINUI_MENU g26_repeats = parser.intval('R', GRID_MAX_POINTS + 1); #else @@ -707,7 +707,7 @@ void GcodeSuite::G26() { #error "A_CNT must be a positive value. Please change A_INT." #endif float trig_table[A_CNT]; - LOOP_L_N(i, A_CNT) + for (uint8_t i = 0; i < A_CNT; ++i) trig_table[i] = INTERSECTION_CIRCLE_RADIUS * cos(RADIANS(i * A_INT)); #endif // !ARC_SUPPORT diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 27c57cf62e..a37e5623e7 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -97,22 +97,23 @@ void GcodeSuite::G35() { bool err_break = false; // Probe all positions - LOOP_L_N(i, G35_PROBE_COUNT) { - const float z_probed_height = probe.probe_at_point(tramming_points[i], PROBE_PT_RAISE, 0, true); + for (uint8_t i = 0; i < G35_PROBE_COUNT; ++i) { + const float z_probed_height = probe.probe_at_point(tramming_points[i], PROBE_PT_RAISE); if (isnan(z_probed_height)) { - SERIAL_ECHOPGM("G35 failed at point ", i + 1, " ("); - SERIAL_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i])); - SERIAL_CHAR(')'); - SERIAL_ECHOLNPGM_P(SP_X_STR, tramming_points[i].x, SP_Y_STR, tramming_points[i].y); + SERIAL_ECHO( + F("G35 failed at point "), i + 1, F(" ("), FPSTR(pgm_read_ptr(&tramming_point_name[i])), AS_CHAR(')'), + FPSTR(SP_X_STR), tramming_points[i].x, FPSTR(SP_Y_STR), tramming_points[i].y + ); err_break = true; break; } if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPGM("Probing point ", i + 1, " ("); - DEBUG_ECHOF(FPSTR(pgm_read_ptr(&tramming_point_name[i]))); - DEBUG_CHAR(')'); - DEBUG_ECHOLNPGM_P(SP_X_STR, tramming_points[i].x, SP_Y_STR, tramming_points[i].y, SP_Z_STR, z_probed_height); + DEBUG_ECHOLN( + F("Probing point "), i + 1, F(" ("), FPSTR(pgm_read_ptr(&tramming_point_name[i])), AS_CHAR(')'), + FPSTR(SP_X_STR), tramming_points[i].x, FPSTR(SP_Y_STR), tramming_points[i].y, + FPSTR(SP_Z_STR), z_probed_height + ); } z_measured[i] = z_probed_height; @@ -122,7 +123,7 @@ void GcodeSuite::G35() { const float threads_factor[] = { 0.5, 0.7, 0.8 }; // Calculate adjusts - LOOP_S_L_N(i, 1, G35_PROBE_COUNT) { + for (uint8_t i = 1; i < G35_PROBE_COUNT; ++i) { const float diff = z_measured[0] - z_measured[i], adjust = ABS(diff) < 0.001f ? 0 : diff / threads_factor[(screw_thread - 30) / 10]; @@ -144,7 +145,7 @@ void GcodeSuite::G35() { // Restore the active tool after homing probe.use_probing_tool(false); - #if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G35) + #if ALL(HAS_LEVELING, RESTORE_LEVELING_AFTER_G35) set_bed_leveling_enabled(leveling_was_active); #endif diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index 277f95b9ff..d870a4f430 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -248,7 +248,7 @@ void GcodeSuite::M420_report(const bool forReplay/*=true*/) { report_heading_etc(forReplay, F( TERN(MESH_BED_LEVELING, "Mesh Bed Leveling", TERN(AUTO_BED_LEVELING_UBL, "Unified Bed Leveling", "Auto Bed Leveling")) )); - SERIAL_ECHOF( + SERIAL_ECHO( F(" M420 S"), planner.leveling_active #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) , FPSTR(SP_Z_STR), LINEAR_UNIT(planner.z_fade_height) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index dd325284af..5632c6e467 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -42,6 +42,9 @@ #if ABL_PLANAR #include "../../../libs/vector_3.h" #endif +#if ENABLED(BD_SENSOR_PROBE_NO_STOP) + #include "../../../feature/bedlevel/bdl/bdl.h" +#endif #include "../../../lcd/marlinui.h" #if ENABLED(EXTENSIBLE_UI) @@ -78,7 +81,7 @@ static void pre_g29_return(const bool retry, const bool did) { TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(M_IDLE, false)); } if (did) { - TERN_(HAS_DWIN_E3V2_BASIC, DWIN_LevelingDone()); + TERN_(HAS_DWIN_E3V2_BASIC, dwinLevelingDone()); TERN_(EXTENSIBLE_UI, ExtUI::onLevelingDone()); } } @@ -97,16 +100,16 @@ public: bool dryrun, reenable; - #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) + #if ANY(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) int abl_probe_index; #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) - int abl_points; + grid_count_t abl_points; #elif ENABLED(AUTO_BED_LEVELING_3POINT) - static constexpr int abl_points = 3; + static constexpr grid_count_t abl_points = 3; #elif ABL_USES_GRID - static constexpr int abl_points = GRID_MAX_POINTS; + static constexpr grid_count_t abl_points = GRID_MAX_POINTS; #endif #if ABL_USES_GRID @@ -132,16 +135,16 @@ public: #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 + 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) +#if ABL_USES_GRID && ANY(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_BILINEAR) constexpr xy_uint8_t G29_State::grid_points; - constexpr int G29_State::abl_points; + constexpr grid_count_t G29_State::abl_points; #endif /** @@ -231,7 +234,7 @@ G29_TYPE GcodeSuite::G29() { reset_stepper_timeout(); // Q = Query leveling and G29 state - const bool seenQ = EITHER(DEBUG_LEVELING_FEATURE, PROBE_MANUALLY) && parser.seen_test('Q'); + const bool seenQ = ANY(DEBUG_LEVELING_FEATURE, PROBE_MANUALLY) && parser.seen_test('Q'); // G29 Q is also available if debugging #if ENABLED(DEBUG_LEVELING_FEATURE) @@ -279,7 +282,7 @@ G29_TYPE GcodeSuite::G29() { probe.use_probing_tool(); - #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) + #if ANY(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) abl.abl_probe_index = -1; #endif @@ -436,7 +439,7 @@ G29_TYPE GcodeSuite::G29() { #if ENABLED(PREHEAT_BEFORE_LEVELING) if (!abl.dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, - #if BOTH(DWIN_LCD_PROUI, HAS_HEATED_BED) + #if ALL(DWIN_LCD_PROUI, HAS_HEATED_BED) HMI_data.BedLevT #else LEVELING_BED_TEMP @@ -484,7 +487,7 @@ G29_TYPE GcodeSuite::G29() { if (!no_action) set_bed_leveling_enabled(false); // Deploy certain probes before starting probing - #if ENABLED(BLTOUCH) || BOTH(HAS_Z_SERVO_PROBE, Z_SERVO_INTERMEDIATE_STOW) + #if ENABLED(BLTOUCH) || ALL(HAS_Z_SERVO_PROBE, Z_SERVO_INTERMEDIATE_STOW) do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); #elif HAS_BED_PROBE if (probe.deploy()) { // (returns true on deploy failure) @@ -542,7 +545,7 @@ G29_TYPE GcodeSuite::G29() { } else { - #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) + #if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) const uint16_t index = abl.abl_probe_index - 1; #endif @@ -677,7 +680,7 @@ G29_TYPE GcodeSuite::G29() { zig ^= true; // zag // An index to print current state - uint8_t pt_index = (PR_OUTER_VAR) * (PR_INNER_SIZE) + 1; + grid_count_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 @@ -693,7 +696,66 @@ G29_TYPE GcodeSuite::G29() { if (abl.verbose_level) SERIAL_ECHOLNPGM("Probing mesh point ", pt_index, "/", abl.abl_points, "."); TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_POINT), int(pt_index), int(abl.abl_points))); - abl.measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); + #if ENABLED(BD_SENSOR_PROBE_NO_STOP) + if (PR_INNER_VAR == inStart) { + char tmp_1[32]; + + // move to the start point of new line + abl.measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); + // Go to the end of the row/column ... and back up by one + // TODO: Why not just use... PR_INNER_VAR = inStop - inInc + for (PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; PR_INNER_VAR += inInc); + PR_INNER_VAR -= inInc; + + // Get the coordinate of the resulting grid point + abl.probePos = abl.probe_position_lf + abl.gridSpacing * abl.meshCount.asFloat(); + + // Coordinate that puts the probe at the grid point + abl.probePos -= probe.offset_xy; + + // Put a G1 move into the buffer + // TODO: Instead of G1, we can just add the move directly to the planner... + // { + // destination = current_position; destination = abl.probePos; + // REMEMBER(fr, feedrate_mm_s, XY_PROBE_FEEDRATE_MM_S); + // prepare_line_to_destination(); + // } + sprintf_P(tmp_1, PSTR("G1X%d.%d Y%d.%d F%d"), + int(abl.probePos.x), int(abl.probePos.x * 10) % 10, + int(abl.probePos.y), int(abl.probePos.y * 10) % 10, + XY_PROBE_FEEDRATE + ); + gcode.process_subcommands_now(tmp_1); + + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("destX: ", abl.probePos.x, " Y:", abl.probePos.y); + + // Reset the inner counter back to the start + PR_INNER_VAR = inStart; + + // Get the coordinate of the start of the row/column + abl.probePos = abl.probe_position_lf + abl.gridSpacing * abl.meshCount.asFloat(); + } + + // Wait around until the real axis position reaches the comparison point + // TODO: Use NEAR() because float is imprecise + constexpr AxisEnum axis = TERN(PROBE_Y_FIRST, Y_AXIS, X_AXIS); + const float cmp = abl.probePos[axis] - probe.offset_xy[axis]; + float pos; + for (;;) { + pos = planner.get_axis_position_mm(axis); + if (inInc > 0 ? (pos >= cmp) : (pos <= cmp)) break; + idle_no_sleep(); + } + //if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM_P(axis == Y_AXIS ? PSTR("Y=") : PSTR("X=", pos); + + abl.measured_z = current_position.z - bdl.read(); + if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("x_cur ", planner.get_axis_position_mm(X_AXIS), " z ", abl.measured_z); + + #else // !BD_SENSOR_PROBE_NO_STOP + + abl.measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); + + #endif if (isnan(abl.measured_z)) { set_bed_leveling_enabled(abl.reenable); @@ -728,7 +790,7 @@ G29_TYPE GcodeSuite::G29() { // Probe at 3 arbitrary points - LOOP_L_N(i, 3) { + for (uint8_t i = 0; i < 3; ++i) { if (abl.verbose_level) SERIAL_ECHOLNPGM("Probing point ", i + 1, "/3."); TERN_(HAS_STATUS_MESSAGE, ui.status_printf(0, F(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_POINT), int(i + 1))); @@ -817,11 +879,11 @@ G29_TYPE GcodeSuite::G29() { abl.mean /= abl.abl_points; 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); + SERIAL_ECHOPGM("Eqn coefficients: a: ", p_float_t(plane_equation_coefficients.a, 8), + " b: ", p_float_t(plane_equation_coefficients.b, 8), + " d: ", p_float_t(plane_equation_coefficients.d, 8)); if (abl.verbose_level > 2) - SERIAL_ECHOPAIR_F("\nMean of sampled points: ", abl.mean, 8); + SERIAL_ECHOPGM("\nMean of sampled points: ", p_float_t(abl.mean, 8)); SERIAL_EOL(); } @@ -837,9 +899,9 @@ G29_TYPE GcodeSuite::G29() { float min_diff = 999; auto print_topo_map = [&](FSTR_P const title, const bool get_min) { - SERIAL_ECHOF(title); + SERIAL_ECHO(title); for (int8_t yy = abl.grid_points.y - 1; yy >= 0; yy--) { - LOOP_L_N(xx, abl.grid_points.x) { + for (uint8_t xx = 0; xx < abl.grid_points.x; ++xx) { 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 }; @@ -848,7 +910,7 @@ G29_TYPE GcodeSuite::G29() { 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); + SERIAL_ECHO(p_float_t(diff, 5)); } // xx SERIAL_EOL(); } // yy diff --git a/Marlin/src/gcode/bedlevel/abl/M421.cpp b/Marlin/src/gcode/bedlevel/abl/M421.cpp index 3272ea1bd2..f66d023190 100644 --- a/Marlin/src/gcode/bedlevel/abl/M421.cpp +++ b/Marlin/src/gcode/bedlevel/abl/M421.cpp @@ -56,8 +56,8 @@ void GcodeSuite::M421() { const float zval = parser.value_linear_units(); uint8_t sx = ix >= 0 ? ix : 0, ex = ix >= 0 ? ix : GRID_MAX_POINTS_X - 1, sy = iy >= 0 ? iy : 0, ey = iy >= 0 ? iy : GRID_MAX_POINTS_Y - 1; - LOOP_S_LE_N(x, sx, ex) { - LOOP_S_LE_N(y, sy, ey) { + for (uint8_t x = sx; x <= ex; ++x) { + for (uint8_t y = sy; y <= ey; ++y) { bedlevel.z_values[x][y] = zval + (hasQ ? bedlevel.z_values[x][y] : 0); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, bedlevel.z_values[x][y])); } diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 9f902141fb..4bc9ba777a 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -173,7 +173,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); diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 782761ee14..6fb062c170 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -36,10 +36,6 @@ #include "../../feature/bedlevel/bedlevel.h" #endif -#if ENABLED(BD_SENSOR) - #include "../../feature/bedlevel/bdl/bdl.h" -#endif - #if ENABLED(SENSORLESS_HOMING) #include "../../feature/tmc_util.h" #endif @@ -206,20 +202,6 @@ void GcodeSuite::G28() { DEBUG_SECTION(log_G28, "G28", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) log_machine_info(); - TERN_(BD_SENSOR, bdl.config_state = 0); - - /** - * Set the laser power to false to stop the planner from processing the current power setting. - */ - #if ENABLED(LASER_FEATURE) - planner.laser_inline.status.isPowered = false; - #endif - - #if ENABLED(DUAL_X_CARRIAGE) - bool IDEX_saved_duplication_state = extruder_duplication_enabled; - DualXMode IDEX_saved_mode = dual_x_carriage_mode; - #endif - #if ENABLED(MARLIN_DEV_MODE) if (parser.seen_test('S')) { LOOP_NUM_AXES(a) set_axis_is_at_home((AxisEnum)a); @@ -230,6 +212,13 @@ void GcodeSuite::G28() { } #endif + /** + * Set the laser power to false to stop the planner from processing the current power setting. + */ + #if ENABLED(LASER_FEATURE) + planner.laser_inline.status.isPowered = false; + #endif + // Home (O)nly if position is unknown if (!axes_should_home() && parser.seen_test('O')) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> homing not needed, skip"); @@ -241,222 +230,327 @@ void GcodeSuite::G28() { set_and_report_grblstate(M_HOMING); #endif - TERN_(HAS_DWIN_E3V2_BASIC, DWIN_HomingStart()); + TERN_(HAS_DWIN_E3V2_BASIC, dwinHomingStart()); TERN_(EXTENSIBLE_UI, ExtUI::onHomingStart()); planner.synchronize(); // Wait for planner moves to finish! - SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state - - // Disable the leveling matrix before homing - #if CAN_SET_LEVELING_AFTER_G28 - const bool leveling_restore_state = parser.boolval('L', TERN1(RESTORE_LEVELING_AFTER_G28, planner.leveling_active)); - #endif - - // Cancel any prior G29 session - TERN_(PROBE_MANUALLY, g29_in_progress = false); - - // Disable leveling before homing - TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); - - // Reset to the XY plane - TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); - // Count this command as movement / activity reset_stepper_timeout(); - #define HAS_CURRENT_HOME(N) (defined(N##_CURRENT_HOME) && N##_CURRENT_HOME != N##_CURRENT) - #if HAS_CURRENT_HOME(X) || HAS_CURRENT_HOME(X2) || HAS_CURRENT_HOME(Y) || HAS_CURRENT_HOME(Y2) || (ENABLED(DELTA) && HAS_CURRENT_HOME(Z)) || HAS_CURRENT_HOME(I) || HAS_CURRENT_HOME(J) || HAS_CURRENT_HOME(K) || HAS_CURRENT_HOME(U) || HAS_CURRENT_HOME(V) || HAS_CURRENT_HOME(W) - #define HAS_HOMING_CURRENT 1 - #endif + #if NUM_AXES - #if HAS_HOMING_CURRENT - auto debug_current = [](FSTR_P const s, const int16_t a, const int16_t b) { - DEBUG_ECHOF(s); DEBUG_ECHOLNPGM(" current: ", a, " -> ", b); - }; - #if HAS_CURRENT_HOME(X) - const int16_t tmc_save_current_X = stepperX.getMilliamps(); - stepperX.rms_current(X_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_X), tmc_save_current_X, X_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(X2) - const int16_t tmc_save_current_X2 = stepperX2.getMilliamps(); - stepperX2.rms_current(X2_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_X2), tmc_save_current_X2, X2_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(Y) - const int16_t tmc_save_current_Y = stepperY.getMilliamps(); - stepperY.rms_current(Y_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_Y), tmc_save_current_Y, Y_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(Y2) - const int16_t tmc_save_current_Y2 = stepperY2.getMilliamps(); - stepperY2.rms_current(Y2_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_Y2), tmc_save_current_Y2, Y2_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(Z) && ENABLED(DELTA) - const int16_t tmc_save_current_Z = stepperZ.getMilliamps(); - stepperZ.rms_current(Z_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_Z), tmc_save_current_Z, Z_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(I) - const int16_t tmc_save_current_I = stepperI.getMilliamps(); - stepperI.rms_current(I_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_I), tmc_save_current_I, I_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(J) - const int16_t tmc_save_current_J = stepperJ.getMilliamps(); - stepperJ.rms_current(J_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_J), tmc_save_current_J, J_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(K) - const int16_t tmc_save_current_K = stepperK.getMilliamps(); - stepperK.rms_current(K_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_K), tmc_save_current_K, K_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(U) - const int16_t tmc_save_current_U = stepperU.getMilliamps(); - stepperU.rms_current(U_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_U), tmc_save_current_U, U_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(V) - const int16_t tmc_save_current_V = stepperV.getMilliamps(); - stepperV.rms_current(V_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_V), tmc_save_current_V, V_CURRENT_HOME); - #endif - #if HAS_CURRENT_HOME(W) - const int16_t tmc_save_current_W = stepperW.getMilliamps(); - stepperW.rms_current(W_CURRENT_HOME); - if (DEBUGGING(LEVELING)) debug_current(F(STR_W), tmc_save_current_W, W_CURRENT_HOME); - #endif - #if SENSORLESS_STALLGUARD_DELAY - safe_delay(SENSORLESS_STALLGUARD_DELAY); // Short delay needed to settle - #endif - #endif - - #if ENABLED(IMPROVE_HOMING_RELIABILITY) - motion_state_t saved_motion_state = begin_slow_homing(); - #endif - - // Always home with tool 0 active - #if HAS_MULTI_HOTEND - #if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE) - const uint8_t old_tool_index = active_extruder; - #endif - // PARKING_EXTRUDER homing requires different handling of movement / solenoid activation, depending on the side of homing - #if ENABLED(PARKING_EXTRUDER) - const bool pe_final_change_must_unpark = parking_extruder_unpark_after_homing(old_tool_index, X_HOME_DIR + 1 == old_tool_index * 2); - #endif - tool_change(0, true); - #endif - - TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false)); - - remember_feedrate_scaling_off(); - - endstops.enable(true); // Enable endstops for next homing move - - #if ENABLED(DELTA) - - constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a DELTA - - home_delta(); - - TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state)); - - #elif ENABLED(AXEL_TPARA) - - constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a TPARA - - home_TPARA(); - - #else - - #define _UNSAFE(A) (homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(A##_AXIS)))) - - const bool homeZ = TERN0(HAS_Z_AXIS, parser.seen_test('Z')), - NUM_AXIS_LIST( // Other axes should be homed before Z safe-homing - needX = _UNSAFE(X), needY = _UNSAFE(Y), needZ = false, // UNUSED - needI = _UNSAFE(I), needJ = _UNSAFE(J), needK = _UNSAFE(K), - needU = _UNSAFE(U), needV = _UNSAFE(V), needW = _UNSAFE(W) - ), - NUM_AXIS_LIST( // Home each axis if needed or flagged - homeX = needX || parser.seen_test('X'), - homeY = needY || parser.seen_test('Y'), - homeZZ = homeZ, - homeI = needI || parser.seen_test(AXIS4_NAME), homeJ = needJ || parser.seen_test(AXIS5_NAME), - homeK = needK || parser.seen_test(AXIS6_NAME), homeU = needU || parser.seen_test(AXIS7_NAME), - homeV = needV || parser.seen_test(AXIS8_NAME), homeW = needW || parser.seen_test(AXIS9_NAME) - ), - home_all = NUM_AXIS_GANG( // Home-all if all or none are flagged - homeX == homeX, && homeY == homeX, && homeZ == homeX, - && homeI == homeX, && homeJ == homeX, && homeK == homeX, - && homeU == homeX, && homeV == homeX, && homeW == homeX - ), - NUM_AXIS_LIST( - doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ, - doI = home_all || homeI, doJ = home_all || homeJ, doK = home_all || homeK, - doU = home_all || homeU, doV = home_all || homeV, doW = home_all || homeW - ); - - #if !HAS_Y_AXIS - constexpr bool doY = false; + #if ENABLED(DUAL_X_CARRIAGE) + bool IDEX_saved_duplication_state = extruder_duplication_enabled; + DualXMode IDEX_saved_mode = dual_x_carriage_mode; #endif - #if HAS_Z_AXIS + SET_SOFT_ENDSTOP_LOOSE(false); // Reset a leftover 'loose' motion state - UNUSED(needZ); UNUSED(homeZZ); + // Disable the leveling matrix before homing + #if CAN_SET_LEVELING_AFTER_G28 + const bool leveling_restore_state = parser.boolval('L', TERN1(RESTORE_LEVELING_AFTER_G28, planner.leveling_active)); + #endif - // Z may home first, e.g., when homing away from the bed - TERN_(HOME_Z_FIRST, if (doZ) homeaxis(Z_AXIS)); + // Cancel any prior G29 session + TERN_(PROBE_MANUALLY, g29_in_progress = false); - // 'R' to specify a specific raise. 'R0' indicates no raise, e.g., for recovery.resume - // When 'R0' is used, there should already be adequate clearance, e.g., from homing Z to max. - const bool seenR = parser.seenval('R'); + // Disable leveling before homing + TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); - // Use raise given by 'R' or Z_CLEARANCE_FOR_HOMING (above the probe trigger point) - float z_homing_height = seenR ? parser.value_linear_units() : Z_CLEARANCE_FOR_HOMING; + // Reset to the XY plane + TERN_(CNC_WORKSPACE_PLANES, workspace_plane = PLANE_XY); - // Check for any lateral motion that might require clearance - const bool may_skate = seenR || NUM_AXIS_GANG(doX, || doY, || TERN0(Z_SAFE_HOMING, doZ), || doI, || doJ, || doK, || doU, || doV, || doW); + #define HAS_CURRENT_HOME(N) (defined(N##_CURRENT_HOME) && N##_CURRENT_HOME != N##_CURRENT) + #if HAS_CURRENT_HOME(X) || HAS_CURRENT_HOME(X2) || HAS_CURRENT_HOME(Y) || HAS_CURRENT_HOME(Y2) || (ENABLED(DELTA) && HAS_CURRENT_HOME(Z)) || HAS_CURRENT_HOME(I) || HAS_CURRENT_HOME(J) || HAS_CURRENT_HOME(K) || HAS_CURRENT_HOME(U) || HAS_CURRENT_HOME(V) || HAS_CURRENT_HOME(W) + #define HAS_HOMING_CURRENT 1 + #endif - if (seenR && z_homing_height == 0) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("R0 = No Z raise"); - } - else { - bool with_probe = ENABLED(HOMING_Z_WITH_PROBE); - // Raise above the current Z (which should be synced in the planner) - // The "height" for Z is a coordinate. But if Z is not trusted/homed make it relative. - if (seenR || !TERN(HOME_AFTER_DEACTIVATE, axis_is_trusted, axis_was_homed)(Z_AXIS)) { - z_homing_height += current_position.z; - with_probe = false; + #if HAS_HOMING_CURRENT + auto debug_current = [](FSTR_P const s, const int16_t a, const int16_t b) { + DEBUG_ECHOLN(s, F(" current: "), a, F(" -> "), b); + }; + #if HAS_CURRENT_HOME(X) + const int16_t tmc_save_current_X = stepperX.getMilliamps(); + stepperX.rms_current(X_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_X), tmc_save_current_X, X_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(X2) + const int16_t tmc_save_current_X2 = stepperX2.getMilliamps(); + stepperX2.rms_current(X2_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_X2), tmc_save_current_X2, X2_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(Y) + const int16_t tmc_save_current_Y = stepperY.getMilliamps(); + stepperY.rms_current(Y_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_Y), tmc_save_current_Y, Y_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(Y2) + const int16_t tmc_save_current_Y2 = stepperY2.getMilliamps(); + stepperY2.rms_current(Y2_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_Y2), tmc_save_current_Y2, Y2_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(Z) && ENABLED(DELTA) + const int16_t tmc_save_current_Z = stepperZ.getMilliamps(); + stepperZ.rms_current(Z_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_Z), tmc_save_current_Z, Z_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(I) + const int16_t tmc_save_current_I = stepperI.getMilliamps(); + stepperI.rms_current(I_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_I), tmc_save_current_I, I_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(J) + const int16_t tmc_save_current_J = stepperJ.getMilliamps(); + stepperJ.rms_current(J_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_J), tmc_save_current_J, J_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(K) + const int16_t tmc_save_current_K = stepperK.getMilliamps(); + stepperK.rms_current(K_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_K), tmc_save_current_K, K_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(U) + const int16_t tmc_save_current_U = stepperU.getMilliamps(); + stepperU.rms_current(U_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_U), tmc_save_current_U, U_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(V) + const int16_t tmc_save_current_V = stepperV.getMilliamps(); + stepperV.rms_current(V_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_V), tmc_save_current_V, V_CURRENT_HOME); + #endif + #if HAS_CURRENT_HOME(W) + const int16_t tmc_save_current_W = stepperW.getMilliamps(); + stepperW.rms_current(W_CURRENT_HOME); + if (DEBUGGING(LEVELING)) debug_current(F(STR_W), tmc_save_current_W, W_CURRENT_HOME); + #endif + #if SENSORLESS_STALLGUARD_DELAY + safe_delay(SENSORLESS_STALLGUARD_DELAY); // Short delay needed to settle + #endif + #endif // HAS_HOMING_CURRENT + + #if ENABLED(IMPROVE_HOMING_RELIABILITY) + motion_state_t saved_motion_state = begin_slow_homing(); + #endif + + // Always home with tool 0 active + #if HAS_MULTI_HOTEND + #if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE) + const uint8_t old_tool_index = active_extruder; + #endif + // PARKING_EXTRUDER homing requires different handling of movement / solenoid activation, depending on the side of homing + #if ENABLED(PARKING_EXTRUDER) + const bool pe_final_change_must_unpark = parking_extruder_unpark_after_homing(old_tool_index, X_HOME_DIR + 1 == old_tool_index * 2); + #endif + tool_change(0, true); + #endif + + TERN_(HAS_DUPLICATION_MODE, set_duplication_enabled(false)); + + remember_feedrate_scaling_off(); + + endstops.enable(true); // Enable endstops for next homing move + + bool finalRaiseZ = false; + + #if ENABLED(DELTA) + + constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a DELTA + + home_delta(); + + TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state)); + + #elif ENABLED(AXEL_TPARA) + + constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a TPARA + + home_TPARA(); + + #else // !DELTA && !AXEL_TPARA + + #define _UNSAFE(A) (homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(A##_AXIS)))) + + const bool homeZ = TERN0(HAS_Z_AXIS, parser.seen_test('Z')), + NUM_AXIS_LIST_( // Other axes should be homed before Z safe-homing + needX = _UNSAFE(X), needY = _UNSAFE(Y), needZ = false, // UNUSED + needI = _UNSAFE(I), needJ = _UNSAFE(J), needK = _UNSAFE(K), + needU = _UNSAFE(U), needV = _UNSAFE(V), needW = _UNSAFE(W) + ) + NUM_AXIS_LIST_( // Home each axis if needed or flagged + homeX = needX || parser.seen_test('X'), + homeY = needY || parser.seen_test('Y'), + homeZZ = homeZ, + homeI = needI || parser.seen_test(AXIS4_NAME), homeJ = needJ || parser.seen_test(AXIS5_NAME), + homeK = needK || parser.seen_test(AXIS6_NAME), homeU = needU || parser.seen_test(AXIS7_NAME), + homeV = needV || parser.seen_test(AXIS8_NAME), homeW = needW || parser.seen_test(AXIS9_NAME) + ) + home_all = NUM_AXIS_GANG_( // Home-all if all or none are flagged + homeX == homeX, && homeY == homeX, && homeZ == homeX, + && homeI == homeX, && homeJ == homeX, && homeK == homeX, + && homeU == homeX, && homeV == homeX, && homeW == homeX + ) + NUM_AXIS_LIST( + doX = home_all || homeX, doY = home_all || homeY, doZ = home_all || homeZ, + doI = home_all || homeI, doJ = home_all || homeJ, doK = home_all || homeK, + doU = home_all || homeU, doV = home_all || homeV, doW = home_all || homeW + ); + + #if !HAS_Y_AXIS + constexpr bool doY = false; + #endif + + #if HAS_Z_AXIS + + UNUSED(needZ); UNUSED(homeZZ); + + // Z may home first, e.g., when homing away from the bed. + // This is also permitted when homing with a Z endstop. + if (TERN0(HOME_Z_FIRST, doZ)) homeaxis(Z_AXIS); + + // 'R' to specify a specific raise. 'R0' indicates no raise, e.g., for recovery.resume + // When 'R0' is used, there should already be adequate clearance, e.g., from homing Z to max. + const bool seenR = parser.seenval('R'); + + // Use raise given by 'R' or Z_CLEARANCE_FOR_HOMING (above the probe trigger point) + float z_homing_height = seenR ? parser.value_linear_units() : Z_CLEARANCE_FOR_HOMING; + + // Check for any lateral motion that might require clearance + const bool may_skate = seenR NUM_AXIS_GANG(|| doX, || doY, || TERN0(Z_SAFE_HOMING, doZ), || doI, || doJ, || doK, || doU, || doV, || doW); + + if (seenR && z_homing_height == 0) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("R0 = No Z raise"); + } + else { + bool with_probe = ENABLED(HOMING_Z_WITH_PROBE); + // Raise above the current Z (which should be synced in the planner) + // The "height" for Z is a coordinate. But if Z is not trusted/homed make it relative. + if (seenR || !TERN(HOME_AFTER_DEACTIVATE, axis_is_trusted, axis_was_homed)(Z_AXIS)) { + z_homing_height += current_position.z; + with_probe = false; + } + + if (may_skate) { + // Apply Z clearance before doing any lateral motion + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Raise Z before homing:"); + do_z_clearance(z_homing_height, with_probe); + } } - if (may_skate) { - // Apply Z clearance before doing any lateral motion - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Raise Z before homing:"); - do_z_clearance(z_homing_height, with_probe); + // Init BLTouch ahead of any lateral motion, even if not homing with the probe + TERN_(BLTOUCH, if (may_skate) bltouch.init()); + + #endif // HAS_Z_AXIS + + // Diagonal move first if both are homing + TERN_(QUICK_HOME, if (doX && doY) quick_home_xy()); + + #if HAS_Y_AXIS + // Home Y (before X) + if (ENABLED(HOME_Y_BEFORE_X) && (doY || TERN0(CODEPENDENT_XY_HOMING, doX))) + homeaxis(Y_AXIS); + #endif + + // Home X + #if HAS_X_AXIS + if (doX || (doY && ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X))) { + + #if ENABLED(DUAL_X_CARRIAGE) + + // Always home the 2nd (right) extruder first + active_extruder = 1; + homeaxis(X_AXIS); + + // Remember this extruder's position for later tool change + inactive_extruder_x = current_position.x; + + // Home the 1st (left) extruder + active_extruder = 0; + homeaxis(X_AXIS); + + // Consider the active extruder to be in its "parked" position + idex_set_parked(); + + #else + + homeaxis(X_AXIS); + + #endif } - } + #endif // HAS_X_AXIS - // Init BLTouch ahead of any lateral motion, even if not homing with the probe - TERN_(BLTOUCH, if (may_skate) bltouch.init()); + #if ALL(FOAMCUTTER_XYUV, HAS_I_AXIS) + // Home I (after X) + if (doI) homeaxis(I_AXIS); + #endif - #endif // HAS_Z_AXIS + #if HAS_Y_AXIS + // Home Y (after X) + if (DISABLED(HOME_Y_BEFORE_X) && doY) + homeaxis(Y_AXIS); + #endif - // Diagonal move first if both are homing - TERN_(QUICK_HOME, if (doX && doY) quick_home_xy()); + #if ALL(FOAMCUTTER_XYUV, HAS_J_AXIS) + // Home J (after Y) + if (doJ) homeaxis(J_AXIS); + #endif + + TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state)); + + #if ENABLED(FOAMCUTTER_XYUV) + + // Skip homing of unused Z axis for foamcutters + if (doZ) set_axis_is_at_home(Z_AXIS); + + #elif HAS_Z_AXIS + + // Home Z last if homing towards the bed + #if DISABLED(HOME_Z_FIRST) + if (doZ) { + #if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + stepper.set_all_z_lock(false); + stepper.set_separate_multi_axis(false); + #endif + + #if ENABLED(Z_SAFE_HOMING) + if (TERN1(POWER_LOSS_RECOVERY, !parser.seen_test('H'))) home_z_safely(); else homeaxis(Z_AXIS); + #else + homeaxis(Z_AXIS); + #endif + + #if ANY(Z_HOME_TO_MIN, ALLOW_Z_AFTER_HOMING) + finalRaiseZ = true; + #endif + } + #endif + + SECONDARY_AXIS_CODE( + if (doI) homeaxis(I_AXIS), + if (doJ) homeaxis(J_AXIS), + if (doK) homeaxis(K_AXIS), + if (doU) homeaxis(U_AXIS), + if (doV) homeaxis(V_AXIS), + if (doW) homeaxis(W_AXIS) + ); + + #endif // HAS_Z_AXIS + + sync_plan_position(); - #if HAS_Y_AXIS - // Home Y (before X) - if (ENABLED(HOME_Y_BEFORE_X) && (doY || TERN0(CODEPENDENT_XY_HOMING, doX))) - homeaxis(Y_AXIS); #endif - // Home X - if (doX || (doY && ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X))) { + /** + * Preserve DXC mode across a G28 for IDEX printers in DXC_DUPLICATION_MODE. + * This is important because it lets a user use the LCD Panel to set an IDEX Duplication mode, and + * then print a standard GCode file that contains a single print that does a G28 and has no other + * IDEX specific commands in it. + */ + #if ENABLED(DUAL_X_CARRIAGE) - #if ENABLED(DUAL_X_CARRIAGE) + if (idex_is_duplicating()) { + + TERN_(IMPROVE_HOMING_RELIABILITY, saved_motion_state = begin_slow_homing()); // Always home the 2nd (right) extruder first active_extruder = 1; @@ -469,174 +563,91 @@ void GcodeSuite::G28() { active_extruder = 0; homeaxis(X_AXIS); - // Consider the active extruder to be in its "parked" position + // Consider the active extruder to be parked idex_set_parked(); - #else + dual_x_carriage_mode = IDEX_saved_mode; + set_duplication_enabled(IDEX_saved_duplication_state); - homeaxis(X_AXIS); + TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state)); + } + #endif // DUAL_X_CARRIAGE + + endstops.not_homing(); + + // Clear endstop state for polled stallGuard endstops + TERN_(SPI_ENDSTOPS, endstops.clear_endstop_state()); + + #if HAS_HOMING_CURRENT + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore driver current..."); + #if HAS_CURRENT_HOME(X) + stepperX.rms_current(tmc_save_current_X); #endif - } - - #if BOTH(FOAMCUTTER_XYUV, HAS_I_AXIS) - // Home I (after X) - if (doI) homeaxis(I_AXIS); - #endif - - #if HAS_Y_AXIS - // Home Y (after X) - if (DISABLED(HOME_Y_BEFORE_X) && doY) - homeaxis(Y_AXIS); - #endif - - #if BOTH(FOAMCUTTER_XYUV, HAS_J_AXIS) - // Home J (after Y) - if (doJ) homeaxis(J_AXIS); - #endif - - TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state)); - - #if ENABLED(FOAMCUTTER_XYUV) - - // Skip homing of unused Z axis for foamcutters - if (doZ) set_axis_is_at_home(Z_AXIS); - - #elif HAS_Z_AXIS - - // Home Z last if homing towards the bed - #if DISABLED(HOME_Z_FIRST) - if (doZ) { - #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) - stepper.set_all_z_lock(false); - stepper.set_separate_multi_axis(false); - #endif - - #if ENABLED(Z_SAFE_HOMING) - if (TERN1(POWER_LOSS_RECOVERY, !parser.seen_test('H'))) home_z_safely(); else homeaxis(Z_AXIS); - #else - homeaxis(Z_AXIS); - #endif - do_move_after_z_homing(); - } + #if HAS_CURRENT_HOME(X2) + stepperX2.rms_current(tmc_save_current_X2); #endif + #if HAS_CURRENT_HOME(Y) + stepperY.rms_current(tmc_save_current_Y); + #endif + #if HAS_CURRENT_HOME(Y2) + stepperY2.rms_current(tmc_save_current_Y2); + #endif + #if HAS_CURRENT_HOME(Z) && ENABLED(DELTA) + stepperZ.rms_current(tmc_save_current_Z); + #endif + #if HAS_CURRENT_HOME(I) + stepperI.rms_current(tmc_save_current_I); + #endif + #if HAS_CURRENT_HOME(J) + stepperJ.rms_current(tmc_save_current_J); + #endif + #if HAS_CURRENT_HOME(K) + stepperK.rms_current(tmc_save_current_K); + #endif + #if HAS_CURRENT_HOME(U) + stepperU.rms_current(tmc_save_current_U); + #endif + #if HAS_CURRENT_HOME(V) + stepperV.rms_current(tmc_save_current_V); + #endif + #if HAS_CURRENT_HOME(W) + stepperW.rms_current(tmc_save_current_W); + #endif + #if SENSORLESS_STALLGUARD_DELAY + safe_delay(SENSORLESS_STALLGUARD_DELAY); // Short delay needed to settle + #endif + #endif // HAS_HOMING_CURRENT - SECONDARY_AXIS_CODE( - if (doI) homeaxis(I_AXIS), - if (doJ) homeaxis(J_AXIS), - if (doK) homeaxis(K_AXIS), - if (doU) homeaxis(U_AXIS), - if (doV) homeaxis(V_AXIS), - if (doW) homeaxis(W_AXIS) - ); + // Move to a height where we can use the full xy-area + TERN_(DELTA_HOME_TO_SAFE_ZONE, do_blocking_move_to_z(delta_clip_start_height)); - #endif // HAS_Z_AXIS + // Move to the configured Z only if Z was homed to MIN, because machines that + // home to MAX historically expect 'G28 Z' to be safe to use at the end of a + // print, and do_move_after_z_homing is not very nuanced. + if (finalRaiseZ) do_move_after_z_homing(); - sync_plan_position(); + TERN_(CAN_SET_LEVELING_AFTER_G28, if (leveling_restore_state) set_bed_leveling_enabled()); - #endif - - /** - * Preserve DXC mode across a G28 for IDEX printers in DXC_DUPLICATION_MODE. - * This is important because it lets a user use the LCD Panel to set an IDEX Duplication mode, and - * then print a standard GCode file that contains a single print that does a G28 and has no other - * IDEX specific commands in it. - */ - #if ENABLED(DUAL_X_CARRIAGE) - - if (idex_is_duplicating()) { - - TERN_(IMPROVE_HOMING_RELIABILITY, saved_motion_state = begin_slow_homing()); - - // Always home the 2nd (right) extruder first - active_extruder = 1; - homeaxis(X_AXIS); - - // Remember this extruder's position for later tool change - inactive_extruder_x = current_position.x; - - // Home the 1st (left) extruder - active_extruder = 0; - homeaxis(X_AXIS); - - // Consider the active extruder to be parked - idex_set_parked(); - - dual_x_carriage_mode = IDEX_saved_mode; - set_duplication_enabled(IDEX_saved_duplication_state); - - TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(saved_motion_state)); - } - - #endif // DUAL_X_CARRIAGE - - endstops.not_homing(); - - // Clear endstop state for polled stallGuard endstops - TERN_(SPI_ENDSTOPS, endstops.clear_endstop_state()); - - // Move to a height where we can use the full xy-area - TERN_(DELTA_HOME_TO_SAFE_ZONE, do_blocking_move_to_z(delta_clip_start_height)); - - TERN_(CAN_SET_LEVELING_AFTER_G28, if (leveling_restore_state) set_bed_leveling_enabled()); - - restore_feedrate_and_scaling(); - - // Restore the active tool after homing - #if HAS_MULTI_HOTEND && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) - tool_change(old_tool_index, TERN(PARKING_EXTRUDER, !pe_final_change_must_unpark, DISABLED(DUAL_X_CARRIAGE))); // Do move if one of these - #endif - - #if HAS_HOMING_CURRENT - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore driver current..."); - #if HAS_CURRENT_HOME(X) - stepperX.rms_current(tmc_save_current_X); + // Restore the active tool after homing + #if HAS_MULTI_HOTEND && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) + tool_change(old_tool_index, TERN(PARKING_EXTRUDER, !pe_final_change_must_unpark, DISABLED(DUAL_X_CARRIAGE))); // Do move if one of these #endif - #if HAS_CURRENT_HOME(X2) - stepperX2.rms_current(tmc_save_current_X2); - #endif - #if HAS_CURRENT_HOME(Y) - stepperY.rms_current(tmc_save_current_Y); - #endif - #if HAS_CURRENT_HOME(Y2) - stepperY2.rms_current(tmc_save_current_Y2); - #endif - #if HAS_CURRENT_HOME(Z) && ENABLED(DELTA) - stepperZ.rms_current(tmc_save_current_Z); - #endif - #if HAS_CURRENT_HOME(I) - stepperI.rms_current(tmc_save_current_I); - #endif - #if HAS_CURRENT_HOME(J) - stepperJ.rms_current(tmc_save_current_J); - #endif - #if HAS_CURRENT_HOME(K) - stepperK.rms_current(tmc_save_current_K); - #endif - #if HAS_CURRENT_HOME(U) - stepperU.rms_current(tmc_save_current_U); - #endif - #if HAS_CURRENT_HOME(V) - stepperV.rms_current(tmc_save_current_V); - #endif - #if HAS_CURRENT_HOME(W) - stepperW.rms_current(tmc_save_current_W); - #endif - #if SENSORLESS_STALLGUARD_DELAY - safe_delay(SENSORLESS_STALLGUARD_DELAY); // Short delay needed to settle - #endif - #endif // HAS_HOMING_CURRENT + + restore_feedrate_and_scaling(); + + if (ENABLED(NANODLP_Z_SYNC) && (ENABLED(NANODLP_ALL_AXIS) || TERN0(HAS_Z_AXIS, doZ))) + SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); + + #endif // NUM_AXES ui.refresh(); - TERN_(HAS_DWIN_E3V2_BASIC, DWIN_HomingDone()); + TERN_(HAS_DWIN_E3V2_BASIC, dwinHomingDone()); TERN_(EXTENSIBLE_UI, ExtUI::onHomingDone()); report_current_position(); - if (ENABLED(NANODLP_Z_SYNC) && (ENABLED(NANODLP_ALL_AXIS) || TERN0(HAS_Z_AXIS, doZ))) - SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); - TERN_(FULL_REPORT_TO_HOST_FEATURE, set_and_report_grblstate(old_grblstate)); } diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 61320c0576..ba6cccffab 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -92,8 +92,7 @@ void ac_cleanup(TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index)) { } void print_signed_float(FSTR_P const prefix, const_float_t f) { - SERIAL_ECHOPGM(" "); - SERIAL_ECHOF(prefix, AS_CHAR(':')); + SERIAL_ECHO(F(" "), prefix, AS_CHAR(':')); serial_offset(f); } @@ -170,7 +169,7 @@ static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool */ static float calibration_probe(const xy_pos_t &xy, const bool stow, const bool probe_at_offset) { #if HAS_BED_PROBE - return probe.probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, probe_at_offset, false); + return probe.probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, probe_at_offset, false, Z_PROBE_LOW_POINT, Z_TWEEN_SAFE_CLEARANCE, true); #else UNUSED(stow); return lcd_probe_pt(xy); @@ -476,8 +475,7 @@ void GcodeSuite::G33() { #if HAS_DELTA_SENSORLESS_PROBING if (verbose_level > 0 && do_save_offset_adj) { offset_sensorless_adj.reset(); - - auto caltower = [&](Probe::sense_bool_t s){ + auto caltower = [&](Probe::sense_bool_t s) { float z_at_pt[NPP + 1]; LOOP_CAL_ALL(rad) z_at_pt[rad] = 0.0f; probe.test_sensitivity = s; @@ -637,7 +635,7 @@ void GcodeSuite::G33() { else #endif { - SERIAL_ECHOPAIR_F("std dev:", zero_std_dev_min, 3); + SERIAL_ECHOPGM("std dev:", p_float_t(zero_std_dev_min, 3)); } SERIAL_EOL(); char mess[21]; @@ -658,7 +656,7 @@ void GcodeSuite::G33() { strcpy_P(mess, PSTR("No convergence")); SERIAL_ECHO(mess); SERIAL_ECHO_SP(32); - SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3); + SERIAL_ECHOLNPGM("std dev:", p_float_t(zero_std_dev, 3)); ui.set_status(mess); if (verbose_level > 1) print_calibration_settings(_endstop_results, _angle_results); @@ -666,9 +664,9 @@ void GcodeSuite::G33() { } else { // dry run FSTR_P const enddryrun = F("End DRY-RUN"); - SERIAL_ECHOF(enddryrun); + SERIAL_ECHO(enddryrun); SERIAL_ECHO_SP(35); - SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3); + SERIAL_ECHOLNPGM("std dev:", p_float_t(zero_std_dev, 3)); char mess[21]; strcpy_P(mess, FTOP(enddryrun)); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index db6ef874d9..39f3d2d5df 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfigPre.h" -#if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) +#if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) #include "../../feature/z_stepper_align.h" @@ -153,7 +153,8 @@ void GcodeSuite::G34() { const xy_pos_t diff = z_stepper_align.xy[i] - z_stepper_align.xy[j]; return HYPOT2(diff.x, diff.y); }; - float z_probe = (Z_PROBE_SAFE_CLEARANCE) + (G34_MAX_GRADE) * 0.01f * SQRT(_MAX(0, magnitude2(0, 1) + const float zoffs = (probe.offset.z < 0) ? -probe.offset.z : 0.0f; + float z_probe = (Z_TWEEN_SAFE_CLEARANCE + zoffs) + (G34_MAX_GRADE) * 0.01f * SQRT(_MAX(0, magnitude2(0, 1) #if TRIPLE_Z , magnitude2(2, 1), magnitude2(2, 0) #if QUAD_Z @@ -165,12 +166,6 @@ void GcodeSuite::G34() { // Home before the alignment procedure home_if_needed(); - // Move the Z coordinate realm towards the positive - dirty trick - current_position.z += z_probe * 0.5f; - sync_plan_position(); - // Now, the Z origin lies below the build plate. That allows to probe deeper, before run_z_probe throws an error. - // This hack is un-done at the end of G34 - either by re-homing, or by using the probed heights of the last iteration. - #if !HAS_Z_STEPPER_ALIGN_STEPPER_XY float last_z_align_move[NUM_Z_STEPPERS] = ARRAY_N_1(NUM_Z_STEPPERS, 10000.0f); #else @@ -209,24 +204,20 @@ void GcodeSuite::G34() { float z_measured_max = -100000.0f; // Probe all positions (one per Z-Stepper) - LOOP_L_N(i, NUM_Z_STEPPERS) { + for (uint8_t i = 0; i < NUM_Z_STEPPERS; ++i) { // iteration odd/even --> downward / upward stepper sequence const uint8_t iprobe = (iteration & 1) ? NUM_Z_STEPPERS - 1 - i : i; - // Safe clearance even on an incline - if ((iteration == 0 || i > 0) && z_probe > current_position.z) do_blocking_move_to_z(z_probe); - xy_pos_t &ppos = z_stepper_align.xy[iprobe]; - if (DEBUGGING(LEVELING)) - DEBUG_ECHOLNPGM_P(PSTR("Probing X"), ppos.x, SP_Y_STR, ppos.y); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM_P(PSTR("Probing X"), ppos.x, SP_Y_STR, ppos.y); // Probe a Z height for each stepper. // Probing sanity check is disabled, as it would trigger even in normal cases because // current_position.z has been manually altered in the "dirty trick" above. - const float z_probed_height = probe.probe_at_point(DIFF_TERN(HAS_HOME_OFFSET, ppos, xy_pos_t(home_offset)), raise_after, 0, true, false); + const float z_probed_height = probe.probe_at_point(DIFF_TERN(HAS_HOME_OFFSET, ppos, xy_pos_t(home_offset)), raise_after, 0, true, false, (Z_PROBE_LOW_POINT) - z_probe * 0.5f, z_probe * 0.5f); if (isnan(z_probed_height)) { - SERIAL_ECHOLNPGM("Probing failed"); + SERIAL_ECHOLNPGM(STR_ERR_PROBING_FAILED); LCD_MESSAGE(MSG_LCD_PROBING_FAILED); err_break = true; break; @@ -234,7 +225,7 @@ void GcodeSuite::G34() { // Add height to each value, to provide a more useful target height for // the next iteration of probing. This allows adjustments to be made away from the bed. - z_measured[iprobe] = z_probed_height + (Z_CLEARANCE_BETWEEN_PROBES); + z_measured[iprobe] = z_probed_height + (Z_TWEEN_SAFE_CLEARANCE + zoffs); //do we need to add the clearance to this? if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("> Z", iprobe + 1, " measured position is ", z_measured[iprobe]); @@ -248,7 +239,7 @@ void GcodeSuite::G34() { // Adapt the next probe clearance height based on the new measurements. // Safe_height = lowest distance to bed (= highest measurement) plus highest measured misalignment. z_maxdiff = z_measured_max - z_measured_min; - z_probe = (Z_PROBE_SAFE_CLEARANCE) + z_measured_max + z_maxdiff; + z_probe = (Z_TWEEN_SAFE_CLEARANCE + zoffs) + z_measured_max + z_maxdiff; //Not sure we need z_maxdiff, but leaving it in for safety. #if HAS_Z_STEPPER_ALIGN_STEPPER_XY // Replace the initial values in z_measured with calculated heights at @@ -264,14 +255,14 @@ void GcodeSuite::G34() { // This allows the actual adjustment logic to be shared by both algorithms. linear_fit_data lfd; incremental_LSF_reset(&lfd); - LOOP_L_N(i, NUM_Z_STEPPERS) { + for (uint8_t i = 0; i < NUM_Z_STEPPERS; ++i) { SERIAL_ECHOLNPGM("PROBEPT_", i, ": ", z_measured[i]); incremental_LSF(&lfd, z_stepper_align.xy[i], z_measured[i]); } finish_incremental_LSF(&lfd); z_measured_min = 100000.0f; - LOOP_L_N(i, NUM_Z_STEPPERS) { + for (uint8_t i = 0; i < NUM_Z_STEPPERS; ++i) { z_measured[i] = -(lfd.A * z_stepper_align.stepper_xy[i].x + lfd.B * z_stepper_align.stepper_xy[i].y + lfd.D); z_measured_min = _MIN(z_measured_min, z_measured[i]); } @@ -339,12 +330,12 @@ void GcodeSuite::G34() { // Calculate mean value as a reference float z_measured_mean = 0.0f; - LOOP_L_N(zstepper, NUM_Z_STEPPERS) z_measured_mean += z_measured[zstepper]; + for (uint8_t zstepper = 0; zstepper < NUM_Z_STEPPERS; ++zstepper) z_measured_mean += z_measured[zstepper]; z_measured_mean /= NUM_Z_STEPPERS; // Calculate the sum of the absolute deviations from the mean value float z_align_level_indicator = 0.0f; - LOOP_L_N(zstepper, NUM_Z_STEPPERS) + for (uint8_t zstepper = 0; zstepper < NUM_Z_STEPPERS; ++zstepper) z_align_level_indicator += ABS(z_measured[zstepper] - z_measured_mean); // If it's getting worse, stop and throw an error @@ -359,7 +350,7 @@ void GcodeSuite::G34() { bool success_break = true; // Correct the individual stepper offsets - LOOP_L_N(zstepper, NUM_Z_STEPPERS) { + for (uint8_t zstepper = 0; zstepper < NUM_Z_STEPPERS; ++zstepper) { // Calculate current stepper move float z_align_move = z_measured[zstepper] - z_measured_min; const float z_align_abs = ABS(z_align_move); @@ -420,7 +411,7 @@ void GcodeSuite::G34() { SERIAL_ECHOLNPGM("G34 aborted."); else { SERIAL_ECHOLNPGM("Did ", iteration + (iteration != z_auto_align_iterations), " of ", z_auto_align_iterations); - SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); + SERIAL_ECHOLNPGM("Accuracy: ", p_float_t(z_maxdiff, 2)); } // Stow the probe because the last call to probe.probe_at_point(...) @@ -428,21 +419,19 @@ void GcodeSuite::G34() { IF_DISABLED(TOUCH_MI_PROBE, probe.stow()); #if ENABLED(HOME_AFTER_G34) - // After this operation the z position needs correction - set_axis_never_homed(Z_AXIS); // Home Z after the alignment procedure process_subcommands_now(F("G28Z")); #else // Use the probed height from the last iteration to determine the Z height. // z_measured_min is used, because all steppers are aligned to z_measured_min. // Ideally, this would be equal to the 'z_probe * 0.5f' which was added earlier. - current_position.z -= z_measured_min - float(Z_CLEARANCE_BETWEEN_PROBES); + current_position.z -= z_measured_min - (Z_TWEEN_SAFE_CLEARANCE + zoffs); //we shouldn't want to subtract the clearance from here right? (Depends if we added it further up) sync_plan_position(); #endif probe.use_probing_tool(false); - #if BOTH(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34) + #if ALL(HAS_LEVELING, RESTORE_LEVELING_AFTER_G34) set_bed_leveling_enabled(leveling_was_active); #endif @@ -512,8 +501,7 @@ void GcodeSuite::M422() { } if (!WITHIN(position_index, 1, NUM_Z_STEPPERS)) { - SERIAL_ECHOF(err_string); - SERIAL_ECHOLNPGM(" index invalid (1.." STRINGIFY(NUM_Z_STEPPERS) ")."); + SERIAL_ECHOLN(err_string, F(" index invalid (1.." STRINGIFY(NUM_Z_STEPPERS) ").")); return; } @@ -540,7 +528,7 @@ void GcodeSuite::M422() { void GcodeSuite::M422_report(const bool forReplay/*=true*/) { report_heading(forReplay, F(STR_Z_AUTO_ALIGN)); - LOOP_L_N(i, NUM_Z_STEPPERS) { + for (uint8_t i = 0; i < NUM_Z_STEPPERS; ++i) { report_echo_start(forReplay); SERIAL_ECHOLNPGM_P( PSTR(" M422 S"), i + 1, @@ -549,7 +537,7 @@ void GcodeSuite::M422_report(const bool forReplay/*=true*/) { ); } #if HAS_Z_STEPPER_ALIGN_STEPPER_XY - LOOP_L_N(i, NUM_Z_STEPPERS) { + for (uint8_t i = 0; i < NUM_Z_STEPPERS; ++i) { report_echo_start(forReplay); SERIAL_ECHOLNPGM_P( PSTR(" M422 W"), i + 1, diff --git a/Marlin/src/gcode/calibrate/G425.cpp b/Marlin/src/gcode/calibrate/G425.cpp index e3f8913125..fb211ad88c 100644 --- a/Marlin/src/gcode/calibrate/G425.cpp +++ b/Marlin/src/gcode/calibrate/G425.cpp @@ -70,7 +70,7 @@ #define CALIBRATION_MEASUREMENT_CERTAIN 0.5 // mm #endif -#if BOTH(CALIBRATION_MEASURE_LEFT, CALIBRATION_MEASURE_RIGHT) +#if ALL(HAS_X_AXIS, CALIBRATION_MEASURE_LEFT, CALIBRATION_MEASURE_RIGHT) #define HAS_X_CENTER 1 #endif #if ALL(HAS_Y_AXIS, CALIBRATION_MEASURE_FRONT, CALIBRATION_MEASURE_BACK) @@ -171,7 +171,7 @@ inline void park_above_object(measurements_t &m, const float uncertainty) { #if HAS_HOTEND_OFFSET inline void normalize_hotend_offsets() { - LOOP_S_L_N(e, 1, HOTENDS) + for (uint8_t e = 1; e < HOTENDS; ++e) hotend_offset[e] -= hotend_offset[0]; hotend_offset[0].reset(); } @@ -398,11 +398,13 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { #if AXIS_CAN_CALIBRATE(Z) SERIAL_ECHOLNPGM(" Top: ", m.obj_side[TOP]); #endif - #if ENABLED(CALIBRATION_MEASURE_LEFT) - SERIAL_ECHOLNPGM(" Left: ", m.obj_side[LEFT]); - #endif - #if ENABLED(CALIBRATION_MEASURE_RIGHT) - SERIAL_ECHOLNPGM(" Right: ", m.obj_side[RIGHT]); + #if HAS_X_AXIS + #if ENABLED(CALIBRATION_MEASURE_LEFT) + SERIAL_ECHOLNPGM(" Left: ", m.obj_side[LEFT]); + #endif + #if ENABLED(CALIBRATION_MEASURE_RIGHT) + SERIAL_ECHOLNPGM(" Right: ", m.obj_side[RIGHT]); + #endif #endif #if HAS_Y_AXIS #if ENABLED(CALIBRATION_MEASURE_FRONT) @@ -616,7 +618,7 @@ inline void probe_sides(measurements_t &m, const float uncertainty) { // This function requires normalize_hotend_offsets() to be called // inline void report_hotend_offsets() { - LOOP_S_L_N(e, 1, HOTENDS) + for (uint8_t e = 1; e < HOTENDS; ++e) SERIAL_ECHOLNPGM_P(PSTR("T"), e, PSTR(" Hotend Offset X"), hotend_offset[e].x, SP_Y_STR, hotend_offset[e].y, SP_Z_STR, hotend_offset[e].z); } #endif diff --git a/Marlin/src/gcode/calibrate/G76_M871.cpp b/Marlin/src/gcode/calibrate/G76_M871.cpp index f25c848f2f..6fe3dd89cf 100644 --- a/Marlin/src/gcode/calibrate/G76_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M871.cpp @@ -81,7 +81,7 @@ * - `P` - Run probe temperature calibration. */ -#if BOTH(PTC_PROBE, PTC_BED) +#if ALL(PTC_PROBE, PTC_BED) static void say_waiting_for() { SERIAL_ECHOPGM("Waiting for "); } static void say_waiting_for_probe_heating() { say_waiting_for(); SERIAL_ECHOLNPGM("probe heating."); } @@ -113,7 +113,7 @@ if (isnan(measured_z)) SERIAL_ECHOLNPGM("!Received NAN. Aborting."); else { - SERIAL_ECHOLNPAIR_F("Measured: ", measured_z); + SERIAL_ECHOLNPGM("Measured: ", p_float_t(measured_z, 2)); if (targ == ProbeTempComp::cali_info[sid].start_temp) ptc.prepare_new_calibration(measured_z); else diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index 338392b597..c05fe12fc3 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -60,7 +60,7 @@ #define TEST_BYTE ((char) 0xE5) -#if EITHER(__AVR__, IS_32BIT_TEENSY) +#if ANY(__AVR__, IS_32BIT_TEENSY) extern char __bss_end; char *end_bss = &__bss_end, @@ -163,14 +163,14 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { while (start_free_memory < end_free_memory) { print_hex_address(start_free_memory); // Print the address SERIAL_CHAR(':'); - LOOP_L_N(i, 16) { // and 16 data bytes + for (uint8_t i = 0; i < 16; ++i) { // and 16 data bytes if (i == 8) SERIAL_CHAR('-'); print_hex_byte(start_free_memory[i]); SERIAL_CHAR(' '); } serial_delay(25); SERIAL_CHAR('|'); // Point out non test bytes - LOOP_L_N(i, 16) { + for (uint8_t i = 0; i < 16; ++i) { char ccc = (char)start_free_memory[i]; // cast to char before automatically casting to char on assignment, in case the compiler is broken ccc = (ccc == TEST_BYTE) ? ' ' : '?'; SERIAL_CHAR(ccc); @@ -183,7 +183,7 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { } void M100_dump_routine(FSTR_P const title, const char * const start, const uintptr_t size) { - SERIAL_ECHOLNF(title); + SERIAL_ECHOLN(title); // // Round the start and end locations to produce full lines of output // @@ -197,7 +197,7 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { #endif // M100_FREE_MEMORY_DUMPER inline int check_for_free_memory_corruption(FSTR_P const title) { - SERIAL_ECHOF(title); + SERIAL_ECHO(title); char *start_free_memory = free_memory_start, *end_free_memory = free_memory_end; int n = end_free_memory - start_free_memory; diff --git a/Marlin/src/gcode/calibrate/M425.cpp b/Marlin/src/gcode/calibrate/M425.cpp index 0432b4c962..cd206ca489 100644 --- a/Marlin/src/gcode/calibrate/M425.cpp +++ b/Marlin/src/gcode/calibrate/M425.cpp @@ -112,17 +112,19 @@ void GcodeSuite::M425_report(const bool forReplay/*=true*/) { #ifdef BACKLASH_SMOOTHING_MM , PSTR(" S"), LINEAR_UNIT(backlash.get_smoothing_mm()) #endif - , LIST_N(DOUBLE(NUM_AXES), - SP_X_STR, LINEAR_UNIT(backlash.get_distance_mm(X_AXIS)), - SP_Y_STR, LINEAR_UNIT(backlash.get_distance_mm(Y_AXIS)), - SP_Z_STR, LINEAR_UNIT(backlash.get_distance_mm(Z_AXIS)), - SP_I_STR, I_AXIS_UNIT(backlash.get_distance_mm(I_AXIS)), - SP_J_STR, J_AXIS_UNIT(backlash.get_distance_mm(J_AXIS)), - SP_K_STR, K_AXIS_UNIT(backlash.get_distance_mm(K_AXIS)), - SP_U_STR, U_AXIS_UNIT(backlash.get_distance_mm(U_AXIS)), - SP_V_STR, V_AXIS_UNIT(backlash.get_distance_mm(V_AXIS)), - SP_W_STR, W_AXIS_UNIT(backlash.get_distance_mm(W_AXIS)) - ) + #if NUM_AXES + , LIST_N(DOUBLE(NUM_AXES), + SP_X_STR, LINEAR_UNIT(backlash.get_distance_mm(X_AXIS)), + SP_Y_STR, LINEAR_UNIT(backlash.get_distance_mm(Y_AXIS)), + SP_Z_STR, LINEAR_UNIT(backlash.get_distance_mm(Z_AXIS)), + SP_I_STR, I_AXIS_UNIT(backlash.get_distance_mm(I_AXIS)), + SP_J_STR, J_AXIS_UNIT(backlash.get_distance_mm(J_AXIS)), + SP_K_STR, K_AXIS_UNIT(backlash.get_distance_mm(K_AXIS)), + SP_U_STR, U_AXIS_UNIT(backlash.get_distance_mm(U_AXIS)), + SP_V_STR, V_AXIS_UNIT(backlash.get_distance_mm(V_AXIS)), + SP_W_STR, W_AXIS_UNIT(backlash.get_distance_mm(W_AXIS)) + ) + #endif ); } diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 5e0c21b42e..9f285b8b8a 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -126,15 +126,13 @@ void GcodeSuite::M48() { 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); - SERIAL_ECHOPAIR_F(" Min: ", min, 3); - SERIAL_ECHOPAIR_F(" Max: ", max, 3); - SERIAL_ECHOPAIR_F(" Range: ", max-min, 3); + SERIAL_ECHOPGM("Mean: ", p_float_t(mean, 6)); + if (!final) SERIAL_ECHOPGM(" Sigma: ", p_float_t(sigma, 6)); + SERIAL_ECHOPGM(" Min: ", p_float_t(min, 3), " Max: ", p_float_t(max, 3), " Range: ", p_float_t(max-min, 3)); if (final) SERIAL_EOL(); } if (final) { - SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); + SERIAL_ECHOLNPGM("Standard Deviation: ", p_float_t(sigma, 6)); SERIAL_EOL(); } }; @@ -148,7 +146,7 @@ void GcodeSuite::M48() { float sample_sum = 0.0; - LOOP_L_N(n, n_samples) { + for (uint8_t n = 0; n < n_samples; ++n) { #if HAS_STATUS_MESSAGE // Display M48 progress in the status bar ui.status_printf(0, F(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); @@ -175,7 +173,7 @@ void GcodeSuite::M48() { } // Move from leg to leg in rapid succession - LOOP_L_N(l, n_legs - 1) { + for (uint8_t l = 0; l < n_legs - 1; ++l) { // Move some distance around the perimeter float delta_angle; @@ -207,7 +205,7 @@ void GcodeSuite::M48() { while (!probe.can_reach(next_pos)) { next_pos *= 0.8f; if (verbose_level > 3) - SERIAL_ECHOLNPGM_P(PSTR("Moving inward: X"), next_pos.x, SP_Y_STR, next_pos.y); + SERIAL_ECHOLN(F("Moving inward: X"), next_pos.x, FPSTR(SP_Y_STR), next_pos.y); } #elif HAS_ENDSTOPS // For a rectangular bed just keep the probe in bounds @@ -216,14 +214,14 @@ void GcodeSuite::M48() { #endif if (verbose_level > 3) - SERIAL_ECHOLNPGM_P(PSTR("Going to: X"), next_pos.x, SP_Y_STR, next_pos.y); + SERIAL_ECHOLN(F("Going to: X"), next_pos.x, FPSTR(SP_Y_STR), next_pos.y); do_blocking_move_to_xy(next_pos); } // n_legs loop } // n_legs // Probe a single point - const float pz = probe.probe_at_point(test_position, raise_after, 0); + const float pz = probe.probe_at_point(test_position, raise_after); // Break the loop if the probe fails probing_good = !isnan(pz); @@ -243,14 +241,11 @@ void GcodeSuite::M48() { // Calculate the standard deviation so far. // The value after the last sample will be the final output. float dev_sum = 0.0; - LOOP_LE_N(j, n) dev_sum += sq(sample_set[j] - mean); + for (uint8_t j = 0; j <= n; ++j) dev_sum += sq(sample_set[j] - mean); sigma = SQRT(dev_sum / (n + 1)); if (verbose_level > 1) { - SERIAL_ECHO(n + 1); - SERIAL_ECHOPGM(" of ", n_samples); - SERIAL_ECHOPAIR_F(": z: ", pz, 3); - SERIAL_CHAR(' '); + SERIAL_ECHO(n + 1, F(" of "), n_samples, F(": z: "), p_float_t(pz, 3), AS_CHAR(' ')); dev_report(verbose_level > 2, mean, sigma, min, max); SERIAL_EOL(); } diff --git a/Marlin/src/gcode/calibrate/M666.cpp b/Marlin/src/gcode/calibrate/M666.cpp index 90fad1811c..dbee73f394 100644 --- a/Marlin/src/gcode/calibrate/M666.cpp +++ b/Marlin/src/gcode/calibrate/M666.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS +#if ANY(DELTA, HAS_EXTRA_ENDSTOPS) #include "../gcode.h" diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp index 6c661dcd61..6d3c004548 100644 --- a/Marlin/src/gcode/calibrate/M852.cpp +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -93,11 +93,9 @@ void GcodeSuite::M852() { void GcodeSuite::M852_report(const bool forReplay/*=true*/) { report_heading_etc(forReplay, F(STR_SKEW_FACTOR)); - SERIAL_ECHOPAIR_F(" M852 I", planner.skew_factor.xy, 6); + SERIAL_ECHOPGM(" M852 I", p_float_t(planner.skew_factor.xy, 6)); #if ENABLED(SKEW_CORRECTION_FOR_Z) - SERIAL_ECHOPAIR_F(" J", planner.skew_factor.xz, 6); - SERIAL_ECHOPAIR_F(" K", planner.skew_factor.yz, 6); - SERIAL_ECHOLNPGM(" ; XY, XZ, YZ"); + SERIAL_ECHOLNPGM(" J", p_float_t(planner.skew_factor.xz, 6), " K", p_float_t(planner.skew_factor.yz, 6), " ; XY, XZ, YZ"); #else SERIAL_ECHOLNPGM(" ; XY"); #endif diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp index cda3177d93..e5e1edf326 100644 --- a/Marlin/src/gcode/config/M200-M205.cpp +++ b/Marlin/src/gcode/config/M200-M205.cpp @@ -143,24 +143,32 @@ void GcodeSuite::M201() { void GcodeSuite::M201_report(const bool forReplay/*=true*/) { report_heading_etc(forReplay, F(STR_MAX_ACCELERATION)); - SERIAL_ECHOLNPGM_P( - LIST_N(DOUBLE(NUM_AXES), - PSTR(" M201 X"), LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[X_AXIS]), - SP_Y_STR, LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Y_AXIS]), - SP_Z_STR, LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Z_AXIS]), - SP_I_STR, I_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[I_AXIS]), - SP_J_STR, J_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[J_AXIS]), - SP_K_STR, K_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[K_AXIS]), - SP_U_STR, U_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[U_AXIS]), - SP_V_STR, V_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[V_AXIS]), - SP_W_STR, W_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[W_AXIS]) - ) - #if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS) - , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS]) - #endif - ); + #if NUM_AXES + SERIAL_ECHOPGM_P( + LIST_N(DOUBLE(NUM_AXES), + PSTR(" M201 X"), LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[X_AXIS]), + SP_Y_STR, LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Y_AXIS]), + SP_Z_STR, LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Z_AXIS]), + SP_I_STR, I_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[I_AXIS]), + SP_J_STR, J_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[J_AXIS]), + SP_K_STR, K_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[K_AXIS]), + SP_U_STR, U_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[U_AXIS]), + SP_V_STR, V_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[V_AXIS]), + SP_W_STR, W_AXIS_UNIT(planner.settings.max_acceleration_mm_per_s2[W_AXIS]) + ) + ); + #endif + + #if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS) + SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS])); + #endif + + #if NUM_AXES || (HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS)) + SERIAL_EOL(); + #endif + #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(i, E_STEPPERS) { + for (uint8_t i = 0; i < E_STEPPERS; ++i) { report_echo_start(forReplay); SERIAL_ECHOLNPGM_P( PSTR(" M201 T"), i @@ -191,24 +199,32 @@ void GcodeSuite::M203() { void GcodeSuite::M203_report(const bool forReplay/*=true*/) { report_heading_etc(forReplay, F(STR_MAX_FEEDRATES)); - SERIAL_ECHOLNPGM_P( - LIST_N(DOUBLE(NUM_AXES), - PSTR(" M203 X"), LINEAR_UNIT(planner.settings.max_feedrate_mm_s[X_AXIS]), - SP_Y_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Y_AXIS]), - SP_Z_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Z_AXIS]), - SP_I_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[I_AXIS]), - SP_J_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[J_AXIS]), - SP_K_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[K_AXIS]), - SP_U_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[U_AXIS]), - SP_V_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[V_AXIS]), - SP_W_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[W_AXIS]) - ) - #if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS) - , SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS]) - #endif - ); + #if NUM_AXES + SERIAL_ECHOPGM_P( + LIST_N(DOUBLE(NUM_AXES), + PSTR(" M203 X"), LINEAR_UNIT(planner.settings.max_feedrate_mm_s[X_AXIS]), + SP_Y_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Y_AXIS]), + SP_Z_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Z_AXIS]), + SP_I_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[I_AXIS]), + SP_J_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[J_AXIS]), + SP_K_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[K_AXIS]), + SP_U_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[U_AXIS]), + SP_V_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[V_AXIS]), + SP_W_STR, LINEAR_UNIT(planner.settings.max_feedrate_mm_s[W_AXIS]) + ) + ); + #endif + + #if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS) + SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS])); + #endif + + #if NUM_AXES || (HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS)) + SERIAL_EOL(); + #endif + #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(i, E_STEPPERS) { + for (uint8_t i = 0; i < E_STEPPERS; ++i) { if (!forReplay) SERIAL_ECHO_START(); SERIAL_ECHOLNPGM_P( PSTR(" M203 T"), i @@ -336,7 +352,7 @@ void GcodeSuite::M205_report(const bool forReplay/*=true*/) { #if HAS_JUNCTION_DEVIATION , PSTR(" J"), LINEAR_UNIT(planner.junction_deviation_mm) #endif - #if HAS_CLASSIC_JERK + #if HAS_CLASSIC_JERK && NUM_AXES , LIST_N(DOUBLE(NUM_AXES), SP_X_STR, LINEAR_UNIT(planner.max_jerk.x), SP_Y_STR, LINEAR_UNIT(planner.max_jerk.y), diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index b360739e21..908a19fae7 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -95,7 +95,9 @@ void GcodeSuite::M217() { #if ENABLED(TOOLCHANGE_PARK) if (parser.seenval('W')) { toolchange_settings.enable_park = parser.value_linear_units(); } - if (parser.seenval('X')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.x = constrain(v, X_MIN_POS, X_MAX_POS); } + #if HAS_X_AXIS + if (parser.seenval('X')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.x = constrain(v, X_MIN_POS, X_MAX_POS); } + #endif #if HAS_Y_AXIS if (parser.seenval('Y')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.y = constrain(v, Y_MIN_POS, Y_MAX_POS); } #endif @@ -183,25 +185,27 @@ void GcodeSuite::M217_report(const bool forReplay/*=true*/) { #endif #if ENABLED(TOOLCHANGE_PARK) - { SERIAL_ECHOPGM(" W", LINEAR_UNIT(toolchange_settings.enable_park)); - SERIAL_ECHOPGM_P( - SP_X_STR, LINEAR_UNIT(toolchange_settings.change_point.x) - #if HAS_Y_AXIS - , SP_Y_STR, LINEAR_UNIT(toolchange_settings.change_point.y) - #endif - #if SECONDARY_AXES >= 1 - , LIST_N(DOUBLE(SECONDARY_AXES) - , SP_I_STR, I_AXIS_UNIT(toolchange_settings.change_point.i) - , SP_J_STR, J_AXIS_UNIT(toolchange_settings.change_point.j) - , SP_K_STR, K_AXIS_UNIT(toolchange_settings.change_point.k) - , SP_C_STR, U_AXIS_UNIT(toolchange_settings.change_point.u) - , PSTR(" H"), V_AXIS_UNIT(toolchange_settings.change_point.v) - , PSTR(" O"), W_AXIS_UNIT(toolchange_settings.change_point.w) - ) - #endif - ); - } + #if NUM_AXES + { + SERIAL_ECHOPGM_P( + SP_X_STR, LINEAR_UNIT(toolchange_settings.change_point.x) + #if HAS_Y_AXIS + , SP_Y_STR, LINEAR_UNIT(toolchange_settings.change_point.y) + #endif + #if SECONDARY_AXES >= 1 + , LIST_N(DOUBLE(SECONDARY_AXES) + , SP_I_STR, I_AXIS_UNIT(toolchange_settings.change_point.i) + , SP_J_STR, J_AXIS_UNIT(toolchange_settings.change_point.j) + , SP_K_STR, K_AXIS_UNIT(toolchange_settings.change_point.k) + , SP_C_STR, U_AXIS_UNIT(toolchange_settings.change_point.u) + , PSTR(" H"), V_AXIS_UNIT(toolchange_settings.change_point.v) + , PSTR(" O"), W_AXIS_UNIT(toolchange_settings.change_point.w) + ) + #endif + ); + } + #endif #endif #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) diff --git a/Marlin/src/gcode/config/M218.cpp b/Marlin/src/gcode/config/M218.cpp index c39447a28d..ff63dcaf34 100644 --- a/Marlin/src/gcode/config/M218.cpp +++ b/Marlin/src/gcode/config/M218.cpp @@ -46,9 +46,15 @@ void GcodeSuite::M218() { const int8_t target_extruder = get_target_extruder_from_command(); if (target_extruder < 0) return; - if (parser.seenval('X')) hotend_offset[target_extruder].x = parser.value_linear_units(); - if (parser.seenval('Y')) hotend_offset[target_extruder].y = parser.value_linear_units(); - if (parser.seenval('Z')) hotend_offset[target_extruder].z = parser.value_linear_units(); + #if HAS_X_AXIS + if (parser.seenval('X')) hotend_offset[target_extruder].x = parser.value_linear_units(); + #endif + #if HAS_Y_AXIS + if (parser.seenval('Y')) hotend_offset[target_extruder].y = parser.value_linear_units(); + #endif + #if HAS_Z_AXIS + if (parser.seenval('Z')) hotend_offset[target_extruder].z = parser.value_linear_units(); + #endif #if ENABLED(DELTA) if (target_extruder == active_extruder) @@ -58,14 +64,14 @@ void GcodeSuite::M218() { void GcodeSuite::M218_report(const bool forReplay/*=true*/) { report_heading_etc(forReplay, F(STR_HOTEND_OFFSETS)); - LOOP_S_L_N(e, 1, HOTENDS) { + for (uint8_t e = 1; e < HOTENDS; ++e) { report_echo_start(forReplay); - SERIAL_ECHOPGM_P( + SERIAL_ECHOLNPGM_P( PSTR(" M218 T"), e, SP_X_STR, LINEAR_UNIT(hotend_offset[e].x), - SP_Y_STR, LINEAR_UNIT(hotend_offset[e].y) + SP_Y_STR, LINEAR_UNIT(hotend_offset[e].y), + SP_Z_STR, p_float_t(LINEAR_UNIT(hotend_offset[e].z), 3) ); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(hotend_offset[e].z), 3); } } diff --git a/Marlin/src/gcode/config/M281.cpp b/Marlin/src/gcode/config/M281.cpp index e4ef3ab40b..2e7f08fe86 100644 --- a/Marlin/src/gcode/config/M281.cpp +++ b/Marlin/src/gcode/config/M281.cpp @@ -56,7 +56,7 @@ void GcodeSuite::M281() { void GcodeSuite::M281_report(const bool forReplay/*=true*/) { report_heading_etc(forReplay, F(STR_SERVO_ANGLES)); - LOOP_L_N(i, NUM_SERVOS) { + for (uint8_t i = 0; i < NUM_SERVOS; ++i) { switch (i) { default: break; #if ENABLED(SWITCHING_EXTRUDER) diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp index 12408c8987..26e5a468ca 100644 --- a/Marlin/src/gcode/config/M302.cpp +++ b/Marlin/src/gcode/config/M302.cpp @@ -59,9 +59,7 @@ void GcodeSuite::M302() { else if (!seen_S) { // Report current state SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Cold extrudes are "); - SERIAL_ECHOF(thermalManager.allow_cold_extrude ? F("en") : F("dis")); - SERIAL_ECHOLNPGM("abled (min temp ", thermalManager.extrude_min_temp, "C)"); + SERIAL_ECHOLN(F("Cold extrudes are "), thermalManager.allow_cold_extrude ? F("en") : F("dis"), F("abled (min temp "), thermalManager.extrude_min_temp, F("C)")); } } diff --git a/Marlin/src/gcode/config/M305.cpp b/Marlin/src/gcode/config/M305.cpp index e7746923b3..48d7cf1882 100644 --- a/Marlin/src/gcode/config/M305.cpp +++ b/Marlin/src/gcode/config/M305.cpp @@ -69,7 +69,7 @@ void GcodeSuite::M305() { SERIAL_ECHO_MSG("!Invalid Steinhart-Hart C coeff. (-0.01 < C < +0.01)"); } // If not setting then report parameters else if (t_index < 0) { // ...all user thermistors - LOOP_L_N(i, USER_THERMISTORS) + for (uint8_t i = 0; i < USER_THERMISTORS; ++i) thermalManager.M305_report(i); } else // ...one user thermistor diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index c427fe7a31..5ea89b7136 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -25,7 +25,7 @@ #if ENABLED(PINS_DEBUGGING) #include "../gcode.h" -#include "../../MarlinCore.h" // for pin_is_protected +#include "../../MarlinCore.h" // for pin_is_protected, wait_for_user #include "../../pins/pinsDebug.h" #include "../../module/endstops.h" @@ -61,7 +61,7 @@ inline void toggle_pins() { end = PARSED_PIN_INDEX('L', NUM_DIGITAL_PINS - 1), wait = parser.intval('W', 500); - LOOP_S_LE_N(i, start, end) { + for (uint8_t i = start; i <= end; ++i) { pin_t pin = GET_PIN_MAP_PIN_M43(i); if (!VALID_PIN(pin)) continue; if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) { @@ -139,17 +139,15 @@ inline void servo_probe_test() { bool deploy_state = false, stow_state; #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - constexpr bool probe_hit_state = Z_MIN_ENDSTOP_HIT_STATE; #define PROBE_TEST_PIN Z_MIN_PIN #define _PROBE_PREF "Z_MIN" #else - constexpr bool probe_hit_state = Z_MIN_PROBE_ENDSTOP_HIT_STATE; #define PROBE_TEST_PIN Z_MIN_PROBE_PIN #define _PROBE_PREF "Z_MIN_PROBE" #endif SERIAL_ECHOLNPGM(". Probe " _PROBE_PREF "_PIN: ", PROBE_TEST_PIN); - serial_ternary(probe_hit_state, F(". " _PROBE_PREF "_ENDSTOP_HIT_STATE: "), F("HIGH"), F("LOW")); + serial_ternary(F(". " _PROBE_PREF "_ENDSTOP_HIT_STATE: "), PROBE_HIT_STATE, F("HIGH"), F("LOW")); SERIAL_EOL(); SET_INPUT_PULLUP(PROBE_TEST_PIN); @@ -166,11 +164,11 @@ inline void servo_probe_test() { SERIAL_ECHOLNPGM(". Check for BLTOUCH"); bltouch._reset(); bltouch._stow(); - if (READ(PROBE_TEST_PIN) != probe_hit_state) { + if (!PROBE_TRIGGERED()) { bltouch._set_SW_mode(); - if (READ(PROBE_TEST_PIN) == probe_hit_state) { + if (PROBE_TRIGGERED()) { bltouch._deploy(); - if (READ(PROBE_TEST_PIN) != probe_hit_state) { + if (!PROBE_TRIGGERED()) { bltouch._stow(); SERIAL_ECHOLNPGM("= BLTouch Classic 1.2, 1.3, Smart 1.0, 2.0, 2.2, 3.0, 3.1 detected."); // Check for a 3.1 by letting the user trigger it, later @@ -189,7 +187,7 @@ inline void servo_probe_test() { // DEPLOY and STOW 4 times and see if the signal follows // Then it is a mechanical switch SERIAL_ECHOLNPGM(". Deploy & stow 4 times"); - LOOP_L_N(i, 4) { + for (uint8_t i = 0; i < 4; ++i) { servo[probe_index].move(servo_angles[Z_PROBE_SERVO_NR][0]); // Deploy safe_delay(500); deploy_state = READ(PROBE_TEST_PIN); @@ -198,7 +196,7 @@ inline void servo_probe_test() { stow_state = READ(PROBE_TEST_PIN); } - if (probe_hit_state == deploy_state) SERIAL_ECHOLNPGM("WARNING: " _PROBE_PREF "_ENDSTOP_HIT_STATE is probably wrong."); + if (PROBE_HIT_STATE == deploy_state) SERIAL_ECHOLNPGM("WARNING: " _PROBE_PREF "_ENDSTOP_HIT_STATE is probably wrong."); if (deploy_state != stow_state) { SERIAL_ECHOLNPGM("= Mechanical Switch detected"); @@ -294,9 +292,7 @@ void GcodeSuite::M43() { // 'E' Enable or disable endstop monitoring and return if (parser.seen('E')) { endstops.monitor_flag = parser.value_bool(); - SERIAL_ECHOPGM("endstop monitor "); - SERIAL_ECHOF(endstops.monitor_flag ? F("en") : F("dis")); - SERIAL_ECHOLNPGM("abled"); + SERIAL_ECHOLN(F("endstop monitor "), endstops.monitor_flag ? F("en") : F("dis"), F("abled")); return; } @@ -328,7 +324,7 @@ void GcodeSuite::M43() { const uint8_t pin_count = last_pin - first_pin + 1; uint8_t pin_state[pin_count]; bool can_watch = false; - LOOP_S_LE_N(i, first_pin, last_pin) { + for (uint8_t i = first_pin; i <= last_pin; ++i) { pin_t pin = GET_PIN_MAP_PIN_M43(i); if (!VALID_PIN(pin)) continue; if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue; @@ -371,8 +367,8 @@ void GcodeSuite::M43() { #endif for (;;) { - LOOP_S_LE_N(i, first_pin, last_pin) { - pin_t pin = GET_PIN_MAP_PIN_M43(i); + for (uint8_t i = first_pin; i <= last_pin; ++i) { + const pin_t pin = GET_PIN_MAP_PIN_M43(i); if (!VALID_PIN(pin)) continue; if (M43_NEVER_TOUCH(i) || (!ignore_protection && pin_is_protected(pin))) continue; const byte val = @@ -383,7 +379,7 @@ void GcodeSuite::M43() { //*/ extDigitalRead(pin); if (val != pin_state[i - first_pin]) { - report_pin_state_extended(pin, ignore_protection, false); + report_pin_state_extended(pin, ignore_protection, true); pin_state[i - first_pin] = val; } } @@ -400,8 +396,8 @@ void GcodeSuite::M43() { } else { // Report current state of selected pin(s) - LOOP_S_LE_N(i, first_pin, last_pin) { - pin_t pin = GET_PIN_MAP_PIN_M43(i); + for (uint8_t i = first_pin; i <= last_pin; ++i) { + const pin_t pin = GET_PIN_MAP_PIN_M43(i); if (VALID_PIN(pin)) report_pin_state_extended(pin, ignore_protection, true); } } diff --git a/Marlin/src/gcode/config/M672.cpp b/Marlin/src/gcode/config/M672.cpp index 257b49471f..064d05d0b6 100644 --- a/Marlin/src/gcode/config/M672.cpp +++ b/Marlin/src/gcode/config/M672.cpp @@ -54,7 +54,7 @@ // b3 b2 b1 b0 ~b0 ... lo bits, NOT last bit // void M672_send(uint8_t b) { // bit rate requirement: 1kHz +/- 30% - LOOP_L_N(bits, 14) { + for (uint8_t bits = 0; bits < 14; ++bits) { switch (bits) { default: { OUT_WRITE(SMART_EFFECTOR_MOD_PIN, !!(b & 0x80)); b <<= 1; break; } // send bit, shift next into place case 7: diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp index c7610b83a9..67f55e2232 100644 --- a/Marlin/src/gcode/config/M92.cpp +++ b/Marlin/src/gcode/config/M92.cpp @@ -82,7 +82,7 @@ void GcodeSuite::M92() { if (wanted) { const float best = uint16_t(wanted / z_full_step_mm) * z_full_step_mm; SERIAL_ECHOPGM(", best:[", best); - if (best != wanted) { SERIAL_CHAR(','); SERIAL_DECIMAL(best + z_full_step_mm); } + if (best != wanted) { SERIAL_ECHO(AS_CHAR(','), best + z_full_step_mm); } SERIAL_CHAR(']'); } SERIAL_ECHOLNPGM(" }"); @@ -92,24 +92,30 @@ void GcodeSuite::M92() { void GcodeSuite::M92_report(const bool forReplay/*=true*/, const int8_t e/*=-1*/) { report_heading_etc(forReplay, F(STR_STEPS_PER_UNIT)); - SERIAL_ECHOPGM_P(LIST_N(DOUBLE(NUM_AXES), - PSTR(" M92 X"), LINEAR_UNIT(planner.settings.axis_steps_per_mm[X_AXIS]), - SP_Y_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Y_AXIS]), - SP_Z_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Z_AXIS]), - SP_I_STR, I_AXIS_UNIT(planner.settings.axis_steps_per_mm[I_AXIS]), - SP_J_STR, J_AXIS_UNIT(planner.settings.axis_steps_per_mm[J_AXIS]), - SP_K_STR, K_AXIS_UNIT(planner.settings.axis_steps_per_mm[K_AXIS]), - SP_U_STR, U_AXIS_UNIT(planner.settings.axis_steps_per_mm[U_AXIS]), - SP_V_STR, V_AXIS_UNIT(planner.settings.axis_steps_per_mm[V_AXIS]), - SP_W_STR, W_AXIS_UNIT(planner.settings.axis_steps_per_mm[W_AXIS]) - )); + #if NUM_AXES + SERIAL_ECHOPGM_P(LIST_N(DOUBLE(NUM_AXES), + PSTR(" M92 X"), LINEAR_UNIT(planner.settings.axis_steps_per_mm[X_AXIS]), + SP_Y_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Y_AXIS]), + SP_Z_STR, LINEAR_UNIT(planner.settings.axis_steps_per_mm[Z_AXIS]), + SP_I_STR, I_AXIS_UNIT(planner.settings.axis_steps_per_mm[I_AXIS]), + SP_J_STR, J_AXIS_UNIT(planner.settings.axis_steps_per_mm[J_AXIS]), + SP_K_STR, K_AXIS_UNIT(planner.settings.axis_steps_per_mm[K_AXIS]), + SP_U_STR, U_AXIS_UNIT(planner.settings.axis_steps_per_mm[U_AXIS]), + SP_V_STR, V_AXIS_UNIT(planner.settings.axis_steps_per_mm[V_AXIS]), + SP_W_STR, W_AXIS_UNIT(planner.settings.axis_steps_per_mm[W_AXIS]) + )); + #endif + #if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS) SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.axis_steps_per_mm[E_AXIS])); #endif - SERIAL_EOL(); + + #if NUM_AXES || (HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS)) + SERIAL_EOL(); + #endif #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(i, E_STEPPERS) { + for (uint8_t i = 0; i < E_STEPPERS; ++i) { if (e >= 0 && i != e) continue; report_echo_start(forReplay); SERIAL_ECHOLNPGM_P( diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp index a92d334ae9..02f37f8497 100644 --- a/Marlin/src/gcode/control/M111.cpp +++ b/Marlin/src/gcode/control/M111.cpp @@ -46,7 +46,7 @@ void GcodeSuite::M111() { SERIAL_ECHOPGM(STR_DEBUG_PREFIX); if (marlin_debug_flags) { uint8_t comma = 0; - LOOP_L_N(i, COUNT(debug_strings)) { + for (uint8_t i = 0; i < COUNT(debug_strings); ++i) { if (TEST(marlin_debug_flags, i)) { if (comma++) SERIAL_CHAR(','); SERIAL_ECHOPGM_P((PGM_P)pgm_read_ptr(&debug_strings[i])); diff --git a/Marlin/src/gcode/control/M17_M18_M84.cpp b/Marlin/src/gcode/control/M17_M18_M84.cpp index 76fc335e25..1742d288b3 100644 --- a/Marlin/src/gcode/control/M17_M18_M84.cpp +++ b/Marlin/src/gcode/control/M17_M18_M84.cpp @@ -48,17 +48,19 @@ inline stepper_flags_t selected_axis_bits() { selected.bits = e_axis_mask; } #endif - selected.bits |= NUM_AXIS_GANG( - (parser.seen_test('X') << X_AXIS), - | (parser.seen_test('Y') << Y_AXIS), - | (parser.seen_test('Z') << Z_AXIS), - | (parser.seen_test(AXIS4_NAME) << I_AXIS), - | (parser.seen_test(AXIS5_NAME) << J_AXIS), - | (parser.seen_test(AXIS6_NAME) << K_AXIS), - | (parser.seen_test(AXIS7_NAME) << U_AXIS), - | (parser.seen_test(AXIS8_NAME) << V_AXIS), - | (parser.seen_test(AXIS9_NAME) << W_AXIS) - ); + #if NUM_AXES + selected.bits |= NUM_AXIS_GANG( + (parser.seen_test('X') << X_AXIS), + | (parser.seen_test('Y') << Y_AXIS), + | (parser.seen_test('Z') << Z_AXIS), + | (parser.seen_test(AXIS4_NAME) << I_AXIS), + | (parser.seen_test(AXIS5_NAME) << J_AXIS), + | (parser.seen_test(AXIS6_NAME) << K_AXIS), + | (parser.seen_test(AXIS7_NAME) << U_AXIS), + | (parser.seen_test(AXIS8_NAME) << V_AXIS), + | (parser.seen_test(AXIS9_NAME) << W_AXIS) + ); + #endif return selected; } @@ -71,7 +73,7 @@ void do_enable(const stepper_flags_t to_enable) { if (!shall_enable) return; // All specified axes already enabled? - ena_mask_t also_enabled = 0; // Track steppers enabled due to overlap + ena_mask_t also_enabled = 0; // Track steppers enabled due to overlap // Enable all flagged axes LOOP_NUM_AXES(a) { diff --git a/Marlin/src/gcode/control/M380_M381.cpp b/Marlin/src/gcode/control/M380_M381.cpp index 6bcec891e2..20d24484ed 100644 --- a/Marlin/src/gcode/control/M380_M381.cpp +++ b/Marlin/src/gcode/control/M380_M381.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) +#if ANY(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) #include "../gcode.h" #include "../../feature/solenoid.h" diff --git a/Marlin/src/gcode/control/M42.cpp b/Marlin/src/gcode/control/M42.cpp index 55ece67de7..6e75ffd4e7 100644 --- a/Marlin/src/gcode/control/M42.cpp +++ b/Marlin/src/gcode/control/M42.cpp @@ -25,7 +25,6 @@ #if ENABLED(DIRECT_PIN_CONTROL) #include "../gcode.h" -#include "../../MarlinCore.h" // for pin_is_protected #if HAS_FAN #include "../../module/temperature.h" @@ -38,6 +37,8 @@ #define OUTPUT_OPEN_DRAIN OUTPUT_OPEN_DRAIN #endif +bool pin_is_protected(const pin_t pin); + void protected_pin_err() { SERIAL_ERROR_MSG(STR_ERR_PROTECTED_PIN); } @@ -87,30 +88,8 @@ void GcodeSuite::M42() { #if HAS_FAN switch (pin) { - #if HAS_FAN0 - case FAN0_PIN: thermalManager.fan_speed[0] = pin_status; return; - #endif - #if HAS_FAN1 - case FAN1_PIN: thermalManager.fan_speed[1] = pin_status; return; - #endif - #if HAS_FAN2 - case FAN2_PIN: thermalManager.fan_speed[2] = pin_status; return; - #endif - #if HAS_FAN3 - case FAN3_PIN: thermalManager.fan_speed[3] = pin_status; return; - #endif - #if HAS_FAN4 - case FAN4_PIN: thermalManager.fan_speed[4] = pin_status; return; - #endif - #if HAS_FAN5 - case FAN5_PIN: thermalManager.fan_speed[5] = pin_status; return; - #endif - #if HAS_FAN6 - case FAN6_PIN: thermalManager.fan_speed[6] = pin_status; return; - #endif - #if HAS_FAN7 - case FAN7_PIN: thermalManager.fan_speed[7] = pin_status; return; - #endif + #define _CASE(N) case FAN##N##_PIN: thermalManager.fan_speed[N] = pin_status; return; + REPEAT(FAN_COUNT, _CASE) } #endif diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp index a52c706fa6..6bf99df4c2 100644 --- a/Marlin/src/gcode/control/M605.cpp +++ b/Marlin/src/gcode/control/M605.cpp @@ -127,21 +127,20 @@ case DXC_MIRRORED_MODE: DEBUG_ECHOPGM("MIRRORED"); break; } DEBUG_ECHOPGM("\nActive Ext: ", active_extruder); - if (!active_extruder_parked) DEBUG_ECHOPGM(" NOT "); - DEBUG_ECHOPGM(" parked."); - DEBUG_ECHOPGM("\nactive_extruder_x_pos: ", current_position.x); - DEBUG_ECHOPGM("\ninactive_extruder_x: ", inactive_extruder_x); - DEBUG_ECHOPGM("\nextruder_duplication_enabled: ", extruder_duplication_enabled); - DEBUG_ECHOPGM("\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset); - DEBUG_ECHOPGM("\nduplicate_extruder_temp_offset: ", duplicate_extruder_temp_offset); - DEBUG_ECHOPGM("\ndelayed_move_time: ", delayed_move_time); - DEBUG_ECHOPGM("\nX1 Home X: ", x_home_pos(0), "\nX1_MIN_POS=", X1_MIN_POS, "\nX1_MAX_POS=", X1_MAX_POS); - DEBUG_ECHOPGM("\nX2 Home X: ", x_home_pos(1), "\nX2_MIN_POS=", X2_MIN_POS, "\nX2_MAX_POS=", X2_MAX_POS); - DEBUG_ECHOPGM("\nX2_HOME_DIR=", X2_HOME_DIR, "\nX2_HOME_POS=", X2_HOME_POS); - DEBUG_ECHOPGM("\nDEFAULT_DUAL_X_CARRIAGE_MODE=", STRINGIFY(DEFAULT_DUAL_X_CARRIAGE_MODE)); - DEBUG_ECHOPGM("\toolchange_settings.z_raise=", toolchange_settings.z_raise); - DEBUG_ECHOPGM("\nDEFAULT_DUPLICATION_X_OFFSET=", DEFAULT_DUPLICATION_X_OFFSET); - DEBUG_EOL(); + if (!active_extruder_parked) DEBUG_ECHOPGM(" NOT ", F(" parked.")); + DEBUG_ECHOLNPGM( + "\nactive_extruder_x_pos: ", current_position.x, + "\ninactive_extruder_x: ", inactive_extruder_x, + "\nextruder_duplication_enabled: ", extruder_duplication_enabled, + "\nduplicate_extruder_x_offset: ", duplicate_extruder_x_offset, + "\nduplicate_extruder_temp_offset: ", duplicate_extruder_temp_offset, + "\ndelayed_move_time: ", delayed_move_time, + "\nX1 Home: ", x_home_pos(0), " X1_MIN_POS=", X1_MIN_POS, " X1_MAX_POS=", X1_MAX_POS, + "\nX2 Home: ", x_home_pos(1), " X2_MIN_POS=", X2_MIN_POS, " X2_MAX_POS=", X2_MAX_POS, + "\nDEFAULT_DUAL_X_CARRIAGE_MODE=", STRINGIFY(DEFAULT_DUAL_X_CARRIAGE_MODE), + "\toolchange_settings.z_raise=", toolchange_settings.z_raise, + "\nDEFAULT_DUPLICATION_X_OFFSET=", DEFAULT_DUPLICATION_X_OFFSET + ); HOTEND_LOOP() { DEBUG_ECHOPGM_P(SP_T_STR, e); diff --git a/Marlin/src/gcode/control/M7-M9.cpp b/Marlin/src/gcode/control/M7-M9.cpp index ccde4f552c..837bb114b2 100644 --- a/Marlin/src/gcode/control/M7-M9.cpp +++ b/Marlin/src/gcode/control/M7-M9.cpp @@ -37,7 +37,7 @@ } #endif -#if EITHER(COOLANT_FLOOD, AIR_ASSIST) +#if ANY(COOLANT_FLOOD, AIR_ASSIST) #if ENABLED(AIR_ASSIST) #include "../../feature/spindle_laser.h" diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 90b25e7ed3..2d3e407446 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -48,7 +48,7 @@ // S: Report the current power supply state and exit if (parser.seen('S')) { - SERIAL_ECHOF(powerManager.psu_on ? F("PS:1\n") : F("PS:0\n")); + SERIAL_ECHO(powerManager.psu_on ? F("PS:1\n") : F("PS:0\n")); return; } @@ -79,7 +79,7 @@ void GcodeSuite::M81() { print_job_timer.stop(); - #if BOTH(HAS_FAN, PROBING_FANS_OFF) + #if ALL(HAS_FAN, PROBING_FANS_OFF) thermalManager.fans_paused = false; ZERO(thermalManager.saved_fan_speed); #endif diff --git a/Marlin/src/gcode/control/M993_M994.cpp b/Marlin/src/gcode/control/M993_M994.cpp index f6fe0f34ad..bc634ae13c 100644 --- a/Marlin/src/gcode/control/M993_M994.cpp +++ b/Marlin/src/gcode/control/M993_M994.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if ALL(SPI_FLASH, HAS_MEDIA, MARLIN_DEV_MODE) +#if SPI_FLASH_BACKUP #include "../gcode.h" #include "../../sd/cardreader.h" @@ -85,4 +85,4 @@ void GcodeSuite::M994() { card.closefile(); } -#endif // SPI_FLASH && HAS_MEDIA && MARLIN_DEV_MODE +#endif // SPI_FLASH_BACKUP diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 5e8f6b5436..5e1579ec12 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -23,7 +23,7 @@ #include "../gcode.h" #include "../../module/tool_change.h" -#if EITHER(HAS_MULTI_EXTRUDER, DEBUG_LEVELING_FEATURE) +#if ANY(HAS_MULTI_EXTRUDER, DEBUG_LEVELING_FEATURE) #include "../../module/motion.h" #endif diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp index 8c0da41801..28cc4f8047 100644 --- a/Marlin/src/gcode/feature/advance/M900.cpp +++ b/Marlin/src/gcode/feature/advance/M900.cpp @@ -120,8 +120,7 @@ void GcodeSuite::M900() { EXTRUDER_LOOP() { const bool slot = TEST(lin_adv_slot, e); SERIAL_ECHOLNPGM("Advance T", e, " S", slot, " K", planner.extruder_advance_K[e], - "(S", !slot, " K", other_extruder_advance_K[e], ")"); - SERIAL_EOL(); + "(S", !slot, " K", other_extruder_advance_K[e], ")"); } #endif @@ -132,10 +131,7 @@ void GcodeSuite::M900() { SERIAL_ECHOLNPGM("Advance K=", planner.extruder_advance_K[0]); #else SERIAL_ECHOPGM("Advance K"); - EXTRUDER_LOOP() { - SERIAL_CHAR(' ', '0' + e, ':'); - SERIAL_DECIMAL(planner.extruder_advance_K[e]); - } + EXTRUDER_LOOP() SERIAL_ECHO(AS_CHAR(' '), AS_CHAR('0' + e), AS_CHAR(':'), planner.extruder_advance_K[e]); SERIAL_EOL(); #endif diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp index cf2e47ef6d..f79e80bcc2 100644 --- a/Marlin/src/gcode/feature/camera/M240.cpp +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -84,7 +84,7 @@ inline void spin_photo_pin() { static constexpr uint32_t sequence[] = PHOTO_PULSES_US; - LOOP_L_N(i, COUNT(sequence)) + for (uint8_t i = 0; i < COUNT(sequence); ++i) pulse_photo_pin(sequence[i], !(i & 1)); } diff --git a/Marlin/src/gcode/feature/clean/G12.cpp b/Marlin/src/gcode/feature/clean/G12.cpp index 597d8ce0a0..a5e312f8fd 100644 --- a/Marlin/src/gcode/feature/clean/G12.cpp +++ b/Marlin/src/gcode/feature/clean/G12.cpp @@ -64,7 +64,7 @@ void GcodeSuite::G12() { NOZZLE_CLEAN_DEFAULT_PATTERN #endif ); - const uint8_t strokes = TERN0(NOZZLE_CLEAN_PATTERN_LINEAR, parser.ushortval('S', NOZZLE_CLEAN_STROKES)), + const uint8_t strokes = parser.ushortval('S', NOZZLE_CLEAN_STROKES), objects = TERN0(NOZZLE_CLEAN_PATTERN_ZIGZAG, parser.ushortval('T', NOZZLE_CLEAN_TRIANGLES)); const float radius = TERN0(NOZZLE_CLEAN_PATTERN_CIRCLE, parser.linearval('R', NOZZLE_CLEAN_CIRCLE_RADIUS)); diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index 9ebe713cde..8869f8d494 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -51,7 +51,7 @@ void GcodeSuite::M907() { if (!parser.seen("BS" STR_AXES_LOGICAL)) return M907_report(); - if (parser.seenval('S')) LOOP_L_N(i, MOTOR_CURRENT_COUNT) stepper.set_digipot_current(i, parser.value_int()); + if (parser.seenval('S')) for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) stepper.set_digipot_current(i, parser.value_int()); LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper.set_digipot_current(i, parser.value_int()); // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. Default with NUM_AXES 3: map X Y Z E to X Y Z E0) // Additional extruders use B,C. // TODO: Change these parameters because 'E' is used and D should be reserved for debugging. B? @@ -82,7 +82,7 @@ void GcodeSuite::M907() { #endif )) return M907_report(); - if (parser.seenval('S')) LOOP_L_N(a, MOTOR_CURRENT_COUNT) stepper.set_digipot_current(a, parser.value_int()); + if (parser.seenval('S')) for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) stepper.set_digipot_current(a, parser.value_int()); #if HAS_X_Y_XY_I_J_K_U_V_W if (NUM_AXIS_GANG( @@ -104,7 +104,7 @@ void GcodeSuite::M907() { #if HAS_MOTOR_CURRENT_I2C // this one uses actual amps in floating point - if (parser.seenval('S')) LOOP_L_N(q, DIGIPOT_I2C_NUM_CHANNELS) digipot_i2c.set_current(q, parser.value_float()); + if (parser.seenval('S')) for (uint8_t q = 0; q < DIGIPOT_I2C_NUM_CHANNELS; ++q) digipot_i2c.set_current(q, parser.value_float()); LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) digipot_i2c.set_current(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to pots adresses. Default with NUM_AXES 3 X Y Z E: map to X Y Z E0) // Additional extruders use B,C,D. // TODO: Change these parameters because 'E' is used and because 'D' should be reserved for debugging. B? diff --git a/Marlin/src/gcode/feature/ft_motion/M493.cpp b/Marlin/src/gcode/feature/ft_motion/M493.cpp index 31e16a194d..e3231480f3 100644 --- a/Marlin/src/gcode/feature/ft_motion/M493.cpp +++ b/Marlin/src/gcode/feature/ft_motion/M493.cpp @@ -28,26 +28,98 @@ #include "../../../module/ft_motion.h" void say_shaping() { - SERIAL_ECHO_TERNARY(fxdTiCtrl.cfg_mode, "Fixed time controller ", "en", "dis", "abled"); - if (fxdTiCtrl.cfg_mode == ftMotionMode_DISABLED || fxdTiCtrl.cfg_mode == ftMotionMode_ENABLED) { - SERIAL_ECHOLNPGM("."); - return; - } + // FT Enabled + SERIAL_ECHO_TERNARY(fxdTiCtrl.cfg.mode, "Fixed-Time Motion ", "en", "dis", "abled"); + + // FT Shaping #if HAS_X_AXIS - SERIAL_ECHOPGM(" with "); - switch (fxdTiCtrl.cfg_mode) { - default: break; - //case ftMotionMode_ULENDO_FBS: SERIAL_ECHOLNPGM("Ulendo FBS."); return; - case ftMotionMode_ZV: SERIAL_ECHOLNPGM("ZV"); break; - case ftMotionMode_ZVD: SERIAL_ECHOLNPGM("ZVD"); break; - case ftMotionMode_EI: SERIAL_ECHOLNPGM("EI"); break; - case ftMotionMode_2HEI: SERIAL_ECHOLNPGM("2 Hump EI"); break; - case ftMotionMode_3HEI: SERIAL_ECHOLNPGM("3 Hump EI"); break; - case ftMotionMode_MZV: SERIAL_ECHOLNPGM("MZV"); break; - //case ftMotionMode_DISCTF: SERIAL_ECHOLNPGM("discrete transfer functions"); break; + if (fxdTiCtrl.cfg.mode > ftMotionMode_ENABLED) { + SERIAL_ECHOPGM(" with "); + switch (fxdTiCtrl.cfg.mode) { + default: break; + case ftMotionMode_ZV: SERIAL_ECHOPGM("ZV"); break; + case ftMotionMode_ZVD: SERIAL_ECHOPGM("ZVD"); break; + case ftMotionMode_EI: SERIAL_ECHOPGM("EI"); break; + case ftMotionMode_2HEI: SERIAL_ECHOPGM("2 Hump EI"); break; + case ftMotionMode_3HEI: SERIAL_ECHOPGM("3 Hump EI"); break; + case ftMotionMode_MZV: SERIAL_ECHOPGM("MZV"); break; + //case ftMotionMode_DISCTF: SERIAL_ECHOPGM("discrete transfer functions"); break; + //case ftMotionMode_ULENDO_FBS: SERIAL_ECHOPGM("Ulendo FBS."); return; + } + SERIAL_ECHOPGM(" shaping"); } - SERIAL_ECHOLNPGM(" shaping."); #endif + SERIAL_ECHOLNPGM("."); + + const bool z_based = TERN0(HAS_DYNAMIC_FREQ_MM, fxdTiCtrl.cfg.dynFreqMode == dynFreqMode_Z_BASED), + g_based = TERN0(HAS_DYNAMIC_FREQ_G, fxdTiCtrl.cfg.dynFreqMode == dynFreqMode_MASS_BASED), + dynamic = z_based || g_based; + + // FT Dynamic Frequency Mode + if (fxdTiCtrl.cfg.modeHasShaper()) { + #if HAS_DYNAMIC_FREQ + SERIAL_ECHOPGM("Dynamic Frequency Mode "); + switch (fxdTiCtrl.cfg.dynFreqMode) { + default: + case dynFreqMode_DISABLED: SERIAL_ECHOPGM("disabled"); break; + #if HAS_DYNAMIC_FREQ_MM + case dynFreqMode_Z_BASED: SERIAL_ECHOPGM("Z-based"); break; + #endif + #if HAS_DYNAMIC_FREQ_G + case dynFreqMode_MASS_BASED: SERIAL_ECHOPGM("Mass-based"); break; + #endif + } + SERIAL_ECHOLNPGM("."); + #endif + + #if HAS_X_AXIS + SERIAL_ECHO_TERNARY(dynamic, "X/A ", "base dynamic", "static", " compensator frequency: "); + SERIAL_ECHO(p_float_t(fxdTiCtrl.cfg.baseFreq[X_AXIS], 2), F("Hz")); + #if HAS_DYNAMIC_FREQ + if (dynamic) SERIAL_ECHO(" scaling: ", p_float_t(fxdTiCtrl.cfg.dynFreqK[X_AXIS], 8), F("Hz/"), z_based ? F("mm") : F("g")); + #endif + SERIAL_EOL(); + #endif + + #if HAS_Y_AXIS + SERIAL_ECHO_TERNARY(dynamic, "Y/B ", "base dynamic", "static", " compensator frequency: "); + SERIAL_ECHO(p_float_t(fxdTiCtrl.cfg.baseFreq[Y_AXIS], 2), F(" Hz")); + #if HAS_DYNAMIC_FREQ + if (dynamic) SERIAL_ECHO(F(" scaling: "), p_float_t(fxdTiCtrl.cfg.dynFreqK[Y_AXIS], 8), F("Hz/"), z_based ? F("mm") : F("g")); + #endif + SERIAL_EOL(); + #endif + } + + #if HAS_EXTRUDERS + SERIAL_ECHO_TERNARY(fxdTiCtrl.cfg.linearAdvEna, "Linear Advance ", "en", "dis", "abled"); + SERIAL_ECHOLN(F(". Gain: "), p_float_t(fxdTiCtrl.cfg.linearAdvK, 5)); + #endif +} + +void GcodeSuite::M493_report(const bool forReplay/*=true*/) { + report_heading_etc(forReplay, F(STR_FT_MOTION)); + const ft_config_t &c = fxdTiCtrl.cfg; + SERIAL_ECHOPGM(" M493 S", c.mode); + #if HAS_X_AXIS + SERIAL_ECHOPGM(" A", c.baseFreq[X_AXIS]); + #if HAS_Y_AXIS + SERIAL_ECHOPGM(" B", c.baseFreq[Y_AXIS]); + #endif + #endif + #if HAS_DYNAMIC_FREQ + SERIAL_ECHOPGM(" D", c.dynFreqMode); + #if HAS_X_AXIS + SERIAL_ECHOPGM(" F", c.dynFreqK[X_AXIS]); + #if HAS_Y_AXIS + SERIAL_ECHOPGM(" H", c.dynFreqK[Y_AXIS]); + #endif + #endif + #endif + #if HAS_EXTRUDERS + SERIAL_ECHOPGM(" P", c.linearAdvEna, " K", c.linearAdvK); + #endif + SERIAL_EOL(); } /** @@ -79,45 +151,39 @@ void say_shaping() { * H Set frequency scaling for the Y axis */ void GcodeSuite::M493() { + struct { bool update_n:1, update_a:1, reset_ft:1, report_h:1; } flag = { false }; + + if (!parser.seen_any()) + flag.report_h = true; + else + planner.synchronize(); + // Parse 'S' mode parameter. if (parser.seenval('S')) { - const ftMotionMode_t val = (ftMotionMode_t)parser.value_byte(); - switch (val) { - case ftMotionMode_DISABLED: - case ftMotionMode_ENABLED: - #if HAS_X_AXIS - case ftMotionMode_ZVD: - case ftMotionMode_2HEI: - case ftMotionMode_3HEI: - case ftMotionMode_MZV: - //case ftMotionMode_ULENDO_FBS: - //case ftMotionMode_DISCTF: - fxdTiCtrl.cfg_mode = val; - say_shaping(); - break; - #endif - default: - SERIAL_ECHOLNPGM("?Invalid control mode [M] value."); - return; - } + const ftMotionMode_t oldmm = fxdTiCtrl.cfg.mode, + newmm = (ftMotionMode_t)parser.value_byte(); - switch (val) { - case ftMotionMode_ENABLED: fxdTiCtrl.reset(); break; - #if HAS_X_AXIS - case ftMotionMode_ZV: - case ftMotionMode_ZVD: - case ftMotionMode_EI: - case ftMotionMode_2HEI: - case ftMotionMode_3HEI: - case ftMotionMode_MZV: - fxdTiCtrl.updateShapingN(fxdTiCtrl.cfg_baseFreq[0] OPTARG(HAS_Y_AXIS, fxdTiCtrl.cfg_baseFreq[1])); - fxdTiCtrl.updateShapingA(); - fxdTiCtrl.reset(); + if (newmm != oldmm) { + switch (newmm) { + default: SERIAL_ECHOLNPGM("?Invalid control mode [S] value."); return; + #if HAS_X_AXIS + case ftMotionMode_ZV: + case ftMotionMode_ZVD: + case ftMotionMode_EI: + case ftMotionMode_2HEI: + case ftMotionMode_3HEI: + case ftMotionMode_MZV: + //case ftMotionMode_ULENDO_FBS: + //case ftMotionMode_DISCTF: + flag.update_n = flag.update_a = true; + #endif + case ftMotionMode_DISABLED: + case ftMotionMode_ENABLED: + fxdTiCtrl.cfg.mode = newmm; + flag.report_h = true; + if (oldmm == ftMotionMode_DISABLED) flag.reset_ft = true; break; - //case ftMotionMode_ULENDO_FBS: - //case ftMotionMode_DISCTF: - #endif - default: break; + } } } @@ -126,47 +192,44 @@ void GcodeSuite::M493() { // Pressure control (linear advance) parameter. if (parser.seen('P')) { const bool val = parser.value_bool(); - fxdTiCtrl.cfg_linearAdvEna = val; - SERIAL_ECHO_TERNARY(val, "Pressure control: Linear Advance ", "en", "dis", "abled.\n"); + fxdTiCtrl.cfg.linearAdvEna = val; + SERIAL_ECHO_TERNARY(val, "Linear Advance ", "en", "dis", "abled.\n"); } // Pressure control (linear advance) gain parameter. if (parser.seenval('K')) { const float val = parser.value_float(); if (val >= 0.0f) { - fxdTiCtrl.cfg_linearAdvK = val; - SERIAL_ECHOPGM("Pressure control: Linear Advance gain set to: "); - SERIAL_ECHO_F(val, 5); - SERIAL_ECHOLNPGM("."); - } - else { // Value out of range. - SERIAL_ECHOLNPGM("Pressure control: Linear Advance gain out of range."); + fxdTiCtrl.cfg.linearAdvK = val; + flag.report_h = true; } + else // Value out of range. + SERIAL_ECHOLNPGM("Linear Advance gain out of range."); } #endif // HAS_EXTRUDERS - #if HAS_Z_AXIS || HAS_EXTRUDERS + #if HAS_DYNAMIC_FREQ // Dynamic frequency mode parameter. if (parser.seenval('D')) { - if (WITHIN(fxdTiCtrl.cfg_mode, 10U, 19U)) { + if (fxdTiCtrl.cfg.modeHasShaper()) { const dynFreqMode_t val = dynFreqMode_t(parser.value_byte()); switch (val) { case dynFreqMode_DISABLED: - fxdTiCtrl.cfg_dynFreqMode = val; - SERIAL_ECHOLNPGM("Dynamic frequency mode disabled."); + fxdTiCtrl.cfg.dynFreqMode = val; + flag.report_h = true; break; - #if HAS_Z_AXIS + #if HAS_DYNAMIC_FREQ_MM case dynFreqMode_Z_BASED: - fxdTiCtrl.cfg_dynFreqMode = val; - SERIAL_ECHOLNPGM("Z-based Dynamic Frequency Mode."); + fxdTiCtrl.cfg.dynFreqMode = val; + flag.report_h = true; break; #endif - #if HAS_EXTRUDERS + #if HAS_DYNAMIC_FREQ_G case dynFreqMode_MASS_BASED: - fxdTiCtrl.cfg_dynFreqMode = val; - SERIAL_ECHOLNPGM("Mass-based Dynamic Frequency Mode."); + fxdTiCtrl.cfg.dynFreqMode = val; + flag.report_h = true; break; #endif default: @@ -175,58 +238,46 @@ void GcodeSuite::M493() { } } else { - SERIAL_ECHOLNPGM("Incompatible shaper for [D] Dynamic Frequency mode."); + SERIAL_ECHOLNPGM("?Wrong shaper for [D] Dynamic Frequency mode."); } } - #endif // HAS_Z_AXIS || HAS_EXTRUDERS + const bool modeUsesDynFreq = ( + TERN0(HAS_DYNAMIC_FREQ_MM, fxdTiCtrl.cfg.dynFreqMode == dynFreqMode_Z_BASED) + || TERN0(HAS_DYNAMIC_FREQ_G, fxdTiCtrl.cfg.dynFreqMode == dynFreqMode_MASS_BASED) + ); + + #endif // HAS_DYNAMIC_FREQ #if HAS_X_AXIS // Parse frequency parameter (X axis). if (parser.seenval('A')) { - if (WITHIN(fxdTiCtrl.cfg_mode, 10U, 19U)) { + if (fxdTiCtrl.cfg.modeHasShaper()) { const float val = parser.value_float(); - const bool frequencyInRange = WITHIN(val, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2); // TODO: Frequency minimum is dependent on the shaper used; the above check isn't always correct. - if (frequencyInRange) { - fxdTiCtrl.cfg_baseFreq[0] = val; - fxdTiCtrl.updateShapingN(fxdTiCtrl.cfg_baseFreq[0] OPTARG(HAS_Y_AXIS, fxdTiCtrl.cfg_baseFreq[1])); - fxdTiCtrl.reset(); - if (fxdTiCtrl.cfg_dynFreqMode) { SERIAL_ECHOPGM("Compensator base dynamic frequency (X/A axis) set to:"); } - else { SERIAL_ECHOPGM("Compensator static frequency (X/A axis) set to: "); } - SERIAL_ECHO_F( fxdTiCtrl.cfg_baseFreq[0], 2 ); - SERIAL_ECHOLNPGM("."); - } - else { // Frequency out of range. - SERIAL_ECHOLNPGM("Invalid [A] frequency value."); + if (WITHIN(val, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2)) { + fxdTiCtrl.cfg.baseFreq[X_AXIS] = val; + flag.update_n = flag.reset_ft = flag.report_h = true; } + else // Frequency out of range. + SERIAL_ECHOLNPGM("Invalid [", AS_CHAR('A'), "] frequency value."); } - else { // Mode doesn't use frequency. - SERIAL_ECHOLNPGM("Incompatible mode for [A] frequency."); - } + else // Mode doesn't use frequency. + SERIAL_ECHOLNPGM("Wrong mode for [", AS_CHAR('A'), "] frequency."); } - #if HAS_Z_AXIS || HAS_EXTRUDERS + #if HAS_DYNAMIC_FREQ // Parse frequency scaling parameter (X axis). if (parser.seenval('F')) { - const bool modeUsesDynFreq = ( - TERN0(HAS_Z_AXIS, fxdTiCtrl.cfg_dynFreqMode == dynFreqMode_Z_BASED) - || TERN0(HAS_EXTRUDERS, fxdTiCtrl.cfg_dynFreqMode == dynFreqMode_MASS_BASED) - ); - if (modeUsesDynFreq) { - const float val = parser.value_float(); - fxdTiCtrl.cfg_dynFreqK[0] = val; - SERIAL_ECHOPGM("Frequency scaling (X/A axis) set to: "); - SERIAL_ECHO_F(fxdTiCtrl.cfg_dynFreqK[0], 8); - SERIAL_ECHOLNPGM("."); - } - else { - SERIAL_ECHOLNPGM("Incompatible mode for [F] frequency scaling."); + fxdTiCtrl.cfg.dynFreqK[X_AXIS] = parser.value_float(); + flag.report_h = true; } + else + SERIAL_ECHOLNPGM("Wrong mode for [", AS_CHAR('F'), "] frequency scaling."); } - #endif // HAS_Z_AXIS || HAS_EXTRUDERS + #endif #endif // HAS_X_AXIS @@ -234,49 +285,40 @@ void GcodeSuite::M493() { // Parse frequency parameter (Y axis). if (parser.seenval('B')) { - if (WITHIN(fxdTiCtrl.cfg_mode, 10U, 19U)) { + if (fxdTiCtrl.cfg.modeHasShaper()) { const float val = parser.value_float(); - const bool frequencyInRange = WITHIN(val, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2); - if (frequencyInRange) { - fxdTiCtrl.cfg_baseFreq[1] = val; - fxdTiCtrl.updateShapingN(fxdTiCtrl.cfg_baseFreq[0] OPTARG(HAS_Y_AXIS, fxdTiCtrl.cfg_baseFreq[1])); - fxdTiCtrl.reset(); - if (fxdTiCtrl.cfg_dynFreqMode) { SERIAL_ECHOPGM("Compensator base dynamic frequency (Y/B axis) set to:"); } - else { SERIAL_ECHOPGM("Compensator static frequency (Y/B axis) set to: "); } - SERIAL_ECHO_F( fxdTiCtrl.cfg_baseFreq[1], 2 ); - SERIAL_ECHOLNPGM("."); - } - else { // Frequency out of range. - SERIAL_ECHOLNPGM("Invalid frequency [B] value."); + if (WITHIN(val, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2)) { + fxdTiCtrl.cfg.baseFreq[Y_AXIS] = val; + flag.update_n = flag.reset_ft = flag.report_h = true; } + else // Frequency out of range. + SERIAL_ECHOLNPGM("Invalid frequency [", AS_CHAR('B'), "] value."); } - else { // Mode doesn't use frequency. - SERIAL_ECHOLNPGM("Incompatible mode for [B] frequency."); - } + else // Mode doesn't use frequency. + SERIAL_ECHOLNPGM("Wrong mode for [", AS_CHAR('B'), "] frequency."); } - #if HAS_Z_AXIS || HAS_EXTRUDERS + #if HAS_DYNAMIC_FREQ // Parse frequency scaling parameter (Y axis). if (parser.seenval('H')) { - const bool modeUsesDynFreq = ( - TERN0(HAS_Z_AXIS, fxdTiCtrl.cfg_dynFreqMode == dynFreqMode_Z_BASED) - || TERN0(HAS_EXTRUDERS, fxdTiCtrl.cfg_dynFreqMode == dynFreqMode_MASS_BASED) - ); - if (modeUsesDynFreq) { - const float val = parser.value_float(); - fxdTiCtrl.cfg_dynFreqK[1] = val; - SERIAL_ECHOPGM("Frequency scaling (Y/B axis) set to: "); - SERIAL_ECHO_F(val, 8); - SERIAL_ECHOLNPGM("."); - } - else { - SERIAL_ECHOLNPGM("Incompatible mode for [H] frequency scaling."); + fxdTiCtrl.cfg.dynFreqK[Y_AXIS] = parser.value_float(); + flag.report_h = true; } + else + SERIAL_ECHOLNPGM("Wrong mode for [", AS_CHAR('H'), "] frequency scaling."); } - #endif // HAS_Z_AXIS || HAS_EXTRUDERS + #endif #endif // HAS_Y_AXIS + + #if HAS_X_AXIS + if (flag.update_n) fxdTiCtrl.refreshShapingN(); + if (flag.update_a) fxdTiCtrl.updateShapingA(); + #endif + if (flag.reset_ft) fxdTiCtrl.reset(); + if (flag.report_h) say_shaping(); + } #endif // FT_MOTION diff --git a/Marlin/src/gcode/feature/leds/M7219.cpp b/Marlin/src/gcode/feature/leds/M7219.cpp index 40d3554dfe..1f74217be3 100644 --- a/Marlin/src/gcode/feature/leds/M7219.cpp +++ b/Marlin/src/gcode/feature/leds/M7219.cpp @@ -79,7 +79,7 @@ void GcodeSuite::M7219() { } if (parser.seen('P')) { - LOOP_L_N(r, MAX7219_LINES) { + for (uint8_t r = 0; r < MAX7219_LINES; ++r) { SERIAL_ECHOPGM("led_line["); if (r < 10) SERIAL_CHAR(' '); SERIAL_ECHO(r); diff --git a/Marlin/src/gcode/feature/network/M552-M554.cpp b/Marlin/src/gcode/feature/network/M552-M554.cpp index 0973fb87bf..7633ec1fd5 100644 --- a/Marlin/src/gcode/feature/network/M552-M554.cpp +++ b/Marlin/src/gcode/feature/network/M552-M554.cpp @@ -46,7 +46,7 @@ void MAC_report() { if (ethernet.hardware_enabled) { Ethernet.MACAddress(mac); SERIAL_ECHOPGM(" MAC: "); - LOOP_L_N(i, 6) { + for (uint8_t i = 0; i < 6; ++i) { if (mac[i] < 16) SERIAL_CHAR('0'); SERIAL_PRINT(mac[i], PrintBase::Hex); if (i < 5) SERIAL_CHAR(':'); @@ -59,12 +59,11 @@ void MAC_report() { // otherwise show the stored values void ip_report(const uint16_t cmd, FSTR_P const post, const IPAddress &ipo) { SERIAL_CHAR('M'); SERIAL_ECHO(cmd); SERIAL_CHAR(' '); - LOOP_L_N(i, 4) { + for (uint8_t i = 0; i < 4; ++i) { SERIAL_ECHO(ipo[i]); if (i < 3) SERIAL_CHAR('.'); } - SERIAL_ECHOPGM(" ; "); - SERIAL_ECHOLNF(post); + SERIAL_ECHOLN(F(" ; "), post); } /** diff --git a/Marlin/src/gcode/feature/pause/G60.cpp b/Marlin/src/gcode/feature/pause/G60.cpp index b32935b341..aa74a57596 100644 --- a/Marlin/src/gcode/feature/pause/G60.cpp +++ b/Marlin/src/gcode/feature/pause/G60.cpp @@ -50,16 +50,19 @@ void GcodeSuite::G60() { { const xyze_pos_t &pos = stored_position[slot]; DEBUG_ECHOPGM(STR_SAVED_POS " S", slot, " :"); - DEBUG_ECHOLNPGM_P( - LIST_N(DOUBLE(NUM_AXES), - SP_X_LBL, pos.x, SP_Y_LBL, pos.y, SP_Z_LBL, pos.z, - SP_I_LBL, pos.i, SP_J_LBL, pos.j, SP_K_LBL, pos.k, - SP_U_LBL, pos.u, SP_V_LBL, pos.v, SP_W_LBL, pos.w - ) - #if HAS_EXTRUDERS - , SP_E_LBL, pos.e - #endif - ); + #if NUM_AXES + DEBUG_ECHOPGM_P( + LIST_N(DOUBLE(NUM_AXES), + SP_X_LBL, pos.x, SP_Y_LBL, pos.y, SP_Z_LBL, pos.z, + SP_I_LBL, pos.i, SP_J_LBL, pos.j, SP_K_LBL, pos.k, + SP_U_LBL, pos.u, SP_V_LBL, pos.v, SP_W_LBL, pos.w + ) + ); + #endif + #if HAS_EXTRUDERS + DEBUG_ECHOPGM_P(SP_E_LBL, pos.e); + #endif + DEBUG_EOL(); } #endif } diff --git a/Marlin/src/gcode/feature/pause/G61.cpp b/Marlin/src/gcode/feature/pause/G61.cpp index 0efcfbf208..423632e72e 100644 --- a/Marlin/src/gcode/feature/pause/G61.cpp +++ b/Marlin/src/gcode/feature/pause/G61.cpp @@ -87,8 +87,7 @@ void GcodeSuite::G61() { destination[i] = parser.seen(AXIS_CHAR(i)) ? stored_position[slot][i] + parser.value_axis_units((AxisEnum)i) : current_position[i]; - DEBUG_CHAR(' ', AXIS_CHAR(i)); - DEBUG_ECHO_F(destination[i]); + DEBUG_ECHO(AS_CHAR(' '), AS_CHAR(AXIS_CHAR(i)), p_float_t(destination[i], 2)); } DEBUG_EOL(); // Move to the saved position diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index d6e6cb9315..b8d9d4811b 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -96,7 +96,7 @@ void GcodeSuite::M125() { const bool show_lcd = TERN0(HAS_MARLINUI_MENU, parser.boolval('P')); if (pause_print(retract, park_point, show_lcd, 0)) { - if (ENABLED(EXTENSIBLE_UI) || BOTH(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) || !sd_printing || show_lcd) { + if (ENABLED(HAS_DISPLAY) || ALL(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) || !sd_printing || show_lcd) { wait_for_confirmation(false, 0); resume_print(0, 0, -retract, 0); } diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp index 2afc5c36a0..aec3a16a2a 100644 --- a/Marlin/src/gcode/feature/pause/M701_M702.cpp +++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp @@ -102,7 +102,7 @@ void GcodeSuite::M701() { // Load filament #if HAS_PRUSA_MMU2 - mmu2.load_filament_to_nozzle(target_extruder); + mmu2.load_to_nozzle(target_extruder); #else constexpr float purge_length = ADVANCED_PAUSE_PURGE_LENGTH, slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH; @@ -199,7 +199,7 @@ void GcodeSuite::M702() { #if HAS_PRUSA_MMU2 mmu2.unload(); #else - #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS) + #if ALL(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS) if (!parser.seenval('T')) { HOTEND_LOOP() { if (e != active_extruder) tool_change(e); diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index 1629a154bc..d56f09f71c 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -47,8 +47,7 @@ void menu_job_recovery(); inline void plr_error(FSTR_P const prefix) { #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) DEBUG_ECHO_START(); - DEBUG_ECHOF(prefix); - DEBUG_ECHOLNPGM(" Job Recovery Data"); + DEBUG_ECHOLN(prefix, F(" Job Recovery Data")); #else UNUSED(prefix); #endif @@ -72,7 +71,7 @@ void GcodeSuite::M1000() { #elif HAS_DWIN_E3V2_BASIC recovery.dwin_flag = true; #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) // Temporary fix until it can be better implemented - CrealityDWIN.Popup_Handler(Resume); + crealityDWIN.popupHandler(Resume); #elif ENABLED(EXTENSIBLE_UI) ExtUI::onPowerLossResume(); #else diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp index f6d82b0ad9..5e508d4f28 100644 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ b/Marlin/src/gcode/feature/powerloss/M413.cpp @@ -50,8 +50,8 @@ void GcodeSuite::M413() { if (parser.seen_test('D')) recovery.debug(F("M413")); if (parser.seen_test('O')) recovery._outage(true); if (parser.seen_test('C')) (void)recovery.check(); - if (parser.seen_test('E')) SERIAL_ECHOF(recovery.exists() ? F("PLR Exists\n") : F("No PLR\n")); - if (parser.seen_test('V')) SERIAL_ECHOF(recovery.valid() ? F("Valid\n") : F("Invalid\n")); + if (parser.seen_test('E')) SERIAL_ECHO(recovery.exists() ? F("PLR Exists\n") : F("No PLR\n")); + if (parser.seen_test('V')) SERIAL_ECHO(recovery.valid() ? F("Valid\n") : F("Invalid\n")); #endif } diff --git a/Marlin/src/gcode/feature/trinamic/M122.cpp b/Marlin/src/gcode/feature/trinamic/M122.cpp index 61786d51ad..a1765bfb43 100644 --- a/Marlin/src/gcode/feature/trinamic/M122.cpp +++ b/Marlin/src/gcode/feature/trinamic/M122.cpp @@ -30,6 +30,14 @@ /** * M122: Debug TMC drivers + * + * I - Flag to re-initialize stepper drivers with current settings. + * X, Y, Z, E - Flags to only report the specified axes. + * + * With TMC_DEBUG: + * V - Report raw register data. Refer to the datasheet to decipher the report. + * S - Flag to enable/disable continuous debug reporting. + * P - Interval between continuous debug reports, in milliseconds. */ void GcodeSuite::M122() { xyze_bool_t print_axis = ARRAY_N_1(LOGICAL_AXES, false); diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp index e0aa182bf2..6f1af7b681 100644 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -35,8 +35,7 @@ template void tmc_say_stealth_status(TMC &st) { st.printLabel(); - SERIAL_ECHOPGM(" driver mode:\t"); - SERIAL_ECHOLNF(st.get_stealthChop() ? F("stealthChop") : F("spreadCycle")); + SERIAL_ECHOLN(F(" driver mode:\t"), st.get_stealthChop() ? F("stealthChop") : F("spreadCycle")); } template void tmc_set_stealthChop(TMC &st, const bool enable) { @@ -57,10 +56,12 @@ static void set_stealth_status(const bool enable, const int8_t eindex) { LOOP_LOGICAL_AXES(i) if (parser.seen(AXIS_CHAR(i))) { switch (i) { - case X_AXIS: - TERN_(X_HAS_STEALTHCHOP, if (index < 0 || index == 0) TMC_SET_STEALTH(X)); - TERN_(X2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_STEALTH(X2)); - break; + #if HAS_X_AXIS + case X_AXIS: + TERN_(X_HAS_STEALTHCHOP, if (index < 0 || index == 0) TMC_SET_STEALTH(X)); + TERN_(X2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_STEALTH(X2)); + break; + #endif #if HAS_Y_AXIS case Y_AXIS: @@ -159,10 +160,7 @@ void GcodeSuite::M569_report(const bool forReplay/*=true*/) { auto say_M569 = [](const bool forReplay, FSTR_P const etc=nullptr, const bool eol=false) { if (!forReplay) SERIAL_ECHO_START(); SERIAL_ECHOPGM(" M569 S1"); - if (etc) { - SERIAL_CHAR(' '); - SERIAL_ECHOF(etc); - } + if (etc) SERIAL_ECHO(AS_CHAR(' '), etc); if (eol) SERIAL_EOL(); }; @@ -198,13 +196,13 @@ void GcodeSuite::M569_report(const bool forReplay/*=true*/) { if (chop_x2 || chop_y2 || chop_z2) { say_M569(forReplay, F("I1")); - if (chop_x2) SERIAL_ECHOPGM_P(SP_X_STR); - #if HAS_Y_AXIS - if (chop_y2) SERIAL_ECHOPGM_P(SP_Y_STR); - #endif - #if HAS_Z_AXIS - if (chop_z2) SERIAL_ECHOPGM_P(SP_Z_STR); - #endif + NUM_AXIS_CODE( + if (chop_x2) SERIAL_ECHOPGM_P(SP_X_STR), + if (chop_y2) SERIAL_ECHOPGM_P(SP_Y_STR), + if (chop_z2) SERIAL_ECHOPGM_P(SP_Z_STR), + NOOP, NOOP, NOOP, + NOOP, NOOP, NOOP + ); SERIAL_EOL(); } diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index b2cab13553..b949200ad7 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -328,7 +328,6 @@ void GcodeSuite::M906_report(const bool forReplay/*=true*/) { say_M906(forReplay); SERIAL_ECHOLNPGM(" T7 E", stepperE7.getMilliamps()); #endif - SERIAL_EOL(); } #endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp index 0fbf1def67..fa1cc1227c 100644 --- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp +++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp @@ -35,7 +35,7 @@ #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2160) || AXIS_DRIVER_TYPE(ST, TMC2208) || AXIS_DRIVER_TYPE(ST, TMC2209) || AXIS_DRIVER_TYPE(ST, TMC2660) || AXIS_DRIVER_TYPE(ST, TMC5130) || AXIS_DRIVER_TYPE(ST, TMC5160)) #define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N)) - #if M91x_USE(X) || M91x_USE(X2) + #if HAS_X_AXIS && (M91x_USE(X) || M91x_USE(X2)) #define M91x_SOME_X 1 #endif #if HAS_Y_AXIS && (M91x_USE(Y) || M91x_USE(Y2)) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 06a9600c43..cedcf97c51 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -80,21 +80,9 @@ millis_t GcodeSuite::previous_move_ms = 0, #endif // Relative motion mode for each logical axis -static constexpr xyze_bool_t ar_init = AXIS_RELATIVE_MODES; -axis_bits_t GcodeSuite::axis_relative = 0 LOGICAL_AXIS_GANG( - | (ar_init.e << REL_E), - | (ar_init.x << REL_X), - | (ar_init.y << REL_Y), - | (ar_init.z << REL_Z), - | (ar_init.i << REL_I), - | (ar_init.j << REL_J), - | (ar_init.k << REL_K), - | (ar_init.u << REL_U), - | (ar_init.v << REL_V), - | (ar_init.w << REL_W) -); +relative_t GcodeSuite::axis_relative; // Init in constructor -#if EITHER(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) +#if ANY(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) bool GcodeSuite::autoreport_paused; // = false #endif @@ -117,8 +105,7 @@ void GcodeSuite::report_heading(const bool forReplay, FSTR_P const fstr, const b if (forReplay) return; if (fstr) { SERIAL_ECHO_START(); - SERIAL_ECHOPGM("; "); - SERIAL_ECHOF(fstr); + SERIAL_ECHO(F("; "), fstr); } if (eol) { SERIAL_CHAR(':'); SERIAL_EOL(); } } @@ -216,13 +203,13 @@ void GcodeSuite::get_destination_from_command() { TERN_(LASER_FEATURE, cutter.feedrate_mm_m = MMS_TO_MMM(feedrate_mm_s)); } - #if BOTH(PRINTCOUNTER, HAS_EXTRUDERS) + #if ALL(PRINTCOUNTER, HAS_EXTRUDERS) if (!DEBUGGING(DRYRUN) && !skip_move) print_job_timer.incFilamentUsed(destination.e - current_position.e); #endif // Get ABCDHI mixing factors - #if BOTH(MIXING_EXTRUDER, DIRECT_MIXING_IN_G1) + #if ALL(MIXING_EXTRUDER, DIRECT_MIXING_IN_G1) M165(); #endif @@ -454,7 +441,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 61: G61(); break; // G61: Apply/restore saved coordinates. #endif - #if BOTH(PTC_PROBE, PTC_BED) + #if ALL(PTC_PROBE, PTC_BED) case 76: G76(); break; // G76: Calibrate first layer compensation values #endif @@ -496,11 +483,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 7: M7(); break; // M7: Coolant Mist ON #endif - #if EITHER(AIR_ASSIST, COOLANT_FLOOD) + #if ANY(AIR_ASSIST, COOLANT_FLOOD) case 8: M8(); break; // M8: Air Assist / Coolant Flood ON #endif - #if EITHER(AIR_ASSIST, COOLANT_CONTROL) + #if ANY(AIR_ASSIST, COOLANT_CONTROL) case 9: M9(); break; // M9: Air Assist / Coolant OFF #endif @@ -540,7 +527,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 33: M33(); break; // M33: Get the long full path to a file or folder #endif - #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) + #if ALL(SDCARD_SORT_ALPHA, SDSORT_GCODE) case 34: M34(); break; // M34: Set SD card sorting options #endif @@ -640,7 +627,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 154: M154(); break; // M154: Set position auto-report interval #endif - #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) + #if ALL(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) case 155: M155(); break; // M155: Set temperature auto-report interval #endif @@ -769,6 +756,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ENABLED(BABYSTEPPING) case 290: M290(); break; // M290: Babystepping + #if ENABLED(EP_BABYSTEPPING) + case 293: IF_DISABLED(EMERGENCY_PARSER, M293()); break; // M293: Babystep up + case 294: IF_DISABLED(EMERGENCY_PARSER, M294()); break; // M294: Babystep down + #endif #endif #if HAS_SOUND @@ -836,7 +827,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 364: if (M364()) return; break; // M364: SCARA Psi pos3 (90 deg to Theta) #endif - #if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) + #if ANY(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) case 380: M380(); break; // M380: Activate solenoid on active (or specified) extruder case 381: M381(); break; // M381: Disable all solenoids or, if MANUAL_SOLENOID_CONTROL, active (or specified) solenoid #endif @@ -954,7 +945,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 665: M665(); break; // M665: Set Kinematics parameters #endif - #if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS + #if ANY(DELTA, HAS_EXTRA_ENDSTOPS) case 666: M666(); break; // M666: Set delta or multiple endstop adjustment #endif @@ -995,7 +986,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { #if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_PWM, HAS_MOTOR_CURRENT_I2C, HAS_MOTOR_CURRENT_DAC) case 907: M907(); break; // M907: Set digital trimpot motor current using axis codes. - #if EITHER(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) + #if ANY(HAS_MOTOR_CURRENT_SPI, HAS_MOTOR_CURRENT_DAC) case 908: M908(); break; // M908: Control digital trimpot directly. #if HAS_MOTOR_CURRENT_DAC case 909: M909(); break; // M909: Print digipot/DAC current value @@ -1061,7 +1052,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 422: M422(); break; // M422: Set Z Stepper automatic alignment position using probe #endif - #if ALL(SPI_FLASH, HAS_MEDIA, MARLIN_DEV_MODE) + #if ENABLED(OTA_FIRMWARE_UPDATE) + case 936: M936(); break; // M936: OTA update firmware. + #endif + + #if SPI_FLASH_BACKUP case 993: M993(); break; // M993: Backup SPI Flash to SD case 994: M994(); break; // M994: Load a Backup from SD to SPI Flash #endif @@ -1124,7 +1119,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { if (!no_ok) queue.ok_to_send(); - SERIAL_OUT(msgDone); // Call the msgDone serial hook to signal command processing done + SERIAL_IMPL.msgDone(); // Call the msgDone serial hook to signal command processing done } #if ENABLED(M100_FREE_MEMORY_DUMPER) diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 6a66fa911a..4bd0ec2fec 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -300,6 +300,7 @@ * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) * M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING) * M919 - Get or Set motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc. If no parameters are given, report. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M936 - OTA update firmware. (Requires OTA_FIRMWARE_UPDATE) * M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER) * M3426 - Read MCP3426 ADC over I2C. (Requires HAS_MCP3426_ADC) * M7219 - Control Max7219 Matrix LEDs. (Requires MAX7219_GCODE) @@ -335,7 +336,7 @@ #include "../feature/encoder_i2c.h" #endif -#if EITHER(IS_SCARA, POLAR) || defined(G0_FEEDRATE) +#if ANY(IS_SCARA, POLAR) || defined(G0_FEEDRATE) #define HAS_FAST_MOVES 1 #endif @@ -344,14 +345,20 @@ enum AxisRelative : uint8_t { #if HAS_EXTRUDERS , E_MODE_ABS, E_MODE_REL #endif + , NUM_REL_MODES }; +typedef bits_t(NUM_REL_MODES) relative_t; extern const char G28_STR[]; class GcodeSuite { public: - static axis_bits_t axis_relative; + static relative_t axis_relative; + + GcodeSuite() { // Relative motion mode for each logical axis + axis_relative = AxisBits(AXIS_RELATIVE_MODES).bits; + } static bool axis_is_relative(const AxisEnum a) { #if HAS_EXTRUDERS @@ -435,7 +442,7 @@ public: process_subcommands_now(keep_leveling ? FPSTR(G28_STR) : TERN(CAN_SET_LEVELING_AFTER_G28, F("G28L0"), FPSTR(G28_STR))); } - #if EITHER(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) + #if ANY(HAS_AUTO_REPORTING, HOST_KEEPALIVE_FEATURE) static bool autoreport_paused; static bool set_autoreport_paused(const bool p) { const bool was = autoreport_paused; @@ -585,7 +592,7 @@ private: static void G59(); #endif - #if BOTH(PTC_PROBE, PTC_BED) + #if ALL(PTC_PROBE, PTC_BED) static void G76(); #endif @@ -617,11 +624,11 @@ private: static void M7(); #endif - #if EITHER(AIR_ASSIST, COOLANT_FLOOD) + #if ANY(AIR_ASSIST, COOLANT_FLOOD) static void M8(); #endif - #if EITHER(AIR_ASSIST, COOLANT_CONTROL) + #if ANY(AIR_ASSIST, COOLANT_CONTROL) static void M9(); #endif @@ -665,7 +672,7 @@ private: #if ENABLED(LONG_FILENAME_HOST_SUPPORT) static void M33(); #endif - #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) + #if ALL(SDCARD_SORT_ALPHA, SDSORT_GCODE) static void M34(); #endif #endif @@ -713,7 +720,6 @@ private: #if ENABLED(BD_SENSOR) static void M102(); - static void M102_report(const bool forReplay=true); #endif #if HAS_HOTEND @@ -814,7 +820,7 @@ private: static void M154(); #endif - #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) + #if ALL(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) static void M155(); #endif @@ -923,6 +929,10 @@ private: #if ENABLED(BABYSTEPPING) static void M290(); + #if ENABLED(EP_BABYSTEPPING) + static void M293(); + static void M294(); + #endif #endif #if HAS_SOUND @@ -982,7 +992,7 @@ private: static bool M364(); #endif - #if EITHER(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) + #if ANY(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL) static void M380(); static void M381(); #endif @@ -1040,6 +1050,7 @@ private: #if ENABLED(FT_MOTION) static void M493(); + static void M493_report(const bool forReplay=true); #endif static void M500(); @@ -1108,7 +1119,7 @@ private: static void M665_report(const bool forReplay=true); #endif - #if EITHER(DELTA, HAS_EXTRA_ENDSTOPS) + #if ANY(DELTA, HAS_EXTRA_ENDSTOPS) static void M666(); static void M666_report(const bool forReplay=true); #endif @@ -1199,6 +1210,10 @@ private: static void M928(); #endif + #if ENABLED(OTA_FIRMWARE_UPDATE) + static void M936(); + #endif + #if ENABLED(MAGNETIC_PARKING_EXTRUDER) static void M951(); #endif @@ -1207,7 +1222,7 @@ private: static void M995(); #endif - #if BOTH(SPI_FLASH, HAS_MEDIA) + #if SPI_FLASH_BACKUP static void M993(); static void M994(); #endif diff --git a/Marlin/src/gcode/geometry/G17-G19.cpp b/Marlin/src/gcode/geometry/G17-G19.cpp index fbac7470ca..312b89286c 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 "); - SERIAL_ECHOF( + SERIAL_ECHO( gcode.workspace_plane == GcodeSuite::PLANE_YZ ? F("YZ\n") : gcode.workspace_plane == GcodeSuite::PLANE_ZX ? F("ZX\n") : F("XY\n") diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp index b36f21d3c0..dfe4170620 100644 --- a/Marlin/src/gcode/geometry/G92.cpp +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -88,28 +88,28 @@ void GcodeSuite::G92() { case 0: LOOP_LOGICAL_AXES(i) { if (parser.seenval(AXIS_CHAR(i))) { - const float l = parser.value_axis_units((AxisEnum)i), // Given axis coordinate value, converted to millimeters + const float l = parser.value_axis_units((AxisEnum)i), // Given axis coordinate value, converted to millimeters v = TERN0(HAS_EXTRUDERS, 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? + d = v - current_position[i]; // How much is the current axis position altered by? if (!NEAR_ZERO(d)) { - #if HAS_POSITION_SHIFT && NONE(IS_SCARA, POLARGRAPH) // When using workspaces... + #if HAS_POSITION_SHIFT && NONE(IS_SCARA, POLARGRAPH) // When using workspaces... if (TERN1(HAS_EXTRUDERS, i != E_AXIS)) { - position_shift[i] += d; // ...most axes offset the workspace... + position_shift[i] += d; // ...most axes offset the workspace... update_workspace_offset((AxisEnum)i); } else { #if HAS_EXTRUDERS sync_E = true; - current_position.e = v; // ...but E is set directly + current_position.e = v; // ...but E is set directly #endif } - #else // Without workspaces... + #else // Without workspaces... if (TERN1(HAS_EXTRUDERS, i != E_AXIS)) sync_XYZE = true; else { TERN_(HAS_EXTRUDERS, sync_E = true); } - current_position[i] = v; // ...set Current Position directly (like Marlin 1.0) + current_position[i] = v; // ...set Current Position directly (like Marlin 1.0) #endif } } diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp index e6e83ba6e5..979764f75e 100644 --- a/Marlin/src/gcode/host/M114.cpp +++ b/Marlin/src/gcode/host/M114.cpp @@ -30,7 +30,7 @@ void report_all_axis_pos(const xyze_pos_t &pos, const uint8_t n=LOGICAL_AXES, const uint8_t precision=3) { char str[12]; - LOOP_L_N(a, n) { + for (uint8_t a = 0; a < n; ++a) { SERIAL_ECHOPGM_P((PGM_P)pgm_read_ptr(&SP_AXIS_LBL[a])); if (pos[a] >= 0) SERIAL_CHAR(' '); SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); @@ -128,9 +128,7 @@ void GcodeSuite::M114() { #if ENABLED(M114_DETAIL) if (parser.seen_test('D')) { - #if DISABLED(M114_LEGACY) - planner.synchronize(); - #endif + IF_DISABLED(M114_LEGACY, planner.synchronize()); report_current_position(); report_current_position_detail(); return; @@ -143,9 +141,7 @@ void GcodeSuite::M114() { #endif #endif - #if ENABLED(M114_REALTIME) - if (parser.seen_test('R')) { report_real_position(); return; } - #endif + TERN_(M114_REALTIME, if (parser.seen_test('R')) return report_real_position()); TERN_(M114_LEGACY, planner.synchronize()); report_current_position_projected(); diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 236895e107..806e593fcb 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -39,28 +39,24 @@ //#define MINIMAL_CAP_LINES // Don't even mention the disabled capabilities #if ENABLED(EXTENDED_CAPABILITIES_REPORT) - #if ENABLED(MINIMAL_CAP_LINES) - #define cap_line(S,C) if (C) _cap_line(S) - static void _cap_line(FSTR_P const name) { - SERIAL_ECHOPGM("Cap:"); - SERIAL_ECHOF(name); - SERIAL_ECHOLNPGM(":1"); - } - #else - #define cap_line(V...) _cap_line(V) - static void _cap_line(FSTR_P const name, bool ena=false) { - SERIAL_ECHOPGM("Cap:"); - SERIAL_ECHOF(name); + inline void cap_line(FSTR_P const name, const bool ena=true) { + #if ENABLED(MINIMAL_CAP_LINES) + if (ena) SERIAL_ECHOLNPGM("Cap:", name, ":1"); + #else + SERIAL_ECHOPGM("Cap:", name); SERIAL_CHAR(':', '0' + ena); SERIAL_EOL(); - } - #endif + #endif + } #endif /** * M115: Capabilities string and extended capabilities report * If a capability is not reported, hosts should assume * the capability is not present. + * + * NOTE: Always make sure to add new capabilities to the RepRap Wiki + * at https://reprap.org/wiki/Firmware_Capabilities_Protocol */ void GcodeSuite::M115() { SERIAL_ECHOPGM("FIRMWARE_NAME:Marlin" @@ -85,7 +81,7 @@ void GcodeSuite::M115() { // Although this code should work on all STM32 based boards SERIAL_ECHOPGM(" UUID:"); uint32_t *uid_address = (uint32_t*)UID_BASE; - LOOP_L_N(i, 3) { + for (uint8_t i = 0; i < 3; ++i) { const uint32_t UID = uint32_t(READ_REG(*(uid_address))); uid_address += 4U; for (int B = 24; B >= 0; B -= 8) print_hex_byte(UID >> B); @@ -100,10 +96,10 @@ void GcodeSuite::M115() { serial_index_t port = queue.ring_buffer.command_port(); // PAREN_COMMENTS - TERN_(PAREN_COMMENTS, cap_line(F("PAREN_COMMENTS"), true)); + TERN_(PAREN_COMMENTS, cap_line(F("PAREN_COMMENTS"))); // QUOTED_STRINGS - TERN_(GCODE_QUOTED_STRINGS, cap_line(F("QUOTED_STRINGS"), true)); + TERN_(GCODE_QUOTED_STRINGS, cap_line(F("QUOTED_STRINGS"))); // SERIAL_XON_XOFF cap_line(F("SERIAL_XON_XOFF"), ENABLED(SERIAL_XON_XOFF)); @@ -124,10 +120,10 @@ void GcodeSuite::M115() { cap_line(F("AUTOREPORT_TEMP"), ENABLED(AUTO_REPORT_TEMPERATURES)); // PROGRESS (M530 S L, M531 , M532 X L) - cap_line(F("PROGRESS")); + cap_line(F("PROGRESS"), false); // Print Job timer M75, M76, M77 - cap_line(F("PRINT_JOB"), true); + cap_line(F("PRINT_JOB")); // AUTOLEVEL (G29) cap_line(F("AUTOLEVEL"), ENABLED(HAS_AUTOLEVEL)); @@ -153,9 +149,9 @@ void GcodeSuite::M115() { // SPINDLE AND LASER CONTROL (M3, M4, M5) #if ENABLED(SPINDLE_FEATURE) - cap_line(F("SPINDLE"), true); + cap_line(F("SPINDLE")); #elif ENABLED(LASER_FEATURE) - cap_line(F("LASER"), true); + cap_line(F("LASER")); #endif // EMERGENCY_PARSER (M108, M112, M410, M876) @@ -208,6 +204,9 @@ void GcodeSuite::M115() { // BABYSTEPPING (M290) cap_line(F("BABYSTEPPING"), ENABLED(BABYSTEPPING)); + // EP_BABYSTEP (M293, M294) + cap_line(F("EP_BABYSTEP"), ENABLED(EP_BABYSTEPPING)); + // CHAMBER_TEMPERATURE (M141, M191) cap_line(F("CHAMBER_TEMPERATURE"), ENABLED(HAS_HEATED_CHAMBER)); @@ -223,9 +222,9 @@ void GcodeSuite::M115() { // Machine Geometry #if ENABLED(M115_GEOMETRY_REPORT) constexpr xyz_pos_t bmin{0}, - bmax = ARRAY_N(NUM_AXES, X_BED_SIZE, Y_BED_SIZE, Z_MAX_POS, I_MAX_POS, J_MAX_POS, K_MAX_POS, U_MAX_POS, V_MAX_POS, W_MAX_POS), - dmin = ARRAY_N(NUM_AXES, X_MIN_POS, Y_MIN_POS, Z_MIN_POS, I_MIN_POS, J_MIN_POS, K_MIN_POS, U_MIN_POS, V_MIN_POS, W_MIN_POS), - dmax = ARRAY_N(NUM_AXES, X_MAX_POS, Y_MAX_POS, Z_MAX_POS, I_MAX_POS, J_MAX_POS, K_MAX_POS, U_MAX_POS, V_MAX_POS, W_MAX_POS); + bmax = NUM_AXIS_ARRAY(X_BED_SIZE, Y_BED_SIZE, Z_MAX_POS, I_MAX_POS, J_MAX_POS, K_MAX_POS, U_MAX_POS, V_MAX_POS, W_MAX_POS), + dmin = NUM_AXIS_ARRAY(X_MIN_POS, Y_MIN_POS, Z_MIN_POS, I_MIN_POS, J_MIN_POS, K_MIN_POS, U_MIN_POS, V_MIN_POS, W_MIN_POS), + dmax = NUM_AXIS_ARRAY(X_MAX_POS, Y_MAX_POS, Z_MAX_POS, I_MAX_POS, J_MAX_POS, K_MAX_POS, U_MAX_POS, V_MAX_POS, W_MAX_POS); xyz_pos_t cmin = bmin, cmax = bmax; apply_motion_limits(cmin); apply_motion_limits(cmax); diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 942d20afd2..d72d5d6789 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -62,7 +62,7 @@ void GcodeSuite::M145() { void GcodeSuite::M145_report(const bool forReplay/*=true*/) { report_heading(forReplay, F(STR_MATERIAL_HEATUP)); - LOOP_L_N(i, PREHEAT_COUNT) { + for (uint8_t i = 0; i < PREHEAT_COUNT; ++i) { report_echo_start(forReplay); SERIAL_ECHOLNPGM_P( PSTR(" M145 S"), i diff --git a/Marlin/src/gcode/lcd/M73.cpp b/Marlin/src/gcode/lcd/M73.cpp index 02d44ca00b..5ac2839beb 100644 --- a/Marlin/src/gcode/lcd/M73.cpp +++ b/Marlin/src/gcode/lcd/M73.cpp @@ -49,28 +49,20 @@ */ void GcodeSuite::M73() { - #if ENABLED(DWIN_LCD_PROUI) + #if ENABLED(SET_PROGRESS_PERCENT) + if (parser.seenval('P')) + ui.set_progress((PROGRESS_SCALE) > 1 + ? parser.value_float() * (PROGRESS_SCALE) + : parser.value_byte() + ); + #endif - DWIN_M73(); - - #else - - #if ENABLED(SET_PROGRESS_PERCENT) - if (parser.seenval('P')) - ui.set_progress((PROGRESS_SCALE) > 1 - ? parser.value_float() * (PROGRESS_SCALE) - : parser.value_byte() - ); - #endif - - #if ENABLED(SET_REMAINING_TIME) - if (parser.seenval('R')) ui.set_remaining_time(60 * parser.value_ulong()); - #endif - - #if ENABLED(SET_INTERACTION_TIME) - if (parser.seenval('C')) ui.set_interaction_time(60 * parser.value_ulong()); - #endif + #if ENABLED(SET_REMAINING_TIME) + if (parser.seenval('R')) ui.set_remaining_time(60 * parser.value_ulong()); + #endif + #if ENABLED(SET_INTERACTION_TIME) + if (parser.seenval('C')) ui.set_interaction_time(60 * parser.value_ulong()); #endif #if ENABLED(M73_REPORT) diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp index 88551f5eb6..957541a361 100644 --- a/Marlin/src/gcode/motion/G0_G1.cpp +++ b/Marlin/src/gcode/motion/G0_G1.cpp @@ -25,7 +25,7 @@ #include "../../MarlinCore.h" -#if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) +#if ALL(FWRETRACT, FWRETRACT_AUTORETRACT) #include "../../feature/fwretract.h" #endif @@ -72,7 +72,7 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { } #endif - #if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) + #if ALL(FWRETRACT, FWRETRACT_AUTORETRACT) if (MIN_AUTORETRACT <= MAX_AUTORETRACT) { // When M209 Autoretract is enabled, convert E-only moves to firmware retract/recover moves @@ -91,7 +91,7 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) { #endif // FWRETRACT - #if EITHER(IS_SCARA, POLAR) + #if ANY(IS_SCARA, POLAR) fast_move ? prepare_fast_move_to_destination() : prepare_line_to_destination(); #else prepare_line_to_destination(); diff --git a/Marlin/src/gcode/motion/G2_G3.cpp b/Marlin/src/gcode/motion/G2_G3.cpp index 1cae82f71c..b3a281bcc8 100644 --- a/Marlin/src/gcode/motion/G2_G3.cpp +++ b/Marlin/src/gcode/motion/G2_G3.cpp @@ -303,7 +303,7 @@ void plan_arc( // d) allows the print head to stop in the remining length of the curve within all configured maximum accelerations. // The last has to be calculated every time through the loop. const float limiting_accel = _MIN(planner.settings.max_acceleration_mm_per_s2[axis_p], planner.settings.max_acceleration_mm_per_s2[axis_q]), - limiting_speed = _MIN(planner.settings.max_feedrate_mm_s[axis_p], planner.settings.max_acceleration_mm_per_s2[axis_q]), + limiting_speed = _MIN(planner.settings.max_feedrate_mm_s[axis_p], planner.settings.max_feedrate_mm_s[axis_q]), limiting_speed_sqr = _MIN(sq(limiting_speed), limiting_accel * radius, sq(scaled_fr_mm_s)); float arc_mm_remaining = flat_mm; diff --git a/Marlin/src/gcode/motion/G6.cpp b/Marlin/src/gcode/motion/G6.cpp index fb6281707b..342741e634 100644 --- a/Marlin/src/gcode/motion/G6.cpp +++ b/Marlin/src/gcode/motion/G6.cpp @@ -38,10 +38,13 @@ void GcodeSuite::G6() { planner.last_page_step_rate = parser.value_ulong(); if (!DirectStepping::Config::DIRECTIONAL) { - if (parser.seen('X')) planner.last_page_dir.x = !!parser.value_byte(); - if (parser.seen('Y')) planner.last_page_dir.y = !!parser.value_byte(); - if (parser.seen('Z')) planner.last_page_dir.z = !!parser.value_byte(); - if (parser.seen('E')) planner.last_page_dir.e = !!parser.value_byte(); + #define PAGE_DIR_SET(N,A) do{ if (parser.seen(N)) planner.last_page_dir.A = !!parser.value_byte(); } while(0) + LOGICAL_AXIS_CODE( + PAGE_DIR_SET('E',E), + PAGE_DIR_SET('X',X), PAGE_DIR_SET('Y',Y), PAGE_DIR_SET('Z',Z), + PAGE_DIR_SET(AXIS4_NAME,I), PAGE_DIR_SET(AXIS5_NAME,J), PAGE_DIR_SET(AXIS6_NAME,K), + PAGE_DIR_SET(AXIS5_NAME,U), PAGE_DIR_SET(AXIS6_NAME,V), PAGE_DIR_SET(AXIS7_NAME,W) + ); } // No index means we just set the state diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index 4fe83ccd40..d10f9ee73c 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -131,4 +131,10 @@ void GcodeSuite::M290() { } } +#if ENABLED(EP_BABYSTEPPING) && DISABLED(EMERGENCY_PARSER) + // Without Emergency Parser M293/M294 will be added to the queue + void GcodeSuite::M293() { babystep.z_up(); } + void GcodeSuite::M294() { babystep.z_down(); } +#endif + #endif // BABYSTEPPING diff --git a/Marlin/src/gcode/control/M400.cpp b/Marlin/src/gcode/motion/M400.cpp similarity index 100% rename from Marlin/src/gcode/control/M400.cpp rename to Marlin/src/gcode/motion/M400.cpp diff --git a/Marlin/src/gcode/ota/M936.cpp b/Marlin/src/gcode/ota/M936.cpp new file mode 100644 index 0000000000..6324b3db43 --- /dev/null +++ b/Marlin/src/gcode/ota/M936.cpp @@ -0,0 +1,72 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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(OTA_FIRMWARE_UPDATE) + +#include "../gcode.h" +#include "../../libs/BL24CXX.h" + +#if ENABLED(CREALITY_RTS) + #include "../../lcd/rts/lcd_rts.h" +#endif + +#define OTA_FLAG_EEPROM 90 + +//#define DEBUG_OUT 1 +#include "../../core/debug_out.h" + +/** + * M936: Set one of the OTA update flags. + * V2 = Upgrade the motherboard firmware + * V3 = Upgrade the RTS controller firmware + */ +void GcodeSuite::M936() { + static uint8_t ota_update_flag = 0x00; + const int16_t ota = parser.intval('V', -1); + switch (ota) { + case 2: + // Set the OTA board firmware upgrade flag ahead of reboot. + ota_update_flag = 0x01; + DEBUG_ECHOLNPGM("Motherboard upgrade flag set"); + TERN_(CREALITY_RTS, RTS_Error(Error_205)); + break; + + #if ENABLED(CREALITY_RTS) + case 3: + // Set the OTA screen firmware upgrade flag ahead of reboot. + ota_update_flag = 0x02; + DEBUG_ECHOLNPGM("DWIN upgrade flag set"); + TERN_(CREALITY_RTS, RTS_Error(Error_206)); + break; + #endif + } + + switch (ota) { + case 2: TERN_(CREALITY_RTS, case 3:) + BL24CXX::write(OTA_FLAG_EEPROM, &ota_update_flag, sizeof(ota_update_flag)); + safe_delay(100); + hal.reboot(); + } +} + +#endif // OTA_FIRMWARE_UPDATE diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 3fc1fc1625..ccd6b4111f 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -229,11 +229,11 @@ void GCodeParser::parse(char *p) { } #endif - } break; + } break; #if ENABLED(GCODE_MOTION_MODES) - #if EITHER(BEZIER_CURVE_SUPPORT, ARC_SUPPORT) + #if ANY(BEZIER_CURVE_SUPPORT, ARC_SUPPORT) case 'I' ... 'J': case 'P': if (TERN1(BEZIER_CURVE_SUPPORT, motion_mode_codenum != 5) && TERN1(ARC_P_CIRCLES, !WITHIN(motion_mode_codenum, 2, 3)) diff --git a/Marlin/src/gcode/probe/G30.cpp b/Marlin/src/gcode/probe/G30.cpp index 468189bf5a..c638e76c1a 100644 --- a/Marlin/src/gcode/probe/G30.cpp +++ b/Marlin/src/gcode/probe/G30.cpp @@ -70,18 +70,18 @@ void GcodeSuite::G30() { remember_feedrate_scaling_off(); - #if EITHER(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) + #if ANY(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) process_subcommands_now(F("G28O")); #endif const ProbePtRaise raise_after = parser.boolval('E', true) ? PROBE_PT_STOW : PROBE_PT_NONE; TERN_(HAS_PTC, ptc.set_enabled(!parser.seen('C') || parser.value_bool())); - const float measured_z = probe.probe_at_point(probepos, raise_after, 1); + const float measured_z = probe.probe_at_point(probepos, raise_after); TERN_(HAS_PTC, ptc.set_enabled(true)); if (!isnan(measured_z)) { SERIAL_ECHOLNPGM("Bed X: ", probepos.asLogical().x, " Y: ", probepos.asLogical().y, " Z: ", measured_z); - #if EITHER(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) + #if ANY(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) char msg[31], str_1[6], str_2[6], str_3[6]; sprintf_P(msg, PSTR("X:%s, Y:%s, Z:%s"), dtostrf(probepos.x, 1, 1, str_1), @@ -102,7 +102,7 @@ void GcodeSuite::G30() { report_current_position(); } else { - SERIAL_ECHOLNF(GET_EN_TEXT_F(MSG_ZPROBE_OUT)); + SERIAL_ECHOLN(GET_EN_TEXT_F(MSG_ZPROBE_OUT)); LCD_MESSAGE(MSG_ZPROBE_OUT); } diff --git a/Marlin/src/gcode/probe/M102.cpp b/Marlin/src/gcode/probe/M102.cpp index b70c9aed18..f24a723ed7 100644 --- a/Marlin/src/gcode/probe/M102.cpp +++ b/Marlin/src/gcode/probe/M102.cpp @@ -30,6 +30,7 @@ #include "../gcode.h" #include "../../feature/bedlevel/bdl/bdl.h" +#include "../../MarlinCore.h" // for printingIsActive /** * M102: Configure the Bed Distance Sensor @@ -38,20 +39,25 @@ * M102 S0 : Disable adjustable Z height. * * Negative S values are commands: - * M102 S-1 : Read sensor information + * M102 S-1 : Read BDsensor version + * M102 S-2 : Read BDsensor distance value * M102 S-5 : Read raw Calibration data * M102 S-6 : Start Calibration */ void GcodeSuite::M102() { - if (parser.seenval('S')) - bdl.config_state = parser.value_int(); - else - M102_report(); -} - -void GcodeSuite::M102_report(const bool forReplay/*=true*/) { - report_heading(forReplay, F("Bed Distance Sensor")); - SERIAL_ECHOLNPGM(" M102 S", bdl.config_state); + if (bdl.config_state < BDS_IDLE) { + SERIAL_ECHOLNPGM("BDsensor is busy:", bdl.config_state); + return; + } + if (parser.seenval('S')) { + const int8_t command = parser.value_int(); + if (command == BDS_READ_MM) + SERIAL_ECHOLNPGM("Bed Distance:", bdl.read(), "mm"); + else if ((command < BDS_IDLE) && printingIsActive()) + return; + else + bdl.config_state = command; + } } #endif // BD_SENSOR diff --git a/Marlin/src/gcode/probe/M423.cpp b/Marlin/src/gcode/probe/M423.cpp index fde5aaaf87..7c82a4f8af 100644 --- a/Marlin/src/gcode/probe/M423.cpp +++ b/Marlin/src/gcode/probe/M423.cpp @@ -88,7 +88,7 @@ void GcodeSuite::M423() { void GcodeSuite::M423_report(const bool forReplay/*=true*/) { report_heading(forReplay, F("X-Twist Correction")); SERIAL_ECHOLNPGM(" M423 A", xatc.start, " I", xatc.spacing); - LOOP_L_N(x, XATC_MAX_POINTS) { + for (uint8_t x = 0; x < XATC_MAX_POINTS; ++x) { const float z = xatc.z_offset[x]; SERIAL_ECHOPGM(" M423 X", x, " Z"); serial_offset(isnan(z) ? 0 : z); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index af8e877436..9ce28f781c 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -99,7 +99,7 @@ PGM_P GCodeQueue::injected_commands_P; // = nullptr */ char GCodeQueue::injected_commands[64]; // = { 0 } -void GCodeQueue::RingBuffer::commit_command(bool skip_ok +void GCodeQueue::RingBuffer::commit_command(const bool skip_ok OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind/*=-1*/) ) { commands[index_w].skip_ok = skip_ok; @@ -113,7 +113,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, const bool skip_ok/*=true*/ OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind/*=-1*/) ) { if (*cmd == ';' || length >= BUFSIZE) return false; @@ -294,7 +294,7 @@ static bool serial_data_available(serial_index_t index) { #if NO_TIMEOUTS > 0 // Multiserial already handles dispatch to/from multiple ports static bool any_serial_data_available() { - LOOP_L_N(p, NUM_SERIAL) + for (uint8_t p = 0; p < NUM_SERIAL; ++p) if (serial_data_available(p)) return true; return false; @@ -313,7 +313,7 @@ inline int read_serial(const serial_index_t index) { return SERIAL_IMPL.read(ind */ void GCodeQueue::flush_rx() { // Flush receive buffer - LOOP_L_N(p, NUM_SERIAL) { + for (uint8_t p = 0; p < NUM_SERIAL; ++p) { if (!serial_data_available(p)) continue; // No data for this port? Skip. while (SERIAL_IMPL.available(p)) (void)read_serial(p); } @@ -324,7 +324,7 @@ inline int read_serial(const serial_index_t index) { return SERIAL_IMPL.read(ind void GCodeQueue::gcode_line_error(FSTR_P const ferr, 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_ECHOLNF(ferr, serial_state[serial_ind.index].last_N); + SERIAL_ECHOLN(ferr, 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.index].count = 0; @@ -441,7 +441,7 @@ void GCodeQueue::get_serial_commands() { // Unless a serial port has data, this will exit on next iteration hadData = false; - LOOP_L_N(p, NUM_SERIAL) { + for (uint8_t p = 0; p < NUM_SERIAL; ++p) { // Check if the queue is full and exit if it is. if (ring_buffer.full()) return; @@ -713,8 +713,8 @@ void GCodeQueue::advance() { void GCodeQueue::report_buffer_statistics() { SERIAL_ECHOLNPGM("D576" - " P:", planner.moves_free(), " ", -planner_buffer_underruns, " (", max_planner_buffer_empty_duration, ")" - " B:", BUFSIZE - ring_buffer.length, " ", -command_buffer_underruns, " (", max_command_buffer_empty_duration, ")" + " P:", planner.moves_free(), " ", planner_buffer_underruns, " (", max_planner_buffer_empty_duration, ")" + " B:", BUFSIZE - ring_buffer.length, " ", command_buffer_underruns, " (", max_command_buffer_empty_duration, ")" ); command_buffer_underruns = planner_buffer_underruns = 0; max_command_buffer_empty_duration = max_planner_buffer_empty_duration = 0; diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 2cb72f2e15..25b9f5cf9b 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -79,11 +79,11 @@ public: void advance_pos(uint8_t &p, const int inc) { if (++p >= BUFSIZE) p = 0; length += inc; } - void commit_command(bool skip_ok + void commit_command(const bool skip_ok OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind = serial_index_t()) ); - bool enqueue(const char *cmd, bool skip_ok = true + bool enqueue(const char *cmd, const bool skip_ok=true OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind = serial_index_t()) ); diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 3c8f38a144..c49909646e 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -34,7 +34,7 @@ #include "../queue.h" #endif -#if EITHER(SET_PROGRESS_MANUALLY, SD_REPRINT_LAST_SELECTED_FILE) +#if ANY(SET_PROGRESS_MANUALLY, SD_REPRINT_LAST_SELECTED_FILE) #include "../../lcd/marlinui.h" #endif diff --git a/Marlin/src/gcode/sd/M34.cpp b/Marlin/src/gcode/sd/M34.cpp index 2dd7dc580c..0a7d4d8c62 100644 --- a/Marlin/src/gcode/sd/M34.cpp +++ b/Marlin/src/gcode/sd/M34.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) +#if ALL(SDCARD_SORT_ALPHA, SDSORT_GCODE) #include "../gcode.h" #include "../../sd/cardreader.h" diff --git a/Marlin/src/gcode/stats/M31.cpp b/Marlin/src/gcode/stats/M31.cpp index 1a1c13ba2f..a76ec7ee4d 100644 --- a/Marlin/src/gcode/stats/M31.cpp +++ b/Marlin/src/gcode/stats/M31.cpp @@ -33,7 +33,7 @@ void GcodeSuite::M31() { char buffer[22]; duration_t(print_job_timer.duration()).toString(buffer); - ui.set_status(buffer, ENABLED(DWIN_LCD_PROUI)); + ui.set_status(buffer, ENABLED(DWIN_LCD_PROUI)); // No expire on ProUI SERIAL_ECHO_MSG("Print time: ", buffer); } diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index ae517c977b..afa2ebfc56 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -61,9 +61,7 @@ void GcodeSuite::M106() { const uint8_t pfan = parser.byteval('P', _ALT_P); if (pfan >= _CNT_P) return; - #if REDUNDANT_PART_COOLING_FAN - if (pfan == REDUNDANT_PART_COOLING_FAN) return; - #endif + if (FAN_IS_REDUNDANT(pfan)) return; #if ENABLED(EXTRA_FAN_SPEED) const uint16_t t = parser.intval('T'); @@ -85,7 +83,7 @@ void GcodeSuite::M106() { if (!got_preset && parser.seenval('S')) speed = parser.value_ushort(); - TERN_(FOAMCUTTER_XYUV, speed *= 2.55); // Get command in % of max heat + TERN_(FOAMCUTTER_XYUV, speed *= 2.55f); // Get command in % of max heat // Set speed, with constraint thermalManager.set_fan_speed(pfan, speed); @@ -102,9 +100,7 @@ void GcodeSuite::M106() { void GcodeSuite::M107() { const uint8_t pfan = parser.byteval('P', _ALT_P); if (pfan >= _CNT_P) return; - #if REDUNDANT_PART_COOLING_FAN - if (pfan == REDUNDANT_PART_COOLING_FAN) return; - #endif + if (FAN_IS_REDUNDANT(pfan)) return; thermalManager.set_fan_speed(pfan, 0); diff --git a/Marlin/src/gcode/temp/M155.cpp b/Marlin/src/gcode/temp/M155.cpp index 48c23986ae..f1744c8a1e 100644 --- a/Marlin/src/gcode/temp/M155.cpp +++ b/Marlin/src/gcode/temp/M155.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) +#if ENABLED(AUTO_REPORT_TEMPERATURES) #include "../gcode.h" #include "../../module/temperature.h" @@ -37,4 +37,4 @@ void GcodeSuite::M155() { } -#endif // AUTO_REPORT_TEMPERATURES && HAS_TEMP_SENSOR +#endif // AUTO_REPORT_TEMPERATURES diff --git a/Marlin/src/gcode/temp/M306.cpp b/Marlin/src/gcode/temp/M306.cpp index d0c005ea4e..2830a77ab4 100644 --- a/Marlin/src/gcode/temp/M306.cpp +++ b/Marlin/src/gcode/temp/M306.cpp @@ -42,7 +42,10 @@ * R Sensor responsiveness (= transfer coefficient / heat capcity). * * With MPC_AUTOTUNE: - * T Autotune the specified or active extruder. + * T Autotune the extruder specified with 'E' or the active extruder. + * S0 : Autotuning method AUTO (default) + * S1 : Autotuning method DIFFERENTIAL + * S2 : Autotuning method ASYMPTOTIC */ void GcodeSuite::M306() { @@ -54,8 +57,15 @@ void GcodeSuite::M306() { #if ENABLED(MPC_AUTOTUNE) if (parser.seen_test('T')) { + Temperature::MPCTuningType tuning_type; + const uint8_t type = parser.byteval('S', 0); + switch (type) { + case 1: tuning_type = Temperature::MPCTuningType::FORCE_DIFFERENTIAL; break; + case 2: tuning_type = Temperature::MPCTuningType::FORCE_ASYMPTOTIC; break; + default: tuning_type = Temperature::MPCTuningType::AUTO; break; + } LCD_MESSAGE(MSG_MPC_AUTOTUNE); - thermalManager.MPC_autotune(e); + thermalManager.MPC_autotune(e, tuning_type); ui.reset_status(); return; } @@ -82,16 +92,16 @@ void GcodeSuite::M306_report(const bool forReplay/*=true*/) { HOTEND_LOOP() { report_echo_start(forReplay); MPC_t &mpc = thermalManager.temp_hotend[e].mpc; - SERIAL_ECHOPGM(" M306 E", e); - SERIAL_ECHOPAIR_F(" P", mpc.heater_power, 2); - SERIAL_ECHOPAIR_F(" C", mpc.block_heat_capacity, 2); - SERIAL_ECHOPAIR_F(" R", mpc.sensor_responsiveness, 4); - SERIAL_ECHOPAIR_F(" A", mpc.ambient_xfer_coeff_fan0, 4); + SERIAL_ECHOPGM(" M306 E", e, + " P", p_float_t(mpc.heater_power, 2), + " C", p_float_t(mpc.block_heat_capacity, 2), + " R", p_float_t(mpc.sensor_responsiveness, 4), + " A", p_float_t(mpc.ambient_xfer_coeff_fan0, 4) + ); #if ENABLED(MPC_INCLUDE_FAN) - SERIAL_ECHOPAIR_F(" F", mpc.fanCoefficient(), 4); + SERIAL_ECHOPGM(" F", p_float_t(mpc.fanCoefficient(), 4)); #endif - SERIAL_ECHOPAIR_F(" H", mpc.filament_heat_capacity_permm, 4); - SERIAL_EOL(); + SERIAL_ECHOLNPGM(" H", p_float_t(mpc.filament_heat_capacity_permm, 4)); } } diff --git a/Marlin/src/gcode/units/M149.cpp b/Marlin/src/gcode/units/M149.cpp index a04247cbcb..43091b6710 100644 --- a/Marlin/src/gcode/units/M149.cpp +++ b/Marlin/src/gcode/units/M149.cpp @@ -38,8 +38,7 @@ void GcodeSuite::M149() { void GcodeSuite::M149_report(const bool forReplay/*=true*/) { report_heading_etc(forReplay, F(STR_TEMPERATURE_UNITS)); - SERIAL_ECHOPGM(" M149 ", AS_CHAR(parser.temp_units_code()), " ; Units in "); - SERIAL_ECHOLNF(parser.temp_units_name()); + SERIAL_ECHOLN(F(" M149 "), AS_CHAR(parser.temp_units_code()), F(" ; Units in "), parser.temp_units_name()); } #endif // TEMPERATURE_UNITS_SUPPORT diff --git a/Marlin/src/inc/Changes.h b/Marlin/src/inc/Changes.h index 4b7627adb4..8a4a9c2b48 100644 --- a/Marlin/src/inc/Changes.h +++ b/Marlin/src/inc/Changes.h @@ -30,7 +30,9 @@ /** * Warnings for old configurations */ -#if WATCH_TEMP_PERIOD > 500 +#ifdef GITHUB_ACTION + // Skip change alerts during CI Test +#elif WATCH_TEMP_PERIOD > 500 #error "WATCH_TEMP_PERIOD now uses seconds instead of milliseconds." #elif DISABLED(THERMAL_PROTECTION_HOTENDS) && (defined(WATCH_TEMP_PERIOD) || defined(THERMAL_PROTECTION_PERIOD)) #error "Thermal Runaway Protection for hotends is now enabled with THERMAL_PROTECTION_HOTENDS." @@ -63,7 +65,7 @@ #elif defined(ENDSTOPPULLUP_FIL_RUNOUT) #error "ENDSTOPPULLUP_FIL_RUNOUT is now FIL_RUNOUT_PULLUP." #elif defined(DISABLE_MAX_ENDSTOPS) || defined(DISABLE_MIN_ENDSTOPS) - #error "DISABLE_MAX_ENDSTOPS and DISABLE_MIN_ENDSTOPS deprecated. Use individual USE_*_PLUG options instead." + #error "DISABLE_MAX_ENDSTOPS and DISABLE_MIN_ENDSTOPS deprecated. Endstops are automatically determined." #elif defined(LANGUAGE_INCLUDE) #error "LANGUAGE_INCLUDE has been replaced by LCD_LANGUAGE." #elif defined(EXTRUDER_OFFSET_X) || defined(EXTRUDER_OFFSET_Y) @@ -643,6 +645,20 @@ #error "TFT_SHARED_SPI is now TFT_SHARED_IO." #elif defined(LCD_PINS_ENABLE) #error "LCD_PINS_ENABLE is now LCD_PINS_EN." +#elif ANY(USE_XMIN_PLUG, USE_XMAX_PLUG, USE_YMIN_PLUG, USE_YMAX_PLUG, USE_ZMIN_PLUG, USE_ZMAX_PLUG, \ + USE_IMIN_PLUG, USE_IMAX_PLUG, USE_JMIN_PLUG, USE_JMAX_PLUG, USE_KMIN_PLUG, USE_KMAX_PLUG, \ + USE_UMIN_PLUG, USE_UMAX_PLUG, USE_VMIN_PLUG, USE_VMAX_PLUG, USE_WMIN_PLUG, USE_WMAX_PLUG) + #error "USE_*_PLUG settings are no longer needed and should be removed." +#elif defined(X2_USE_ENDSTOP) + #error "X2_USE_ENDSTOP is obsolete. Instead set X2_STOP_PIN directly. (e.g., 'X2_USE_ENDSTOP _XMAX_' becomes 'X2_STOP_PIN X_MAX_PIN')" +#elif defined(Y2_USE_ENDSTOP) + #error "Y2_USE_ENDSTOP is obsolete. Instead set Y2_STOP_PIN directly. (e.g., 'Y2_USE_ENDSTOP _YMAX_' becomes 'Y2_STOP_PIN Y_MAX_PIN')" +#elif defined(Z2_USE_ENDSTOP) + #error "Z2_USE_ENDSTOP is obsolete. Instead set Z2_STOP_PIN directly. (e.g., 'Z2_USE_ENDSTOP _ZMAX_' becomes 'Z2_STOP_PIN Z_MAX_PIN')" +#elif defined(Z3_USE_ENDSTOP) + #error "Z3_USE_ENDSTOP is obsolete. Instead set Z2_STOP_PIN directly. (e.g., 'Z3_USE_ENDSTOP _ZMAX_' becomes 'Z3_STOP_PIN Z_MAX_PIN')" +#elif defined(Z4_USE_ENDSTOP) + #error "Z4_USE_ENDSTOP is obsolete. Instead set Z4_STOP_PIN directly. (e.g., 'Z4_USE_ENDSTOP _ZMAX_' becomes 'Z4_STOP_PIN Z_MAX_PIN')" #endif // L64xx stepper drivers have been removed diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index b11ede3dc5..b33720b2a5 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -31,12 +31,12 @@ #endif // MKS_LCD12864A/B is a variant of MKS_MINI_12864 -#if EITHER(MKS_LCD12864A, MKS_LCD12864B) +#if ANY(MKS_LCD12864A, MKS_LCD12864B) #define MKS_MINI_12864 #endif // MKS_MINI_12864_V3 and BTT_MINI_12864_V1 are identical to FYSETC_MINI_12864_2_1 -#if EITHER(MKS_MINI_12864_V3, BTT_MINI_12864_V1) +#if ANY(MKS_MINI_12864_V3, BTT_MINI_12864_V1) #define FYSETC_MINI_12864_2_1 #endif @@ -70,7 +70,7 @@ * IS_U8GLIB_ST7565_64128N : ST7565 128x64 LCD with SPI interface via U8GLib * IS_U8GLIB_LM6059_AF : LM6059 with Hardware SPI via U8GLib */ -#if EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) +#if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define MINIPANEL @@ -83,7 +83,7 @@ #define DOGLCD #define IS_ULTIPANEL 1 -#elif EITHER(DWIN_MARLINUI_PORTRAIT, DWIN_MARLINUI_LANDSCAPE) +#elif ANY(DWIN_MARLINUI_PORTRAIT, DWIN_MARLINUI_LANDSCAPE) #define IS_DWIN_MARLINUI 1 #define IS_ULTIPANEL 1 @@ -216,7 +216,7 @@ #define LCD_WIDTH 16 #define LCD_HEIGHT 2 -#elif EITHER(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) +#elif ANY(TFTGLCD_PANEL_SPI, TFTGLCD_PANEL_I2C) #define IS_TFTGLCD_PANEL 1 #define IS_ULTIPANEL 1 // Note that IS_ULTIPANEL leads to HAS_WIRED_LCD @@ -246,7 +246,7 @@ #define LCD_ST7920_DELAY_2 125 #define LCD_ST7920_DELAY_3 125 -#elif EITHER(ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING) +#elif ANY(ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING) #define IS_RRD_FG_SC 1 #define LCD_ST7920_DELAY_1 150 @@ -276,7 +276,7 @@ #endif // ST7565 / 64128N graphical displays -#if EITHER(MAKRPANEL, MINIPANEL) +#if ANY(MAKRPANEL, MINIPANEL) #define IS_ULTIPANEL 1 #define DOGLCD #if ENABLED(MAKRPANEL) @@ -328,24 +328,22 @@ #define IS_ULTIPANEL 1 #endif -// TFT Legacy Compatibility +// TFT Legacy options masquerade as TFT_GENERIC #if ANY(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT, TFT_320x240, TFT_480x320, TFT_320x240_SPI, TFT_480x320_SPI, TFT_LVGL_UI_FSMC, TFT_LVGL_UI_SPI) #define IS_LEGACY_TFT 1 #define TFT_GENERIC -#endif - -#if ANY(FSMC_GRAPHICAL_TFT, TFT_320x240, TFT_480x320, TFT_LVGL_UI_FSMC) - #define TFT_INTERFACE_FSMC -#elif ANY(SPI_GRAPHICAL_TFT, TFT_320x240_SPI, TFT_480x320_SPI, TFT_LVGL_UI_SPI) - #define TFT_INTERFACE_SPI -#endif - -#if EITHER(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) - #define TFT_CLASSIC_UI -#elif ANY(TFT_320x240, TFT_480x320, TFT_320x240_SPI, TFT_480x320_SPI) - #define TFT_COLOR_UI -#elif EITHER(TFT_LVGL_UI_FSMC, TFT_LVGL_UI_SPI) - #define TFT_LVGL_UI + #if ANY(FSMC_GRAPHICAL_TFT, TFT_320x240, TFT_480x320, TFT_LVGL_UI_FSMC) + #define TFT_INTERFACE_FSMC + #elif ANY(SPI_GRAPHICAL_TFT, TFT_320x240_SPI, TFT_480x320_SPI, TFT_LVGL_UI_SPI) + #define TFT_INTERFACE_SPI + #endif + #if ANY(FSMC_GRAPHICAL_TFT, SPI_GRAPHICAL_TFT) + #define TFT_CLASSIC_UI + #elif ANY(TFT_320x240, TFT_480x320, TFT_320x240_SPI, TFT_480x320_SPI) + #define TFT_COLOR_UI + #elif ANY(TFT_LVGL_UI_FSMC, TFT_LVGL_UI_SPI) + #define TFT_LVGL_UI + #endif #endif // FSMC/SPI TFT Panels (LVGL) @@ -389,7 +387,7 @@ #define IS_ULTIPANEL 1 #endif -#elif EITHER(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) +#elif ANY(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) #define LCD_I2C_TYPE_PCF8575 // I2C Character-based 12864 display #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander @@ -427,7 +425,7 @@ #endif -#if EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) && DISABLED(NO_LCD_DETECT) +#if ANY(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) && DISABLED(NO_LCD_DETECT) #define DETECT_I2C_LCD_DEVICE 1 #endif @@ -465,15 +463,15 @@ #define IS_ULTIPANEL 1 #endif -#if EITHER(IS_ULTIPANEL, ULTRA_LCD) +#if ANY(IS_ULTIPANEL, ULTRA_LCD) #define HAS_WIRED_LCD 1 #endif -#if EITHER(IS_ULTIPANEL, REPRAPWORLD_KEYPAD) +#if ANY(IS_ULTIPANEL, REPRAPWORLD_KEYPAD) #define IS_NEWPANEL 1 #endif -#if EITHER(ZONESTAR_LCD, REPRAPWORLD_KEYPAD) +#if ANY(ZONESTAR_LCD, REPRAPWORLD_KEYPAD) #define IS_RRW_KEYPAD 1 #ifndef REPRAPWORLD_KEYPAD_MOVE_STEP #define REPRAPWORLD_KEYPAD_MOVE_STEP 1.0 @@ -488,36 +486,35 @@ #endif #endif -// Serial Controllers require LCD_SERIAL_PORT -#if ANY(HAS_DGUS_LCD, MALYAN_LCD, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT) - #define LCD_NEEDS_SERIAL_PORT 1 -#endif - // Extensible UI serial touch screens. (See src/lcd/extui) -#if EITHER(LCD_NEEDS_SERIAL_PORT, TOUCH_UI_FTDI_EVE) +#if ANY(HAS_DGUS_LCD, MALYAN_LCD, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT, TOUCH_UI_FTDI_EVE) #define IS_EXTUI 1 #define EXTENSIBLE_UI #endif // Aliases for LCD features -#if EITHER(DWIN_CREALITY_LCD, DWIN_LCD_PROUI) +#if ANY(DWIN_CREALITY_LCD, DWIN_LCD_PROUI) #define HAS_DWIN_E3V2_BASIC 1 #endif -#if EITHER(HAS_DWIN_E3V2_BASIC, DWIN_CREALITY_LCD_JYERSUI) +#if ANY(HAS_DWIN_E3V2_BASIC, DWIN_CREALITY_LCD_JYERSUI) #define HAS_DWIN_E3V2 1 #endif -#if ENABLED(DWIN_LCD_PROUI) - #define DO_LIST_BIN_FILES 1 -#endif // E3V2 extras #if HAS_DWIN_E3V2 || IS_DWIN_MARLINUI #define SERIAL_CATCHALL 0 #define HAS_LCD_BRIGHTNESS 1 #define LCD_BRIGHTNESS_MAX 250 - #if ENABLED(DWIN_LCD_PROUI) - #define LCD_BRIGHTNESS_DEFAULT 127 - #endif +#endif + +#if ENABLED(DWIN_LCD_PROUI) + #define DO_LIST_BIN_FILES 1 + #define LCD_BRIGHTNESS_DEFAULT 127 +#endif + +// Serial Controllers require LCD_SERIAL_PORT +#if ANY(IS_DWIN_MARLINUI, HAS_DWIN_E3V2, HAS_DGUS_LCD, MALYAN_LCD, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT) + #define LCD_IS_SERIAL_HOST 1 #endif #if HAS_WIRED_LCD @@ -541,6 +538,10 @@ #define HAS_LCDPRINT 1 #endif +#if HAS_DISPLAY || HAS_LCDPRINT + #define HAS_UTF8_UTILS 1 +#endif + #if HAS_DISPLAY || HAS_DWIN_E3V2 #define HAS_STATUS_MESSAGE 1 #endif @@ -638,10 +639,10 @@ #define E_TERN_(N) TERN_(HAS_MULTI_EXTRUDER, N) #define E_TERN0(N) TERN0(HAS_MULTI_EXTRUDER, N) -#if EITHER(SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_EXTRUDER) +#if ANY(SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_EXTRUDER) #define HAS_SWITCHING_EXTRUDER 1 #endif -#if EITHER(SWITCHING_NOZZLE, MECHANICAL_SWITCHING_NOZZLE) +#if ANY(SWITCHING_NOZZLE, MECHANICAL_SWITCHING_NOZZLE) #define HAS_SWITCHING_NOZZLE 1 #endif @@ -680,8 +681,8 @@ #endif -// No inactive extruders with SWITCHING_NOZZLE or Průša MMU1 -#if HAS_SWITCHING_NOZZLE || HAS_PRUSA_MMU1 +// No inactive extruders with SWITCHING_NOZZLE or Průša MMU1 or just 1 E stepper exists +#if HAS_SWITCHING_NOZZLE || HAS_PRUSA_MMU1 || E_STEPPERS < 2 #undef DISABLE_OTHER_EXTRUDERS #endif @@ -699,14 +700,14 @@ #endif // Number of hotends... -#if EITHER(SINGLENOZZLE, MIXING_EXTRUDER) // Only one for singlenozzle or mixing extruder +#if ANY(SINGLENOZZLE, MIXING_EXTRUDER) // Only one for singlenozzle or mixing extruder #define HOTENDS 1 -#elif HAS_SWITCHING_EXTRUDER && !HAS_SWITCHING_NOZZLE // One for each pair of abstract "extruders" +#elif HAS_SWITCHING_EXTRUDER && !HAS_SWITCHING_NOZZLE // One for each pair of abstract "extruders" #define HOTENDS E_STEPPERS #elif TEMP_SENSOR_0 - #define HOTENDS EXTRUDERS // One per extruder if at least one heater exists + #define HOTENDS EXTRUDERS // One per extruder if at least one heater exists #else - #define HOTENDS 0 // A machine with no hotends at all can still extrude + #define HOTENDS 0 // A machine with no hotends at all can still extrude #endif // More than one hotend... @@ -795,33 +796,55 @@ #define NUM_AXES 3 #elif defined(Y_DRIVER_TYPE) #define NUM_AXES 2 -#else +#elif defined(X_DRIVER_TYPE) #define NUM_AXES 1 +#else + #define NUM_AXES 0 #endif -#define HAS_X_AXIS 1 -#if NUM_AXES >= XY - #define HAS_Y_AXIS 1 +#if NUM_AXES >= 1 + #define HAS_X_AXIS 1 + #if NUM_AXES >= XY + #define HAS_Y_AXIS 1 + #if NUM_AXES >= XYZ + #define HAS_Z_AXIS 1 + #if NUM_AXES >= 4 + #define HAS_I_AXIS 1 + #if NUM_AXES >= 5 + #define HAS_J_AXIS 1 + #if NUM_AXES >= 6 + #define HAS_K_AXIS 1 + #if NUM_AXES >= 7 + #define HAS_U_AXIS 1 + #if NUM_AXES >= 8 + #define HAS_V_AXIS 1 + #if NUM_AXES >= 9 + #define HAS_W_AXIS 1 + #endif + #endif + #endif + #endif + #endif + #endif + #endif + #endif #endif -#if NUM_AXES >= XYZ - #define HAS_Z_AXIS 1 -#endif -#if NUM_AXES >= 4 - #define HAS_I_AXIS 1 -#endif -#if NUM_AXES >= 5 - #define HAS_J_AXIS 1 -#endif -#if NUM_AXES >= 6 - #define HAS_K_AXIS 1 -#endif -#if NUM_AXES >= 7 - #define HAS_U_AXIS 1 -#endif -#if NUM_AXES >= 8 - #define HAS_V_AXIS 1 -#endif -#if NUM_AXES >= 9 - #define HAS_W_AXIS 1 + +#if !HAS_X_AXIS + #undef AVOID_OBSTACLES + #undef ENDSTOPPULLUP_XMIN + #undef ENDSTOPPULLUP_XMAX + #undef X_MIN_ENDSTOP_HIT_STATE + #undef X_MAX_ENDSTOP_HIT_STATE + #undef X2_DRIVER_TYPE + #undef X_ENABLE_ON + #undef DISABLE_X + #undef INVERT_X_DIR + #undef X_HOME_DIR + #undef X_MIN_POS + #undef X_MAX_POS + #undef MANUAL_X_HOME_POS + #undef MIN_SOFTWARE_ENDSTOPS + #undef MAX_SOFTWARE_ENDSTOPS #endif #if !HAS_Y_AXIS @@ -979,11 +1002,9 @@ #ifdef X2_DRIVER_TYPE #define HAS_X2_STEPPER 1 - // Dual X Carriage isn't known yet. TODO: Consider moving it to Configuration.h. #endif #ifdef Y2_DRIVER_TYPE #define HAS_Y2_STEPPER 1 - #define HAS_DUAL_Y_STEPPERS 1 #endif /** @@ -1083,7 +1104,7 @@ #if DISABLED(SINGLENOZZLE) #undef SINGLENOZZLE_STANDBY_TEMP #endif -#if !BOTH(HAS_FAN, SINGLENOZZLE) +#if !ALL(HAS_FAN, SINGLENOZZLE) #undef SINGLENOZZLE_STANDBY_FAN #endif @@ -1317,10 +1338,12 @@ #endif // FILAMENT_SWITCH_AND_MOTION // Homing to Min or Max -#if X_HOME_DIR > 0 - #define X_HOME_TO_MAX 1 -#elif X_HOME_DIR < 0 - #define X_HOME_TO_MIN 1 +#if HAS_X_AXIS + #if X_HOME_DIR > 0 + #define X_HOME_TO_MAX 1 + #elif X_HOME_DIR < 0 + #define X_HOME_TO_MIN 1 + #endif #endif #if HAS_Y_AXIS #if Y_HOME_DIR > 0 @@ -1386,19 +1409,19 @@ #if DISABLED(NOZZLE_AS_PROBE) #define HAS_PROBE_XY_OFFSET 1 #endif - #if BOTH(DELTA, SENSORLESS_PROBING) + #if ALL(DELTA, SENSORLESS_PROBING) #define HAS_DELTA_SENSORLESS_PROBING 1 #endif #if NONE(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, HAS_DELTA_SENSORLESS_PROBING) - #define USES_Z_MIN_PROBE_PIN 1 + #define USE_Z_MIN_PROBE 1 #endif - #if Z_HOME_TO_MIN && (DISABLED(USES_Z_MIN_PROBE_PIN) || ENABLED(USE_PROBE_FOR_Z_HOMING)) + #if Z_HOME_TO_MIN && (DISABLED(USE_Z_MIN_PROBE) || ENABLED(USE_PROBE_FOR_Z_HOMING)) #define HOMING_Z_WITH_PROBE 1 #endif #ifndef Z_PROBE_LOW_POINT #define Z_PROBE_LOW_POINT -5 #endif - #if EITHER(Z_PROBE_ALLEN_KEY, MAG_MOUNTED_PROBE) + #if ANY(Z_PROBE_ALLEN_KEY, MAG_MOUNTED_PROBE) #define PROBE_TRIGGERED_WHEN_STOWED_TEST 1 // Extra test for Allen Key Probe #endif #if MULTIPLE_PROBING > 1 @@ -1428,14 +1451,14 @@ */ #if ENABLED(AUTO_BED_LEVELING_UBL) #undef LCD_BED_LEVELING - #if EITHER(DELTA, SEGMENT_LEVELED_MOVES) + #if ANY(DELTA, SEGMENT_LEVELED_MOVES) #define UBL_SEGMENTED 1 #endif #endif -#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) +#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) #define ABL_PLANAR 1 #endif -#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) +#if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) #define ABL_USES_GRID 1 #endif #if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_3POINT) @@ -1444,16 +1467,16 @@ #if ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL, MESH_BED_LEVELING) #define HAS_MESH 1 #endif -#if EITHER(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_3POINT) +#if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_3POINT) #define NEEDS_THREE_PROBE_POINTS 1 #endif -#if EITHER(HAS_ABL_NOT_UBL, AUTO_BED_LEVELING_UBL) +#if ANY(HAS_ABL_NOT_UBL, AUTO_BED_LEVELING_UBL) #define HAS_ABL_OR_UBL 1 #if DISABLED(PROBE_MANUALLY) #define HAS_AUTOLEVEL 1 #endif #endif -#if EITHER(HAS_ABL_OR_UBL, MESH_BED_LEVELING) +#if ANY(HAS_ABL_OR_UBL, MESH_BED_LEVELING) #define HAS_LEVELING 1 #if DISABLED(AUTO_BED_LEVELING_UBL) #define PLANNER_LEVELING 1 @@ -1464,7 +1487,7 @@ #undef ENABLE_LEVELING_AFTER_G28 #undef G29_RETRY_AND_RECOVER #endif -#if !HAS_LEVELING || EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) +#if !HAS_LEVELING || ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) #undef PROBE_MANUALLY #endif #if ANY(HAS_BED_PROBE, PROBE_MANUALLY, MESH_BED_LEVELING) @@ -1473,7 +1496,7 @@ #ifdef GRID_MAX_POINTS_X #define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) - #define GRID_LOOP(A,B) LOOP_L_N(A, GRID_MAX_POINTS_X) LOOP_L_N(B, GRID_MAX_POINTS_Y) + #define GRID_LOOP(A,B) for (uint8_t A = 0; A < GRID_MAX_POINTS_X; ++A) for (uint8_t B = 0; B < GRID_MAX_POINTS_Y; ++B) #endif // Slim menu optimizations @@ -1484,13 +1507,13 @@ /** * CoreXY, CoreXZ, and CoreYZ - and their reverse */ -#if EITHER(COREXY, COREYX) +#if ANY(COREXY, COREYX) #define CORE_IS_XY 1 #endif -#if EITHER(COREXZ, COREZX) +#if ANY(COREXZ, COREZX) #define CORE_IS_XZ 1 #endif -#if EITHER(COREYZ, COREZY) +#if ANY(COREYZ, COREZY) #define CORE_IS_YZ 1 #endif #if CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ @@ -1511,7 +1534,7 @@ #define CORE_AXIS_2 C_AXIS #endif #define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n)) -#elif EITHER(MARKFORGED_XY, MARKFORGED_YX) +#elif ANY(MARKFORGED_XY, MARKFORGED_YX) // Markforged kinematics #define CORE_AXIS_1 A_AXIS #define CORE_AXIS_2 B_AXIS @@ -1535,7 +1558,7 @@ #endif // This flag indicates some kind of jerk storage is needed -#if EITHER(CLASSIC_JERK, IS_KINEMATIC) +#if ANY(CLASSIC_JERK, IS_KINEMATIC) #define HAS_CLASSIC_JERK 1 #endif @@ -1599,12 +1622,12 @@ * - TFT_COLOR * - GRAPHICAL_TFT_UPSCALE */ -#if EITHER(MKS_TS35_V2_0, BTT_TFT35_SPI_V1_0) // ST7796 +#if ANY(MKS_TS35_V2_0, BTT_TFT35_SPI_V1_0) // ST7796 #define TFT_DEFAULT_DRIVER ST7796 #define TFT_DEFAULT_ORIENTATION TFT_EXCHANGE_XY #define TFT_RES_480x320 #define TFT_INTERFACE_SPI -#elif EITHER(LERDGE_TFT35, ANET_ET5_TFT35) // ST7796 +#elif ANY(LERDGE_TFT35, ANET_ET5_TFT35) // ST7796 #define TFT_DEFAULT_ORIENTATION TFT_EXCHANGE_XY #define TFT_RES_480x320 #define TFT_INTERFACE_FSMC @@ -1622,7 +1645,7 @@ #define TFT_DEFAULT_ORIENTATION 0 #define TFT_RES_480x272 #define TFT_INTERFACE_FSMC -#elif EITHER(MKS_ROBIN_TFT_V1_1R, LONGER_LK_TFT28) // ILI9328 or R61505 +#elif ANY(MKS_ROBIN_TFT_V1_1R, LONGER_LK_TFT28) // ILI9328 or R61505 #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) #define TFT_RES_320x240 #define TFT_INTERFACE_FSMC @@ -1668,7 +1691,7 @@ #endif #if ANY(HAS_SPI_TFT, HAS_FSMC_TFT, HAS_LTDC_TFT) - #include "../lcd/tft_io/tft_orientation.h" + #include "../lcd/tft_io/tft_orientation.h" // for TFT_COLOR_UI_PORTRAIT #endif #if ENABLED(TFT_RES_320x240) @@ -1685,8 +1708,13 @@ #define TFT_HEIGHT 272 #define GRAPHICAL_TFT_UPSCALE 2 #elif ENABLED(TFT_RES_480x320) - #define TFT_WIDTH 480 - #define TFT_HEIGHT 320 + #if ENABLED(TFT_COLOR_UI_PORTRAIT) + #define TFT_WIDTH 320 + #define TFT_HEIGHT 480 + #else + #define TFT_WIDTH 480 + #define TFT_HEIGHT 320 + #endif #define GRAPHICAL_TFT_UPSCALE 3 #elif ENABLED(TFT_RES_1024x600) #define TFT_WIDTH 1024 @@ -1707,7 +1735,7 @@ #elif ENABLED(TFT_INTERFACE_FSMC) #define TFT_320x240 #endif - #elif TFT_HEIGHT == 320 + #elif TFT_HEIGHT == 320 || (TFT_HEIGHT == 480 && ENABLED(TFT_COLOR_UI_PORTRAIT)) #if ENABLED(TFT_INTERFACE_SPI) #define TFT_480x320_SPI #elif ENABLED(TFT_INTERFACE_FSMC) @@ -1728,13 +1756,13 @@ #endif #endif -#if EITHER(TFT_320x240, TFT_320x240_SPI) +#if ANY(TFT_320x240, TFT_320x240_SPI) #define HAS_UI_320x240 1 -#elif EITHER(TFT_480x320, TFT_480x320_SPI) +#elif ANY(TFT_480x320, TFT_480x320_SPI) #define HAS_UI_480x320 1 -#elif EITHER(TFT_480x272, TFT_480x272_SPI) +#elif ANY(TFT_480x272, TFT_480x272_SPI) #define HAS_UI_480x272 1 -#elif EITHER(TFT_1024x600_LTDC, TFT_1024x600_SIM) +#elif ANY(TFT_1024x600_LTDC, TFT_1024x600_SIM) #define HAS_UI_1024x600 1 #endif #if ANY(HAS_UI_320x240, HAS_UI_480x320, HAS_UI_480x272) @@ -1772,18 +1800,7 @@ #endif #endif -// XPT2046_** Compatibility -#if !(defined(TOUCH_CALIBRATION_X) || defined(TOUCH_CALIBRATION_Y) || defined(TOUCH_OFFSET_X) || defined(TOUCH_OFFSET_Y) || defined(TOUCH_ORIENTATION)) - #if defined(XPT2046_X_CALIBRATION) && defined(XPT2046_Y_CALIBRATION) && defined(XPT2046_X_OFFSET) && defined(XPT2046_Y_OFFSET) - #define TOUCH_CALIBRATION_X XPT2046_X_CALIBRATION - #define TOUCH_CALIBRATION_Y XPT2046_Y_CALIBRATION - #define TOUCH_OFFSET_X XPT2046_X_OFFSET - #define TOUCH_OFFSET_Y XPT2046_Y_OFFSET - #define TOUCH_ORIENTATION TOUCH_LANDSCAPE - #endif -#endif - -#if X_HOME_DIR || (HAS_Y_AXIS && Y_HOME_DIR) || (HAS_Z_AXIS && Z_HOME_DIR) \ +#if (HAS_X_AXIS && X_HOME_DIR) || (HAS_Y_AXIS && Y_HOME_DIR) || (HAS_Z_AXIS && Z_HOME_DIR) \ || (HAS_I_AXIS && I_HOME_DIR) || (HAS_J_AXIS && J_HOME_DIR) || (HAS_K_AXIS && K_HOME_DIR) \ || (HAS_U_AXIS && U_HOME_DIR) || (HAS_V_AXIS && V_HOME_DIR) || (HAS_W_AXIS && W_HOME_DIR) #define HAS_ENDSTOPS 1 @@ -1798,3 +1815,7 @@ #if defined(NEOPIXEL_BKGD_INDEX_FIRST) && !defined(NEOPIXEL_BKGD_INDEX_LAST) #define NEOPIXEL_BKGD_INDEX_LAST NEOPIXEL_BKGD_INDEX_FIRST #endif + +#if ALL(SPI_FLASH, HAS_MEDIA, MARLIN_DEV_MODE) + #define SPI_FLASH_BACKUP 1 +#endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 929a7c78cf..4892ff24b1 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -94,8 +94,26 @@ #endif // Some options are disallowed without required axes +#if !HAS_X_AXIS + //#define LCD_SHOW_E_TOTAL + #define NO_WORKSPACE_OFFSETS + #undef AUTOTEMP + #undef CALIBRATION_MEASURE_LEFT + #undef CALIBRATION_MEASURE_RIGHT + #undef CALIBRATION_MEASURE_XMAX + #undef CALIBRATION_MEASURE_XMIN + #undef DISABLE_IDLE_X + #undef INPUT_SHAPING_X + #undef SAFE_BED_LEVELING_START_X + #undef SHAPING_BUFFER_X + #undef SHAPING_FREQ_X + #undef STEALTHCHOP_X +#endif + #if !HAS_Y_AXIS #undef ARC_SUPPORT + #undef CALIBRATION_MEASURE_BACK + #undef CALIBRATION_MEASURE_FRONT #undef CALIBRATION_MEASURE_YMAX #undef CALIBRATION_MEASURE_YMIN #undef DISABLE_IDLE_Y @@ -227,8 +245,8 @@ #define DISABLE_IDLE_E #endif -#define _OR_HAS_DI(A) || BOTH(HAS_##A##_AXIS, DISABLE_IDLE_##A) -#if BOTH(HAS_EXTRUDERS, DISABLE_IDLE_E) MAP(_OR_HAS_DI, X, Y, Z, I, J, K, U, V, W) +#define _OR_HAS_DI(A) || ALL(HAS_##A##_AXIS, DISABLE_IDLE_##A) +#if ALL(HAS_EXTRUDERS, DISABLE_IDLE_E) MAP(_OR_HAS_DI, X, Y, Z, I, J, K, U, V, W) #define HAS_DISABLE_IDLE_AXES 1 #endif #undef _OR_HAS_DI @@ -288,7 +306,8 @@ */ // Temperature sensor IDs -#define HID_REDUNDANT -6 +#define HID_REDUNDANT -7 +#define HID_SOC -6 #define HID_BOARD -5 #define HID_COOLER -4 #define HID_PROBE -3 @@ -306,9 +325,8 @@ #define _SENSOR_IS(I,N) || (TEMP_SENSOR(N) == I) #define _E_SENSOR_IS(I,N) _SENSOR_IS(N,I) #define ANY_E_SENSOR_IS(N) (0 REPEAT2(HOTENDS, _E_SENSOR_IS, N)) -#define ANY_THERMISTOR_IS(N) ( ANY_E_SENSOR_IS(N) \ - _SENSOR_IS(N,BED) _SENSOR_IS(N,PROBE) _SENSOR_IS(N,CHAMBER) \ - _SENSOR_IS(N,COOLER) _SENSOR_IS(N,BOARD) _SENSOR_IS(N,REDUNDANT) ) +#define ANY_THERMISTOR_IS(N) ( ANY_E_SENSOR_IS(N) _SENSOR_IS(N,REDUNDANT) \ + _SENSOR_IS(N,BED) _SENSOR_IS(N,PROBE) _SENSOR_IS(N,CHAMBER) _SENSOR_IS(N,COOLER) _SENSOR_IS(N,BOARD) ) #if ANY_THERMISTOR_IS(1000) #define HAS_USER_THERMISTORS 1 @@ -346,12 +364,12 @@ #define TEMP_SENSOR_0_IS_AD8495 1 #elif TEMP_SENSOR_0 == -1 #define TEMP_SENSOR_0_IS_AD595 1 -#elif TEMP_SENSOR_0 == 998 || TEMP_SENSOR_0 == 999 - #define TEMP_SENSOR_0_IS_DUMMY 1 #elif TEMP_SENSOR_0 > 0 #define TEMP_SENSOR_0_IS_THERMISTOR 1 #if TEMP_SENSOR_0 == 1000 #define TEMP_SENSOR_0_IS_CUSTOM 1 + #elif TEMP_SENSOR_0 == 998 || TEMP_SENSOR_0 == 999 + #define TEMP_SENSOR_0_IS_DUMMY 1 #endif #endif @@ -389,12 +407,12 @@ #define TEMP_SENSOR_1_IS_AD8495 1 #elif TEMP_SENSOR_1 == -1 #define TEMP_SENSOR_1_IS_AD595 1 -#elif TEMP_SENSOR_1 == 998 || TEMP_SENSOR_1 == 999 - #define TEMP_SENSOR_1_IS_DUMMY 1 #elif TEMP_SENSOR_1 > 0 #define TEMP_SENSOR_1_IS_THERMISTOR 1 #if TEMP_SENSOR_1 == 1000 #define TEMP_SENSOR_1_IS_CUSTOM 1 + #elif TEMP_SENSOR_1 == 998 || TEMP_SENSOR_1 == 999 + #define TEMP_SENSOR_1_IS_DUMMY 1 #endif #endif @@ -432,57 +450,57 @@ #define TEMP_SENSOR_2_IS_AD8495 1 #elif TEMP_SENSOR_2 == -1 #define TEMP_SENSOR_2_IS_AD595 1 -#elif TEMP_SENSOR_2 == 998 || TEMP_SENSOR_2 == 999 - #define TEMP_SENSOR_2_IS_DUMMY 1 #elif TEMP_SENSOR_2 > 0 #define TEMP_SENSOR_2_IS_THERMISTOR 1 #if TEMP_SENSOR_2 == 1000 #define TEMP_SENSOR_2_IS_CUSTOM 1 + #elif TEMP_SENSOR_2 == 998 || TEMP_SENSOR_2 == 999 + #define TEMP_SENSOR_2_IS_DUMMY 1 #endif #endif -#if TEMP_SENSOR_3 == 998 || TEMP_SENSOR_3 == 999 - #define TEMP_SENSOR_3_IS_DUMMY 1 -#elif TEMP_SENSOR_3 > 0 +#if TEMP_SENSOR_3 > 0 #define TEMP_SENSOR_3_IS_THERMISTOR 1 #if TEMP_SENSOR_3 == 1000 #define TEMP_SENSOR_3_IS_CUSTOM 1 + #elif TEMP_SENSOR_3 == 998 || TEMP_SENSOR_3 == 999 + #define TEMP_SENSOR_3_IS_DUMMY 1 #endif #endif -#if TEMP_SENSOR_4 == 998 || TEMP_SENSOR_4 == 999 - #define TEMP_SENSOR_4_IS_DUMMY 1 -#elif TEMP_SENSOR_4 > 0 +#if TEMP_SENSOR_4 > 0 #define TEMP_SENSOR_4_IS_THERMISTOR 1 #if TEMP_SENSOR_4 == 1000 #define TEMP_SENSOR_4_IS_CUSTOM 1 + #elif TEMP_SENSOR_4 == 998 || TEMP_SENSOR_4 == 999 + #define TEMP_SENSOR_4_IS_DUMMY 1 #endif #endif -#if TEMP_SENSOR_5 == 998 || TEMP_SENSOR_5 == 999 - #define TEMP_SENSOR_5_IS_DUMMY 1 -#elif TEMP_SENSOR_5 > 0 +#if TEMP_SENSOR_5 > 0 #define TEMP_SENSOR_5_IS_THERMISTOR 1 #if TEMP_SENSOR_5 == 1000 #define TEMP_SENSOR_5_IS_CUSTOM 1 + #elif TEMP_SENSOR_5 == 998 || TEMP_SENSOR_5 == 999 + #define TEMP_SENSOR_5_IS_DUMMY 1 #endif #endif -#if TEMP_SENSOR_6 == 998 || TEMP_SENSOR_6 == 999 - #define TEMP_SENSOR_6_IS_DUMMY 1 -#elif TEMP_SENSOR_6 > 0 +#if TEMP_SENSOR_6 > 0 #define TEMP_SENSOR_6_IS_THERMISTOR 1 #if TEMP_SENSOR_6 == 1000 #define TEMP_SENSOR_6_IS_CUSTOM 1 + #elif TEMP_SENSOR_6 == 998 || TEMP_SENSOR_6 == 999 + #define TEMP_SENSOR_6_IS_DUMMY 1 #endif #endif -#if TEMP_SENSOR_7 == 998 || TEMP_SENSOR_7 == 999 - #define TEMP_SENSOR_7_IS_DUMMY 1 -#elif TEMP_SENSOR_7 > 0 +#if TEMP_SENSOR_7 > 0 #define TEMP_SENSOR_7_IS_THERMISTOR 1 #if TEMP_SENSOR_7 == 1000 #define TEMP_SENSOR_7_IS_CUSTOM 1 + #elif TEMP_SENSOR_7 == 998 || TEMP_SENSOR_7 == 999 + #define TEMP_SENSOR_7_IS_DUMMY 1 #endif #endif @@ -662,16 +680,14 @@ #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_BED." #elif TEMP_SENSOR_BED == -1 #define TEMP_SENSOR_BED_IS_AD595 1 -#elif TEMP_SENSOR_BED == 998 || TEMP_SENSOR_BED == 999 - #define TEMP_SENSOR_BED_IS_DUMMY 1 #elif TEMP_SENSOR_BED > 0 #define TEMP_SENSOR_BED_IS_THERMISTOR 1 #if TEMP_SENSOR_BED == 1000 #define TEMP_SENSOR_BED_IS_CUSTOM 1 + #elif TEMP_SENSOR_BED == 998 || TEMP_SENSOR_BED == 999 + #define TEMP_SENSOR_BED_IS_DUMMY 1 #endif #else - #undef THERMAL_PROTECTION_BED - #undef THERMAL_PROTECTION_BED_PERIOD #undef BED_MINTEMP #undef BED_MAXTEMP #endif @@ -684,12 +700,12 @@ #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_CHAMBER." #elif TEMP_SENSOR_CHAMBER == -1 #define TEMP_SENSOR_CHAMBER_IS_AD595 1 -#elif TEMP_SENSOR_CHAMBER == 998 || TEMP_SENSOR_CHAMBER == 999 - #define TEMP_SENSOR_CHAMBER_IS_DUMMY 1 #elif TEMP_SENSOR_CHAMBER > 0 #define TEMP_SENSOR_CHAMBER_IS_THERMISTOR 1 #if TEMP_SENSOR_CHAMBER == 1000 #define TEMP_SENSOR_CHAMBER_IS_CUSTOM 1 + #elif TEMP_SENSOR_CHAMBER == 998 || TEMP_SENSOR_CHAMBER == 999 + #define TEMP_SENSOR_CHAMBER_IS_DUMMY 1 #endif #else #undef THERMAL_PROTECTION_CHAMBER @@ -726,12 +742,12 @@ #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_PROBE." #elif TEMP_SENSOR_PROBE == -1 #define TEMP_SENSOR_PROBE_IS_AD595 1 -#elif TEMP_SENSOR_PROBE == 998 || TEMP_SENSOR_PROBE == 999 - #define TEMP_SENSOR_PROBE_IS_DUMMY 1 #elif TEMP_SENSOR_PROBE > 0 #define TEMP_SENSOR_PROBE_IS_THERMISTOR 1 #if TEMP_SENSOR_PROBE == 1000 #define TEMP_SENSOR_PROBE_IS_CUSTOM 1 + #elif TEMP_SENSOR_PROBE == 998 || TEMP_SENSOR_PROBE == 999 + #define TEMP_SENSOR_PROBE_IS_DUMMY 1 #endif #endif @@ -743,20 +759,20 @@ #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_BOARD." #elif TEMP_SENSOR_BOARD == -1 #define TEMP_SENSOR_BOARD_IS_AD595 1 -#elif TEMP_SENSOR_BOARD == 998 || TEMP_SENSOR_BOARD == 999 - #define TEMP_SENSOR_BOARD_IS_DUMMY 1 #elif TEMP_SENSOR_BOARD > 0 #define TEMP_SENSOR_BOARD_IS_THERMISTOR 1 #if TEMP_SENSOR_BOARD == 1000 #define TEMP_SENSOR_BOARD_IS_CUSTOM 1 + #elif TEMP_SENSOR_BOARD == 998 || TEMP_SENSOR_BOARD == 999 + #define TEMP_SENSOR_BOARD_IS_DUMMY 1 #endif #endif -#if ENABLED(MIXING_EXTRUDER) && (ENABLED(RETRACT_SYNC_MIXING) || BOTH(FILAMENT_LOAD_UNLOAD_GCODES, FILAMENT_UNLOAD_ALL_EXTRUDERS)) +#if ENABLED(MIXING_EXTRUDER) && (ENABLED(RETRACT_SYNC_MIXING) || ALL(FILAMENT_LOAD_UNLOAD_GCODES, FILAMENT_UNLOAD_ALL_EXTRUDERS)) #define HAS_MIXER_SYNC_CHANNEL 1 #endif -#if EITHER(DUAL_X_CARRIAGE, MULTI_NOZZLE_DUPLICATION) +#if ANY(DUAL_X_CARRIAGE, MULTI_NOZZLE_DUPLICATION) #define HAS_DUPLICATION_MODE 1 #endif @@ -794,7 +810,7 @@ #undef MENU_ADDAUTOSTART #endif -#if EITHER(HAS_MEDIA, SET_PROGRESS_MANUALLY) +#if ANY(HAS_MEDIA, SET_PROGRESS_MANUALLY) #define HAS_PRINT_PROGRESS 1 #endif @@ -820,7 +836,7 @@ #define HAS_EXTRA_PROGRESS 1 #endif -#if HAS_PRINT_PROGRESS && EITHER(PRINT_PROGRESS_SHOW_DECIMALS, SHOW_REMAINING_TIME) +#if HAS_PRINT_PROGRESS && ANY(PRINT_PROGRESS_SHOW_DECIMALS, SHOW_REMAINING_TIME) #define HAS_PRINT_PROGRESS_PERMYRIAD 1 #endif @@ -838,7 +854,7 @@ #if ANY(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS, Z_MULTI_ENDSTOPS) #define HAS_EXTRA_ENDSTOPS 1 #endif -#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) +#if ANY(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) #define HAS_SOFTWARE_ENDSTOPS 1 #endif #if ANY(EXTENSIBLE_UI, IS_NEWPANEL, EMERGENCY_PARSER, HAS_ADC_BUTTONS, HAS_DWIN_E3V2) @@ -860,21 +876,32 @@ #define HAS_GCODE_M255 1 #endif -#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) +#if ANY(DIGIPOT_MCP4018, DIGIPOT_MCP4451) #define HAS_MOTOR_CURRENT_I2C 1 #endif -#if ENABLED(Z_STEPPER_AUTO_ALIGN) - #ifdef Z_STEPPER_ALIGN_STEPPER_XY - #define HAS_Z_STEPPER_ALIGN_STEPPER_XY 1 - #undef Z_STEPPER_ALIGN_AMP - #endif - #ifndef Z_STEPPER_ALIGN_AMP - #define Z_STEPPER_ALIGN_AMP 1.0 - #endif +// X2 but not IDEX => Dual Synchronized X Steppers +#if defined(X2_DRIVER_TYPE) && DISABLED(DUAL_X_CARRIAGE) + #define HAS_SYNCED_X_STEPPERS 1 +#endif + +// Y2 Stepper => Dual Synchronized Y Steppers +#ifdef Y2_DRIVER_TYPE + #define HAS_SYNCED_Y_STEPPERS 1 #endif // Multiple Z steppers +#ifdef INVERT_Z_DIR + #if NUM_Z_STEPPERS >= 2 && !defined(INVERT_Z2_DIR) + #define INVERT_Z2_DIR INVERT_Z_DIR + #if NUM_Z_STEPPERS >= 3 && !defined(INVERT_Z3_DIR) + #define INVERT_Z3_DIR INVERT_Z_DIR + #if NUM_Z_STEPPERS >= 4 && !defined(INVERT_Z4_DIR) + #define INVERT_Z4_DIR INVERT_Z_DIR + #endif + #endif + #endif +#endif #if NUM_Z_STEPPERS < 4 #undef INVERT_Z4_VS_Z_DIR #if NUM_Z_STEPPERS < 3 @@ -885,15 +912,22 @@ #endif #endif -#if defined(X2_DRIVER_TYPE) && DISABLED(DUAL_X_CARRIAGE) - #define HAS_DUAL_X_STEPPERS 1 +// Z Stepper Auto-align +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + #ifdef Z_STEPPER_ALIGN_STEPPER_XY + #define HAS_Z_STEPPER_ALIGN_STEPPER_XY 1 + #undef Z_STEPPER_ALIGN_AMP + #endif + #ifndef Z_STEPPER_ALIGN_AMP + #define Z_STEPPER_ALIGN_AMP 1.0 + #endif #endif // // Spindle/Laser power display types // Defined here so sanity checks can use them // -#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) +#if ANY(SPINDLE_FEATURE, LASER_FEATURE) #define HAS_CUTTER 1 #define _CUTTER_POWER_PWM255 1 #define _CUTTER_POWER_PERCENT 2 @@ -966,7 +1000,7 @@ #endif #endif -#if EITHER(FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864) +#if ANY(FYSETC_MINI_12864_2_1, FYSETC_242_OLED_12864) #ifndef LED_USER_PRESET_GREEN #define LED_USER_PRESET_GREEN 128 #endif @@ -1001,7 +1035,7 @@ #endif #endif -#if BOTH(LED_CONTROL_MENU, NEOPIXEL2_SEPARATE) +#if ALL(LED_CONTROL_MENU, NEOPIXEL2_SEPARATE) #ifndef LED2_USER_PRESET_RED #define LED2_USER_PRESET_RED 255 #endif @@ -1024,7 +1058,7 @@ #endif // Full Touch Screen needs 'tft/xpt2046' -#if EITHER(TFT_TOUCH_DEVICE_XPT2046, HAS_TFT_LVGL_UI) +#if ANY(TFT_TOUCH_DEVICE_XPT2046, HAS_TFT_LVGL_UI) #define HAS_TFT_XPT2046 1 #endif @@ -1044,12 +1078,6 @@ #define POLL_JOG #endif -#if X2_HOME_DIR > 0 - #define X2_HOME_TO_MAX 1 -#elif X2_HOME_DIR < 0 - #define X2_HOME_TO_MIN 1 -#endif - #ifndef HOMING_BUMP_MM #define HOMING_BUMP_MM { 0, 0, 0 } #endif @@ -1156,10 +1184,11 @@ #define SD_CONNECTION_IS(V) (_SDCARD_ID(SDCARD_CONNECTION) == _SDCARD_ID(V)) #else #define SD_CONNECTION_IS(...) 0 + #undef SD_ABORT_ON_ENDSTOP_HIT #endif // Power Monitor sensors -#if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) +#if ANY(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) #define HAS_POWER_MONITOR 1 #if ENABLED(POWER_MONITOR_CURRENT) && (ENABLED(POWER_MONITOR_VOLTAGE) || defined(POWER_MONITOR_FIXED_VOLTAGE)) #define HAS_POWER_MONITOR_WATTS 1 @@ -1178,7 +1207,7 @@ // 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) + #if ANY(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED) #define CASE_LIGHT_IS_COLOR_LED 1 #else #define NEED_CASE_LIGHT_PIN 1 @@ -1195,7 +1224,7 @@ #define NEED_LSF 1 #endif -#if BOTH(HAS_TFT_LVGL_UI, CUSTOM_MENU_MAIN) +#if ALL(HAS_TFT_LVGL_UI, CUSTOM_MENU_MAIN) #define _HAS_1(N) (defined(MAIN_MENU_ITEM_##N##_DESC) && defined(MAIN_MENU_ITEM_##N##_GCODE)) #define HAS_USER_ITEM(V...) DO(HAS,||,V) #else @@ -1203,17 +1232,16 @@ #endif /** - * LCD_SERIAL_PORT must be defined ahead of HAL.h + * LCD_SERIAL_PORT must be defined ahead of HAL.h and + * currently HAL.h must be included ahead of pins.h. */ -#ifndef LCD_SERIAL_PORT - #if HAS_DWIN_E3V2 || IS_DWIN_MARLINUI || HAS_DGUS_LCD - #if MB(BTT_SKR_MINI_E3_V1_0, BTT_SKR_MINI_E3_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_MINI_E3_V3_0, BTT_SKR_E3_TURBO, BTT_OCTOPUS_V1_1) - #define LCD_SERIAL_PORT 1 - #elif MB(CREALITY_V24S1_301, CREALITY_V24S1_301F4, CREALITY_V423, MKS_ROBIN) - #define LCD_SERIAL_PORT 2 // Creality Ender3S1, MKS Robin - #else - #define LCD_SERIAL_PORT 3 // Other boards - #endif +#if LCD_IS_SERIAL_HOST && !defined(LCD_SERIAL_PORT) + #if MB(BTT_SKR_MINI_E3_V1_0, BTT_SKR_MINI_E3_V1_2, BTT_SKR_MINI_E3_V2_0, BTT_SKR_MINI_E3_V3_0, BTT_SKR_E3_TURBO, BTT_OCTOPUS_V1_1) + #define LCD_SERIAL_PORT 1 + #elif MB(CREALITY_V24S1_301, CREALITY_V24S1_301F4, CREALITY_V423, MKS_ROBIN, PANOWIN_CUTLASS, KODAMA_BARDO) + #define LCD_SERIAL_PORT 2 + #else + #define LCD_SERIAL_PORT 3 #endif #ifdef LCD_SERIAL_PORT #define AUTO_ASSIGNED_LCD_SERIAL 1 @@ -1223,18 +1251,18 @@ #if !HAS_MULTI_SERIAL #undef MEATPACK_ON_SERIAL_PORT_2 #endif -#if EITHER(MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2) +#if ANY(MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2) #define HAS_MEATPACK 1 #endif // AVR are (usually) too limited in resources to store the configuration into the binary -#if ENABLED(CONFIGURATION_EMBEDDING) && !defined(FORCE_CONFIG_EMBED) && (defined(__AVR__) || !HAS_MEDIA || EITHER(SDCARD_READONLY, DISABLE_M503)) +#if ENABLED(CONFIGURATION_EMBEDDING) && !defined(FORCE_CONFIG_EMBED) && (defined(__AVR__) || !HAS_MEDIA || ANY(SDCARD_READONLY, DISABLE_M503)) #undef CONFIGURATION_EMBEDDING #define CANNOT_EMBED_CONFIGURATION defined(__AVR__) #endif // Input shaping -#if EITHER(INPUT_SHAPING_X, INPUT_SHAPING_Y) +#if ANY(INPUT_SHAPING_X, INPUT_SHAPING_Y) #define HAS_ZV_SHAPING 1 #endif @@ -1250,3 +1278,8 @@ #define MULTISTEPPING_LIMIT 128 #define MULTISTEPPING_LIMIT_WARNING 1 #endif + +// One redundant cooling fan by default +#if defined(REDUNDANT_PART_COOLING_FAN) && !defined(NUM_REDUNDANT_FANS) + #define NUM_REDUNDANT_FANS 1 +#endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 30c2613b03..bc33c20f41 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -38,7 +38,7 @@ #endif // Linear advance uses Jerk since E is an isolated axis -#if BOTH(HAS_JUNCTION_DEVIATION, LIN_ADVANCE) +#if ALL(HAS_JUNCTION_DEVIATION, LIN_ADVANCE) #define HAS_LINEAR_E_JERK 1 #endif @@ -48,7 +48,7 @@ // Set additional flags to let HALs choose in their Conditionals_post.h #if ANY(FLASH_EEPROM_EMULATION, SRAM_EEPROM_EMULATION, SDCARD_EEPROM_EMULATION, QSPI_EEPROM) #define USE_EMULATED_EEPROM 1 - #elif EITHER(I2C_EEPROM, SPI_EEPROM) + #elif ANY(I2C_EEPROM, SPI_EEPROM) #define USE_WIRED_EEPROM 1 #elif ENABLED(IIC_BL24CXX_EEPROM) // nothing @@ -65,6 +65,10 @@ #undef IIC_BL24CXX_EEPROM #endif +#if DISABLED(IIC_BL24CXX_EEPROM) + #undef OTA_FIRMWARE_UPDATE +#endif + #ifdef TEENSYDUINO #undef max #define max(a,b) ((a)>(b)?(a):(b)) @@ -101,7 +105,9 @@ #define HAS_ROTATIONAL_AXES 1 #endif -#define X_MAX_LENGTH (X_MAX_POS - (X_MIN_POS)) +#if HAS_X_AXIS + #define X_MAX_LENGTH (X_MAX_POS - (X_MIN_POS)) +#endif #if HAS_Y_AXIS #define Y_MAX_LENGTH (Y_MAX_POS - (Y_MIN_POS)) #endif @@ -130,7 +136,7 @@ #endif // Defined only if the sanity-check is bypassed -#ifndef X_BED_SIZE +#if HAS_X_AXIS && !defined(X_BED_SIZE) #define X_BED_SIZE X_MAX_LENGTH #endif #if HAS_Y_AXIS && !defined(Y_BED_SIZE) @@ -161,7 +167,9 @@ #endif // Define center values for future use -#define _X_HALF_BED ((X_BED_SIZE) / 2) +#if HAS_X_AXIS + #define _X_HALF_BED ((X_BED_SIZE) / 2) +#endif #if HAS_Y_AXIS #define _Y_HALF_BED ((Y_BED_SIZE) / 2) #endif @@ -184,7 +192,9 @@ #define _W_HALF_WMAX ((W_BED_SIZE) / 2) #endif -#define X_CENTER TERN(BED_CENTER_AT_0_0, 0, _X_HALF_BED) +#if HAS_X_AXIS + #define X_CENTER TERN(BED_CENTER_AT_0_0, 0, _X_HALF_BED) +#endif #if HAS_Y_AXIS #define Y_CENTER TERN(BED_CENTER_AT_0_0, 0, _Y_HALF_BED) #define XY_CENTER { X_CENTER, Y_CENTER } @@ -209,8 +219,10 @@ #endif // Get the linear boundaries of the bed -#define X_MIN_BED (X_CENTER - _X_HALF_BED) -#define X_MAX_BED (X_MIN_BED + X_BED_SIZE) +#if HAS_X_AXIS + #define X_MIN_BED (X_CENTER - _X_HALF_BED) + #define X_MAX_BED (X_MIN_BED + X_BED_SIZE) +#endif #if HAS_Y_AXIS #define Y_MIN_BED (Y_CENTER - _Y_HALF_BED) #define Y_MAX_BED (Y_MIN_BED + Y_BED_SIZE) @@ -253,7 +265,7 @@ #endif // Calibration codes only for non-core axes -#if EITHER(BACKLASH_GCODE, CALIBRATION_GCODE) +#if ANY(BACKLASH_GCODE, CALIBRATION_GCODE) #if ANY(IS_CORE, MARKFORGED_XY, MARKFORGED_YX) #define CAN_CALIBRATE(A,B) TERN0(HAS_##A##_AXIS, (_AXIS(A) == B)) #else @@ -288,14 +300,16 @@ /** * Set the home position based on settings or manual overrides */ -#ifdef MANUAL_X_HOME_POS - #define X_HOME_POS MANUAL_X_HOME_POS -#else - #define X_END_POS TERN(X_HOME_TO_MIN, X_MIN_POS, X_MAX_POS) - #if ENABLED(BED_CENTER_AT_0_0) - #define X_HOME_POS TERN(DELTA, 0, X_END_POS) +#if HAS_X_AXIS + #ifdef MANUAL_X_HOME_POS + #define X_HOME_POS MANUAL_X_HOME_POS #else - #define X_HOME_POS TERN(DELTA, X_MIN_POS + (X_BED_SIZE) * 0.5, X_END_POS) + #define X_END_POS TERN(X_HOME_TO_MIN, X_MIN_POS, X_MAX_POS) + #if ENABLED(BED_CENTER_AT_0_0) + #define X_HOME_POS TERN(DELTA, 0, X_END_POS) + #else + #define X_HOME_POS TERN(DELTA, X_MIN_POS + (X_BED_SIZE) * 0.5, X_END_POS) + #endif #endif #endif @@ -452,14 +466,14 @@ #elif ENABLED(AZSMZ_12864) #define _LCD_CONTRAST_MIN 120 #define _LCD_CONTRAST_INIT 190 -#elif EITHER(MKS_LCD12864A, MKS_LCD12864B) +#elif ANY(MKS_LCD12864A, MKS_LCD12864B) #define _LCD_CONTRAST_MIN 120 #define _LCD_CONTRAST_INIT 205 -#elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) +#elif ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define _LCD_CONTRAST_MIN 120 #define _LCD_CONTRAST_INIT 195 -#elif EITHER(MKS_MINI_12864_V3, BTT_MINI_12864_V1) - #define _LCD_CONTRAST_MIN 255 +#elif ENABLED(FYSETC_MINI_12864_2_1) + #define _LCD_CONTRAST_MIN 230 #define _LCD_CONTRAST_INIT 255 #elif ENABLED(FYSETC_MINI_12864) #define _LCD_CONTRAST_MIN 180 @@ -512,7 +526,7 @@ */ #if HAS_MEDIA - #if HAS_SD_HOST_DRIVE && SD_CONNECTION_IS(ONBOARD) + #if HAS_SD_HOST_DRIVE && SD_CONNECTION_IS(ONBOARD) && DISABLED(KEEP_SD_DETECT) // // The external SD card is not used. Hardware SPI is used to access the card. // When sharing the SD card with a PC we want the menu options to @@ -544,7 +558,7 @@ #endif #endif - #if DISABLED(USB_FLASH_DRIVE_SUPPORT) || BOTH(MULTI_VOLUME, VOLUME_SD_ONBOARD) + #if DISABLED(USB_FLASH_DRIVE_SUPPORT) || ALL(MULTI_VOLUME, VOLUME_SD_ONBOARD) #if ENABLED(ONBOARD_SDIO) #define NEED_SD2CARD_SDIO 1 #else @@ -556,7 +570,7 @@ #define REINIT_NOISY_LCD 1 // Have the LCD re-init on SD insertion #endif -#endif +#endif // HAS_MEDIA /** * Power Supply @@ -717,13 +731,13 @@ // Add LIB_MAX6675 / LIB_MAX31855 / LIB_MAX31865 to the build_flags // to select a USER library for MAX6675, MAX31855, MAX31865 // - #if BOTH(HAS_MAX6675, LIB_MAX6675) + #if ALL(HAS_MAX6675, LIB_MAX6675) #define USE_LIB_MAX6675 1 #endif - #if BOTH(HAS_MAX31855, LIB_MAX31855) + #if ALL(HAS_MAX31855, LIB_MAX31855) #define USE_ADAFRUIT_MAX31855 1 #endif - #if BOTH(HAS_MAX31865, LIB_MAX31865) + #if ALL(HAS_MAX31865, LIB_MAX31865) #define USE_ADAFRUIT_MAX31865 1 #elif HAS_MAX31865 #define LIB_INTERNAL_MAX31865 1 @@ -737,17 +751,17 @@ #if ENABLED(X_DUAL_ENDSTOPS) #if X_HOME_TO_MAX #ifndef X2_MAX_ENDSTOP_HIT_STATE - #if X2_USE_ENDSTOP == _XMIN_ + #if X2_STOP_PIN == X_MIN_PIN #define X2_MAX_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _XMAX_ + #elif X2_STOP_PIN == X_MAX_PIN #define X2_MAX_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _YMIN_ + #elif X2_STOP_PIN == Y_MIN_PIN #define X2_MAX_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _YMAX_ + #elif X2_STOP_PIN == Y_MAX_PIN #define X2_MAX_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _ZMIN_ + #elif X2_STOP_PIN == Z_MIN_PIN #define X2_MAX_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _ZMAX_ + #elif X2_STOP_PIN == Z_MAX_PIN #define X2_MAX_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -759,17 +773,17 @@ #endif #else #ifndef X2_MIN_ENDSTOP_HIT_STATE - #if X2_USE_ENDSTOP == _XMIN_ + #if X2_STOP_PIN == X_MIN_PIN #define X2_MIN_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _XMAX_ + #elif X2_STOP_PIN == X_MAX_PIN #define X2_MIN_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _YMIN_ + #elif X2_STOP_PIN == Y_MIN_PIN #define X2_MIN_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _YMAX_ + #elif X2_STOP_PIN == Y_MAX_PIN #define X2_MIN_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _ZMIN_ + #elif X2_STOP_PIN == Z_MIN_PIN #define X2_MIN_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif X2_USE_ENDSTOP == _ZMAX_ + #elif X2_STOP_PIN == Z_MAX_PIN #define X2_MIN_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -794,17 +808,17 @@ #if ENABLED(Y_DUAL_ENDSTOPS) #if Y_HOME_TO_MAX #ifndef Y2_MAX_ENDSTOP_HIT_STATE - #if Y2_USE_ENDSTOP == _XMIN_ + #if Y2_STOP_PIN == X_MIN_PIN #define Y2_MAX_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _XMAX_ + #elif Y2_STOP_PIN == X_MAX_PIN #define Y2_MAX_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _YMIN_ + #elif Y2_STOP_PIN == Y_MIN_PIN #define Y2_MAX_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _YMAX_ + #elif Y2_STOP_PIN == Y_MAX_PIN #define Y2_MAX_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _ZMIN_ + #elif Y2_STOP_PIN == Z_MIN_PIN #define Y2_MAX_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _ZMAX_ + #elif Y2_STOP_PIN == Z_MAX_PIN #define Y2_MAX_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -816,17 +830,17 @@ #endif #else #ifndef Y2_MIN_ENDSTOP_HIT_STATE - #if Y2_USE_ENDSTOP == _XMIN_ + #if Y2_STOP_PIN == X_MIN_PIN #define Y2_MIN_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _XMAX_ + #elif Y2_STOP_PIN == X_MAX_PIN #define Y2_MIN_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _YMIN_ + #elif Y2_STOP_PIN == Y_MIN_PIN #define Y2_MIN_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _YMAX_ + #elif Y2_STOP_PIN == Y_MAX_PIN #define Y2_MIN_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _ZMIN_ + #elif Y2_STOP_PIN == Z_MIN_PIN #define Y2_MIN_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif Y2_USE_ENDSTOP == _ZMAX_ + #elif Y2_STOP_PIN == Z_MAX_PIN #define Y2_MIN_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -852,17 +866,17 @@ #if Z_HOME_TO_MAX #ifndef Z2_MAX_ENDSTOP_HIT_STATE - #if Z2_USE_ENDSTOP == _XMIN_ + #if Z2_STOP_PIN == X_MIN_PIN #define Z2_MAX_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _XMAX_ + #elif Z2_STOP_PIN == X_MAX_PIN #define Z2_MAX_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _YMIN_ + #elif Z2_STOP_PIN == Y_MIN_PIN #define Z2_MAX_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _YMAX_ + #elif Z2_STOP_PIN == Y_MAX_PIN #define Z2_MAX_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _ZMIN_ + #elif Z2_STOP_PIN == Z_MIN_PIN #define Z2_MAX_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _ZMAX_ + #elif Z2_STOP_PIN == Z_MAX_PIN #define Z2_MAX_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -874,17 +888,17 @@ #endif #else #ifndef Z2_MIN_ENDSTOP_HIT_STATE - #if Z2_USE_ENDSTOP == _XMIN_ + #if Z2_STOP_PIN == X_MIN_PIN #define Z2_MIN_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _XMAX_ + #elif Z2_STOP_PIN == X_MAX_PIN #define Z2_MIN_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _YMIN_ + #elif Z2_STOP_PIN == Y_MIN_PIN #define Z2_MIN_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _YMAX_ + #elif Z2_STOP_PIN == Y_MAX_PIN #define Z2_MIN_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _ZMIN_ + #elif Z2_STOP_PIN == Z_MIN_PIN #define Z2_MIN_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif Z2_USE_ENDSTOP == _ZMAX_ + #elif Z2_STOP_PIN == Z_MAX_PIN #define Z2_MIN_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -905,17 +919,17 @@ #if NUM_Z_STEPPERS >= 3 #if Z_HOME_TO_MAX #ifndef Z3_MAX_ENDSTOP_HIT_STATE - #if Z3_USE_ENDSTOP == _XMIN_ + #if Z3_STOP_PIN == X_MIN_PIN #define Z3_MAX_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _XMAX_ + #elif Z3_STOP_PIN == X_MAX_PIN #define Z3_MAX_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _YMIN_ + #elif Z3_STOP_PIN == Y_MIN_PIN #define Z3_MAX_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _YMAX_ + #elif Z3_STOP_PIN == Y_MAX_PIN #define Z3_MAX_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _ZMIN_ + #elif Z3_STOP_PIN == Z_MIN_PIN #define Z3_MAX_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _ZMAX_ + #elif Z3_STOP_PIN == Z_MAX_PIN #define Z3_MAX_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -927,17 +941,17 @@ #endif #else #ifndef Z3_MIN_ENDSTOP_HIT_STATE - #if Z3_USE_ENDSTOP == _XMIN_ + #if Z3_STOP_PIN == X_MIN_PIN #define Z3_MIN_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _XMAX_ + #elif Z3_STOP_PIN == X_MAX_PIN #define Z3_MIN_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _YMIN_ + #elif Z3_STOP_PIN == Y_MIN_PIN #define Z3_MIN_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _YMAX_ + #elif Z3_STOP_PIN == Y_MAX_PIN #define Z3_MIN_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _ZMIN_ + #elif Z3_STOP_PIN == Z_MIN_PIN #define Z3_MIN_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif Z3_USE_ENDSTOP == _ZMAX_ + #elif Z3_STOP_PIN == Z_MAX_PIN #define Z3_MIN_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -959,17 +973,17 @@ #if NUM_Z_STEPPERS >= 4 #if Z_HOME_TO_MAX #ifndef Z4_MAX_ENDSTOP_HIT_STATE - #if Z4_USE_ENDSTOP == _XMIN_ + #if Z4_STOP_PIN == X_MIN_PIN #define Z4_MAX_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _XMAX_ + #elif Z4_STOP_PIN == X_MAX_PIN #define Z4_MAX_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _YMIN_ + #elif Z4_STOP_PIN == Y_MIN_PIN #define Z4_MAX_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _YMAX_ + #elif Z4_STOP_PIN == Y_MAX_PIN #define Z4_MAX_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _ZMIN_ + #elif Z4_STOP_PIN == Z_MIN_PIN #define Z4_MAX_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _ZMAX_ + #elif Z4_STOP_PIN == Z_MAX_PIN #define Z4_MAX_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -981,17 +995,17 @@ #endif #else #ifndef Z4_MIN_ENDSTOP_HIT_STATE - #if Z4_USE_ENDSTOP == _XMIN_ + #if Z4_STOP_PIN == X_MIN_PIN #define Z4_MIN_ENDSTOP_HIT_STATE X_MIN_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _XMAX_ + #elif Z4_STOP_PIN == X_MAX_PIN #define Z4_MIN_ENDSTOP_HIT_STATE X_MAX_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _YMIN_ + #elif Z4_STOP_PIN == Y_MIN_PIN #define Z4_MIN_ENDSTOP_HIT_STATE Y_MIN_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _YMAX_ + #elif Z4_STOP_PIN == Y_MAX_PIN #define Z4_MIN_ENDSTOP_HIT_STATE Y_MAX_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _ZMIN_ + #elif Z4_STOP_PIN == Z_MIN_PIN #define Z4_MIN_ENDSTOP_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE - #elif Z4_USE_ENDSTOP == _ZMAX_ + #elif Z4_STOP_PIN == Z_MAX_PIN #define Z4_MIN_ENDSTOP_HIT_STATE Z_MAX_ENDSTOP_HIT_STATE #endif #endif @@ -1012,119 +1026,37 @@ #endif // Z_MULTI_ENDSTOPS -/** - * Set ENDSTOPPULLUPS for active endstop switches - */ -#if ENABLED(ENDSTOPPULLUPS) - #if ENABLED(USE_XMAX_PLUG) - #define ENDSTOPPULLUP_XMAX - #endif - #if ENABLED(USE_YMAX_PLUG) - #define ENDSTOPPULLUP_YMAX - #endif - #if ENABLED(USE_ZMAX_PLUG) - #define ENDSTOPPULLUP_ZMAX - #endif - #if ENABLED(USE_IMAX_PLUG) - #define ENDSTOPPULLUP_IMAX - #endif - #if ENABLED(USE_JMAX_PLUG) - #define ENDSTOPPULLUP_JMAX - #endif - #if ENABLED(USE_KMAX_PLUG) - #define ENDSTOPPULLUP_KMAX - #endif - #if ENABLED(USE_UMAX_PLUG) - #define ENDSTOPPULLUP_UMAX - #endif - #if ENABLED(USE_VMAX_PLUG) - #define ENDSTOPPULLUP_VMAX - #endif - #if ENABLED(USE_WMAX_PLUG) - #define ENDSTOPPULLUP_WMAX - #endif - #if ENABLED(USE_XMIN_PLUG) - #define ENDSTOPPULLUP_XMIN - #endif - #if ENABLED(USE_YMIN_PLUG) - #define ENDSTOPPULLUP_YMIN - #endif - #if ENABLED(USE_ZMIN_PLUG) - #define ENDSTOPPULLUP_ZMIN - #endif - #if ENABLED(USE_IMIN_PLUG) - #define ENDSTOPPULLUP_IMIN - #endif - #if ENABLED(USE_JMIN_PLUG) - #define ENDSTOPPULLUP_JMIN - #endif - #if ENABLED(USE_KMIN_PLUG) - #define ENDSTOPPULLUP_KMIN - #endif - #if ENABLED(USE_UMIN_PLUG) - #define ENDSTOPPULLUP_UMIN - #endif - #if ENABLED(USE_VMIN_PLUG) - #define ENDSTOPPULLUP_VMIN - #endif - #if ENABLED(USE_WMIN_PLUG) - #define ENDSTOPPULLUP_WMIN - #endif -#endif - -/** - * Set ENDSTOPPULLDOWNS for active endstop switches - */ -#if ENABLED(ENDSTOPPULLDOWNS) - #if ENABLED(USE_XMAX_PLUG) - #define ENDSTOPPULLDOWN_XMAX - #endif - #if ENABLED(USE_YMAX_PLUG) - #define ENDSTOPPULLDOWN_YMAX - #endif - #if ENABLED(USE_ZMAX_PLUG) - #define ENDSTOPPULLDOWN_ZMAX - #endif - #if ENABLED(USE_XMIN_PLUG) - #define ENDSTOPPULLDOWN_XMIN - #endif - #if ENABLED(USE_YMIN_PLUG) - #define ENDSTOPPULLDOWN_YMIN - #endif - #if ENABLED(USE_ZMIN_PLUG) - #define ENDSTOPPULLDOWN_ZMIN - #endif -#endif - /** * Shorthand for pin tests, used wherever needed */ // Steppers -#if PIN_EXISTS(X_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X)) - #define HAS_X_ENABLE 1 -#endif -#if PIN_EXISTS(X_DIR) - #define HAS_X_DIR 1 -#endif -#if PIN_EXISTS(X_STEP) - #define HAS_X_STEP 1 -#endif -#if PIN_EXISTS(X_MS1) - #define HAS_X_MS_PINS 1 -#endif +#if HAS_X_AXIS + #if PIN_EXISTS(X_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X)) + #define HAS_X_ENABLE 1 + #endif + #if PIN_EXISTS(X_DIR) + #define HAS_X_DIR 1 + #endif + #if PIN_EXISTS(X_STEP) + #define HAS_X_STEP 1 + #endif + #if PIN_EXISTS(X_MS1) + #define HAS_X_MS_PINS 1 + #endif -#if PIN_EXISTS(X2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X2)) - #define HAS_X2_ENABLE 1 -#endif -#if PIN_EXISTS(X2_DIR) - #define HAS_X2_DIR 1 -#endif -#if PIN_EXISTS(X2_STEP) - #define HAS_X2_STEP 1 -#endif -#if PIN_EXISTS(X2_MS1) - #define HAS_X2_MS_PINS 1 + #if PIN_EXISTS(X2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X2)) + #define HAS_X2_ENABLE 1 + #endif + #if PIN_EXISTS(X2_DIR) + #define HAS_X2_DIR 1 + #endif + #if PIN_EXISTS(X2_STEP) + #define HAS_X2_STEP 1 + #endif + #if PIN_EXISTS(X2_MS1) + #define HAS_X2_MS_PINS 1 + #endif #endif /** @@ -1145,17 +1077,19 @@ #define HAS_Y_MS_PINS 1 #endif - #if PIN_EXISTS(Y2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y2)) - #define HAS_Y2_ENABLE 1 - #endif - #if PIN_EXISTS(Y2_DIR) - #define HAS_Y2_DIR 1 - #endif - #if PIN_EXISTS(Y2_STEP) - #define HAS_Y2_STEP 1 - #endif - #if PIN_EXISTS(Y2_MS1) - #define HAS_Y2_MS_PINS 1 + #if HAS_Y2_STEPPER + #if PIN_EXISTS(Y2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y2)) + #define HAS_Y2_ENABLE 1 + #endif + #if PIN_EXISTS(Y2_DIR) + #define HAS_Y2_DIR 1 + #endif + #if PIN_EXISTS(Y2_STEP) + #define HAS_Y2_STEP 1 + #endif + #if PIN_EXISTS(Y2_MS1) + #define HAS_Y2_MS_PINS 1 + #endif #endif #endif @@ -1441,7 +1375,7 @@ * - Z_PROBE_SLED uses SOL1_PIN, when defined (unless EXT_SOLENOID is enabled) */ #if ANY(EXT_SOLENOID, MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER, SOLENOID_PROBE, Z_PROBE_SLED) - #if PIN_EXISTS(SOL0) && (EITHER(MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER) || BOTH(EXT_SOLENOID, HAS_EXTRUDERS)) + #if PIN_EXISTS(SOL0) && (ANY(MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER) || ALL(EXT_SOLENOID, HAS_EXTRUDERS)) #define HAS_SOLENOID_0 1 #endif #if PIN_EXISTS(SOL1) && (ANY(MANUAL_SOLENOID_CONTROL, PARKING_EXTRUDER, SOLENOID_PROBE, Z_PROBE_SLED) || TERN0(EXT_SOLENOID, E_STEPPERS > 1)) @@ -1475,9 +1409,10 @@ #if ANY(STEALTHCHOP_E, STEALTHCHOP_XY, STEALTHCHOP_Z, STEALTHCHOP_I, STEALTHCHOP_J, STEALTHCHOP_K, STEALTHCHOP_U, STEALTHCHOP_V, STEALTHCHOP_W) #define STEALTHCHOP_ENABLED 1 #endif - #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + #if ANY(SENSORLESS_HOMING, SENSORLESS_PROBING) #define USE_SENSORLESS 1 #endif + // Disable Z axis sensorless homing if a probe is used to home the Z axis #if HOMING_Z_WITH_PROBE #undef Z_STALL_SENSITIVITY @@ -1506,7 +1441,6 @@ #define X_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(X2) #if defined(X2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2) #define X2_SENSORLESS 1 @@ -1544,31 +1478,22 @@ #ifndef Y_SLAVE_ADDRESS #define Y_SLAVE_ADDRESS 0 #endif - #if HAS_DUAL_Y_STEPPERS - #if defined(Y2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2) - #define Y2_SENSORLESS 1 - #endif - #if AXIS_HAS_STEALTHCHOP(Y2) - #define Y2_HAS_STEALTHCHOP 1 - #endif - #ifndef Y2_INTERPOLATE - #define Y2_INTERPOLATE Y_INTERPOLATE - #endif - #ifndef Y2_HOLD_MULTIPLIER - #define Y2_HOLD_MULTIPLIER Y_HOLD_MULTIPLIER - #endif - #ifndef Y2_SLAVE_ADDRESS - #define Y2_SLAVE_ADDRESS 0 - #endif + #endif + #if AXIS_IS_TMC(Y2) + #if defined(Y2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2) + #define Y2_SENSORLESS 1 #endif - #if HAS_U_AXIS - #define U_SPI_SENSORLESS U_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(Y2) + #define Y2_HAS_STEALTHCHOP 1 #endif - #if HAS_V_AXIS - #define V_SPI_SENSORLESS V_SENSORLESS + #ifndef Y2_INTERPOLATE + #define Y2_INTERPOLATE Y_INTERPOLATE #endif - #if HAS_W_AXIS - #define W_SPI_SENSORLESS W_SENSORLESS + #ifndef Y2_HOLD_MULTIPLIER + #define Y2_HOLD_MULTIPLIER Y_HOLD_MULTIPLIER + #endif + #ifndef Y2_SLAVE_ADDRESS + #define Y2_SLAVE_ADDRESS 0 #endif #endif @@ -1591,56 +1516,56 @@ #ifndef Z_SLAVE_ADDRESS #define Z_SLAVE_ADDRESS 0 #endif - #if NUM_Z_STEPPERS >= 2 - #if defined(Z2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2) - #define Z2_SENSORLESS 1 - #endif - #if AXIS_HAS_STEALTHCHOP(Z2) - #define Z2_HAS_STEALTHCHOP 1 - #endif - #ifndef Z2_INTERPOLATE - #define Z2_INTERPOLATE Z_INTERPOLATE - #endif - #ifndef Z2_HOLD_MULTIPLIER - #define Z2_HOLD_MULTIPLIER Z_HOLD_MULTIPLIER - #endif - #ifndef Z2_SLAVE_ADDRESS - #define Z2_SLAVE_ADDRESS 0 - #endif + #endif + #if NUM_Z_STEPPERS >= 2 && AXIS_IS_TMC(Z2) + #if defined(Z2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2) + #define Z2_SENSORLESS 1 #endif - #if NUM_Z_STEPPERS >= 3 - #if defined(Z3_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3) - #define Z3_SENSORLESS 1 - #endif - #if AXIS_HAS_STEALTHCHOP(Z3) - #define Z3_HAS_STEALTHCHOP 1 - #endif - #ifndef Z3_INTERPOLATE - #define Z3_INTERPOLATE Z_INTERPOLATE - #endif - #ifndef Z3_HOLD_MULTIPLIER - #define Z3_HOLD_MULTIPLIER Z_HOLD_MULTIPLIER - #endif - #ifndef Z3_SLAVE_ADDRESS - #define Z3_SLAVE_ADDRESS 0 - #endif + #if AXIS_HAS_STEALTHCHOP(Z2) + #define Z2_HAS_STEALTHCHOP 1 #endif - #if NUM_Z_STEPPERS >= 4 - #if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4) - #define Z4_SENSORLESS 1 - #endif - #if AXIS_HAS_STEALTHCHOP(Z4) - #define Z4_HAS_STEALTHCHOP 1 - #endif - #ifndef Z4_INTERPOLATE - #define Z4_INTERPOLATE Z_INTERPOLATE - #endif - #ifndef Z4_HOLD_MULTIPLIER - #define Z4_HOLD_MULTIPLIER Z_HOLD_MULTIPLIER - #endif - #ifndef Z4_SLAVE_ADDRESS - #define Z4_SLAVE_ADDRESS 0 - #endif + #ifndef Z2_INTERPOLATE + #define Z2_INTERPOLATE Z_INTERPOLATE + #endif + #ifndef Z2_HOLD_MULTIPLIER + #define Z2_HOLD_MULTIPLIER Z_HOLD_MULTIPLIER + #endif + #ifndef Z2_SLAVE_ADDRESS + #define Z2_SLAVE_ADDRESS 0 + #endif + #endif + #if NUM_Z_STEPPERS >= 3 && AXIS_IS_TMC(Z3) + #if defined(Z3_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3) + #define Z3_SENSORLESS 1 + #endif + #if AXIS_HAS_STEALTHCHOP(Z3) + #define Z3_HAS_STEALTHCHOP 1 + #endif + #ifndef Z3_INTERPOLATE + #define Z3_INTERPOLATE Z_INTERPOLATE + #endif + #ifndef Z3_HOLD_MULTIPLIER + #define Z3_HOLD_MULTIPLIER Z_HOLD_MULTIPLIER + #endif + #ifndef Z3_SLAVE_ADDRESS + #define Z3_SLAVE_ADDRESS 0 + #endif + #endif + #if NUM_Z_STEPPERS >= 4 && AXIS_IS_TMC(Z4) + #if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4) + #define Z4_SENSORLESS 1 + #endif + #if AXIS_HAS_STEALTHCHOP(Z4) + #define Z4_HAS_STEALTHCHOP 1 + #endif + #ifndef Z4_INTERPOLATE + #define Z4_INTERPOLATE Z_INTERPOLATE + #endif + #ifndef Z4_HOLD_MULTIPLIER + #define Z4_HOLD_MULTIPLIER Z_HOLD_MULTIPLIER + #endif + #ifndef Z4_SLAVE_ADDRESS + #define Z4_SLAVE_ADDRESS 0 #endif #endif @@ -1890,6 +1815,9 @@ #if ANY_AXIS_HAS(SW_SERIAL) #define HAS_TMC_SW_SERIAL 1 #endif +#ifndef SERIAL_FLOAT_PRECISION + #define SERIAL_FLOAT_PRECISION 2 +#endif #if DISABLED(SENSORLESS_HOMING) #undef SENSORLESS_BACKOFF_MM @@ -2024,154 +1952,268 @@ // Endstops and bed probe // -// Is an endstop plug used for extra Z endstops or the probe? -#define IS_PROBE_PIN(A,M) (USES_Z_MIN_PROBE_PIN && Z_MIN_PROBE_PIN == A##_##M##_PIN) -#define IS_X2_ENDSTOP(A,M) (ENABLED(X_DUAL_ENDSTOPS) && X2_USE_ENDSTOP == _##A##M##_) -#define IS_Y2_ENDSTOP(A,M) (ENABLED(Y_DUAL_ENDSTOPS) && Y2_USE_ENDSTOP == _##A##M##_) -#define IS_Z2_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && Z2_USE_ENDSTOP == _##A##M##_) -#define IS_Z3_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPERS >= 3 && Z3_USE_ENDSTOP == _##A##M##_) -#define IS_Z4_ENDSTOP(A,M) (ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPERS >= 4 && Z4_USE_ENDSTOP == _##A##M##_) +#define _USE_STOP(A,N,M,C) ((A##_HOME_TO_##M || (C+0)) && PIN_EXISTS(A##N##_##M)) -#define _HAS_STOP(A,M) (HAS_##A##_AXIS && PIN_EXISTS(A##_##M) && !IS_PROBE_PIN(A,M) && !IS_X2_ENDSTOP(A,M) && !IS_Y2_ENDSTOP(A,M) && !IS_Z2_ENDSTOP(A,M) && !IS_Z3_ENDSTOP(A,M) && !IS_Z4_ENDSTOP(A,M)) -#if _HAS_STOP(X,MIN) - #define HAS_X_MIN 1 +#if _USE_STOP(X,,MIN,) + #define USE_X_MIN 1 #endif -#if _HAS_STOP(X,MAX) - #define HAS_X_MAX 1 +#if _USE_STOP(X,,MAX,ENABLED(DUAL_X_CARRIAGE)) + #define USE_X_MAX 1 #endif -#if _HAS_STOP(Y,MIN) - #define HAS_Y_MIN 1 -#endif -#if _HAS_STOP(Y,MAX) - #define HAS_Y_MAX 1 -#endif -#if _HAS_STOP(Z,MIN) - #define HAS_Z_MIN 1 -#endif -#if _HAS_STOP(Z,MAX) - #define HAS_Z_MAX 1 -#endif -#if _HAS_STOP(I,MIN) - #define HAS_I_MIN 1 -#endif -#if _HAS_STOP(I,MAX) - #define HAS_I_MAX 1 -#endif -#if _HAS_STOP(J,MIN) - #define HAS_J_MIN 1 -#endif -#if _HAS_STOP(J,MAX) - #define HAS_J_MAX 1 -#endif -#if _HAS_STOP(K,MIN) - #define HAS_K_MIN 1 -#endif -#if _HAS_STOP(K,MAX) - #define HAS_K_MAX 1 -#endif -#if _HAS_STOP(U,MIN) - #define HAS_U_MIN 1 -#endif -#if _HAS_STOP(U,MAX) - #define HAS_U_MAX 1 -#endif -#if _HAS_STOP(V,MIN) - #define HAS_V_MIN 1 -#endif -#if _HAS_STOP(V,MAX) - #define HAS_V_MAX 1 -#endif -#if _HAS_STOP(W,MIN) - #define HAS_W_MIN 1 -#endif -#if _HAS_STOP(W,MAX) - #define HAS_W_MAX 1 -#endif -#if PIN_EXISTS(X2_MIN) - #define HAS_X2_MIN 1 -#endif -#if PIN_EXISTS(X2_MAX) - #define HAS_X2_MAX 1 -#endif -#if PIN_EXISTS(Y2_MIN) - #define HAS_Y2_MIN 1 -#endif -#if PIN_EXISTS(Y2_MAX) - #define HAS_Y2_MAX 1 -#endif -#if PIN_EXISTS(Z2_MIN) - #define HAS_Z2_MIN 1 -#endif -#if PIN_EXISTS(Z2_MAX) - #define HAS_Z2_MAX 1 -#endif -#if PIN_EXISTS(Z3_MIN) - #define HAS_Z3_MIN 1 -#endif -#if PIN_EXISTS(Z3_MAX) - #define HAS_Z3_MAX 1 -#endif -#if PIN_EXISTS(Z4_MIN) - #define HAS_Z4_MIN 1 -#endif -#if PIN_EXISTS(Z4_MAX) - #define HAS_Z4_MAX 1 -#endif - -#if HAS_X_MIN || HAS_X_MAX +#if USE_X_MIN || USE_X_MAX #define HAS_X_ENDSTOP 1 #endif -#if HAS_X2_MIN || HAS_X2_MAX - #define HAS_X2_ENDSTOP 1 + +#if _USE_STOP(Y,,MIN,) + #define USE_Y_MIN 1 +#elif _USE_STOP(Y,,MAX,) + #define USE_Y_MAX 1 #endif -#if HAS_Y_MIN || HAS_Y_MAX +#if USE_Y_MIN || USE_Y_MAX #define HAS_Y_ENDSTOP 1 #endif -#if HAS_Y2_MIN || HAS_Y2_MAX - #define HAS_Y2_ENDSTOP 1 + +#if _USE_STOP(Z,,MIN,ANY(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, HAS_DELTA_SENSORLESS_PROBING)) + #define USE_Z_MIN 1 + #if !HAS_DELTA_SENSORLESS_PROBING + #define HAS_Z_MIN_PIN 1 + #endif #endif -#if HAS_Z_MIN || HAS_Z_MAX +#if _USE_STOP(Z,,MAX,) + #define USE_Z_MAX 1 +#endif +#if USE_Z_MIN || USE_Z_MAX #define HAS_Z_ENDSTOP 1 #endif -#if HAS_Z2_MIN || HAS_Z2_MAX - #define HAS_Z2_ENDSTOP 1 + +#if _USE_STOP(I,,MIN,) + #define USE_I_MIN 1 +#elif _USE_STOP(I,,MAX,) + #define USE_I_MAX 1 #endif -#if HAS_Z3_MIN || HAS_Z3_MAX - #define HAS_Z3_ENDSTOP 1 -#endif -#if HAS_Z4_MIN || HAS_Z4_MAX - #define HAS_Z4_ENDSTOP 1 -#endif -#if HAS_I_MIN || HAS_I_MAX +#if USE_I_MIN || USE_I_MAX #define HAS_I_ENDSTOP 1 #endif -#if HAS_J_MIN || HAS_J_MAX + +#if _USE_STOP(J,,MIN,) + #define USE_J_MIN 1 +#elif _USE_STOP(J,,MAX,) + #define USE_J_MAX 1 +#endif +#if USE_J_MIN || USE_J_MAX #define HAS_J_ENDSTOP 1 #endif -#if HAS_K_MIN || HAS_K_MAX + +#if _USE_STOP(K,,MIN,) + #define USE_K_MIN 1 +#elif _USE_STOP(K,,MAX,) + #define USE_K_MAX 1 +#endif +#if USE_K_MIN || USE_K_MAX #define HAS_K_ENDSTOP 1 #endif -#if HAS_U_MIN || HAS_U_MAX + +#if _USE_STOP(U,,MIN,) + #define USE_U_MIN 1 +#elif _USE_STOP(U,,MAX,) + #define USE_U_MAX 1 +#endif +#if USE_U_MIN || USE_U_MAX #define HAS_U_ENDSTOP 1 #endif -#if HAS_V_MIN || HAS_V_MAX + +#if _USE_STOP(V,,MIN,) + #define USE_V_MIN 1 +#elif _USE_STOP(V,,MAX,) + #define USE_V_MAX 1 +#endif +#if USE_V_MIN || USE_V_MAX #define HAS_V_ENDSTOP 1 #endif -#if HAS_W_MIN || HAS_W_MAX + +#if _USE_STOP(W,,MIN,) + #define USE_W_MIN 1 +#elif _USE_STOP(W,,MAX,) + #define USE_W_MAX 1 +#endif +#if USE_W_MIN || USE_W_MAX #define HAS_W_ENDSTOP 1 #endif -#if HAS_BED_PROBE && PIN_EXISTS(Z_MIN_PROBE) - #define HAS_Z_MIN_PROBE_PIN 1 +#if ANY(DUAL_X_CARRIAGE, X_DUAL_ENDSTOPS) + #if _USE_STOP(X,2,MIN,) + #define USE_X2_MIN 1 + #elif _USE_STOP(X,2,MAX,) + #define USE_X2_MAX 1 + #endif + #if USE_X2_MIN || USE_X2_MAX + #define HAS_X2_ENDSTOP 1 + #endif #endif -#undef _HAS_STOP -#undef IS_PROBE_PIN -#undef IS_X2_ENDSTOP -#undef IS_Y2_ENDSTOP -#undef IS_Z2_ENDSTOP -#undef IS_Z3_ENDSTOP -#undef IS_Z4_ENDSTOP +#if ENABLED(Y_DUAL_ENDSTOPS) + #if _USE_STOP(Y,2,MIN,) + #define USE_Y2_MIN 1 + #elif _USE_STOP(Y,2,MAX,) + #define USE_Y2_MAX 1 + #endif + #if USE_Y2_MIN || USE_Y2_MAX + #define HAS_Y2_ENDSTOP 1 + #endif +#endif + +#if ENABLED(Z_MULTI_ENDSTOPS) + #if _USE_STOP(Z,2,MIN,) + #define USE_Z2_MIN 1 + #elif _USE_STOP(Z,2,MAX,) + #define USE_Z2_MAX 1 + #endif + #if USE_Z2_MIN || USE_Z2_MAX + #define HAS_Z2_ENDSTOP 1 + #endif + #if NUM_Z_STEPPERS >= 3 + #if _USE_STOP(Z,3,MIN,) + #define USE_Z3_MIN 1 + #elif _USE_STOP(Z,3,MAX,) + #define USE_Z3_MAX 1 + #endif + #if USE_Z3_MIN || USE_Z3_MAX + #define HAS_Z3_ENDSTOP 1 + #endif + #endif + #if NUM_Z_STEPPERS >= 4 + #if _USE_STOP(Z,4,MIN,) + #define USE_Z4_MIN 1 + #elif _USE_STOP(Z,4,MAX,) + #define USE_Z4_MAX 1 + #endif + #if USE_Z4_MIN || USE_Z4_MAX + #define HAS_Z4_ENDSTOP 1 + #endif + #endif +#endif + +#undef _USE_STOP + +/** + * Set ENDSTOPPULLUPS for active endstop switches + */ +#if ENABLED(ENDSTOPPULLUPS) + #if USE_X_MIN + #define ENDSTOPPULLUP_XMIN + #endif + #if USE_X_MAX + #define ENDSTOPPULLUP_XMAX + #endif + #if USE_Y_MIN + #define ENDSTOPPULLUP_YMIN + #endif + #if USE_Y_MAX + #define ENDSTOPPULLUP_YMAX + #endif + #if HAS_Z_MIN_PIN + #define ENDSTOPPULLUP_ZMIN + #endif + #if USE_Z_MAX + #define ENDSTOPPULLUP_ZMAX + #endif + #if USE_I_MIN + #define ENDSTOPPULLUP_IMIN + #endif + #if USE_I_MAX + #define ENDSTOPPULLUP_IMAX + #endif + #if USE_J_MIN + #define ENDSTOPPULLUP_JMIN + #endif + #if USE_J_MAX + #define ENDSTOPPULLUP_JMAX + #endif + #if USE_K_MIN + #define ENDSTOPPULLUP_KMIN + #endif + #if USE_K_MAX + #define ENDSTOPPULLUP_KMAX + #endif + #if USE_U_MIN + #define ENDSTOPPULLUP_UMIN + #endif + #if USE_U_MAX + #define ENDSTOPPULLUP_UMAX + #endif + #if USE_V_MIN + #define ENDSTOPPULLUP_VMIN + #endif + #if USE_V_MAX + #define ENDSTOPPULLUP_VMAX + #endif + #if USE_W_MIN + #define ENDSTOPPULLUP_WMIN + #endif + #if USE_W_MAX + #define ENDSTOPPULLUP_WMAX + #endif +#endif + +/** + * Set ENDSTOPPULLDOWNS for active endstop switches + */ +#if ENABLED(ENDSTOPPULLDOWNS) + #if USE_X_MIN + #define ENDSTOPPULLDOWN_XMIN + #endif + #if USE_X_MAX + #define ENDSTOPPULLDOWN_XMAX + #endif + #if USE_Y_MIN + #define ENDSTOPPULLDOWN_YMIN + #endif + #if USE_Y_MAX + #define ENDSTOPPULLDOWN_YMAX + #endif + #if USE_Z_MIN + #define ENDSTOPPULLDOWN_ZMIN + #endif + #if USE_Z_MAX + #define ENDSTOPPULLDOWN_ZMAX + #endif + #if USE_I_MIN + #define ENDSTOPPULLDOWN_IMIN + #endif + #if USE_I_MAX + #define ENDSTOPPULLDOWN_IMAX + #endif + #if USE_J_MIN + #define ENDSTOPPULLDOWN_JMIN + #endif + #if USE_J_MAX + #define ENDSTOPPULLDOWN_JMAX + #endif + #if USE_K_MIN + #define ENDSTOPPULLDOWN_KMIN + #endif + #if USE_K_MAX + #define ENDSTOPPULLDOWN_KMAX + #endif + #if USE_U_MIN + #define ENDSTOPPULLDOWN_UMIN + #endif + #if USE_U_MAX + #define ENDSTOPPULLDOWN_UMAX + #endif + #if USE_V_MIN + #define ENDSTOPPULLDOWN_VMIN + #endif + #if USE_V_MAX + #define ENDSTOPPULLDOWN_VMAX + #endif + #if USE_W_MIN + #define ENDSTOPPULLDOWN_WMIN + #endif + #if USE_W_MAX + #define ENDSTOPPULLDOWN_WMAX + #endif +#endif // // ADC Temp Sensors (Thermistor or Thermocouple with amplifier ADC interface) @@ -2201,8 +2243,11 @@ #if HOTENDS > 7 && HAS_ADC_TEST(7) #define HAS_TEMP_ADC_7 1 #endif -#if HAS_ADC_TEST(BED) - #define HAS_TEMP_ADC_BED 1 +#if TEMP_SENSOR_BED + #define HAS_HEATED_BED 1 + #if HAS_ADC_TEST(BED) + #define HAS_TEMP_ADC_BED 1 + #endif #endif #if HAS_ADC_TEST(PROBE) #define HAS_TEMP_ADC_PROBE 1 @@ -2216,11 +2261,14 @@ #if HAS_ADC_TEST(BOARD) #define HAS_TEMP_ADC_BOARD 1 #endif +#if HAS_ADC_TEST(SOC) + #define HAS_TEMP_ADC_SOC 1 +#endif #if HAS_ADC_TEST(REDUNDANT) #define HAS_TEMP_ADC_REDUNDANT 1 #endif -#define HAS_TEMP(N) (TEMP_SENSOR_IS_MAX_TC(N) || EITHER(HAS_TEMP_ADC_##N, TEMP_SENSOR_##N##_IS_DUMMY)) +#define HAS_TEMP(N) (TEMP_SENSOR_IS_MAX_TC(N) || HAS_TEMP_ADC_##N || TEMP_SENSOR_##N##_IS_DUMMY) #if HAS_HOTEND && HAS_TEMP(0) #define HAS_TEMP_HOTEND 1 #endif @@ -2239,6 +2287,9 @@ #if HAS_TEMP(BOARD) #define HAS_TEMP_BOARD 1 #endif +#if HAS_TEMP(SOC) + #define HAS_TEMP_SOC 1 +#endif #if HAS_TEMP(REDUNDANT) #define HAS_TEMP_REDUNDANT 1 #endif @@ -2286,10 +2337,12 @@ #if PIN_EXISTS(HEATER_BED) #define HAS_HEATER_BED 1 #endif +#if PIN_EXISTS(HEATER_CHAMBER) + #define HAS_HEATER_CHAMBER 1 +#endif // Shorthand for common combinations -#if HAS_TEMP_BED && HAS_HEATER_BED - #define HAS_HEATED_BED 1 +#if HAS_HEATED_BED #ifndef BED_OVERSHOOT #define BED_OVERSHOOT 10 #endif @@ -2312,11 +2365,11 @@ #define BED_OR_CHAMBER 1 #endif -#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE || HAS_TEMP_COOLER || HAS_TEMP_BOARD +#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE || HAS_TEMP_COOLER || HAS_TEMP_BOARD || HAS_TEMP_SOC #define HAS_TEMP_SENSOR 1 #endif -#if HAS_TEMP_CHAMBER && PIN_EXISTS(HEATER_CHAMBER) +#if HAS_TEMP_CHAMBER && HAS_HEATER_CHAMBER #define HAS_HEATED_CHAMBER 1 #ifndef CHAMBER_OVERSHOOT #define CHAMBER_OVERSHOOT 10 @@ -2332,10 +2385,10 @@ #endif #if ENABLED(DWIN_LCD_PROUI) - #if EITHER(PIDTEMP, PIDTEMPBED) + #if ANY(PIDTEMP, PIDTEMPBED) #define DWIN_PID_TUNE 1 #endif - #if EITHER(DWIN_PID_TUNE, MPC_AUTOTUNE) && DISABLED(DISABLE_TUNING_GRAPH) + #if ANY(DWIN_PID_TUNE, MPC_AUTOTUNE) && DISABLED(DISABLE_TUNING_GRAPH) #define SHOW_TUNING_GRAPH 1 #endif #endif @@ -2343,6 +2396,7 @@ // Thermal protection #if !HAS_HEATED_BED #undef THERMAL_PROTECTION_BED + #undef THERMAL_PROTECTION_BED_PERIOD #endif #if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0 #define WATCH_HOTENDS 1 @@ -2350,10 +2404,10 @@ #if ENABLED(THERMAL_PROTECTION_BED) && WATCH_BED_TEMP_PERIOD > 0 #define WATCH_BED 1 #endif -#if BOTH(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER) && WATCH_CHAMBER_TEMP_PERIOD > 0 +#if ALL(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 +#if ALL(HAS_COOLER, THERMAL_PROTECTION_COOLER) && WATCH_COOLER_TEMP_PERIOD > 0 #define WATCH_COOLER 1 #endif #if NONE(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER, THERMAL_PROTECTION_BED, THERMAL_PROTECTION_COOLER) @@ -2463,6 +2517,24 @@ #undef AUTO_POWER_COOLER_FAN #endif +/** + * Controller Fan Settings + */ +#if PIN_EXISTS(CONTROLLER_FAN) + #define HAS_CONTROLLER_FAN 1 +#endif + +#if HAS_CONTROLLER_FAN + #if ENABLED(CONTROLLER_FAN_USE_BOARD_TEMP) + #define HAS_CONTROLLER_FAN_BOARD_TEMP_TRIGGER 1 + #ifndef CONTROLLER_FAN_TRIGGER_TEMP + #define CONTROLLER_FAN_TRIGGER_TEMP 30 + #endif + #else + #undef CONTROLLER_FAN_TRIGGER_TEMP + #endif +#endif + // Print Cooling fans (limit) #ifdef NUM_M106_FANS #define MAX_FANS NUM_M106_FANS @@ -2472,11 +2544,12 @@ #define _IS_E_AUTO(N,F) (PIN_EXISTS(E##N##_AUTO_FAN) && E##N##_AUTO_FAN_PIN == FAN##F##_PIN) #define _HAS_FAN(F) (F < MAX_FANS && PIN_EXISTS(FAN##F) \ - && CONTROLLER_FAN_PIN != FAN##F##_PIN \ + && !(HAS_CONTROLLER_FAN && CONTROLLER_FAN_PIN == FAN##F##_PIN) \ && !_IS_E_AUTO(0,F) && !_IS_E_AUTO(1,F) \ && !_IS_E_AUTO(2,F) && !_IS_E_AUTO(3,F) \ && !_IS_E_AUTO(4,F) && !_IS_E_AUTO(5,F) \ && !_IS_E_AUTO(6,F) && !_IS_E_AUTO(7,F)) + #if _HAS_FAN(0) #define HAS_FAN0 1 #endif @@ -2543,31 +2616,10 @@ #define HAS_FANMUX 1 // Part Cooling fan multipliexer #endif -/** - * Controller Fan Settings - */ -#if PIN_EXISTS(CONTROLLER_FAN) - #define HAS_CONTROLLER_FAN 1 - #if CONTROLLER_FAN_MIN_BOARD_TEMP - #define HAS_CONTROLLER_FAN_MIN_BOARD_TEMP 1 - #endif -#endif - -#if HAS_CONTROLLER_FAN - #if ENABLED(CONTROLLER_FAN_USE_BOARD_TEMP) - #define HAS_CONTROLLER_FAN_BOARD_TEMP_TRIGGER 1 - #ifndef CONTROLLER_FAN_TRIGGER_TEMP - #define CONTROLLER_FAN_TRIGGER_TEMP 30 - #endif - #else - #undef CONTROLLER_FAN_TRIGGER_TEMP - #endif -#endif - /** * MIN/MAX fan PWM scaling */ -#if EITHER(HAS_FAN, USE_CONTROLLER_FAN) +#if ANY(HAS_FAN, USE_CONTROLLER_FAN) #ifndef FAN_OFF_PWM #define FAN_OFF_PWM 0 #endif @@ -2667,7 +2719,7 @@ * Helper Macros for heaters and extruder fan */ #define WRITE_HEATER_0P(v) WRITE(HEATER_0_PIN, (v) ^ ENABLED(HEATER_0_INVERTING)) -#if EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) +#if ANY(HAS_MULTI_HOTEND, HEATERS_PARALLEL) #define WRITE_HEATER_1(v) WRITE(HEATER_1_PIN, (v) ^ ENABLED(HEATER_1_INVERTING)) #if HOTENDS > 2 #define WRITE_HEATER_2(v) WRITE(HEATER_2_PIN, (v) ^ ENABLED(HEATER_2_INVERTING)) @@ -2780,7 +2832,7 @@ /** * Bed Probe dependencies */ -#if EITHER(MESH_BED_LEVELING, HAS_BED_PROBE) +#if ANY(MESH_BED_LEVELING, HAS_BED_PROBE) #ifndef Z_PROBE_OFFSET_RANGE_MIN #define Z_PROBE_OFFSET_RANGE_MIN -20 #endif @@ -2789,7 +2841,7 @@ #endif #endif #if HAS_BED_PROBE - #if BOTH(ENDSTOPPULLUPS, HAS_Z_MIN_PROBE_PIN) + #if ALL(ENDSTOPPULLUPS, USE_Z_MIN_PROBE) #define ENDSTOPPULLUP_ZMIN_PROBE #endif #ifndef XY_PROBE_FEEDRATE @@ -2847,16 +2899,16 @@ #undef ADAPTIVE_FAN_SLOWING #undef TEMP_TUNING_MAINTAIN_FAN #endif -#if !BOTH(HAS_BED_PROBE, HAS_FAN) +#if !ALL(HAS_BED_PROBE, HAS_FAN) #undef PROBING_FANS_OFF #endif -#if !BOTH(HAS_BED_PROBE, HAS_EXTRUDERS) +#if !ALL(HAS_BED_PROBE, HAS_EXTRUDERS) #undef PROBING_ESTEPPERS_OFF #elif ENABLED(PROBING_STEPPERS_OFF) // PROBING_STEPPERS_OFF implies PROBING_ESTEPPERS_OFF, make sure it is defined #define PROBING_ESTEPPERS_OFF #endif -#if EITHER(ADVANCED_PAUSE_FEATURE, PROBING_HEATERS_OFF) +#if ANY(ADVANCED_PAUSE_FEATURE, PROBING_HEATERS_OFF) #define HEATER_IDLE_HANDLER 1 #endif #if HAS_BED_PROBE && (ANY(PROBING_HEATERS_OFF, PROBING_STEPPERS_OFF, PROBING_ESTEPPERS_OFF, PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0) @@ -2867,7 +2919,7 @@ * Advanced Pause - Filament Change */ #if ENABLED(ADVANCED_PAUSE_FEATURE) - #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) || BOTH(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) + #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI, DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI) || ALL(EMERGENCY_PARSER, HOST_PROMPT_SUPPORT) #define M600_PURGE_MORE_RESUMABLE 1 #endif #ifndef FILAMENT_CHANGE_SLOW_LOAD_LENGTH @@ -2953,7 +3005,7 @@ /** * Default mesh area is an area with an inset margin on the print area. */ -#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) +#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) #if IS_KINEMATIC // Probing points may be verified at compile time within the radius // using static_assert(HYPOT2(X2-X1,Y2-Y1)<=sq(PRINTABLE_RADIUS),"bad probe point!") @@ -3003,7 +3055,7 @@ #if ANY(IS_TFTGLCD_PANEL, PCA9632_BUZZER, LCD_USE_I2C_BUZZER) #define USE_MARLINUI_BUZZER 1 #endif -#if EITHER(HAS_BEEPER, USE_MARLINUI_BUZZER) +#if ANY(HAS_BEEPER, USE_MARLINUI_BUZZER) #define HAS_SOUND 1 #endif @@ -3074,7 +3126,7 @@ // Define a starting height for measuring manual probe points #ifndef MANUAL_PROBE_START_Z - #if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) + #if ANY(MESH_BED_LEVELING, PROBE_MANUALLY) // Leave MANUAL_PROBE_START_Z undefined so the prior Z height will be used. // Note: If Z_CLEARANCE_BETWEEN_MANUAL_PROBES is 0 there will be no raise between points #elif ENABLED(AUTO_BED_LEVELING_UBL) && defined(Z_CLEARANCE_BETWEEN_PROBES) @@ -3100,7 +3152,7 @@ #endif #endif -#if EITHER(HAS_MARLINUI_MENU, TOUCH_UI_FTDI_EVE) +#if ANY(HAS_MARLINUI_MENU, TOUCH_UI_FTDI_EVE) // LCD timeout to status screen default is 15s #ifndef LCD_TIMEOUT_TO_STATUS #define LCD_TIMEOUT_TO_STATUS 15000 @@ -3125,6 +3177,25 @@ #endif #endif +// Touch Calibration +#if ANY(HAS_SPI_TFT, HAS_FSMC_TFT, HAS_LTDC_TFT) + #ifndef TOUCH_CALIBRATION_X + #define TOUCH_CALIBRATION_X 0 + #endif + #ifndef TOUCH_CALIBRATION_Y + #define TOUCH_CALIBRATION_Y 0 + #endif + #ifndef TOUCH_OFFSET_X + #define TOUCH_OFFSET_X 0 + #endif + #ifndef TOUCH_OFFSET_Y + #define TOUCH_OFFSET_Y 0 + #endif + #ifndef TOUCH_ORIENTATION + #define TOUCH_ORIENTATION TOUCH_LANDSCAPE + #endif +#endif + // Number of VFAT entries used. Each entry has 13 UTF-16 characters #if ANY(SCROLL_LONG_FILENAMES, HAS_DWIN_E3V2, TFT_COLOR_UI) #define VFAT_ENTRIES_LIMIT 5 @@ -3134,7 +3205,7 @@ #define MAX_VFAT_ENTRIES 20 // by VFAT specs to fit LFN of length 255 // Nozzle park for Delta -#if BOTH(NOZZLE_PARK_FEATURE, DELTA) +#if ALL(NOZZLE_PARK_FEATURE, DELTA) #undef NOZZLE_PARK_Z_FEEDRATE #define NOZZLE_PARK_Z_FEEDRATE NOZZLE_PARK_XY_FEEDRATE #endif diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h index ad11cc67b2..dda1480e02 100644 --- a/Marlin/src/inc/MarlinConfig.h +++ b/Marlin/src/inc/MarlinConfig.h @@ -27,28 +27,30 @@ #include "MarlinConfigPre.h" -#ifndef __MARLIN_DEPS__ +#ifdef __MARLIN_DEPS__ + #include "../HAL/shared/fauxpins.h" +#else #include "../HAL/HAL.h" #endif #include "../pins/pins.h" #ifndef __MARLIN_DEPS__ - #include HAL_PATH(../HAL, timers.h) - #include HAL_PATH(../HAL, spi_pins.h) + #include HAL_PATH(.., timers.h) + #include HAL_PATH(.., spi_pins.h) #endif #include "Conditionals_post.h" #ifndef __MARLIN_DEPS__ - #include HAL_PATH(../HAL, inc/Conditionals_post.h) + #include HAL_PATH(.., inc/Conditionals_post.h) #include "../core/types.h" // Ahead of sanity-checks #include "Changes.h" #include "SanityCheck.h" - #include HAL_PATH(../HAL, inc/SanityCheck.h) + #include HAL_PATH(.., inc/SanityCheck.h) // Include all core headers #include "../core/language.h" diff --git a/Marlin/src/inc/MarlinConfigPre.h b/Marlin/src/inc/MarlinConfigPre.h index c090b7e37b..c2191ab1b7 100644 --- a/Marlin/src/inc/MarlinConfigPre.h +++ b/Marlin/src/inc/MarlinConfigPre.h @@ -49,7 +49,7 @@ #include "Conditionals_LCD.h" #ifndef __MARLIN_DEPS__ - #include HAL_PATH(../HAL, inc/Conditionals_LCD.h) + #include HAL_PATH(.., inc/Conditionals_LCD.h) #endif #include "../core/drivers.h" @@ -58,5 +58,5 @@ #include "Conditionals_adv.h" #ifndef __MARLIN_DEPS__ - #include HAL_PATH(../HAL, inc/Conditionals_adv.h) + #include HAL_PATH(.., inc/Conditionals_adv.h) #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2c2e17f4e3..9fdd0d603e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -46,8 +46,8 @@ #if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3) || !ENABLED(TEST1, TEST2, TEST4) #error "ENABLED is borked!" #endif -#if BOTH(TEST0, TEST1) - #error "BOTH is borked!" +#if ALL(TEST0, TEST1) + #error "ALL is borked!" #endif #if DISABLED(TEST1) || !DISABLED(TEST3) || DISABLED(TEST4) || DISABLED(TEST0, TEST1, TEST2, TEST4) || !DISABLED(TEST0, TEST3) #error "DISABLED is borked!" @@ -127,6 +127,24 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #undef _ISMAX_1 #undef _ISSNS_1 +/** + * RADDS is forbidden for non-DUE boards, for now. + */ +#if ENABLED(RADDS_DISPLAY) && !defined(__SAM3X8E__) + #error "RADDS_DISPLAY is currently only incompatible with DUE boards." +#endif + +/** + * Heated Bed requirements + */ +#if HAS_HEATED_BED + #if !HAS_TEMP_BED + #error "The Heated Bed requires a TEMP_BED_PIN or Thermocouple." + #elif !HAS_HEATER_BED + #error "The Heated Bed requires HEATER_BED_PIN." + #endif +#endif + /** * Hephestos 2 Heated Bed Kit requirements */ @@ -239,15 +257,13 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Multiple Stepper Drivers Per Axis */ -#define GOOD_AXIS_PINS(A) (HAS_##A##_ENABLE && HAS_##A##_STEP && HAS_##A##_DIR) -#if HAS_X2_STEPPER && !GOOD_AXIS_PINS(X) +#define GOOD_AXIS_PINS(A) PINS_EXIST(A##_ENABLE, A##_STEP, A##_DIR) +#if HAS_X2_STEPPER && !GOOD_AXIS_PINS(X2) #error "If X2_DRIVER_TYPE is defined, then X2 ENABLE/STEP/DIR pins are also needed." #endif - -#if HAS_DUAL_Y_STEPPERS && !GOOD_AXIS_PINS(Y) +#if HAS_Y2_STEPPER && !GOOD_AXIS_PINS(Y2) #error "If Y2_DRIVER_TYPE is defined, then Y2 ENABLE/STEP/DIR pins are also needed." #endif - #if HAS_Z_AXIS #if NUM_Z_STEPPERS >= 2 && !GOOD_AXIS_PINS(Z2) #error "If Z2_DRIVER_TYPE is defined, then Z2 ENABLE/STEP/DIR pins are also needed." @@ -262,7 +278,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L * Validate bed size */ #if !defined(X_BED_SIZE) || !defined(Y_BED_SIZE) - #error "X_BED_SIZE and Y_BED_SIZE are now required!" + #error "X_BED_SIZE and Y_BED_SIZE are required!" #else #if HAS_X_AXIS static_assert(X_MAX_LENGTH >= X_BED_SIZE, "Movement bounds (X_MIN_POS, X_MAX_POS) are too narrow to contain X_BED_SIZE."); @@ -291,45 +307,45 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #endif #endif -#if BOTH(ENDSTOPPULLUPS, ENDSTOPPULLDOWNS) +#if ALL(ENDSTOPPULLUPS, ENDSTOPPULLDOWNS) #error "Enable only one of ENDSTOPPULLUPS or ENDSTOPPULLDOWNS." -#elif BOTH(FIL_RUNOUT_PULLUP, FIL_RUNOUT_PULLDOWN) +#elif ALL(FIL_RUNOUT_PULLUP, FIL_RUNOUT_PULLDOWN) #error "Enable only one of FIL_RUNOUT_PULLUP or FIL_RUNOUT_PULLDOWN." -#elif BOTH(ENDSTOPPULLUP_XMAX, ENDSTOPPULLDOWN_XMAX) +#elif ALL(ENDSTOPPULLUP_XMAX, ENDSTOPPULLDOWN_XMAX) #error "Enable only one of ENDSTOPPULLUP_X_MAX or ENDSTOPPULLDOWN_X_MAX." -#elif BOTH(ENDSTOPPULLUP_YMAX, ENDSTOPPULLDOWN_YMAX) +#elif ALL(ENDSTOPPULLUP_YMAX, ENDSTOPPULLDOWN_YMAX) #error "Enable only one of ENDSTOPPULLUP_Y_MAX or ENDSTOPPULLDOWN_Y_MAX." -#elif BOTH(ENDSTOPPULLUP_ZMAX, ENDSTOPPULLDOWN_ZMAX) +#elif ALL(ENDSTOPPULLUP_ZMAX, ENDSTOPPULLDOWN_ZMAX) #error "Enable only one of ENDSTOPPULLUP_Z_MAX or ENDSTOPPULLDOWN_Z_MAX." -#elif BOTH(ENDSTOPPULLUP_IMAX, ENDSTOPPULLDOWN_IMAX) +#elif ALL(ENDSTOPPULLUP_IMAX, ENDSTOPPULLDOWN_IMAX) #error "Enable only one of ENDSTOPPULLUP_I_MAX or ENDSTOPPULLDOWN_I_MAX." -#elif BOTH(ENDSTOPPULLUP_JMAX, ENDSTOPPULLDOWN_JMAX) +#elif ALL(ENDSTOPPULLUP_JMAX, ENDSTOPPULLDOWN_JMAX) #error "Enable only one of ENDSTOPPULLUP_J_MAX or ENDSTOPPULLDOWN_J_MAX." -#elif BOTH(ENDSTOPPULLUP_KMAX, ENDSTOPPULLDOWN_KMAX) +#elif ALL(ENDSTOPPULLUP_KMAX, ENDSTOPPULLDOWN_KMAX) #error "Enable only one of ENDSTOPPULLUP_K_MAX or ENDSTOPPULLDOWN_K_MAX." -#elif BOTH(ENDSTOPPULLUP_UMAX, ENDSTOPPULLDOWN_UMAX) +#elif ALL(ENDSTOPPULLUP_UMAX, ENDSTOPPULLDOWN_UMAX) #error "Enable only one of ENDSTOPPULLUP_U_MAX or ENDSTOPPULLDOWN_U_MAX." -#elif BOTH(ENDSTOPPULLUP_VMAX, ENDSTOPPULLDOWN_VMAX) +#elif ALL(ENDSTOPPULLUP_VMAX, ENDSTOPPULLDOWN_VMAX) #error "Enable only one of ENDSTOPPULLUP_V_MAX or ENDSTOPPULLDOWN_V_MAX." -#elif BOTH(ENDSTOPPULLUP_WMAX, ENDSTOPPULLDOWN_WMAX) +#elif ALL(ENDSTOPPULLUP_WMAX, ENDSTOPPULLDOWN_WMAX) #error "Enable only one of ENDSTOPPULLUP_W_MAX or ENDSTOPPULLDOWN_W_MAX." -#elif BOTH(ENDSTOPPULLUP_XMIN, ENDSTOPPULLDOWN_XMIN) +#elif ALL(ENDSTOPPULLUP_XMIN, ENDSTOPPULLDOWN_XMIN) #error "Enable only one of ENDSTOPPULLUP_X_MIN or ENDSTOPPULLDOWN_X_MIN." -#elif BOTH(ENDSTOPPULLUP_YMIN, ENDSTOPPULLDOWN_YMIN) +#elif ALL(ENDSTOPPULLUP_YMIN, ENDSTOPPULLDOWN_YMIN) #error "Enable only one of ENDSTOPPULLUP_Y_MIN or ENDSTOPPULLDOWN_Y_MIN." -#elif BOTH(ENDSTOPPULLUP_ZMIN, ENDSTOPPULLDOWN_ZMIN) +#elif ALL(ENDSTOPPULLUP_ZMIN, ENDSTOPPULLDOWN_ZMIN) #error "Enable only one of ENDSTOPPULLUP_Z_MIN or ENDSTOPPULLDOWN_Z_MIN." -#elif BOTH(ENDSTOPPULLUP_IMIN, ENDSTOPPULLDOWN_IMIN) +#elif ALL(ENDSTOPPULLUP_IMIN, ENDSTOPPULLDOWN_IMIN) #error "Enable only one of ENDSTOPPULLUP_I_MIN or ENDSTOPPULLDOWN_I_MIN." -#elif BOTH(ENDSTOPPULLUP_JMIN, ENDSTOPPULLDOWN_JMIN) +#elif ALL(ENDSTOPPULLUP_JMIN, ENDSTOPPULLDOWN_JMIN) #error "Enable only one of ENDSTOPPULLUP_J_MIN or ENDSTOPPULLDOWN_J_MIN." -#elif BOTH(ENDSTOPPULLUP_KMIN, ENDSTOPPULLDOWN_KMIN) +#elif ALL(ENDSTOPPULLUP_KMIN, ENDSTOPPULLDOWN_KMIN) #error "Enable only one of ENDSTOPPULLUP_K_MIN or ENDSTOPPULLDOWN_K_MIN." -#elif BOTH(ENDSTOPPULLUP_UMIN, ENDSTOPPULLDOWN_UMIN) +#elif ALL(ENDSTOPPULLUP_UMIN, ENDSTOPPULLDOWN_UMIN) #error "Enable only one of ENDSTOPPULLUP_U_MIN or ENDSTOPPULLDOWN_U_MIN." -#elif BOTH(ENDSTOPPULLUP_VMIN, ENDSTOPPULLDOWN_VMIN) +#elif ALL(ENDSTOPPULLUP_VMIN, ENDSTOPPULLDOWN_VMIN) #error "Enable only one of ENDSTOPPULLUP_V_MIN or ENDSTOPPULLDOWN_V_MIN." -#elif BOTH(ENDSTOPPULLUP_WMIN, ENDSTOPPULLDOWN_WMIN) +#elif ALL(ENDSTOPPULLUP_WMIN, ENDSTOPPULLDOWN_WMIN) #error "Enable only one of ENDSTOPPULLUP_W_MIN or ENDSTOPPULLDOWN_W_MIN." #endif @@ -366,7 +382,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #endif #if HAS_LCDPRINT && HAS_EXTRA_PROGRESS && LCD_HEIGHT < 4 - #error "Displays with fewer than 4 rows of text can't show progress values." + #error "Displays with fewer than 4 rows can't show progress values (e.g., SHOW_PROGRESS_PERCENT, SHOW_ELAPSED_TIME, SHOW_REMAINING_TIME, SHOW_INTERACTION_TIME)." #endif #if !HAS_MARLINUI_MENU && ENABLED(SD_REPRINT_LAST_SELECTED_FILE) @@ -446,7 +462,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L * I2C Position Encoders */ #if ENABLED(I2C_POSITION_ENCODERS) - #if !BOTH(BABYSTEPPING, BABYSTEP_XY) + #if !ALL(BABYSTEPPING, BABYSTEP_XY) #error "I2C_POSITION_ENCODERS requires BABYSTEPPING and BABYSTEP_XY." #elif !WITHIN(I2CPE_ENCODER_CNT, 1, 5) #error "I2CPE_ENCODER_CNT must be between 1 and 5." @@ -459,11 +475,11 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #if ENABLED(BABYSTEPPING) #if ENABLED(SCARA) #error "BABYSTEPPING is not implemented for SCARA yet." - #elif ENABLED(BABYSTEP_XY) && EITHER(MARKFORGED_XY, MARKFORGED_YX) + #elif ENABLED(BABYSTEP_XY) && ANY(MARKFORGED_XY, MARKFORGED_YX) #error "BABYSTEPPING only implemented for Z axis on MarkForged." - #elif BOTH(DELTA, BABYSTEP_XY) + #elif ALL(DELTA, BABYSTEP_XY) #error "BABYSTEPPING only implemented for Z axis on deltabots." - #elif BOTH(BABYSTEP_ZPROBE_OFFSET, MESH_BED_LEVELING) + #elif ALL(BABYSTEP_ZPROBE_OFFSET, MESH_BED_LEVELING) #error "MESH_BED_LEVELING and BABYSTEP_ZPROBE_OFFSET is not a valid combination" #elif ENABLED(BABYSTEP_ZPROBE_OFFSET) && !HAS_BED_PROBE #error "BABYSTEP_ZPROBE_OFFSET requires a probe." @@ -473,7 +489,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "BABYSTEP_GFX_OVERLAY requires a BABYSTEP_ZPROBE_OFFSET." #elif ENABLED(BABYSTEP_HOTEND_Z_OFFSET) && !HAS_HOTEND_OFFSET #error "BABYSTEP_HOTEND_Z_OFFSET requires 2 or more HOTENDS." - #elif BOTH(BABYSTEP_ALWAYS_AVAILABLE, MOVE_Z_WHEN_IDLE) + #elif ALL(BABYSTEP_ALWAYS_AVAILABLE, MOVE_Z_WHEN_IDLE) #error "BABYSTEP_ALWAYS_AVAILABLE and MOVE_Z_WHEN_IDLE are incompatible." #elif !defined(BABYSTEP_MULTIPLICATOR_Z) #error "BABYSTEPPING requires BABYSTEP_MULTIPLICATOR_Z." @@ -511,21 +527,21 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #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) + #elif ALL(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) + #elif ALL(FIL_RUNOUT2_PULLUP, FIL_RUNOUT2_PULLDOWN) #error "You can't enable FIL_RUNOUT2_PULLUP and FIL_RUNOUT2_PULLDOWN at the same time." - #elif BOTH(FIL_RUNOUT3_PULLUP, FIL_RUNOUT3_PULLDOWN) + #elif ALL(FIL_RUNOUT3_PULLUP, FIL_RUNOUT3_PULLDOWN) #error "You can't enable FIL_RUNOUT3_PULLUP and FIL_RUNOUT3_PULLDOWN at the same time." - #elif BOTH(FIL_RUNOUT4_PULLUP, FIL_RUNOUT4_PULLDOWN) + #elif ALL(FIL_RUNOUT4_PULLUP, FIL_RUNOUT4_PULLDOWN) #error "You can't enable FIL_RUNOUT4_PULLUP and FIL_RUNOUT4_PULLDOWN at the same time." - #elif BOTH(FIL_RUNOUT5_PULLUP, FIL_RUNOUT5_PULLDOWN) + #elif ALL(FIL_RUNOUT5_PULLUP, FIL_RUNOUT5_PULLDOWN) #error "You can't enable FIL_RUNOUT5_PULLUP and FIL_RUNOUT5_PULLDOWN at the same time." - #elif BOTH(FIL_RUNOUT6_PULLUP, FIL_RUNOUT6_PULLDOWN) + #elif ALL(FIL_RUNOUT6_PULLUP, FIL_RUNOUT6_PULLDOWN) #error "You can't enable FIL_RUNOUT6_PULLUP and FIL_RUNOUT6_PULLDOWN at the same time." - #elif BOTH(FIL_RUNOUT7_PULLUP, FIL_RUNOUT7_PULLDOWN) + #elif ALL(FIL_RUNOUT7_PULLUP, FIL_RUNOUT7_PULLDOWN) #error "You can't enable FIL_RUNOUT7_PULLUP and FIL_RUNOUT7_PULLDOWN at the same time." - #elif BOTH(FIL_RUNOUT8_PULLUP, FIL_RUNOUT8_PULLDOWN) + #elif ALL(FIL_RUNOUT8_PULLUP, FIL_RUNOUT8_PULLDOWN) #error "You can't enable FIL_RUNOUT8_PULLUP and FIL_RUNOUT8_PULLDOWN at the same time." #elif FILAMENT_RUNOUT_DISTANCE_MM < 0 #error "FILAMENT_RUNOUT_DISTANCE_MM must be greater than or equal to zero." @@ -578,7 +594,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Individual axis homing is useless for DELTAS */ -#if BOTH(INDIVIDUAL_AXIS_HOMING_MENU, DELTA) +#if ALL(INDIVIDUAL_AXIS_HOMING_MENU, DELTA) #error "INDIVIDUAL_AXIS_HOMING_MENU is incompatible with DELTA kinematics." #endif @@ -682,7 +698,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * A Dual Nozzle carriage with switching servo */ -#if BOTH(SWITCHING_NOZZLE, MECHANICAL_SWITCHING_NOZZLE) +#if ALL(SWITCHING_NOZZLE, MECHANICAL_SWITCHING_NOZZLE) #error "Enable only one of SWITCHING_NOZZLE or MECHANICAL_SWITCHING_NOZZLE." #elif ENABLED(MECHANICAL_SWITCHING_NOZZLE) #if EXTRUDERS != 2 @@ -738,7 +754,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Single Stepper Dual Extruder with switching servo */ -#if BOTH(SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_EXTRUDER) +#if ALL(SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_EXTRUDER) #error "Enable only one of SWITCHING_EXTRUDER or MECHANICAL_SWITCHING_EXTRUDER." #elif ENABLED(MECHANICAL_SWITCHING_EXTRUDER) #if EXTRUDERS < 2 @@ -846,7 +862,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * (Magnetic) Parking Extruder requirements */ -#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) +#if ANY(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) #if ENABLED(EXT_SOLENOID) #error "(MAGNETIC_)PARKING_EXTRUDER and EXT_SOLENOID are incompatible. (Pins are used twice.)" #elif EXTRUDERS != 2 @@ -904,7 +920,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Magnetic / Electromagnetic Switching Toolhead requirements */ -#if EITHER(MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) +#if ANY(MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) #ifndef SWITCHING_TOOLHEAD_Y_POS #error "(ELECTRO)?MAGNETIC_SWITCHING_TOOLHEAD requires SWITCHING_TOOLHEAD_Y_POS" #elif !defined(SWITCHING_TOOLHEAD_X_POS) @@ -974,7 +990,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Extruder temperature control algorithm - There can be only one! */ -#if BOTH(PIDTEMP, MPCTEMP) +#if ALL(PIDTEMP, MPCTEMP) #error "Only enable PIDTEMP or MPCTEMP, but not both." #undef MPCTEMP #undef MPC_AUTOTUNE @@ -998,7 +1014,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Bed Heating Options - PID vs Limit Switching */ -#if BOTH(PIDTEMPBED, BED_LIMIT_SWITCHING) +#if ALL(PIDTEMPBED, BED_LIMIT_SWITCHING) #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED." #endif @@ -1021,7 +1037,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Chamber Heating Options - PID vs Limit Switching */ -#if BOTH(PIDTEMPCHAMBER, CHAMBER_LIMIT_SWITCHING) +#if ALL(PIDTEMPCHAMBER, CHAMBER_LIMIT_SWITCHING) #error "To use CHAMBER_LIMIT_SWITCHING you must disable PIDTEMPCHAMBER." #endif @@ -1187,7 +1203,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Some things should not be used on Belt Printers */ -#if BOTH(BELTPRINTER, HAS_LEVELING) +#if ALL(BELTPRINTER, HAS_LEVELING) #error "Bed Leveling is not compatible with BELTPRINTER." #endif @@ -1209,7 +1225,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Z_PROBE_SLED is incompatible with DELTA */ - #if BOTH(Z_PROBE_SLED, DELTA) + #if ALL(Z_PROBE_SLED, DELTA) #error "You cannot use Z_PROBE_SLED with DELTA." #endif @@ -1255,7 +1271,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #else #define _IS_5V_TOLERANT(P) 1 // Assume 5V tolerance #endif - #if USES_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE #if !_IS_5V_TOLERANT(Z_MIN_PROBE_PIN) #error "BLTOUCH_SET_5V_MODE is not compatible with the Z_MIN_PROBE_PIN." #endif @@ -1267,7 +1283,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #undef _IS_5V_TOLERANT #undef _5V #elif NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN, ENDSTOPPULLUP_ZMIN_PROBE) - #if USES_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE #error "BLTOUCH on Z_MIN_PROBE_PIN requires ENDSTOPPULLUP_ZMIN_PROBE, ENDSTOPPULLUPS, or BLTOUCH_SET_5V_MODE." #else #error "BLTOUCH on Z_MIN_PIN requires ENDSTOPPULLUP_ZMIN, ENDSTOPPULLUPS, or BLTOUCH_SET_5V_MODE." @@ -1276,10 +1292,10 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #if HAS_BLTOUCH_HS_MODE constexpr char hs[] = STRINGIFY(BLTOUCH_HS_MODE); - static_assert(!(strcmp(hs, "1") && strcmp(hs, "true") && strcmp(hs, "0") && strcmp(hs, "false")), \ - "BLTOUCH_HS_MODE must now be defined as true or false, indicating the default state."); + static_assert(!(strcmp(hs, "1") && strcmp(hs, "0x1") && strcmp(hs, "true") && strcmp(hs, "0") && strcmp(hs, "0x0") && strcmp(hs, "false")), \ + "BLTOUCH_HS_MODE must now be defined as true or false, indicating the default state."); #ifdef BLTOUCH_HS_EXTRA_CLEARANCE - static_assert(BLTOUCH_HS_EXTRA_CLEARANCE > 0, "BLTOUCH_HS_MODE requires a positive BLTOUCH_HS_EXTRA_CLEARANCE."); + static_assert(BLTOUCH_HS_EXTRA_CLEARANCE >= 0, "BLTOUCH_HS_MODE requires BLTOUCH_HS_EXTRA_CLEARANCE >= 0."); #endif #endif @@ -1352,7 +1368,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Mag mounted probe requirements */ - #if BOTH(MAG_MOUNTED_PROBE, USE_PROBE_FOR_Z_HOMING) && DISABLED(Z_SAFE_HOMING) + #if ALL(MAG_MOUNTED_PROBE, USE_PROBE_FOR_Z_HOMING) && DISABLED(Z_SAFE_HOMING) #error "MAG_MOUNTED_PROBE requires Z_SAFE_HOMING if it's being used to home Z." #endif @@ -1379,14 +1395,12 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "SENSORLESS_PROBING requires a TMC2130/2160/2209/5130/5160 driver on Z and Z_STALL_SENSITIVITY." #endif #elif ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - #if DISABLED(USE_ZMIN_PLUG) - #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires USE_ZMIN_PLUG to be enabled." - #elif !HAS_Z_MIN + #if !HAS_Z_MIN_PIN #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires the Z_MIN_PIN to be defined." #elif Z_MIN_PROBE_ENDSTOP_HIT_STATE != Z_MIN_ENDSTOP_HIT_STATE #error "Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN requires Z_MIN_ENDSTOP_HIT_STATE to match Z_MIN_PROBE_ENDSTOP_HIT_STATE." #endif - #elif !HAS_Z_MIN_PROBE_PIN + #elif !USE_Z_MIN_PROBE #error "Z_MIN_PROBE_PIN must be defined if Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN is not enabled." #endif @@ -1502,8 +1516,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "AUTO_BED_LEVELING_UBL does not yet support POLAR printers." #elif DISABLED(EEPROM_SETTINGS) #error "AUTO_BED_LEVELING_UBL requires EEPROM_SETTINGS." - #elif !WITHIN(GRID_MAX_POINTS_X, 3, 15) || !WITHIN(GRID_MAX_POINTS_Y, 3, 15) - #error "GRID_MAX_POINTS_[XY] must be a whole number between 3 and 15." + #elif !WITHIN(GRID_MAX_POINTS_X, 3, 255) || !WITHIN(GRID_MAX_POINTS_Y, 3, 255) + #error "GRID_MAX_POINTS_[XY] must be between 3 and 255." #endif #elif HAS_ABL_NOT_UBL @@ -1517,6 +1531,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L */ #if IS_SCARA && DISABLED(AUTO_BED_LEVELING_BILINEAR) #error "SCARA machines can only use the AUTO_BED_LEVELING_BILINEAR leveling option." + #elif ABL_USES_GRID && !(WITHIN(GRID_MAX_POINTS_X, 3, 255) && WITHIN(GRID_MAX_POINTS_Y, 3, 255)) + #error "GRID_MAX_POINTS_[XY] must be between 3 and 255." #endif #elif ENABLED(MESH_BED_LEVELING) @@ -1543,6 +1559,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #if HAS_MESH && HAS_CLASSIC_JERK static_assert(DEFAULT_ZJERK > 0.1, "Low DEFAULT_ZJERK values are incompatible with mesh-based leveling."); #endif +#if HAS_MESH && DGUS_LCD_UI_IA_CREALITY && GRID_MAX_POINTS > 25 + #error "DGUS_LCD_UI IA_CREALITY requires a mesh with no more than 25 points as defined by GRID_MAX_POINTS_X/Y." +#endif #if ENABLED(G26_MESH_VALIDATION) #if !HAS_EXTRUDERS @@ -1577,7 +1596,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #endif #endif -#if BOTH(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) +#if ALL(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) #error "Disable PREHEAT_BEFORE_LEVELING when using PREHEAT_BEFORE_PROBING." #endif @@ -1694,7 +1713,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Make sure DISABLE_[XYZ] compatible with selected homing options */ -#if HAS_DISABLE_MAIN_AXES && EITHER(HOME_AFTER_DEACTIVATE, Z_SAFE_HOMING) +#if HAS_DISABLE_MAIN_AXES && ANY(HOME_AFTER_DEACTIVATE, Z_SAFE_HOMING) #error "DISABLE_[XYZIJKUVW] is not compatible with HOME_AFTER_DEACTIVATE or Z_SAFE_HOMING." #endif @@ -1716,7 +1735,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "POWER_MONITOR_CURRENT requires a valid POWER_MONITOR_CURRENT_PIN." #elif ENABLED(POWER_MONITOR_VOLTAGE) && !PIN_EXISTS(POWER_MONITOR_VOLTAGE) #error "POWER_MONITOR_VOLTAGE requires POWER_MONITOR_VOLTAGE_PIN to be defined." -#elif BOTH(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) && POWER_MONITOR_CURRENT_PIN == POWER_MONITOR_VOLTAGE_PIN +#elif ALL(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) && POWER_MONITOR_CURRENT_PIN == POWER_MONITOR_VOLTAGE_PIN #error "POWER_MONITOR_CURRENT_PIN and POWER_MONITOR_VOLTAGE_PIN must be different." #endif @@ -1748,7 +1767,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #if ENABLED(SAV_3DGLCD) #if NONE(U8GLIB_SSD1306, U8GLIB_SH1106) #error "Enable a SAV_3DGLCD display type: U8GLIB_SSD1306 or U8GLIB_SH1106." - #elif BOTH(U8GLIB_SSD1306, U8GLIB_SH1106) + #elif ALL(U8GLIB_SSD1306, U8GLIB_SH1106) #error "Only enable one SAV_3DGLCD display type: U8GLIB_SSD1306 or U8GLIB_SH1106." #endif #endif @@ -1771,12 +1790,12 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, COREZX, MARKFORGED_YX, or MARKFORGED_XY." #elif !GOOD_AXIS_PINS(X2) #error "DUAL_X_CARRIAGE requires X2 stepper pins to be defined." - #elif !HAS_X_MAX - #error "DUAL_X_CARRIAGE requires USE_XMAX_PLUG and an X Max Endstop." + #elif !USE_X_MAX + #error "DUAL_X_CARRIAGE requires an X_MAX_PIN in addition to the X_MIN_PIN." #elif !defined(X2_HOME_POS) || !defined(X2_MIN_POS) || !defined(X2_MAX_POS) #error "DUAL_X_CARRIAGE requires X2_HOME_POS, X2_MIN_POS, and X2_MAX_POS." - #elif X_HOME_TO_MAX || X2_HOME_TO_MIN - #error "DUAL_X_CARRIAGE requires X_HOME_DIR -1 and X2_HOME_DIR 1." + #elif X_HOME_TO_MAX + #error "DUAL_X_CARRIAGE requires X_HOME_DIR 1." #endif #endif @@ -1832,7 +1851,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Make sure FAN_*_PWM values are sensible */ -#if EITHER(HAS_FAN, USE_CONTROLLER_FAN) +#if ANY(HAS_FAN, USE_CONTROLLER_FAN) #if !WITHIN(FAN_MIN_PWM, 0, 255) #error "FAN_MIN_PWM must be a value from 0 to 255." #elif !WITHIN(FAN_MAX_PWM, 0, 255) @@ -1847,8 +1866,10 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #ifdef REDUNDANT_PART_COOLING_FAN #if FAN_COUNT < 2 #error "REDUNDANT_PART_COOLING_FAN requires a board with at least two PWM fans." - #else - static_assert(WITHIN(REDUNDANT_PART_COOLING_FAN, 1, FAN_COUNT - 1), "REDUNDANT_PART_COOLING_FAN must be between 1 and " STRINGIFY(DECREMENT(FAN_COUNT)) "."); + #elif !WITHIN(REDUNDANT_PART_COOLING_FAN, 1, FAN_COUNT - 1) + static_assert(false, "REDUNDANT_PART_COOLING_FAN must be between 1 and " STRINGIFY(DECREMENT(FAN_COUNT)) "."); + #elif !WITHIN(REDUNDANT_PART_COOLING_FAN + NUM_REDUNDANT_FANS - 1, 1, FAN_COUNT - 1) + #error "Not enough fans available for NUM_REDUNDANT_FANS." #endif #endif @@ -1976,6 +1997,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be PROBE. TEMP_SENSOR_PROBE is in use." #elif REDUNDANT_TEMP_MATCH(SOURCE, BOARD) && HAS_TEMP_BOARD #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be BOARD. TEMP_SENSOR_BOARD is in use." + #elif REDUNDANT_TEMP_MATCH(SOURCE, SOC) + #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be SOC." #elif REDUNDANT_TEMP_MATCH(SOURCE, CHAMBER) && HAS_TEMP_CHAMBER #error "TEMP_SENSOR_REDUNDANT_SOURCE can't be CHAMBER. TEMP_SENSOR_CHAMBER is in use." #elif REDUNDANT_TEMP_MATCH(SOURCE, BED) && HAS_TEMP_BED @@ -2004,6 +2027,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "TEMP_SENSOR_REDUNDANT_TARGET can't be CHAMBER without TEMP_CHAMBER_PIN defined." #elif REDUNDANT_TEMP_MATCH(TARGET, BOARD) && !PIN_EXISTS(TEMP_BOARD) #error "TEMP_SENSOR_REDUNDANT_TARGET can't be BOARD without TEMP_BOARD_PIN defined." + #elif REDUNDANT_TEMP_MATCH(TARGET, SOC) + #error "TEMP_SENSOR_REDUNDANT_TARGET can't be SOC." #elif REDUNDANT_TEMP_MATCH(TARGET, PROBE) && !PIN_EXISTS(TEMP_PROBE) #error "TEMP_SENSOR_REDUNDANT_TARGET can't be PROBE without TEMP_PROBE_PIN defined." #elif REDUNDANT_TEMP_MATCH(TARGET, COOLER) && !PIN_EXISTS(TEMP_COOLER) @@ -2025,24 +2050,30 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "HEATER_0_PIN not defined for this board." #elif TEMP_SENSOR_IS_MAX_TC(0) && !PIN_EXISTS(TEMP_0_CS) #error "TEMP_SENSOR_0 MAX thermocouple requires TEMP_0_CS_PIN." + #elif TEMP_SENSOR_0 == 100 + #error "TEMP_SENSOR_0 can't use Soc temperature sensor." #elif TEMP_SENSOR_0 == 0 #error "TEMP_SENSOR_0 is required with 1 or more HOTENDS." #elif !ANY_PIN(TEMP_0, TEMP_0_CS) && !TEMP_SENSOR_0_IS_DUMMY #error "TEMP_0_PIN or TEMP_0_CS_PIN not defined for this board." #endif - #if EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 + #if ANY(HAS_MULTI_HOTEND, HEATERS_PARALLEL) && !HAS_HEATER_1 #error "HEATER_1_PIN is not defined. TEMP_SENSOR_1 might not be set, or the board (not EEB / EEF?) doesn't define a pin." #endif #if HAS_MULTI_HOTEND #if TEMP_SENSOR_IS_MAX_TC(1) && !PIN_EXISTS(TEMP_1_CS) #error "TEMP_SENSOR_1 MAX thermocouple requires TEMP_1_CS_PIN." + #elif TEMP_SENSOR_1 == 100 + #error "TEMP_SENSOR_1 can't use Soc temperature sensor." #elif TEMP_SENSOR_1 == 0 #error "TEMP_SENSOR_1 is required with 2 or more HOTENDS." #elif !ANY_PIN(TEMP_1, TEMP_1_CS) && !TEMP_SENSOR_1_IS_DUMMY #error "TEMP_1_PIN or TEMP_1_CS_PIN not defined for this board." #endif #if HOTENDS > 2 - #if TEMP_SENSOR_2 == 0 + #if TEMP_SENSOR_2 == 100 + #error "TEMP_SENSOR_2 can't use Soc temperature sensor." + #elif TEMP_SENSOR_2 == 0 #error "TEMP_SENSOR_2 is required with 3 or more HOTENDS." #elif !HAS_HEATER_2 #error "HEATER_2_PIN not defined for this board." @@ -2050,7 +2081,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "TEMP_2_PIN or TEMP_2_CS_PIN not defined for this board." #endif #if HOTENDS > 3 - #if TEMP_SENSOR_3 == 0 + #if TEMP_SENSOR_3 == 100 + #error "TEMP_SENSOR_3 can't use Soc temperature sensor." + #elif TEMP_SENSOR_3 == 0 #error "TEMP_SENSOR_3 is required with 4 or more HOTENDS." #elif !HAS_HEATER_3 #error "HEATER_3_PIN not defined for this board." @@ -2058,7 +2091,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "TEMP_3_PIN not defined for this board." #endif #if HOTENDS > 4 - #if TEMP_SENSOR_4 == 0 + #if TEMP_SENSOR_4 == 100 + #error "TEMP_SENSOR_4 can't use Soc temperature sensor." + #elif TEMP_SENSOR_4 == 0 #error "TEMP_SENSOR_4 is required with 5 or more HOTENDS." #elif !HAS_HEATER_4 #error "HEATER_4_PIN not defined for this board." @@ -2066,7 +2101,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "TEMP_4_PIN not defined for this board." #endif #if HOTENDS > 5 - #if TEMP_SENSOR_5 == 0 + #if TEMP_SENSOR_5 == 100 + #error "TEMP_SENSOR_5 can't use Soc temperature sensor." + #elif TEMP_SENSOR_5 == 0 #error "TEMP_SENSOR_5 is required with 6 HOTENDS." #elif !HAS_HEATER_5 #error "HEATER_5_PIN not defined for this board." @@ -2074,7 +2111,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "TEMP_5_PIN not defined for this board." #endif #if HOTENDS > 6 - #if TEMP_SENSOR_6 == 0 + #if TEMP_SENSOR_6 == 100 + #error "TEMP_SENSOR_6 can't use Soc temperature sensor." + #elif TEMP_SENSOR_6 == 0 #error "TEMP_SENSOR_6 is required with 6 HOTENDS." #elif !HAS_HEATER_6 #error "HEATER_6_PIN not defined for this board." @@ -2082,7 +2121,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "TEMP_6_PIN not defined for this board." #endif #if HOTENDS > 7 - #if TEMP_SENSOR_7 == 0 + #if TEMP_SENSOR_7 == 100 + #error "TEMP_SENSOR_7 can't use Soc temperature sensor." + #elif TEMP_SENSOR_7 == 0 #error "TEMP_SENSOR_7 is required with 7 HOTENDS." #elif !HAS_HEATER_7 #error "HEATER_7_PIN not defined for this board." @@ -2105,12 +2146,22 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Pins must be set for temp sensors, with some other feature requirements. */ -#if TEMP_SENSOR_CHAMBER && !PIN_EXISTS(TEMP_CHAMBER) - #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN." +#if TEMP_SENSOR_BED == 100 + #error "TEMP_SENSOR_BED can't use Soc temperature sensor." +#endif + +#if TEMP_SENSOR_CHAMBER + #if TEMP_SENSOR_CHAMBER == 100 + #error "TEMP_SENSOR_CHAMBER can't use Soc temperature sensor." + #elif !PIN_EXISTS(TEMP_CHAMBER) + #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN." + #endif #endif #if TEMP_SENSOR_COOLER - #if !PIN_EXISTS(TEMP_COOLER) + #if TEMP_SENSOR_COOLER == 100 + #error "TEMP_SENSOR_COOLER can't use Soc temperature sensor." + #elif !PIN_EXISTS(TEMP_COOLER) #error "TEMP_SENSOR_COOLER requires TEMP_COOLER_PIN." #elif DISABLED(LASER_FEATURE) #error "TEMP_SENSOR_COOLER requires LASER_FEATURE." @@ -2118,7 +2169,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #endif #if TEMP_SENSOR_PROBE - #if !PIN_EXISTS(TEMP_PROBE) + #if TEMP_SENSOR_PROBE == 100 + #error "TEMP_SENSOR_PROBE can't use Soc temperature sensor." + #elif !PIN_EXISTS(TEMP_PROBE) #error "TEMP_SENSOR_PROBE requires TEMP_PROBE_PIN." #elif DISABLED(FIX_MOUNTED_PROBE) #error "TEMP_SENSOR_PROBE shouldn't be set without FIX_MOUNTED_PROBE." @@ -2126,7 +2179,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #endif #if TEMP_SENSOR_BOARD - #if !PIN_EXISTS(TEMP_BOARD) + #if TEMP_SENSOR_BOARD == 100 + #error "TEMP_SENSOR_BOARD can't use Soc temperature sensor." + #elif !PIN_EXISTS(TEMP_BOARD) #error "TEMP_SENSOR_BOARD requires TEMP_BOARD_PIN." #elif ENABLED(THERMAL_PROTECTION_BOARD) && (!defined(BOARD_MINTEMP) || !defined(BOARD_MAXTEMP)) #error "THERMAL_PROTECTION_BOARD requires BOARD_MINTEMP and BOARD_MAXTEMP." @@ -2135,8 +2190,16 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "CONTROLLER_FAN_MIN_BOARD_TEMP requires TEMP_SENSOR_BOARD." #endif -#if TEMP_SENSOR_BOARD && !PIN_EXISTS(TEMP_BOARD) - #error "TEMP_SENSOR_BOARD requires TEMP_BOARD_PIN." +#if TEMP_SENSOR_SOC + #if TEMP_SENSOR_SOC != 100 + #error "TEMP_SENSOR_SOC requires TEMP_SENSOR_SOC 100." + #elif !PIN_EXISTS(TEMP_SOC) + #error "TEMP_SENSOR_SOC requires TEMP_SOC_PIN." + #elif ENABLED(THERMAL_PROTECTION_SOC) && !defined(SOC_MAXTEMP) + #error "THERMAL_PROTECTION_SOC requires SOC_MAXTEMP." + #endif +#elif CONTROLLER_FAN_MIN_SOC_TEMP + #error "CONTROLLER_FAN_MIN_SOC_TEMP requires TEMP_SENSOR_SOC." #endif #if ENABLED(LASER_COOLANT_FLOW_METER) && !(PIN_EXISTS(FLOWMETER) && ENABLED(LASER_FEATURE)) @@ -2177,7 +2240,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * FYSETC/MKS/BTT Mini Panel Requirements */ -#if EITHER(FYSETC_242_OLED_12864, FYSETC_MINI_12864_2_1) +#if ANY(FYSETC_242_OLED_12864, FYSETC_MINI_12864_2_1) #ifndef NEO_RGB #define NEO_RGB 123 #define FAUX_RGB 1 @@ -2191,7 +2254,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #undef NEO_RGB #undef FAUX_RGB #endif -#elif EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) && DISABLED(RGB_LED) +#elif ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) && DISABLED(RGB_LED) #error "Your FYSETC Mini Panel requires RGB_LED." #endif @@ -2260,121 +2323,84 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Endstop Tests */ - -#define _PLUG_UNUSED_TEST(A,P) (DISABLED(USE_##P##MIN_PLUG, USE_##P##MAX_PLUG) \ - && !(ENABLED(A##_DUAL_ENDSTOPS) && WITHIN(A##2_USE_ENDSTOP, _##P##MAX_, _##P##MIN_)) \ - && !(ENABLED(A##_MULTI_ENDSTOPS) && WITHIN(A##2_USE_ENDSTOP, _##P##MAX_, _##P##MIN_)) ) -#define _AXIS_PLUG_UNUSED_TEST(A) (HAS_##A##_A NUM_AXIS_GANG(&& _PLUG_UNUSED_TEST(A,X), && _PLUG_UNUSED_TEST(A,Y), && _PLUG_UNUSED_TEST(A,Z), \ - && _PLUG_UNUSED_TEST(A,I), && _PLUG_UNUSED_TEST(A,J), && _PLUG_UNUSED_TEST(A,K), \ - && _PLUG_UNUSED_TEST(A,U), && _PLUG_UNUSED_TEST(A,V), && _PLUG_UNUSED_TEST(A,W) ) ) - -// 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 - #if _AXIS_PLUG_UNUSED_TEST(I) - #error "You must enable USE_IMIN_PLUG or USE_IMAX_PLUG." - #endif - #if _AXIS_PLUG_UNUSED_TEST(J) - #error "You must enable USE_JMIN_PLUG or USE_JMAX_PLUG." - #endif - #if _AXIS_PLUG_UNUSED_TEST(K) - #error "You must enable USE_KMIN_PLUG or USE_KMAX_PLUG." - #endif - #if _AXIS_PLUG_UNUSED_TEST(U) - #error "You must enable USE_UMIN_PLUG or USE_UMAX_PLUG." - #endif - #if _AXIS_PLUG_UNUSED_TEST(V) - #error "You must enable USE_VMIN_PLUG or USE_VMAX_PLUG." - #endif - #if _AXIS_PLUG_UNUSED_TEST(W) - #error "You must enable USE_WMIN_PLUG or USE_WMAX_PLUG." - #endif - // Delta and Cartesian use 3 homing endstops #if NONE(IS_SCARA, SPI_ENDSTOPS) - #if X_HOME_TO_MIN && DISABLED(USE_XMIN_PLUG) - #error "Enable USE_XMIN_PLUG when homing X to MIN." - #elif X_HOME_TO_MAX && DISABLED(USE_XMAX_PLUG) - #error "Enable USE_XMAX_PLUG when homing X to MAX." - #elif Y_HOME_TO_MIN && DISABLED(USE_YMIN_PLUG) - #error "Enable USE_YMIN_PLUG when homing Y to MIN." - #elif Y_HOME_TO_MAX && DISABLED(USE_YMAX_PLUG) - #error "Enable USE_YMAX_PLUG when homing Y to MAX." - #elif I_HOME_TO_MIN && DISABLED(USE_IMIN_PLUG) - #error "Enable USE_IMIN_PLUG when homing I to MIN." - #elif I_HOME_TO_MAX && DISABLED(USE_IMAX_PLUG) - #error "Enable USE_IMAX_PLUG when homing I to MAX." - #elif J_HOME_TO_MIN && DISABLED(USE_JMIN_PLUG) - #error "Enable USE_JMIN_PLUG when homing J to MIN." - #elif J_HOME_TO_MAX && DISABLED(USE_JMAX_PLUG) - #error "Enable USE_JMAX_PLUG when homing J to MAX." - #elif K_HOME_TO_MIN && DISABLED(USE_KMIN_PLUG) - #error "Enable USE_KMIN_PLUG when homing K to MIN." - #elif K_HOME_TO_MAX && DISABLED(USE_KMAX_PLUG) - #error "Enable USE_KMAX_PLUG when homing K to MAX." - #elif U_HOME_TO_MIN && DISABLED(USE_UMIN_PLUG) - #error "Enable USE_UMIN_PLUG when homing U to MIN." - #elif U_HOME_TO_MAX && DISABLED(USE_UMAX_PLUG) - #error "Enable USE_UMAX_PLUG when homing U to MAX." - #elif V_HOME_TO_MIN && DISABLED(USE_VMIN_PLUG) - #error "Enable USE_VMIN_PLUG when homing V to MIN." - #elif V_HOME_TO_MAX && DISABLED(USE_VMAX_PLUG) - #error "Enable USE_VMAX_PLUG when homing V to MAX." - #elif W_HOME_TO_MIN && DISABLED(USE_WMIN_PLUG) - #error "Enable USE_WMIN_PLUG when homing W to MIN." - #elif W_HOME_TO_MAX && DISABLED(USE_WMAX_PLUG) - #error "Enable USE_WMAX_PLUG when homing W to MAX." + #if X_HOME_TO_MIN && !PIN_EXISTS(X_MIN) + #error "X_MIN_PIN (or X_STOP_PIN) is required for X axis homing." + #elif X_HOME_TO_MAX && !PIN_EXISTS(X_MAX) + #error "X_MAX_PIN (or X_STOP_PIN) is required for X axis homing." + #elif Y_HOME_TO_MIN && !PIN_EXISTS(Y_MIN) + #error "Y_MIN_PIN (or Y_STOP_PIN) is required for Y axis homing." + #elif Y_HOME_TO_MAX && !PIN_EXISTS(Y_MAX) + #error "Y_MAX_PIN (or Y_STOP_PIN) is required for Y axis homing." + #elif I_HOME_TO_MIN && !PIN_EXISTS(I_MIN) + #error "I_MIN_PIN (or I_STOP_PIN) is required for I axis homing." + #elif I_HOME_TO_MAX && !PIN_EXISTS(I_MAX) + #error "I_MAX_PIN (or I_STOP_PIN) is required for I axis homing." + #elif J_HOME_TO_MIN && !PIN_EXISTS(J_MIN) + #error "J_MIN_PIN (or J_STOP_PIN) is required for J axis homing." + #elif J_HOME_TO_MAX && !PIN_EXISTS(J_MAX) + #error "J_MAX_PIN (or J_STOP_PIN) is required for J axis homing." + #elif K_HOME_TO_MIN && !PIN_EXISTS(K_MIN) + #error "K_MIN_PIN (or K_STOP_PIN) is required for K axis homing." + #elif K_HOME_TO_MAX && !PIN_EXISTS(K_MAX) + #error "K_MAX_PIN (or K_STOP_PIN) is required for K axis homing." + #elif U_HOME_TO_MIN && !PIN_EXISTS(U_MIN) + #error "U_MIN_PIN (or U_STOP_PIN) is required for U axis homing." + #elif U_HOME_TO_MAX && !PIN_EXISTS(U_MAX) + #error "U_MAX_PIN (or U_STOP_PIN) is required for U axis homing." + #elif V_HOME_TO_MIN && !PIN_EXISTS(V_MIN) + #error "V_MIN_PIN (or V_STOP_PIN) is required for V axis homing." + #elif V_HOME_TO_MAX && !PIN_EXISTS(V_MAX) + #error "V_MAX_PIN (or V_STOP_PIN) is required for V axis homing." + #elif W_HOME_TO_MIN && !PIN_EXISTS(W_MIN) + #error "W_MIN_PIN (or W_STOP_PIN) is required for W axis homing." + #elif W_HOME_TO_MAX && !PIN_EXISTS(W_MAX) + #error "W_MAX_PIN (or W_STOP_PIN) is required for W axis homing." #endif #endif - // Z homing direction and plug usage flags - #if Z_HOME_TO_MIN && NONE(USE_ZMIN_PLUG, HOMING_Z_WITH_PROBE) - #error "Enable USE_ZMIN_PLUG when homing Z to MIN." - #elif Z_HOME_TO_MAX && ENABLED(USE_PROBE_FOR_Z_HOMING) + // Z homing requirements + #if Z_HOME_TO_MAX && 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) + #elif ALL(HOMING_Z_WITH_PROBE, Z_MULTI_ENDSTOPS) #error "Z_MULTI_ENDSTOPS is incompatible with USE_PROBE_FOR_Z_HOMING." - #elif Z_HOME_TO_MAX && 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) +#if ALL(HOME_Z_FIRST, USE_PROBE_FOR_Z_HOMING) #error "HOME_Z_FIRST can't be used when homing Z with a probe." #endif +#if Z_HOME_TO_MAX && defined(Z_AFTER_HOMING) && DISABLED(ALLOW_Z_AFTER_HOMING) + #error "Z_AFTER_HOMING shouldn't be used with Z max homing to keep 'G28 Z' safe for end-of-print usage. Define ALLOW_Z_AFTER_HOMING to allow this at your own risk." +#endif + // Dual/multiple endstops requirements #if ENABLED(X_DUAL_ENDSTOPS) #if ENABLED(DELTA) #error "X_DUAL_ENDSTOPS is not compatible with DELTA." - #elif !X2_USE_ENDSTOP - #error "X2_USE_ENDSTOP must be set with X_DUAL_ENDSTOPS." + #elif !HAS_X2_ENDSTOP + #error "X2 Endstop Pin must be defined for X_DUAL_ENDSTOPS." #endif #endif #if ENABLED(Y_DUAL_ENDSTOPS) #if ENABLED(DELTA) #error "Y_DUAL_ENDSTOPS is not compatible with DELTA." - #elif !Y2_USE_ENDSTOP - #error "Y2_USE_ENDSTOP must be set with Y_DUAL_ENDSTOPS." + #elif !HAS_Y2_ENDSTOP + #error "Y2 Endstop Pin must be defined for Y_DUAL_ENDSTOPS." #endif #endif #if ENABLED(Z_MULTI_ENDSTOPS) #if ENABLED(DELTA) #error "Z_MULTI_ENDSTOPS is not compatible with DELTA." - #elif !Z2_USE_ENDSTOP - #error "Z2_USE_ENDSTOP must be set with Z_MULTI_ENDSTOPS." - #elif !Z3_USE_ENDSTOP && NUM_Z_STEPPERS >= 3 - #error "Z3_USE_ENDSTOP must be set with Z_MULTI_ENDSTOPS and Z3_DRIVER_TYPE." - #elif !Z4_USE_ENDSTOP && NUM_Z_STEPPERS >= 4 - #error "Z4_USE_ENDSTOP must be set with Z_MULTI_ENDSTOPS and Z4_DRIVER_TYPE." + #elif !HAS_Z2_ENDSTOP + #error "Z2 Endstop Pin must be defined for Z_MULTI_ENDSTOPS." + #elif NUM_Z_STEPPERS >= 3 && !HAS_Z3_ENDSTOP + #error "Z3 Endstop Pin must be defined for Z_MULTI_ENDSTOPS and Z3_DRIVER_TYPE." + #elif NUM_Z_STEPPERS >= 4 && !HAS_Z4_ENDSTOP + #error "Z4 Endstop Pin must be defined for Z_MULTI_ENDSTOPS and Z4_DRIVER_TYPE." #endif #endif @@ -2482,21 +2508,21 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L * Fan check */ #if HAS_FANCHECK - #if BOTH(E0_FAN_TACHO_PULLUP, E0_FAN_TACHO_PULLDOWN) + #if ALL(E0_FAN_TACHO_PULLUP, E0_FAN_TACHO_PULLDOWN) #error "Enable only one of E0_FAN_TACHO_PULLUP or E0_FAN_TACHO_PULLDOWN." - #elif BOTH(E1_FAN_TACHO_PULLUP, E1_FAN_TACHO_PULLDOWN) + #elif ALL(E1_FAN_TACHO_PULLUP, E1_FAN_TACHO_PULLDOWN) #error "Enable only one of E1_FAN_TACHO_PULLUP or E1_FAN_TACHO_PULLDOWN." - #elif BOTH(E2_FAN_TACHO_PULLUP, E2_FAN_TACHO_PULLDOWN) + #elif ALL(E2_FAN_TACHO_PULLUP, E2_FAN_TACHO_PULLDOWN) #error "Enable only one of E2_FAN_TACHO_PULLUP or E2_FAN_TACHO_PULLDOWN." - #elif BOTH(E3_FAN_TACHO_PULLUP, E3_FAN_TACHO_PULLDOWN) + #elif ALL(E3_FAN_TACHO_PULLUP, E3_FAN_TACHO_PULLDOWN) #error "Enable only one of E3_FAN_TACHO_PULLUP or E3_FAN_TACHO_PULLDOWN." - #elif BOTH(E4_FAN_TACHO_PULLUP, E4_FAN_TACHO_PULLDOWN) + #elif ALL(E4_FAN_TACHO_PULLUP, E4_FAN_TACHO_PULLDOWN) #error "Enable only one of E4_FAN_TACHO_PULLUP or E4_FAN_TACHO_PULLDOWN." - #elif BOTH(E5_FAN_TACHO_PULLUP, E5_FAN_TACHO_PULLDOWN) + #elif ALL(E5_FAN_TACHO_PULLUP, E5_FAN_TACHO_PULLDOWN) #error "Enable only one of E5_FAN_TACHO_PULLUP or E5_FAN_TACHO_PULLDOWN." - #elif BOTH(E6_FAN_TACHO_PULLUP, E6_FAN_TACHO_PULLDOWN) + #elif ALL(E6_FAN_TACHO_PULLUP, E6_FAN_TACHO_PULLDOWN) #error "Enable only one of E6_FAN_TACHO_PULLUP or E6_FAN_TACHO_PULLDOWN." - #elif BOTH(E7_FAN_TACHO_PULLUP, E7_FAN_TACHO_PULLDOWN) + #elif ALL(E7_FAN_TACHO_PULLUP, E7_FAN_TACHO_PULLDOWN) #error "Enable only one of E7_FAN_TACHO_PULLUP or E7_FAN_TACHO_PULLDOWN." #endif #elif ENABLED(AUTO_REPORT_FANS) @@ -2624,10 +2650,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #if ENABLED(TFT_GENERIC) && NONE(TFT_INTERFACE_FSMC, TFT_INTERFACE_SPI) #error "TFT_GENERIC requires either TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI interface." -#endif - -#if BOTH(TFT_INTERFACE_FSMC, TFT_INTERFACE_SPI) - #error "Please enable only one of TFT_INTERFACE_SPI or TFT_INTERFACE_SPI." +#elif ALL(TFT_INTERFACE_FSMC, TFT_INTERFACE_SPI) + #error "Please enable only one of TFT_INTERFACE_FSMC or TFT_INTERFACE_SPI." #endif #if defined(LCD_SCREEN_ROTATE) && LCD_SCREEN_ROTATE != 0 && LCD_SCREEN_ROTATE != 90 && LCD_SCREEN_ROTATE != 180 && LCD_SCREEN_ROTATE != 270 @@ -2650,7 +2674,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "GRAPHICAL_TFT_UPSCALE must be between 2 and 8." #endif -#if BOTH(CHIRON_TFT_STANDARD, CHIRON_TFT_NEW) +#if ALL(CHIRON_TFT_STANDARD, CHIRON_TFT_NEW) #error "Please select only one of CHIRON_TFT_STANDARD or CHIRON_TFT_NEW." #endif @@ -2672,7 +2696,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_2), "zh_CN") == 0, "LCD_LANGUAGE_2 must be set to zh_CN for ANYCUBIC_LCD_VYPER."); #endif -#if EITHER(MKS_TS35_V2_0, BTT_TFT35_SPI_V1_0) && SD_CONNECTION_IS(LCD) +#if ANY(MKS_TS35_V2_0, BTT_TFT35_SPI_V1_0) && SD_CONNECTION_IS(LCD) #error "SDCARD_CONNECTION cannot be set to LCD for the enabled TFT. No available SD card reader." #endif @@ -2682,26 +2706,30 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #if ENABLED(DWIN_CREALITY_LCD) #if !HAS_MEDIA #error "DWIN_CREALITY_LCD requires SDSUPPORT to be enabled." - #elif EITHER(PID_EDIT_MENU, PID_AUTOTUNE_MENU) + #elif ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) #error "DWIN_CREALITY_LCD does not support PID_EDIT_MENU or PID_AUTOTUNE_MENU." - #elif EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) + #elif ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) #error "DWIN_CREALITY_LCD does not support MPC_EDIT_MENU or MPC_AUTOTUNE_MENU." #elif ENABLED(LCD_BED_TRAMMING) #error "DWIN_CREALITY_LCD does not support LCD_BED_TRAMMING." - #elif BOTH(LCD_BED_LEVELING, PROBE_MANUALLY) + #elif ALL(LCD_BED_LEVELING, PROBE_MANUALLY) #error "DWIN_CREALITY_LCD does not support LCD_BED_LEVELING with PROBE_MANUALLY." #endif #elif ENABLED(DWIN_LCD_PROUI) #if !HAS_MEDIA #error "DWIN_LCD_PROUI requires SDSUPPORT to be enabled." - #elif EITHER(PID_EDIT_MENU, PID_AUTOTUNE_MENU) - #error "DWIN_LCD_PROUI does not support PID_EDIT_MENU or PID_AUTOTUNE_MENU." - #elif EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) - #error "DWIN_LCD_PROUI does not support MPC_EDIT_MENU or MPC_AUTOTUNE_MENU." - #elif ENABLED(LCD_BED_TRAMMING) - #error "DWIN_LCD_PROUI does not support LCD_BED_TRAMMING." - #elif BOTH(LCD_BED_LEVELING, PROBE_MANUALLY) + #elif ALL(LCD_BED_LEVELING, PROBE_MANUALLY) #error "DWIN_LCD_PROUI does not support LCD_BED_LEVELING with PROBE_MANUALLY." + #elif ENABLED(MEDIASORT_MENU_ITEM) && DISABLED(SDCARD_SORT_ALPHA) + #error "MEDIASORT_MENU_ITEM requires SDCARD_SORT_ALPHA." + #elif ENABLED(RUNOUT_TUNE_ITEM) && DISABLED(HAS_FILAMENT_SENSOR) + #error "RUNOUT_TUNE_ITEM requires HAS_FILAMENT_SENSOR." + #elif ENABLED(PLR_TUNE_ITEM) && DISABLED(POWER_LOSS_RECOVERY) + #error "PLR_TUNE_ITEM requires POWER_LOSS_RECOVERY." + #elif ENABLED(JD_TUNE_ITEM) && DISABLED(HAS_JUNCTION_DEVIATION) + #error "JD_TUNE_ITEM requires HAS_JUNCTION_DEVIATION." + #elif ENABLED(ADVK_TUNE_ITEM) && DISABLED(LIN_ADVANCE) + #error "ADVK_TUNE_ITEM requires LIN_ADVANCE." #endif #endif @@ -2721,9 +2749,9 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L // Startup Tune requirements #ifdef STARTUP_TUNE - #if EITHER(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_VYPER) + #if ANY(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_VYPER) #error "STARTUP_TUNE should be disabled with ANYCUBIC_LCD_CHIRON or ANYCUBIC_LCD_VYPER." - #elif !(BOTH(HAS_BEEPER, SPEAKER) || USE_MARLINUI_BUZZER) + #elif !(ALL(HAS_BEEPER, SPEAKER) || USE_MARLINUI_BUZZER) #error "STARTUP_TUNE requires a BEEPER_PIN with SPEAKER or USE_MARLINUI_BUZZER." #undef STARTUP_TUNE #endif @@ -3044,13 +3072,12 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_WMIN (or ENDSTOPPULLUPS) for W MIN homing." #elif W_SENSORLESS && W_HOME_TO_MAX && DISABLED(ENDSTOPPULLUP_WMAX) #error "SENSORLESS_HOMING requires ENDSTOPPULLUP_WMAX (or ENDSTOPPULLUPS) for W MAX homing." - #endif #endif #if ENABLED(SPI_ENDSTOPS) - #if ENABLED(QUICK_HOME) - #warning "SPI_ENDSTOPS may be unreliable with QUICK_HOME. Adjust back-offs for better results." + #if !ANY_AXIS_HAS(SPI) + #error "SPI_ENDSTOPS requires stepper drivers with SPI support." #endif #else // !SPI_ENDSTOPS // Stall detection DIAG = HIGH : TMC2209 @@ -3219,7 +3246,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #endif // !SPI_ENDSTOPS - #if ENABLED(DELTA) && !BOTH(STEALTHCHOP_XY, STEALTHCHOP_Z) + #if ENABLED(DELTA) && !ALL(STEALTHCHOP_XY, STEALTHCHOP_Z) #error "SENSORLESS_HOMING on DELTA currently requires STEALTHCHOP_XY and STEALTHCHOP_Z." #elif ENDSTOP_NOISE_THRESHOLD #error "SENSORLESS_HOMING is incompatible with ENDSTOP_NOISE_THRESHOLD." @@ -3227,7 +3254,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "SENSORLESS_HOMING requires a TMC stepper driver with StallGuard on X, Y, Z, I, J, K, U, V, or W axes." #endif -#endif +#endif // SENSORLESS_HOMING // Sensorless probing requirements #if ENABLED(SENSORLESS_PROBING) @@ -3249,7 +3276,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "CoreXZ requires both X and Z to use sensorless homing if either one does." #elif CORE_IS_YZ && Y_SENSORLESS != Z_SENSORLESS && !HOMING_Z_WITH_PROBE #error "CoreYZ requires both Y and Z to use sensorless homing if either one does." -#elif EITHER(MARKFORGED_XY, MARKFORGED_YX) && X_SENSORLESS != Y_SENSORLESS +#elif ANY(MARKFORGED_XY, MARKFORGED_YX) && X_SENSORLESS != Y_SENSORLESS #error "MARKFORGED requires both X and Y to use sensorless homing if either one does." #endif @@ -3268,10 +3295,12 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L * TMC SPI Chaining */ #define IN_CHAIN(A) A##_CHAIN_POS > 0 -#if IN_CHAIN(X ) || IN_CHAIN(Y ) || IN_CHAIN(Z ) || IN_CHAIN(X2) || IN_CHAIN(Y2) || IN_CHAIN(Z2) || IN_CHAIN(Z3) || IN_CHAIN(Z4) \ +#if IN_CHAIN(X) || IN_CHAIN(Y) || IN_CHAIN(Z) || IN_CHAIN(I) || IN_CHAIN(J) || IN_CHAIN(K) || IN_CHAIN(U) || IN_CHAIN(V) || IN_CHAIN(W) \ + || IN_CHAIN(X2) || IN_CHAIN(Y2) || IN_CHAIN(Z2) || IN_CHAIN(Z3) || IN_CHAIN(Z4) \ || IN_CHAIN(E0) || IN_CHAIN(E1) || IN_CHAIN(E2) || IN_CHAIN(E3) || IN_CHAIN(E4) || IN_CHAIN(E5) || IN_CHAIN(E6) || IN_CHAIN(E7) #define BAD_CHAIN(A) (IN_CHAIN(A) && !PIN_EXISTS(A##_CS)) - #if BAD_CHAIN(X ) || BAD_CHAIN(Y ) || BAD_CHAIN(Z ) || BAD_CHAIN(X2) || BAD_CHAIN(Y2) || BAD_CHAIN(Z2) || BAD_CHAIN(Z3) || BAD_CHAIN(Z4) \ + #if BAD_CHAIN(X) || BAD_CHAIN(Y) || BAD_CHAIN(Z) || BAD_CHAIN(I) || BAD_CHAIN(J) || BAD_CHAIN(K) || BAD_CHAIN(U) || BAD_CHAIN(V) || BAD_CHAIN(W) \ + || BAD_CHAIN(X2) || BAD_CHAIN(Y2) || BAD_CHAIN(Z2) || BAD_CHAIN(Z3) || BAD_CHAIN(Z4) \ || BAD_CHAIN(E0) || BAD_CHAIN(E1) || BAD_CHAIN(E2) || BAD_CHAIN(E3) || BAD_CHAIN(E4) || BAD_CHAIN(E5) || BAD_CHAIN(E6) || BAD_CHAIN(E7) #error "All chained TMC drivers need a CS pin." #else @@ -3319,9 +3348,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #define CS_COMPARE E7_CS_PIN #endif #define BAD_CS_PIN(A) (IN_CHAIN(A) && A##_CS_PIN != CS_COMPARE) - #if BAD_CS_PIN(X ) || BAD_CS_PIN(Y ) || BAD_CS_PIN(Z ) || BAD_CS_PIN(X2) || BAD_CS_PIN(Y2) || BAD_CS_PIN(Z2) || BAD_CS_PIN(Z3) || BAD_CS_PIN(Z4) \ - || BAD_CS_PIN(I) || BAD_CS_PIN(J) || BAD_CS_PIN(K) \ - || BAD_CS_PIN(U) || BAD_CS_PIN(V) || BAD_CS_PIN(W) \ + #if BAD_CS_PIN(X) || BAD_CS_PIN(Y) || BAD_CS_PIN(Z) || BAD_CS_PIN(I) || BAD_CS_PIN(J) || BAD_CS_PIN(K) || BAD_CS_PIN(U) || BAD_CS_PIN(V) || BAD_CS_PIN(W) \ + || BAD_CS_PIN(X2) || BAD_CS_PIN(Y2) || BAD_CS_PIN(Z2) || BAD_CS_PIN(Z3) || BAD_CS_PIN(Z4) \ || BAD_CS_PIN(E0) || BAD_CS_PIN(E1) || BAD_CS_PIN(E2) || BAD_CS_PIN(E3) || BAD_CS_PIN(E4) || BAD_CS_PIN(E5) || BAD_CS_PIN(E6) || BAD_CS_PIN(E7) #error "All chained TMC drivers must use the same CS pin." #endif @@ -3336,7 +3364,7 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L * Digipot requirement */ #if HAS_MOTOR_CURRENT_I2C - #if BOTH(DIGIPOT_MCP4018, DIGIPOT_MCP4451) + #if ALL(DIGIPOT_MCP4018, DIGIPOT_MCP4451) #error "Enable only one of DIGIPOT_MCP4018 or DIGIPOT_MCP4451." #elif !MB(MKS_SBASE, AZTEEG_X5_GT, AZTEEG_X5_MINI, AZTEEG_X5_MINI_WIFI) \ && (!defined(DIGIPOTS_I2C_SDA_X) || !defined(DIGIPOTS_I2C_SDA_Y) || !defined(DIGIPOTS_I2C_SDA_Z) || !defined(DIGIPOTS_I2C_SDA_E0) || !defined(DIGIPOTS_I2C_SDA_E1)) @@ -3371,9 +3399,11 @@ static_assert(COUNT(sanity_arr_3) >= LOGICAL_AXES, "DEFAULT_MAX_ACCELERATION re static_assert(COUNT(sanity_arr_3) <= DISTINCT_AXES, "DEFAULT_MAX_ACCELERATION has too many elements." _EXTRA_NOTE); static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive."); -constexpr float sanity_arr_4[] = HOMING_FEEDRATE_MM_M; -static_assert(COUNT(sanity_arr_4) == NUM_AXES, "HOMING_FEEDRATE_MM_M requires " _NUM_AXES_STR "elements (and no others)."); -static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); +#if NUM_AXES + constexpr float sanity_arr_4[] = HOMING_FEEDRATE_MM_M; + static_assert(COUNT(sanity_arr_4) == NUM_AXES, "HOMING_FEEDRATE_MM_M requires " _NUM_AXES_STR "elements (and no others)."); + static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); +#endif #ifdef MAX_ACCEL_EDIT_VALUES constexpr float sanity_arr_5[] = MAX_ACCEL_EDIT_VALUES; @@ -3407,7 +3437,7 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #undef _PLUS_TEST #undef _EXTRA_NOTE -#if BOTH(CNC_COORDINATE_SYSTEMS, NO_WORKSPACE_OFFSETS) +#if ALL(CNC_COORDINATE_SYSTEMS, NO_WORKSPACE_OFFSETS) #error "CNC_COORDINATE_SYSTEMS is incompatible with NO_WORKSPACE_OFFSETS." #endif @@ -3443,18 +3473,18 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #endif #endif -#if BOTH(X_AXIS_TWIST_COMPENSATION, NOZZLE_AS_PROBE) +#if ALL(X_AXIS_TWIST_COMPENSATION, NOZZLE_AS_PROBE) #error "X_AXIS_TWIST_COMPENSATION is incompatible with NOZZLE_AS_PROBE." #endif #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_PULLUP, POWER_LOSS_PULLDOWN) + #elif ALL(POWER_LOSS_PULLUP, POWER_LOSS_PULLDOWN) #error "You can't enable POWER_LOSS_PULLUP and POWER_LOSS_PULLDOWN at the same time." #elif ENABLED(POWER_LOSS_RECOVER_ZHOME) && Z_HOME_TO_MAX #error "POWER_LOSS_RECOVER_ZHOME is not needed on a machine that homes to ZMAX." - #elif BOTH(IS_CARTESIAN, POWER_LOSS_RECOVER_ZHOME) && Z_HOME_TO_MIN && !defined(POWER_LOSS_ZHOME_POS) + #elif ALL(IS_CARTESIAN, POWER_LOSS_RECOVER_ZHOME) && Z_HOME_TO_MIN && !defined(POWER_LOSS_ZHOME_POS) #error "POWER_LOSS_RECOVER_ZHOME requires POWER_LOSS_ZHOME_POS for a Cartesian that homes to ZMIN." #endif #endif @@ -3516,7 +3546,7 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #error "BACKLASH_COMPENSATION requires BACKLASH_DISTANCE_MM." #elif !defined(BACKLASH_CORRECTION) #error "BACKLASH_COMPENSATION requires BACKLASH_CORRECTION." - #elif EITHER(MARKFORGED_XY, MARKFORGED_YX) + #elif ANY(MARKFORGED_XY, MARKFORGED_YX) constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM; static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2], "BACKLASH_COMPENSATION can only apply to " STRINGIFY(NORMAL_AXIS) " on a MarkForged system."); @@ -3566,11 +3596,11 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); /** * Require soft endstops for certain setups */ -#if !BOTH(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) +#if !ALL(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) #if ENABLED(DUAL_X_CARRIAGE) #error "DUAL_X_CARRIAGE requires both MIN_ and MAX_SOFTWARE_ENDSTOPS." #elif HAS_HOTEND_OFFSET - #error "MIN_ and MAX_SOFTWARE_ENDSTOPS are both required with offset hotends." + #error "Multi-hotends with offset requires both MIN_ and MAX_SOFTWARE_ENDSTOPS." #endif #endif @@ -3627,7 +3657,7 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #endif #define _PIN_CONFLICT(P) (PIN_EXISTS(P) && P##_PIN == SPINDLE_LASER_PWM_PIN) - #if BOTH(SPINDLE_FEATURE, LASER_FEATURE) + #if ALL(SPINDLE_FEATURE, LASER_FEATURE) #error "Enable only one of SPINDLE_FEATURE or LASER_FEATURE." #elif NONE(SPINDLE_SERVO, SPINDLE_LASER_USE_PWM) && !PIN_EXISTS(SPINDLE_LASER_ENA) #error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN, SPINDLE_LASER_USE_PWM, or SPINDLE_SERVO to control the power." @@ -3700,10 +3730,14 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #endif -#if ENABLED(COOLANT_MIST) && !PIN_EXISTS(COOLANT_MIST) - #error "COOLANT_MIST requires COOLANT_MIST_PIN to be defined." -#elif ENABLED(COOLANT_FLOOD) && !PIN_EXISTS(COOLANT_FLOOD) - #error "COOLANT_FLOOD requires COOLANT_FLOOD_PIN to be defined." +#if ENABLED(COOLANT_CONTROL) + #if NONE(COOLANT_MIST, COOLANT_FLOOD) + #error "COOLANT_CONTROL requires either COOLANT_MIST or COOLANT_FLOOD." + #elif ENABLED(COOLANT_MIST) && !PIN_EXISTS(COOLANT_MIST) + #error "COOLANT_MIST requires COOLANT_MIST_PIN to be defined." + #elif ENABLED(COOLANT_FLOOD) && !PIN_EXISTS(COOLANT_FLOOD) + #error "COOLANT_FLOOD requires COOLANT_FLOOD_PIN to be defined." + #endif #endif #if HAS_ADC_BUTTONS && defined(ADC_BUTTON_DEBOUNCE_DELAY) && ADC_BUTTON_DEBOUNCE_DELAY < 16 @@ -3772,7 +3806,7 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #error "ESP3D_WIFISUPPORT requires an ESP32 MOTHERBOARD." #elif ENABLED(WEBSUPPORT) && NONE(ARDUINO_ARCH_ESP32, WIFISUPPORT) #error "WEBSUPPORT requires WIFISUPPORT and an ESP32 MOTHERBOARD." -#elif BOTH(ESP3D_WIFISUPPORT, WIFISUPPORT) +#elif ALL(ESP3D_WIFISUPPORT, WIFISUPPORT) #error "Enable only one of ESP3D_WIFISUPPORT or WIFISUPPORT." #endif @@ -3790,14 +3824,14 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); /** * Sanity Check for MEATPACK and BINARY_FILE_TRANSFER Features */ -#if BOTH(HAS_MEATPACK, BINARY_FILE_TRANSFER) +#if ALL(HAS_MEATPACK, BINARY_FILE_TRANSFER) #error "Either enable MEATPACK_ON_SERIAL_PORT_* or BINARY_FILE_TRANSFER, not both." #endif /** * Sanity Check for Slim LCD Menus and Probe Offset Wizard */ -#if BOTH(SLIM_LCD_MENUS, PROBE_OFFSET_WIZARD) +#if ALL(SLIM_LCD_MENUS, PROBE_OFFSET_WIZARD) #error "SLIM_LCD_MENUS disables \"Advanced Settings > Probe Offsets > PROBE_OFFSET_WIZARD.\"" #endif @@ -3834,7 +3868,7 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); /** * Sanity check for MIXING_EXTRUDER & DISTINCT_E_FACTORS these are not compatible */ -#if BOTH(MIXING_EXTRUDER, DISTINCT_E_FACTORS) +#if ALL(MIXING_EXTRUDER, DISTINCT_E_FACTORS) #error "MIXING_EXTRUDER can't be used with DISTINCT_E_FACTORS. But you may use SINGLENOZZLE with DISTINCT_E_FACTORS." #endif @@ -3968,8 +4002,8 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #endif // Check requirements for upload.py -#if ENABLED(XFER_BUILD) && !BOTH(BINARY_FILE_TRANSFER, CUSTOM_FIRMWARE_UPLOAD) - #error "BINARY_FILE_TRANSFER and CUSTOM_FIRMWARE_UPLOAD are required for custom upload." +#if ENABLED(XFER_BUILD) && !ALL(SDSUPPORT, BINARY_FILE_TRANSFER, CUSTOM_FIRMWARE_UPLOAD) + #error "SDSUPPORT, BINARY_FILE_TRANSFER, and CUSTOM_FIRMWARE_UPLOAD are required for custom upload." #endif /** @@ -3988,12 +4022,12 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #error "Input Shaping is not compatible with POLARGRAPH kinematics." #elif ENABLED(DIRECT_STEPPING) #error "Input Shaping is not compatible with DIRECT_STEPPING." - #elif BOTH(INPUT_SHAPING_X, CORE_IS_XZ) + #elif ALL(INPUT_SHAPING_X, CORE_IS_XZ) #error "INPUT_SHAPING_X is not supported with COREXZ." - #elif BOTH(INPUT_SHAPING_Y, CORE_IS_YZ) + #elif ALL(INPUT_SHAPING_Y, CORE_IS_YZ) #error "INPUT_SHAPING_Y is not supported with COREYZ." #elif ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) - #if !BOTH(INPUT_SHAPING_X, INPUT_SHAPING_Y) + #if !ALL(INPUT_SHAPING_X, INPUT_SHAPING_Y) #error "INPUT_SHAPING_X and INPUT_SHAPING_Y must both be enabled for COREXY, COREYX, or MARKFORGED_*." #else static_assert(SHAPING_FREQ_X == SHAPING_FREQ_Y, "SHAPING_FREQ_X and SHAPING_FREQ_Y must be the same for COREXY / COREYX / MARKFORGED_*."); @@ -4001,13 +4035,13 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #endif #endif + #ifdef SHAPING_MIN_FREQ + static_assert((SHAPING_MIN_FREQ) > 0, "SHAPING_MIN_FREQ must be > 0."); + #else + TERN_(INPUT_SHAPING_X, static_assert((SHAPING_FREQ_X) > 0, "SHAPING_FREQ_X must be > 0 or SHAPING_MIN_FREQ must be set.")); + TERN_(INPUT_SHAPING_Y, static_assert((SHAPING_FREQ_Y) > 0, "SHAPING_FREQ_Y must be > 0 or SHAPING_MIN_FREQ must be set.")); + #endif #ifdef __AVR__ - #ifdef SHAPING_MIN_FREQ - static_assert((SHAPING_MIN_FREQ) > 0, "SHAPING_MIN_FREQ must be > 0."); - #else - TERN_(INPUT_SHAPING_X, static_assert((SHAPING_FREQ_X) > 0, "SHAPING_FREQ_X must be > 0 or SHAPING_MIN_FREQ must be set.")); - TERN_(INPUT_SHAPING_Y, static_assert((SHAPING_FREQ_Y) > 0, "SHAPING_FREQ_Y must be > 0 or SHAPING_MIN_FREQ must be set.")); - #endif #if ENABLED(INPUT_SHAPING_X) #if F_CPU > 16000000 static_assert((SHAPING_FREQ_X) == 0 || (SHAPING_FREQ_X) * 2 * 0x10000 >= (STEPPER_TIMER_RATE), "SHAPING_FREQ_X is below the minimum (20) for AVR 20MHz."); @@ -4025,9 +4059,29 @@ static_assert(_PLUS_TEST(4), "HOMING_FEEDRATE_MM_M values must be positive."); #endif #endif +/** + * Fixed-Time Motion limitations + */ +#if ALL(FT_MOTION, MIXING_EXTRUDER) + #error "FT_MOTION does not currently support MIXING_EXTRUDER." +#endif + // Multi-Stepping Limit static_assert(WITHIN(MULTISTEPPING_LIMIT, 1, 128) && IS_POWER_OF_2(MULTISTEPPING_LIMIT), "MULTISTEPPING_LIMIT must be 1, 2, 4, 8, 16, 32, 64, or 128."); +// One Click Print +#if ENABLED(ONE_CLICK_PRINT) + #if !HAS_MEDIA + #error "SD Card or Flash Drive is required for ONE_CLICK_PRINT." + #elif ENABLED(BROWSE_MEDIA_ON_INSERT) + #error "ONE_CLICK_PRINT is incompatible with BROWSE_MEDIA_ON_INSERT." + #elif DISABLED(NO_SD_AUTOSTART) + #error "NO_SD_AUTOSTART must be enabled for ONE_CLICK_PRINT." + #elif !defined(HAS_MARLINUI_MENU) + #error "ONE_CLICK_PRINT needs a display that has Marlin UI menus." + #endif +#endif + // Misc. Cleanup #undef _TEST_PWM #undef _NUM_AXES_STR diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 146d422033..f86372c103 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 "2023-04-24" + #define STRING_DISTRIBUTION_DATE "2023-06-23" #endif /** diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 82aadf7d77..34c63239e5 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -95,46 +95,40 @@ #warning "Note: Auto-assigned X2_CS_PIN to an unused En_CS_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_X2_DIAG - #if X2_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned X2_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned X2_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _XSTOP_ - #warning "Note: Auto-assigned X2_DIAG_PIN to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned X2_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned X2_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _YSTOP_ - #warning "Note: Auto-assigned X2_DIAG_PIN to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned X2_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned X2_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _ZSTOP_ - #warning "Note: Auto-assigned X2_DIAG_PIN to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif X2_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned X2_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if X2_STOP_PIN == X_MIN_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == X_STOP_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == Y_MIN_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == Y_STOP_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == Z_MIN_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == Z_STOP_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif X2_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned X2 sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_Y2_STEPPER @@ -153,46 +147,40 @@ #warning "Note: Auto-assigned Y2_CS_PIN to an unused En_CS_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_Y2_DIAG - #if Y2_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _XSTOP_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _YSTOP_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _ZSTOP_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Y2_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned Y2_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if Y2_USE_ENDSTOP == X_MIN_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == X_STOP_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_USE_ENDSTOP == Y_MIN_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == Y_STOP_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_USE_ENDSTOP == Z_MIN_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == Z_STOP_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Y2_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned Y2 sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_Z2_STEPPER @@ -211,46 +199,40 @@ #warning "Note: Auto-assigned Z2_CS_PIN to an unused En_CS_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_Z2_DIAG - #if Z2_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _XSTOP_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _YSTOP_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _ZSTOP_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z2_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned Z2_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if Z2_USE_ENDSTOP == X_MIN_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == X_STOP_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_USE_ENDSTOP == Y_MIN_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == Y_STOP_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_USE_ENDSTOP == Z_MIN_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == Z_STOP_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z2_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned Z2 sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_Z3_STEPPER @@ -269,46 +251,40 @@ #warning "Note: Auto-assigned Z3_MS3_PIN to an unused En_MS3_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_Z3_DIAG - #if Z3_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _XSTOP_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _YSTOP_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _ZSTOP_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z3_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned Z3_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if Z3_USE_ENDSTOP == X_MIN_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == X_STOP_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_USE_ENDSTOP == Y_MIN_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == Y_STOP_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_USE_ENDSTOP == Z_MIN_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == Z_STOP_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z3_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned Z3 sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_Z4_STEPPER @@ -327,46 +303,40 @@ #warning "Note: Auto-assigned Z4_MS3_PIN to an unused En_MS3_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_Z4_DIAG - #if Z4_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _XSTOP_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _YSTOP_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _ZSTOP_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif Z4_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned Z4_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if Z4_USE_ENDSTOP == X_MIN_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == X_STOP_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_USE_ENDSTOP == Y_MIN_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == Y_STOP_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_USE_ENDSTOP == Z_MIN_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == Z_STOP_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif Z4_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned Z4 sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_I_STEPPER @@ -385,46 +355,40 @@ #warning "Note: Auto-assigned I_MS3_PIN to an unused En_MS3_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_I_DIAG - #if I_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned I_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned I_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _XSTOP_ - #warning "Note: Auto-assigned I_DIAG_PIN to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned I_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned I_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _YSTOP_ - #warning "Note: Auto-assigned I_DIAG_PIN to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned I_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned I_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _ZSTOP_ - #warning "Note: Auto-assigned I_DIAG_PIN to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif I_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned I_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if I_STOP_PIN == X_MIN_PIN + #warning "Note: Auto-assigned I sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned I sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == X_STOP_PIN + #warning "Note: Auto-assigned I sensorless endstop to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == Y_MIN_PIN + #warning "Note: Auto-assigned I sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned I sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == Y_STOP_PIN + #warning "Note: Auto-assigned I sensorless endstop to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == Z_MIN_PIN + #warning "Note: Auto-assigned I sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned I sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == Z_STOP_PIN + #warning "Note: Auto-assigned I sensorless endstop to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned I sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned I sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned I sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned I sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned I sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned I sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned I sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif I_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned I sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_J_STEPPER @@ -443,46 +407,40 @@ #warning "Note: Auto-assigned J_MS3_PIN to an unused En_MS3_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_J_DIAG - #if J_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned J_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned J_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _XSTOP_ - #warning "Note: Auto-assigned J_DIAG_PIN to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned J_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned J_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _YSTOP_ - #warning "Note: Auto-assigned J_DIAG_PIN to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned J_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned J_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _ZSTOP_ - #warning "Note: Auto-assigned J_DIAG_PIN to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif J_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned J_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if J_STOP_PIN == X_MIN_PIN + #warning "Note: Auto-assigned J sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned J sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == X_STOP_PIN + #warning "Note: Auto-assigned J sensorless endstop to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == Y_MIN_PIN + #warning "Note: Auto-assigned J sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned J sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == Y_STOP_PIN + #warning "Note: Auto-assigned J sensorless endstop to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == Z_MIN_PIN + #warning "Note: Auto-assigned J sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned J sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == Z_STOP_PIN + #warning "Note: Auto-assigned J sensorless endstop to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned J sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned J sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned J sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned J sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned J sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned J sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned J sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif J_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned J sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_K_STEPPER @@ -501,46 +459,40 @@ #warning "Note: Auto-assigned K_MS3_PIN to an unused En_MS3_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_K_DIAG - #if K_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned K_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned K_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _XSTOP_ - #warning "Note: Auto-assigned K_DIAG_PIN to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned K_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned K_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _YSTOP_ - #warning "Note: Auto-assigned K_DIAG_PIN to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned K_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned K_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _ZSTOP_ - #warning "Note: Auto-assigned K_DIAG_PIN to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned K_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if K_STOP_PIN == X_MIN_PIN + #warning "Note: Auto-assigned K sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned K sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == X_STOP_PIN + #warning "Note: Auto-assigned K sensorless endstop to X_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == Y_MIN_PIN + #warning "Note: Auto-assigned K sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned K sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == Y_STOP_PIN + #warning "Note: Auto-assigned K sensorless endstop to Y_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == Z_MIN_PIN + #warning "Note: Auto-assigned K sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned K sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == Z_STOP_PIN + #warning "Note: Auto-assigned K sensorless endstop to Z_STOP_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned K sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned K sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned K sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned K sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned K sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned K sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned K sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned K sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif @@ -560,40 +512,34 @@ #warning "Note: Auto-assigned U_MS3_PIN to an unused En_MS3_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_U_DIAG - #if U_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned U_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned U_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif K_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned U_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned U_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned U_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned U_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif U_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned U_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if U_STOP_PIN == X_MIN_PIN + #warning "Note: Auto-assigned U sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned U sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif K_STOP_PIN == Y_MIN_PIN + #warning "Note: Auto-assigned U sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned U sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == Z_MIN_PIN + #warning "Note: Auto-assigned U sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned U sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned U sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned U sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned U sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned U sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned U sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned U sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned U sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif U_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned U sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_V_STEPPER @@ -612,40 +558,34 @@ #warning "Note: Auto-assigned V_MS3_PIN to an unused En_MS3_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_V_DIAG - #if V_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned V_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned V_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned V_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned V_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned V_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned V_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif V_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned V_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if V_STOP_PIN == X_MIN_PIN + #warning "Note: Auto-assigned V sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned V sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == Y_MIN_PIN + #warning "Note: Auto-assigned V sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned V sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == Z_MIN_PIN + #warning "Note: Auto-assigned V sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned V sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned V sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned V sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned V sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned V sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned V sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned V sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned V sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif V_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned V sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif #if AUTO_ASSIGNED_W_STEPPER @@ -664,40 +604,34 @@ #warning "Note: Auto-assigned W_MS3_PIN to an unused En_MS3_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #if AUTO_ASSIGNED_W_DIAG - #if W_USE_ENDSTOP == _XMIN_ - #warning "Note: Auto-assigned W_DIAG_PIN to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _XMAX_ - #warning "Note: Auto-assigned W_DIAG_PIN to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _YMIN_ - #warning "Note: Auto-assigned W_DIAG_PIN to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _YMAX_ - #warning "Note: Auto-assigned W_DIAG_PIN to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _ZMIN_ - #warning "Note: Auto-assigned W_DIAG_PIN to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _ZMAX_ - #warning "Note: Auto-assigned W_DIAG_PIN to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _XDIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to X_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _YDIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to Y_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _ZDIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to Z_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _E0DIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _E1DIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _E2DIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _E3DIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _E4DIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _E5DIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _E6DIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" - #elif W_USE_ENDSTOP == _E7DIAG_ - #warning "Note: Auto-assigned W_DIAG_PIN to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #if W_STOP_PIN == X_MIN_PIN + #warning "Note: Auto-assigned W sensorless endstop to X_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == X_MAX_PIN + #warning "Note: Auto-assigned W sensorless endstop to X_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == Y_MIN_PIN + #warning "Note: Auto-assigned W sensorless endstop to Y_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == Y_MAX_PIN + #warning "Note: Auto-assigned W sensorless endstop to Y_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == Z_MIN_PIN + #warning "Note: Auto-assigned W sensorless endstop to Z_MIN_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == Z_MAX_PIN + #warning "Note: Auto-assigned W sensorless endstop to Z_MAX_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == E0_DIAG_PIN + #warning "Note: Auto-assigned W sensorless endstop to E0_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == E1_DIAG_PIN + #warning "Note: Auto-assigned W sensorless endstop to E1_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == E2_DIAG_PIN + #warning "Note: Auto-assigned W sensorless endstop to E2_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == E3_DIAG_PIN + #warning "Note: Auto-assigned W sensorless endstop to E3_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == E4_DIAG_PIN + #warning "Note: Auto-assigned W sensorless endstop to E4_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == E5_DIAG_PIN + #warning "Note: Auto-assigned W sensorless endstop to E5_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == E6_DIAG_PIN + #warning "Note: Auto-assigned W sensorless endstop to E6_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" + #elif W_STOP_PIN == E7_DIAG_PIN + #warning "Note: Auto-assigned W sensorless endstop to E7_DIAG_PIN. (Define NO_AUTO_ASSIGN_WARNING to suppress this warning.)" #endif #endif @@ -734,6 +668,10 @@ #endif #endif +#if ENABLED(QUICK_HOME) && (X_SPI_SENSORLESS || Y_SPI_SENSORLESS) + #warning "SPI_ENDSTOPS may be unreliable with QUICK_HOME. Adjust back-offs for better results." +#endif + #if CANNOT_EMBED_CONFIGURATION #warning "Disabled CONFIGURATION_EMBEDDING because the target usually has less flash storage. Define FORCE_CONFIG_EMBED to override." #endif @@ -749,17 +687,17 @@ /** * FYSETC/MKS/BTT Mini Panel backlighting */ -#if EITHER(FYSETC_242_OLED_12864, FYSETC_MINI_12864_2_1) && !ALL(NEOPIXEL_LED, LED_CONTROL_MENU, LED_USER_PRESET_STARTUP, LED_COLOR_PRESETS) +#if ANY(FYSETC_242_OLED_12864, FYSETC_MINI_12864_2_1) && !ALL(NEOPIXEL_LED, LED_CONTROL_MENU, LED_USER_PRESET_STARTUP, LED_COLOR_PRESETS) #warning "Your FYSETC/MKS/BTT Mini Panel works best with NEOPIXEL_LED, LED_CONTROL_MENU, LED_USER_PRESET_STARTUP, and LED_COLOR_PRESETS." #endif -#if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) && DISABLED(RGB_LED) +#if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) && DISABLED(RGB_LED) #warning "Your FYSETC Mini Panel works best with RGB_LED." -#elif EITHER(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1) && DISABLED(LED_USER_PRESET_STARTUP) +#elif ANY(FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1) && DISABLED(LED_USER_PRESET_STARTUP) #warning "Your FYSETC Mini Panel works best with LED_USER_PRESET_STARTUP." #endif -#if EITHER(FYSETC_242_OLED_12864, FYSETC_MINI_12864) && BOTH(PSU_CONTROL, HAS_COLOR_LEDS) && !LED_POWEROFF_TIMEOUT +#if ANY(FYSETC_242_OLED_12864, FYSETC_MINI_12864) && ALL(PSU_CONTROL, HAS_COLOR_LEDS) && !LED_POWEROFF_TIMEOUT #warning "Your FYSETC display with PSU_CONTROL works best with LED_POWEROFF_TIMEOUT." #endif @@ -791,10 +729,17 @@ #warning "BABYSTEPPING is recommended with BD_SENSOR." #endif +/** + * EP Babystepping works best with EMERGENCY_PARSER + */ +#if ENABLED(EP_BABYSTEPPING) && DISABLED(EMERGENCY_PARSER) + #warning "EMERGENCY_PARSER is recommended for EP_BABYSTEPPING." +#endif + /** * POLAR warnings */ -#if BOTH(POLAR, S_CURVE_ACCELERATION) +#if ALL(POLAR, S_CURVE_ACCELERATION) #warning "POLAR kinematics may not work well with S_CURVE_ACCELERATION." #endif @@ -815,3 +760,14 @@ #if SDSORT_CACHE_LPC1768_WARNING #warning "SDCARD_SORT_ALPHA sub-options overridden for LPC1768 with DOGM LCD SCK overlap." #endif + +/** + * Ender-5 S1 bootloader + */ +#ifdef STM32F4_UPDATE_FOLDER + #warning "Place the firmware bin file in a folder named 'STM32F4_UPDATE' on the SD card. Install with 'M936 V2'." +#endif + +#if ENABLED(DWIN_LCD_PROUI) && BOOTSCREEN_TIMEOUT > 2000 + #warning "For ProUI the original BOOTSCREEN_TIMEOUT of 1100 is recommended." +#endif diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 36831767f3..1aa53241ad 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -41,12 +41,12 @@ #include "../../module/planner.h" #include "../../module/motion.h" -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) +#if DISABLED(LCD_PROGRESS_BAR) && ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) #include "../../feature/filwidth.h" #include "../../gcode/parser.h" #endif -#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) +#if ANY(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif @@ -70,7 +70,7 @@ LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_I2C_PIN_EN, LCD_I2C_PIN_RW, LCD_I2C_PIN_RS, LCD_I2C_PIN_D4, LCD_I2C_PIN_D5, LCD_I2C_PIN_D6, LCD_I2C_PIN_D7); -#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) +#elif ANY(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) LCD_CLASS lcd(LCD_I2C_ADDRESS OPTARG(DETECT_I2C_LCD_DEVICE, 1)); @@ -103,7 +103,23 @@ #elif ENABLED(YHCB2004) - LCD_CLASS lcd(YHCB2004_CLK, 20, 4, YHCB2004_MOSI, YHCB2004_MISO); // CLK, cols, rows, MOSI, MISO + #ifndef YHCB2004_SS_PIN + #define YHCB2004_SS_PIN SS + #endif + #ifndef YHCB2004_SCK_PIN + #define YHCB2004_SCK_PIN SCK + #endif + #ifndef YHCB2004_MOSI_PIN + #define YHCB2004_MOSI_PIN MOSI + #endif + #ifndef YHCB2004_MISO_PIN + #define YHCB2004_MISO_PIN MISO + #endif + #if !PINS_EXIST(YHCB2004_SS, YHCB2004_SCK, YHCB2004_MOSI, YHCB2004_MISO) + #error "YHCB2004 display requires YHCB2004_SS_PIN, YHCB2004_SCK_PIN, YHCB2004_MOSI_PIN, and YHCB2004_MISO_PIN." + #endif + + LCD_CLASS lcd(YHCB2004_SS_PIN, 20, 4, YHCB2004_SCK_PIN, YHCB2004_MOSI_PIN, YHCB2004_MISO_PIN); // SS, cols, rows, SCK, MOSI, MISO #else @@ -114,7 +130,7 @@ static void createChar_P(const char c, const byte * const ptr) { byte temp[8]; - LOOP_L_N(i, 8) + for (uint8_t i = 0; i < 8; ++i) temp[i] = pgm_read_byte(&ptr[i]); lcd.createChar(c, temp); } @@ -289,7 +305,7 @@ void MarlinUI::set_custom_characters(const HD44780CharSet screen_charset/*=CHARS #endif // LCD_PROGRESS_BAR - #if BOTH(HAS_MEDIA, HAS_MARLINUI_MENU) + #if ALL(HAS_MEDIA, HAS_MARLINUI_MENU) // CHARSET_MENU const static PROGMEM byte refresh[8] = { @@ -339,7 +355,7 @@ void MarlinUI::set_custom_characters(const HD44780CharSet screen_charset/*=CHARS #endif { createChar_P(LCD_STR_UPLEVEL[0], uplevel); - #if BOTH(HAS_MEDIA, HAS_MARLINUI_MENU) + #if ALL(HAS_MEDIA, HAS_MARLINUI_MENU) // SD Card sub-menu special characters createChar_P(LCD_STR_REFRESH[0], refresh); createChar_P(LCD_STR_FOLDER[0], folder); @@ -424,7 +440,7 @@ void MarlinUI::clear_lcd() { lcd.clear(); } else { PGM_P p = FTOP(ftxt); int dly = time / _MAX(slen, 1); - LOOP_LE_N(i, slen) { + for (uint8_t i = 0; i <= slen; ++i) { // Print the text at the correct place lcd_put_u8str_max_P(col, line, p, len); @@ -697,7 +713,7 @@ void MarlinUI::draw_status_message(const bool blink) { if (progress > 2) return draw_progress_bar(progress); } - #elif BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) + #elif ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) // Alternate Status message and Filament display if (ELAPSED(millis(), next_filament_display)) { @@ -771,9 +787,10 @@ void MarlinUI::draw_status_message(const bool blink) { #define TPOFFSET (LCD_WIDTH - 1) static uint8_t timepos = TPOFFSET - 6; static char buffer[8]; - static lcd_uint_t pc, pr; #if ENABLED(SHOW_PROGRESS_PERCENT) + static lcd_uint_t pc = 0, pr = 2; + inline void setPercentPos(const lcd_uint_t c, const lcd_uint_t r) { pc = c; pr = r; } void MarlinUI::drawPercent() { const uint8_t progress = ui.get_progress_percent(); if (progress) { @@ -784,6 +801,7 @@ void MarlinUI::draw_status_message(const bool blink) { } } #endif + #if ENABLED(SHOW_REMAINING_TIME) void MarlinUI::drawRemain() { if (printJobOngoing()) { @@ -795,6 +813,7 @@ void MarlinUI::draw_status_message(const bool blink) { } } #endif + #if ENABLED(SHOW_INTERACTION_TIME) void MarlinUI::drawInter() { const duration_t interactt = ui.interaction_time; @@ -806,6 +825,7 @@ void MarlinUI::draw_status_message(const bool blink) { } } #endif + #if ENABLED(SHOW_ELAPSED_TIME) void MarlinUI::drawElapsed() { if (printJobOngoing()) { @@ -931,7 +951,7 @@ void MarlinUI::draw_status_screen() { #if LCD_WIDTH < 20 #if HAS_PRINT_PROGRESS - pc = 0; pr = 2; + TERN_(SHOW_PROGRESS_PERCENT, setPercentPos(0, 2)); rotate_progress(); #endif @@ -957,25 +977,25 @@ void MarlinUI::draw_status_screen() { // Two-component mix / gradient instead of XY - char mixer_messages[12]; - const char *mix_label; + char mixer_messages[15]; + PGM_P mix_label; #if ENABLED(GRADIENT_MIX) if (mixer.gradient.enabled) { mixer.update_mix_from_gradient(); - mix_label = "Gr"; + mix_label = PSTR("Gr"); } else #endif { mixer.update_mix_from_vtool(); - mix_label = "Mx"; + mix_label = PSTR("Mx"); } - sprintf_P(mixer_messages, PSTR("%s %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); + sprintf_P(mixer_messages, PSTR(S_FMT " %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); lcd_put_u8str(mixer_messages); #else // !HAS_DUAL_MIXING - const bool show_e_total = TERN0(LCD_SHOW_E_TOTAL, printingIsActive()); + const bool show_e_total = TERN1(HAS_X_AXIS, TERN0(LCD_SHOW_E_TOTAL, printingIsActive())); if (show_e_total) { #if ENABLED(LCD_SHOW_E_TOTAL) @@ -986,10 +1006,14 @@ void MarlinUI::draw_status_screen() { #endif } else { - const xy_pos_t lpos = current_position.asLogical(); - _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink); - lcd_put_u8str(F(" ")); - _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink); + #if HAS_X_AXIS + const xy_pos_t lpos = current_position.asLogical(); + _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink); + #endif + #if HAS_Y_AXIS + TERN_(HAS_X_AXIS, lcd_put_u8str(F(" "))); + _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink); + #endif } #endif // !HAS_DUAL_MIXING @@ -1019,14 +1043,14 @@ void MarlinUI::draw_status_screen() { #if LCD_WIDTH >= 20 #if HAS_PRINT_PROGRESS - pc = 6; pr = 2; + TERN_(SHOW_PROGRESS_PERCENT, setPercentPos(6, 2)); rotate_progress(); #else char c; uint16_t per; #if HAS_FAN0 if (true - #if BOTH(HAS_EXTRUDERS, ADAPTIVE_FAN_SLOWING) + #if ALL(HAS_EXTRUDERS, ADAPTIVE_FAN_SLOWING) && (blink || thermalManager.fan_speed_scaler[0] < 128) #endif ) { @@ -1065,8 +1089,10 @@ void MarlinUI::draw_status_screen() { // // Z Coordinate // - lcd_moveto(LCD_WIDTH - 9, 0); - _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); + #if HAS_Z_AXIS + lcd_moveto(LCD_WIDTH - 9, 0); + _draw_axis_value(Z_AXIS, ftostr52sp(LOGICAL_Z_POSITION(current_position.z)), blink); + #endif #if HAS_LEVELING && (HAS_MULTI_HOTEND || !HAS_HEATED_BED) lcd_put_lchar(LCD_WIDTH - 1, 0, planner.leveling_active || blink ? '_' : ' '); @@ -1100,7 +1126,7 @@ void MarlinUI::draw_status_screen() { _draw_bed_status(blink); #elif HAS_PRINT_PROGRESS #define DREW_PRINT_PROGRESS 1 - pc = 0; pr = 2; + TERN_(SHOW_PROGRESS_PERCENT, setPercentPos(0, 2)); rotate_progress(); #endif @@ -1108,7 +1134,7 @@ void MarlinUI::draw_status_screen() { // All progress strings // #if HAS_PRINT_PROGRESS && !DREW_PRINT_PROGRESS - pc = LCD_WIDTH - 9; pr = 2; + TERN_(SHOW_PROGRESS_PERCENT, setPercentPos(LCD_WIDTH - 9, 2)); rotate_progress(); #endif #endif // LCD_INFO_SCREEN_STYLE 1 diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.h b/Marlin/src/lcd/HD44780/marlinui_HD44780.h index 62c0c76202..719514fb11 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.h +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.h @@ -103,5 +103,4 @@ #endif -#include "../fontutils.h" #include "../lcdprint.h" diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 6090b13732..ee7154ae41 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -52,12 +52,12 @@ #include "../../module/planner.h" #include "../../module/motion.h" -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) +#if DISABLED(LCD_PROGRESS_BAR) && ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) #include "../../feature/filwidth.h" #include "../../gcode/parser.h" #endif -#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) +#if ANY(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif @@ -141,7 +141,7 @@ static uint8_t PanelDetected = 0; #if ANY(__AVR__, TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) #define SPI_SEND_ONE(V) SPI.transfer(V); #define SPI_SEND_TWO(V) SPI.transfer16(V); -#elif EITHER(STM32F4xx, STM32F1xx) +#elif ANY(STM32F4xx, STM32F1xx) #define SPI_SEND_ONE(V) SPI.transfer(V, SPI_CONTINUE); #define SPI_SEND_TWO(V) SPI.transfer16(V, SPI_CONTINUE); #elif defined(ARDUINO_ARCH_ESP32) @@ -151,7 +151,7 @@ static uint8_t PanelDetected = 0; #if ANY(__AVR__, ARDUINO_ARCH_SAM, __SAMD51__, __MK20DX256__, __MK64FX512__) #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L); -#elif EITHER(STM32F4xx, STM32F1xx) +#elif ANY(STM32F4xx, STM32F1xx) #define SPI_SEND_SOME(V,L,Z) SPI.transfer(&V[Z], L, SPI_CONTINUE); #elif ANY(TARGET_LPC1768, __STM32F1__, ARDUINO_ARCH_ESP32) #define SPI_SEND_SOME(V,L,Z) do{ for (uint16_t i = 0; i < L; i++) SPI_SEND_ONE(V[(Z)+i]); }while(0) @@ -290,7 +290,7 @@ uint8_t MarlinUI::read_slow_buttons() { Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, 2, 0, 0, 1); #elif defined(STM32F1) Wire.requestFrom((uint8_t)LCD_I2C_ADDRESS, (uint8_t)2); - #elif EITHER(STM32F4xx, TARGET_LPC1768) + #elif ANY(STM32F4xx, TARGET_LPC1768) Wire.requestFrom(LCD_I2C_ADDRESS, 2); #endif encoderDiff += Wire.read(); @@ -672,7 +672,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const void MarlinUI::draw_status_message(const bool blink) { if (!PanelDetected) return; lcd_moveto(0, 3); - #if BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) + #if ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) // Alternate Status message and Filament display if (ELAPSED(millis(), next_filament_display)) { @@ -820,11 +820,17 @@ void MarlinUI::draw_status_screen() { // Line 1 - XYZ coordinates // - lcd_moveto(0, 0); - const xyz_pos_t lpos = current_position.asLogical(); - _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink); lcd.write(' '); - _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink); lcd.write(' '); - _draw_axis_value(Z_AXIS, ftostr52sp(lpos.z), blink); + #if NUM_AXES + lcd_moveto(0, 0); + const xyz_pos_t lpos = current_position.asLogical(); + _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink); + #if HAS_Y_AXIS + lcd.write(' '); _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink); + #endif + #if HAS_Z_AXIS + lcd.write(' '); _draw_axis_value(Z_AXIS, ftostr52sp(lpos.z), blink); + #endif + #endif #if HAS_LEVELING && !HAS_HEATED_BED lcd.write(planner.leveling_active || blink ? '_' : ' '); @@ -860,23 +866,23 @@ void MarlinUI::draw_status_screen() { // #if HOTENDS <= 1 || (HOTENDS <= 2 && !HAS_HEATED_BED) - #if DUAL_MIXING_EXTRUDER + #if HAS_DUAL_MIXING lcd_moveto(0, 4); // Two-component mix / gradient instead of XY - char mixer_messages[12]; - const char *mix_label; + char mixer_messages[15]; + PGM_P mix_label; #if ENABLED(GRADIENT_MIX) if (mixer.gradient.enabled) { mixer.update_mix_from_gradient(); - mix_label = "Gr"; + mix_label = PSTR("Gr"); } else #endif { mixer.update_mix_from_vtool(); - mix_label = "Mx"; + mix_label = PSTR("Mx"); } - sprintf_P(mixer_messages, PSTR("%s %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); + sprintf_P(mixer_messages, PSTR(S_FMT " %d;%d%% "), mix_label, int(mixer.mix[0]), int(mixer.mix[1])); lcd_put_u8str(mixer_messages); #endif #endif diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h index c399b907e4..3e447fa196 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.h @@ -57,7 +57,6 @@ class TFTGLCD { extern TFTGLCD lcd; -#include "../fontutils.h" #include "../lcdprint.h" // Use panel encoder - free old encoder pins diff --git a/Marlin/src/lcd/buttons.h b/Marlin/src/lcd/buttons.h index 58471239bb..601e8a70ae 100644 --- a/Marlin/src/lcd/buttons.h +++ b/Marlin/src/lcd/buttons.h @@ -38,7 +38,7 @@ #define HAS_SLOW_BUTTONS 1 #endif -#if EITHER(HAS_DIGITAL_BUTTONS, HAS_DWIN_E3V2) +#if ANY(HAS_DIGITAL_BUTTONS, HAS_DWIN_E3V2) // Wheel spin pins where BA is 00, 10, 11, 01 (1 bit always changes) #define BLEN_A 0 #define BLEN_B 1 @@ -149,7 +149,7 @@ #ifndef EN_C #define EN_C 0 #endif -#if BUTTON_EXISTS(BACK) || EITHER(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL) +#if BUTTON_EXISTS(BACK) || ANY(HAS_TOUCH_BUTTONS, IS_TFTGLCD_PANEL) #define BLEN_D 3 #define EN_D _BV(BLEN_D) #else diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 8d0ab4efbe..9eec9d1987 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -143,7 +143,7 @@ // Can also be overridden in Configuration_adv.h // If you can afford it, try the 3-frame fan animation! // Don't compile in the fan animation with no fan -#if !HAS_FAN0 || (HOTENDS == 5 || (HOTENDS == 4 && BED_OR_CHAMBER) || BOTH(STATUS_COMBINE_HEATERS, HAS_HEATED_CHAMBER)) +#if !HAS_FAN0 || (HOTENDS == 5 || (HOTENDS == 4 && BED_OR_CHAMBER) || ALL(STATUS_COMBINE_HEATERS, HAS_HEATED_CHAMBER)) #undef STATUS_FAN_FRAMES #elif !STATUS_FAN_FRAMES #define STATUS_FAN_FRAMES 2 @@ -253,7 +253,7 @@ ((STATUS_CHAMBER_WIDTH || STATUS_FAN_WIDTH || STATUS_BED_WIDTH) && STATUS_HOTEND_BITMAPS == 4) #define STATUS_HEATERS_X 5 #else - #if BOTH(STATUS_COMBINE_HEATERS, HAS_HEATED_BED) && HOTENDS <= 4 + #if ALL(STATUS_COMBINE_HEATERS, HAS_HEATED_BED) && HOTENDS <= 4 #define STATUS_HEATERS_X 5 #else #define STATUS_HEATERS_X 8 // Like the included bitmaps @@ -742,22 +742,22 @@ #if HAS_FAN0 && STATUS_FAN_WIDTH && HOTENDS <= 4 && defined(STATUS_FAN_FRAMES) #define DO_DRAW_FAN 1 #endif -#if BOTH(HAS_HOTEND, STATUS_HOTEND_ANIM) +#if ALL(HAS_HOTEND, STATUS_HOTEND_ANIM) #define ANIM_HOTEND 1 #endif -#if BOTH(DO_DRAW_BED, STATUS_BED_ANIM) +#if ALL(DO_DRAW_BED, STATUS_BED_ANIM) #define ANIM_BED 1 #endif -#if BOTH(DO_DRAW_CHAMBER, STATUS_CHAMBER_ANIM) +#if ALL(DO_DRAW_CHAMBER, STATUS_CHAMBER_ANIM) #define ANIM_CHAMBER 1 #endif -#if BOTH(DO_DRAW_CUTTER, STATUS_CUTTER_ANIM) +#if ALL(DO_DRAW_CUTTER, STATUS_CUTTER_ANIM) #define ANIM_CUTTER 1 #endif -#if BOTH(DO_DRAW_COOLER, STATUS_COOLER_ANIM) +#if ALL(DO_DRAW_COOLER, STATUS_COOLER_ANIM) #define ANIM_COOLER 1 #endif -#if BOTH(DO_DRAW_FLOWMETER, STATUS_FLOWMETER_ANIM) +#if ALL(DO_DRAW_FLOWMETER, STATUS_FLOWMETER_ANIM) #define ANIM_FLOWMETER 1 #endif #if ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp index 74a49b0950..ea0db357b6 100644 --- a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp +++ b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp @@ -16,7 +16,6 @@ #include "../marlinui.h" #include "../../MarlinCore.h" -#include "../fontutils.h" #include "u8g_fontutf8.h" #include "../lcdprint.h" diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 76fa7842a3..5b2db31fbb 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -47,7 +47,6 @@ #endif #include "../lcdprint.h" -#include "../fontutils.h" #include "../../libs/numtostr.h" #include "../marlinui.h" @@ -156,7 +155,7 @@ bool MarlinUI::detected() { return true; } #if DISABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) constexpr millis_t frame_time = CUSTOM_BOOTSCREEN_FRAME_TIME; #endif - LOOP_L_N(f, COUNT(custom_bootscreen_animation)) + for (uint8_t f = 0; f < COUNT(custom_bootscreen_animation); ++f) #endif { #if ENABLED(CUSTOM_BOOTSCREEN_ANIMATED_FRAME_TIME) @@ -229,7 +228,7 @@ bool MarlinUI::detected() { return true; } draw_bootscreen_bmp(start_bmp); #else constexpr millis_t frame_time = MARLIN_BOOTSCREEN_FRAME_TIME; - LOOP_L_N(f, COUNT(marlin_bootscreen_animation)) { + for (uint8_t f = 0; f < COUNT(marlin_bootscreen_animation); ++f) { draw_bootscreen_bmp((uint8_t*)pgm_read_ptr(&marlin_bootscreen_animation[f])); if (frame_time) safe_delay(frame_time); } @@ -646,7 +645,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop #endif // AUTO_BED_LEVELING_UBL - #if EITHER(BABYSTEP_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + #if ANY(BABYSTEP_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) // // Draw knob rotation => Z motion key for: diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index afdda5ac5b..414508b129 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -127,7 +127,7 @@ #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes #endif -#elif EITHER(FYSETC_242_OLED_12864, K3D_242_OLED_CONTROLLER) +#elif ANY(FYSETC_242_OLED_12864, K3D_242_OLED_CONTROLLER) // FYSETC OLED 2.42" 128 × 64 Full Graphics Controller // or K3D OLED 2.42" 128 × 64 Full Graphics Controller @@ -151,7 +151,7 @@ #define U8G_CLASS U8GLIB_SH1306_128X64 // 8 stripes #endif -#elif EITHER(MKS_12864OLED, ZONESTAR_12864OLED) +#elif ANY(MKS_12864OLED, ZONESTAR_12864OLED) // MKS 128x64 (SH1106) OLED I2C LCD // - or - diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index cb3515a694..12cee1fc80 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -55,7 +55,7 @@ #include "../../feature/spindle_laser.h" #endif -#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) +#if ANY(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif @@ -127,7 +127,7 @@ #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) #endif -#if EITHER(DO_DRAW_BED, DO_DRAW_HOTENDS) +#if ANY(DO_DRAW_BED, DO_DRAW_HOTENDS) #define STATUS_HEATERS_BOT (STATUS_HEATERS_Y + STATUS_HEATERS_HEIGHT - 1) #endif @@ -457,7 +457,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const } // Prepare strings for progress display -#if EITHER(HAS_EXTRA_PROGRESS, HAS_PRINT_PROGRESS) +#if ANY(HAS_EXTRA_PROGRESS, HAS_PRINT_PROGRESS) static MarlinUI::progress_t progress = 0; static char bufferc[13]; #endif @@ -510,20 +510,24 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const * Use the PAGE_CONTAINS macros to avoid pointless draw calls. */ void MarlinUI::draw_status_screen() { - constexpr int xystorage = TERN(INCH_MODE_SUPPORT, 8, 5); - static char xstring[TERN(LCD_SHOW_E_TOTAL, 12, xystorage)]; - #if HAS_Y_AXIS - static char ystring[xystorage]; - #endif - #if HAS_Z_AXIS - static char zstring[8]; + #if NUM_AXES + constexpr int xystorage = TERN(INCH_MODE_SUPPORT, 8, 5); + #if ANY(HAS_X_AXIS, LCD_SHOW_E_TOTAL) + static char xstring[TERN(LCD_SHOW_E_TOTAL, 12, xystorage)]; + #endif + #if HAS_Y_AXIS + static char ystring[xystorage]; + #endif + #if HAS_Z_AXIS + static char zstring[8]; + #endif #endif #if ENABLED(FILAMENT_LCD_DISPLAY) static char wstring[5], mstring[4]; #endif - const bool show_e_total = TERN0(LCD_SHOW_E_TOTAL, printingIsActive()); + const bool show_e_total = TERN1(HAS_X_AXIS, TERN0(LCD_SHOW_E_TOTAL, printingIsActive())); #if HAS_PRINT_PROGRESS static u8g_uint_t progress_bar_solid_width = 0; @@ -544,10 +548,9 @@ void MarlinUI::draw_status_screen() { draw_bits = new_bits; #endif - const xyz_pos_t lpos = current_position.asLogical(); - const bool is_inch = parser.using_inch_units(); - #if HAS_Z_AXIS - strcpy(zstring, is_inch ? ftostr42_52(LINEAR_UNIT(lpos.z)) : ftostr52sp(lpos.z)); + #if NUM_AXES + const xyz_pos_t lpos = current_position.asLogical(); + const bool is_inch = parser.using_inch_units(); #endif if (show_e_total) { @@ -557,10 +560,12 @@ void MarlinUI::draw_status_screen() { #endif } else { - strcpy(xstring, is_inch ? ftostr53_63(LINEAR_UNIT(lpos.x)) : ftostr4sign(lpos.x)); + TERN_(HAS_X_AXIS, strcpy(xstring, is_inch ? ftostr53_63(LINEAR_UNIT(lpos.x)) : ftostr4sign(lpos.x))); TERN_(HAS_Y_AXIS, strcpy(ystring, is_inch ? ftostr53_63(LINEAR_UNIT(lpos.y)) : ftostr4sign(lpos.y))); } + TERN_(HAS_Z_AXIS, strcpy(zstring, is_inch ? ftostr42_52(LINEAR_UNIT(lpos.z)) : ftostr52sp(lpos.z))); + #if ENABLED(FILAMENT_LCD_DISPLAY) strcpy(wstring, ftostr12ns(filwidth.measured_mm)); strcpy(mstring, i16tostr3rj(planner.volumetric_percent(parser.volumetric_enabled))); @@ -607,7 +612,7 @@ void MarlinUI::draw_status_screen() { #if DO_DRAW_BED && DISABLED(STATUS_COMBINE_HEATERS) #if ANIM_BED - #if BOTH(HAS_LEVELING, STATUS_ALT_BED_BITMAP) + #if ALL(HAS_LEVELING, STATUS_ALT_BED_BITMAP) #define BED_BITMAP(S) ((S) \ ? (planner.leveling_active ? status_bed_leveled_on_bmp : status_bed_on_bmp) \ : (planner.leveling_active ? status_bed_leveled_bmp : status_bed_bmp)) @@ -667,7 +672,7 @@ void MarlinUI::draw_status_screen() { if (PAGE_UNDER(6 + 1 + 12 + 1 + 6 + 1)) { // Extruders #if DO_DRAW_HOTENDS - LOOP_L_N(e, MAX_HOTEND_DRAW) _draw_hotend_status((heater_id_t)e, blink); + for (uint8_t e = 0; e < MAX_HOTEND_DRAW; ++e) _draw_hotend_status((heater_id_t)e, blink); #endif // Laser / Spindle @@ -778,7 +783,7 @@ void MarlinUI::draw_status_screen() { // XYZ Coordinates // - #if EITHER(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) + #if ANY(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) #define XYZ_FRAME_TOP 29 #define XYZ_FRAME_HEIGHT INFO_FONT_ASCENT + 3 #else @@ -839,15 +844,13 @@ void MarlinUI::draw_status_screen() { #endif } else { - _draw_axis_value(X_AXIS, xstring, blink); + TERN_(HAS_X_AXIS, _draw_axis_value(X_AXIS, xstring, blink)); TERN_(HAS_Y_AXIS, _draw_axis_value(Y_AXIS, ystring, blink)); } #endif - #if HAS_Z_AXIS - _draw_axis_value(Z_AXIS, zstring, blink); - #endif + TERN_(HAS_Z_AXIS, _draw_axis_value(Z_AXIS, zstring, blink)); #if NONE(XYZ_NO_FRAME, XYZ_HOLLOW_FRAME) u8g.setColorIndex(1); // black on white @@ -887,7 +890,7 @@ void MarlinUI::draw_status_screen() { if (PAGE_CONTAINS(STATUS_BASELINE - INFO_FONT_ASCENT, STATUS_BASELINE + INFO_FONT_DESCENT)) { lcd_moveto(0, STATUS_BASELINE); - #if BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) + #if ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) // Alternate Status message and Filament display if (ELAPSED(millis(), next_filament_display)) { lcd_put_u8str(F(LCD_STR_FILAM_DIA)); diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index a4ace1ce8a..8e70941628 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -73,7 +73,6 @@ #if ENABLED(LIGHTWEIGHT_UI) #include "../marlinui.h" -#include "../fontutils.h" #include "../lcdprint.h" #include "../../libs/duration_t.h" #include "../../module/motion.h" @@ -238,7 +237,7 @@ void ST7920_Lite_Status_Screen::clear_ddram() { /* This fills the entire graphics buffer with zeros */ void ST7920_Lite_Status_Screen::clear_gdram() { - LOOP_L_N(y, BUFFER_HEIGHT) { + for (uint8_t y = 0; y < BUFFER_HEIGHT; ++y) { set_gdram_address(0, y); begin_data(); for (uint8_t i = (BUFFER_WIDTH) / 16; i--;) write_word(0); @@ -436,7 +435,7 @@ void ST7920_Lite_Status_Screen::draw_degree_symbol(uint8_t x, uint8_t y, const b const uint8_t x_word = x >> 1, y_top = degree_symbol_y_top, y_bot = y_top + COUNT(degree_symbol); - LOOP_S_L_N(i, y_top, y_bot) { + for (uint8_t i = y_top; i < y_bot; ++i) { uint8_t byte = pgm_read_byte(p_bytes++); set_gdram_address(x_word, i + y * 16); begin_data(); @@ -755,10 +754,10 @@ bool ST7920_Lite_Status_Screen::indicators_changed() { // This drawing is a mess and only produce readable result around 25% steps // i.e. 74-76% look fine [|||||||||||||||||||||||| ], but 73% look like this: [|||||||||||||||| | ] // meaning partially filled bytes produce only single vertical line, and i bet they're not supposed to! - LOOP_S_LE_N(y, top, bottom) { + for (uint8_t y = top; y <= bottom; ++y) { set_gdram_address(left, y); begin_data(); - LOOP_L_N(x, width) { + for (uint8_t x = 0; x < width; ++x) { uint16_t gfx_word = 0x0000; if ((x + 1) * char_pcnt <= value) gfx_word = 0xFFFF; // Draw completely filled bytes diff --git a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp index fde6e41792..ae1531e9f8 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp @@ -87,11 +87,11 @@ void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev) { u8g_SetAddress(u8g, dev, 0); // cmd mode u8g_WriteByte(u8g, dev, 0x08); //display off, cursor+blink off u8g_WriteByte(u8g, dev, 0x3E); //extended mode + GDRAM active - LOOP_L_N(y, (LCD_PIXEL_HEIGHT) / 2) { //clear GDRAM + for (uint8_t y = 0; y < (LCD_PIXEL_HEIGHT) / 2; ++y) { //clear GDRAM u8g_WriteByte(u8g, dev, 0x80 | y); //set y u8g_WriteByte(u8g, dev, 0x80); //set x = 0 u8g_SetAddress(u8g, dev, 1); /* data mode */ - LOOP_L_N(i, 2 * (LCD_PIXEL_WIDTH) / 8) //2x width clears both segments + for (uint8_t i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; ++i) //2x width clears both segments u8g_WriteByte(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); /* cmd mode */ } 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 efc010ca89..d16693cee4 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 @@ -298,14 +298,14 @@ static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, v = color; else v = TFT_MARLINBG_COLOR; - LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = v; + for (uint8_t n = 0; n < GRAPHICAL_TFT_UPSCALE; ++n) buffer[k++] = v; } #if HAS_LCD_IO - LOOP_S_L_N(n, 1, GRAPHICAL_TFT_UPSCALE) + for (uint8_t n = 1; n < GRAPHICAL_TFT_UPSCALE; ++n) for (uint16_t l = 0; l < UPSCALE0(length); l++) buffer[l + n * UPSCALE0(length)] = buffer[l]; - tftio.WriteSequence(buffer, length * sq(GRAPHICAL_TFT_UPSCALE)); + tftio.writeSequence(buffer, length * sq(GRAPHICAL_TFT_UPSCALE)); #else for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) u8g_WriteSequence(u8g, dev, k << 1, (uint8_t*)buffer); @@ -351,7 +351,7 @@ static void u8g_upscale_clear_lcd(u8g_t *u8g, u8g_dev_t *dev, uint16_t *buffer) setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); #if HAS_LCD_IO UNUSED(buffer); - tftio.WriteMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT)); + tftio.writeMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT)); #else memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2); for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++) @@ -381,8 +381,8 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u } if (msgInitCount) return -1; - tftio.Init(); - tftio.InitTFT(); + tftio.init(); + tftio.initTFT(); TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset()); u8g_upscale_clear_lcd(u8g, dev, buffer); return 0; @@ -412,24 +412,24 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u if (TERN0(HAS_TOUCH_BUTTONS_SLEEP, touchBt.isSleeping())) break; if (++page > (HEIGHT / PAGE_HEIGHT)) return 1; - LOOP_L_N(y, PAGE_HEIGHT) { + for (uint8_t y = 0; y < PAGE_HEIGHT; ++y) { uint32_t k = 0; TERN_(HAS_LCD_IO, buffer = (y & 1) ? bufferB : bufferA); for (uint16_t i = 0; i < (uint32_t)pb->width; i++) { const uint8_t b = *(((uint8_t *)pb->buf) + i); const uint16_t c = TEST(b, y) ? TFT_MARLINUI_COLOR : TFT_MARLINBG_COLOR; - LOOP_L_N(n, GRAPHICAL_TFT_UPSCALE) buffer[k++] = c; + for (uint8_t n = 0; n < GRAPHICAL_TFT_UPSCALE; ++n) buffer[k++] = c; } #if HAS_LCD_IO - LOOP_S_L_N(n, 1, GRAPHICAL_TFT_UPSCALE) + for (uint8_t n = 1; n < GRAPHICAL_TFT_UPSCALE; ++n) for (uint16_t l = 0; l < UPSCALE0(WIDTH); l++) buffer[l + n * UPSCALE0(WIDTH)] = buffer[l]; - tftio.WriteSequence(buffer, COUNT(bufferA)); + tftio.writeSequence(buffer, COUNT(bufferA)); #else uint8_t *bufptr = (uint8_t*) buffer; for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) { - LOOP_S_L_N(n, 0, GRAPHICAL_TFT_UPSCALE * 2) { + for (uint8_t n = 0; n < GRAPHICAL_TFT_UPSCALE * 2; ++n) { u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH * n]); } } @@ -469,19 +469,19 @@ uint8_t u8g_com_hal_tft_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_p break; case U8G_COM_MSG_WRITE_BYTE: - tftio.DataTransferBegin(DATASIZE_8BIT); + tftio.dataTransferBegin(DATASIZE_8BIT); if (isCommand) - tftio.WriteReg(arg_val); + tftio.writeReg(arg_val); else - tftio.WriteData((uint16_t)arg_val); - tftio.DataTransferEnd(); + tftio.writeData((uint16_t)arg_val); + tftio.dataTransferEnd(); break; case U8G_COM_MSG_WRITE_SEQ: - tftio.DataTransferBegin(DATASIZE_16BIT); + tftio.dataTransferBegin(DATASIZE_16BIT); for (uint8_t i = 0; i < arg_val; i += 2) - tftio.WriteData(*(uint16_t *)(((uintptr_t)arg_ptr) + i)); - tftio.DataTransferEnd(); + tftio.writeData(*(uint16_t *)(((uintptr_t)arg_ptr) + i)); + tftio.dataTransferEnd(); break; } @@ -494,9 +494,9 @@ U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, static void drawCross(uint16_t x, uint16_t y, uint16_t color) { tftio.set_window(x - 15, y, x + 15, y); - tftio.WriteMultiple(color, 31); + tftio.writeMultiple(color, 31); tftio.set_window(x, y - 15, x, y + 15); - tftio.WriteMultiple(color, 31); + tftio.writeMultiple(color, 31); } void MarlinUI::touch_calibration_screen() { @@ -508,7 +508,7 @@ U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, defer_status_screen(true); stage = touch_calibration.calibration_start(); tftio.set_window(0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1); - tftio.WriteMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); + tftio.writeMultiple(TFT_MARLINBG_COLOR, uint32_t(TFT_WIDTH) * (TFT_HEIGHT)); } else { // clear last cross @@ -556,4 +556,4 @@ U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, #endif // TOUCH_SCREEN_CALIBRATION -#endif // HAS_MARLINUI_U8GLIB && (FSMC_CS_PIN || HAS_SPI_GRAPHICAL_TFT) +#endif // HAS_MARLINUI_U8GLIB && (FSMC_CS_PIN || HAS_SPI_GRAPHICAL_TFT || HAS_LTDC_GRAPHICAL_TFT) diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp index e9d1535096..79fabfd805 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp @@ -12,7 +12,7 @@ #if HAS_MARLINUI_U8GLIB #include -#include "../fontutils.h" +#include "../utf8.h" #include "u8g_fontutf8.h" typedef void font_t; diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.h b/Marlin/src/lcd/dogm/u8g_fontutf8.h index 660eb28ffe..281894509d 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.h +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.h @@ -9,7 +9,7 @@ #pragma once #include -#include "../fontutils.h" +#include "../utf8.h" // the macro to indicate a UTF-8 string // You should to save the C/C++ source in UTF-8 encoding! diff --git a/Marlin/src/lcd/e3v2/common/dwin_api.cpp b/Marlin/src/lcd/e3v2/common/dwin_api.cpp index f3abaf25c9..af28cfe62b 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_api.cpp +++ b/Marlin/src/lcd/e3v2/common/dwin_api.cpp @@ -31,21 +31,21 @@ #include // for memset -uint8_t DWIN_SendBuf[11 + DWIN_WIDTH / 6 * 2] = { 0xAA }; -uint8_t DWIN_BufTail[4] = { 0xCC, 0x33, 0xC3, 0x3C }; +uint8_t dwinSendBuf[11 + DWIN_WIDTH / 6 * 2] = { 0xAA }; +uint8_t dwinBufTail[4] = { 0xCC, 0x33, 0xC3, 0x3C }; uint8_t databuf[26] = { 0 }; // Send the data in the buffer plus the packet tail -void DWIN_Send(size_t &i) { +void dwinSend(size_t &i) { ++i; - LOOP_L_N(n, i) { LCD_SERIAL.write(DWIN_SendBuf[n]); delayMicroseconds(1); } - LOOP_L_N(n, 4) { LCD_SERIAL.write(DWIN_BufTail[n]); delayMicroseconds(1); } + for (uint8_t n = 0; n < i; ++n) { LCD_SERIAL.write(dwinSendBuf[n]); delayMicroseconds(1); } + for (uint8_t n = 0; n < 4; ++n) { LCD_SERIAL.write(dwinBufTail[n]); delayMicroseconds(1); } } /*-------------------------------------- System variable function --------------------------------------*/ // Handshake (1: Success, 0: Fail) -bool DWIN_Handshake() { +bool dwinHandshake() { static int recnum = 0; #ifndef LCD_BAUDRATE #define LCD_BAUDRATE 115200 @@ -55,8 +55,8 @@ bool DWIN_Handshake() { while (!LCD_SERIAL.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } size_t i = 0; - DWIN_Byte(i, 0x00); - DWIN_Send(i); + dwinByte(i, 0x00); + dwinSend(i); while (LCD_SERIAL.available() > 0 && recnum < (signed)sizeof(databuf)) { databuf[recnum] = LCD_SERIAL.read(); @@ -82,11 +82,11 @@ bool DWIN_Handshake() { #if HAS_LCD_BRIGHTNESS // Set LCD backlight (from DWIN Enhanced) // brightness: 0x00-0xFF - void DWIN_LCD_Brightness(const uint8_t brightness) { + void dwinLCDBrightness(const uint8_t brightness) { size_t i = 0; - DWIN_Byte(i, 0x30); - DWIN_Byte(i, brightness); - DWIN_Send(i); + dwinByte(i, 0x30); + dwinByte(i, brightness); + dwinSend(i); } #endif @@ -126,31 +126,31 @@ uint8_t fontHeight(uint8_t cfont) { // Set screen display direction // dir: 0=0°, 1=90°, 2=180°, 3=270° -void DWIN_Frame_SetDir(uint8_t dir) { +void dwinFrameSetDir(uint8_t dir) { size_t i = 0; - DWIN_Byte(i, 0x34); - DWIN_Byte(i, 0x5A); - DWIN_Byte(i, 0xA5); - DWIN_Byte(i, dir); - DWIN_Send(i); + dwinByte(i, 0x34); + dwinByte(i, 0x5A); + dwinByte(i, 0xA5); + dwinByte(i, dir); + dwinSend(i); } // Update display -void DWIN_UpdateLCD() { +void dwinUpdateLCD() { size_t i = 0; - DWIN_Byte(i, 0x3D); - DWIN_Send(i); + dwinByte(i, 0x3D); + dwinSend(i); } /*---------------------------------------- Drawing functions ----------------------------------------*/ // Clear screen // color: Clear screen color -void DWIN_Frame_Clear(const uint16_t color) { +void dwinFrameClear(const uint16_t color) { size_t i = 0; - DWIN_Byte(i, 0x01); - DWIN_Word(i, color); - DWIN_Send(i); + dwinByte(i, 0x01); + dwinWord(i, color); + dwinSend(i); } // Draw a point @@ -158,30 +158,30 @@ void DWIN_Frame_Clear(const uint16_t color) { // width: point width 0x01-0x0F // height: point height 0x01-0x0F // x,y: upper left point -void DWIN_Draw_Point(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y) { +void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y) { size_t i = 0; - DWIN_Byte(i, 0x02); - DWIN_Word(i, color); - DWIN_Byte(i, width); - DWIN_Byte(i, height); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Send(i); + dwinByte(i, 0x02); + dwinWord(i, color); + dwinByte(i, width); + dwinByte(i, height); + dwinWord(i, x); + dwinWord(i, y); + dwinSend(i); } // Draw a line // color: Line segment color // xStart/yStart: Start point // xEnd/yEnd: End point -void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { +void dwinDrawLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; - DWIN_Byte(i, 0x03); - DWIN_Word(i, color); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Send(i); + dwinByte(i, 0x03); + dwinWord(i, color); + dwinWord(i, xStart); + dwinWord(i, yStart); + dwinWord(i, xEnd); + dwinWord(i, yEnd); + dwinSend(i); } // Draw a rectangle @@ -189,16 +189,16 @@ void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t x // color: Rectangle color // xStart/yStart: upper left point // xEnd/yEnd: lower right point -void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { +void dwinDrawRectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; - DWIN_Byte(i, 0x05); - DWIN_Byte(i, mode); - DWIN_Word(i, color); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Send(i); + dwinByte(i, 0x05); + dwinByte(i, mode); + dwinWord(i, color); + dwinWord(i, xStart); + dwinWord(i, yStart); + dwinWord(i, xEnd); + dwinWord(i, yEnd); + dwinSend(i); } // Move a screen area @@ -208,18 +208,18 @@ void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t // color: Fill color // xStart/yStart: upper left point // xEnd/yEnd: bottom right point -void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, +void dwinFrameAreaMove(uint8_t mode, uint8_t dir, uint16_t dis, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd) { size_t i = 0; - DWIN_Byte(i, 0x09); - DWIN_Byte(i, (mode << 7) | dir); - DWIN_Word(i, dis); - DWIN_Word(i, color); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Send(i); + dwinByte(i, 0x09); + dwinByte(i, (mode << 7) | dir); + dwinWord(i, dis); + dwinWord(i, color); + dwinWord(i, xStart); + dwinWord(i, yStart); + dwinWord(i, xEnd); + dwinWord(i, yEnd); + dwinSend(i); } /*---------------------------------------- Text related functions ----------------------------------------*/ @@ -233,24 +233,24 @@ void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, // x/y: Upper-left coordinate of the string // *string: The string // rlimit: To limit the drawn string length -void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const char * const string, uint16_t rlimit/*=0xFFFF*/) { +void dwinDrawString(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const char * const string, uint16_t rlimit/*=0xFFFF*/) { #if NONE(DWIN_LCD_PROUI, DWIN_CREALITY_LCD_JYERSUI, IS_DWIN_MARLINUI) - DWIN_Draw_Rectangle(1, bColor, x, y, x + (fontWidth(size) * strlen_P(string)), y + fontHeight(size)); + dwinDrawRectangle(1, bColor, x, y, x + (fontWidth(size) * strlen_P(string)), y + fontHeight(size)); #endif constexpr uint8_t widthAdjust = 0; size_t i = 0; - DWIN_Byte(i, 0x11); + dwinByte(i, 0x11); // Bit 7: widthAdjust // Bit 6: bShow // Bit 5-4: Unused (0) // Bit 3-0: size - DWIN_Byte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); - DWIN_Word(i, color); - DWIN_Word(i, bColor); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Text(i, string, rlimit); - DWIN_Send(i); + dwinByte(i, (widthAdjust * 0x80) | (bShow * 0x40) | size); + dwinWord(i, color); + dwinWord(i, bColor); + dwinWord(i, x); + dwinWord(i, y); + dwinText(i, string, rlimit); + dwinSend(i); } // Draw a positive integer @@ -263,28 +263,28 @@ void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, // iNum: Number of digits // x/y: Upper-left coordinate // value: Integer value -void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, +void dwinDrawIntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint32_t value) { size_t i = 0; #if DISABLED(DWIN_CREALITY_LCD_JYERSUI) - DWIN_Draw_Rectangle(1, bColor, x, y, x + fontWidth(size) * iNum + 1, y + fontHeight(size)); + dwinDrawRectangle(1, bColor, x, y, x + fontWidth(size) * iNum + 1, y + fontHeight(size)); #endif - DWIN_Byte(i, 0x14); + dwinByte(i, 0x14); // Bit 7: bshow // Bit 6: 1 = signed; 0 = unsigned number; // Bit 5: zeroFill // Bit 4: zeroMode // Bit 3-0: size - DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); - DWIN_Word(i, color); - DWIN_Word(i, bColor); - DWIN_Byte(i, iNum); - DWIN_Byte(i, 0); // fNum - DWIN_Word(i, x); - DWIN_Word(i, y); + dwinByte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); + dwinWord(i, color); + dwinWord(i, bColor); + dwinByte(i, iNum); + dwinByte(i, 0); // fNum + dwinWord(i, x); + dwinWord(i, y); #if 0 for (char count = 0; count < 8; count++) { - DWIN_Byte(i, value); + dwinByte(i, value); value >>= 8; if (!(value & 0xFF)) break; } @@ -293,12 +293,12 @@ void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t const size_t p = i + 1; for (char count = 8; count--;) { // 7..0 ++i; - DWIN_SendBuf[p + count] = value; + dwinSendBuf[p + count] = value; value >>= 8; } #endif - DWIN_Send(i); + dwinSend(i); } // Draw a floating point number @@ -312,48 +312,48 @@ void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t // fNum: Number of decimal digits // x/y: Upper-left point // value: Float value -void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, +void dwinDrawFloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, int32_t value) { //uint8_t *fvalue = (uint8_t*)&value; size_t i = 0; #if DISABLED(DWIN_CREALITY_LCD_JYERSUI) - DWIN_Draw_Rectangle(1, bColor, x, y, x + fontWidth(size) * (iNum+fNum+1), y + fontHeight(size)); + dwinDrawRectangle(1, bColor, x, y, x + fontWidth(size) * (iNum+fNum+1), y + fontHeight(size)); #endif - DWIN_Byte(i, 0x14); - DWIN_Byte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); - DWIN_Word(i, color); - DWIN_Word(i, bColor); - DWIN_Byte(i, iNum); - DWIN_Byte(i, fNum); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Long(i, value); + dwinByte(i, 0x14); + dwinByte(i, (bShow * 0x80) | (zeroFill * 0x20) | (zeroMode * 0x10) | size); + dwinWord(i, color); + dwinWord(i, bColor); + dwinByte(i, iNum); + dwinByte(i, fNum); + dwinWord(i, x); + dwinWord(i, y); + dwinLong(i, value); /* - DWIN_Byte(i, fvalue[3]); - DWIN_Byte(i, fvalue[2]); - DWIN_Byte(i, fvalue[1]); - DWIN_Byte(i, fvalue[0]); + dwinByte(i, fvalue[3]); + dwinByte(i, fvalue[2]); + dwinByte(i, fvalue[1]); + dwinByte(i, fvalue[0]); */ - DWIN_Send(i); + dwinSend(i); } // Draw a floating point number // value: positive unscaled float value -void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, +void dwinDrawFloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, float value) { const int32_t val = round(value * POW(10, fNum)); - DWIN_Draw_FloatValue(bShow, zeroFill, zeroMode, size, color, bColor, iNum, fNum, x, y, val); + dwinDrawFloatValue(bShow, zeroFill, zeroMode, size, color, bColor, iNum, fNum, x, y, val); } /*---------------------------------------- Picture related functions ----------------------------------------*/ // Draw JPG and cached in #0 virtual display area // id: Picture ID -void DWIN_JPG_ShowAndCache(const uint8_t id) { +void dwinJPGShowAndCache(const uint8_t id) { size_t i = 0; - DWIN_Word(i, 0x2200); - DWIN_Byte(i, id); - DWIN_Send(i); // AA 23 00 00 00 00 08 00 01 02 03 CC 33 C3 3C + dwinWord(i, 0x2200); + dwinByte(i, id); + dwinSend(i); // AA 23 00 00 00 00 08 00 01 02 03 CC 33 C3 3C } // Draw an Icon @@ -363,16 +363,16 @@ void DWIN_JPG_ShowAndCache(const uint8_t id) { // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWIN_ICON_Show(bool IBD, bool BIR, bool BFI, uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { +void dwinIconShow(bool IBD, bool BIR, bool BFI, uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { NOMORE(x, DWIN_WIDTH - 1); NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl size_t i = 0; - DWIN_Byte(i, 0x23); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Byte(i, (IBD << 7) | (BIR << 6) | (BFI << 5) | libID); - DWIN_Byte(i, picID); - DWIN_Send(i); + dwinByte(i, 0x23); + dwinWord(i, x); + dwinWord(i, y); + dwinByte(i, (IBD << 7) | (BIR << 6) | (BFI << 5) | libID); + dwinByte(i, picID); + dwinSend(i); } // Draw an Icon from SRAM @@ -381,27 +381,27 @@ void DWIN_ICON_Show(bool IBD, bool BIR, bool BFI, uint8_t libID, uint8_t picID, // BFI: Background filtering strength: 0=normal, 1=enhanced, (only valid when the icon background display=0) // x/y: Upper-left point // addr: SRAM address -void DWIN_ICON_Show(bool IBD, bool BIR, bool BFI, uint16_t x, uint16_t y, uint16_t addr) { +void dwinIconShow(bool IBD, bool BIR, bool BFI, uint16_t x, uint16_t y, uint16_t addr) { NOMORE(x, DWIN_WIDTH - 1); NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl size_t i = 0; - DWIN_Byte(i, 0x24); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Byte(i, (IBD << 7) | (BIR << 6) | (BFI << 5) | 0x00); - DWIN_Word(i, addr); - DWIN_Send(i); + dwinByte(i, 0x24); + dwinWord(i, x); + dwinWord(i, y); + dwinByte(i, (IBD << 7) | (BIR << 6) | (BFI << 5) | 0x00); + dwinWord(i, addr); + dwinSend(i); } // Unzip the JPG picture to a virtual display area // n: Cache index // id: Picture ID -void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { +void dwinJPGCacheToN(uint8_t n, uint8_t id) { size_t i = 0; - DWIN_Byte(i, 0x25); - DWIN_Byte(i, n); - DWIN_Byte(i, id); - DWIN_Send(i); + dwinByte(i, 0x25); + dwinByte(i, n); + dwinByte(i, id); + dwinSend(i); } // Animate a series of icons @@ -412,32 +412,32 @@ void DWIN_JPG_CacheToN(uint8_t n, uint8_t id) { // picIDe: Icon ending ID // x/y: Upper-left point // interval: Display time interval, unit 10mS -void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval) { +void dwinIconAnimation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval) { NOMORE(x, DWIN_WIDTH - 1); NOMORE(y, DWIN_HEIGHT - 1); // -- ozy -- srl size_t i = 0; - DWIN_Byte(i, 0x28); - DWIN_Word(i, x); - DWIN_Word(i, y); + dwinByte(i, 0x28); + dwinWord(i, x); + dwinWord(i, y); // Bit 7: animation on or off // Bit 6: start from begin or end // Bit 5-4: unused (0) // Bit 3-0: animID - DWIN_Byte(i, (animate * 0x80) | 0x40 | animID); - DWIN_Byte(i, libID); - DWIN_Byte(i, picIDs); - DWIN_Byte(i, picIDe); - DWIN_Byte(i, interval); - DWIN_Send(i); + dwinByte(i, (animate * 0x80) | 0x40 | animID); + dwinByte(i, libID); + dwinByte(i, picIDs); + dwinByte(i, picIDe); + dwinByte(i, interval); + dwinSend(i); } // Animation Control // state: 16 bits, each bit is the state of an animation id -void DWIN_ICON_AnimationControl(uint16_t state) { +void dwinIconAnimationControl(uint16_t state) { size_t i = 0; - DWIN_Byte(i, 0x29); - DWIN_Word(i, state); - DWIN_Send(i); + dwinByte(i, 0x29); + dwinWord(i, state); + dwinSend(i); } /*---------------------------------------- Memory functions ----------------------------------------*/ diff --git a/Marlin/src/lcd/e3v2/common/dwin_api.h b/Marlin/src/lcd/e3v2/common/dwin_api.h index dc97ef2723..f2392af55c 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_api.h +++ b/Marlin/src/lcd/e3v2/common/dwin_api.h @@ -39,101 +39,101 @@ #define DWIN_SCROLL_UP 2 #define DWIN_SCROLL_DOWN 3 -// Make sure DWIN_SendBuf is large enough to hold the largest string plus draw command and tail. +// Make sure dwinSendBuf is large enough to hold the largest string plus draw command and tail. // Assume the narrowest (6 pixel) font and 2-byte gb2312-encoded characters. -extern uint8_t DWIN_SendBuf[11 + DWIN_WIDTH / 6 * 2]; -extern uint8_t DWIN_BufTail[4]; +extern uint8_t dwinSendBuf[11 + DWIN_WIDTH / 6 * 2]; +extern uint8_t dwinBufTail[4]; extern uint8_t databuf[26]; -inline void DWIN_Byte(size_t &i, const uint16_t bval) { - DWIN_SendBuf[++i] = bval; +inline void dwinByte(size_t &i, const uint16_t bval) { + dwinSendBuf[++i] = bval; } -inline void DWIN_Word(size_t &i, const uint16_t wval) { - DWIN_SendBuf[++i] = wval >> 8; - DWIN_SendBuf[++i] = wval & 0xFF; +inline void dwinWord(size_t &i, const uint16_t wval) { + dwinSendBuf[++i] = wval >> 8; + dwinSendBuf[++i] = wval & 0xFF; } -inline void DWIN_Long(size_t &i, const uint32_t lval) { - DWIN_SendBuf[++i] = (lval >> 24) & 0xFF; - DWIN_SendBuf[++i] = (lval >> 16) & 0xFF; - DWIN_SendBuf[++i] = (lval >> 8) & 0xFF; - DWIN_SendBuf[++i] = lval & 0xFF; +inline void dwinLong(size_t &i, const uint32_t lval) { + dwinSendBuf[++i] = (lval >> 24) & 0xFF; + dwinSendBuf[++i] = (lval >> 16) & 0xFF; + dwinSendBuf[++i] = (lval >> 8) & 0xFF; + dwinSendBuf[++i] = lval & 0xFF; } // Send the data in the buffer plus the packet tail -void DWIN_Send(size_t &i); +void dwinSend(size_t &i); -inline void DWIN_Text(size_t &i, const char * const string, uint16_t rlimit=0xFFFF) { +inline void dwinText(size_t &i, const char * const string, uint16_t rlimit=0xFFFF) { if (!string) return; - const size_t len = _MIN(sizeof(DWIN_SendBuf) - i, _MIN(strlen(string), rlimit)); + const size_t len = _MIN(sizeof(dwinSendBuf) - i, _MIN(strlen(string), rlimit)); if (len == 0) return; - memcpy(&DWIN_SendBuf[i+1], string, len); + memcpy(&dwinSendBuf[i+1], string, len); i += len; } -inline void DWIN_Text(size_t &i, FSTR_P string, uint16_t rlimit=0xFFFF) { +inline void dwinText(size_t &i, FSTR_P string, uint16_t rlimit=0xFFFF) { if (!string) return; - const size_t len = _MIN(sizeof(DWIN_SendBuf) - i, _MIN(rlimit, strlen_P(FTOP(string)))); + const size_t len = _MIN(sizeof(dwinSendBuf) - i, _MIN(rlimit, strlen_P(FTOP(string)))); if (len == 0) return; - memcpy_P(&DWIN_SendBuf[i+1], string, len); + memcpy_P(&dwinSendBuf[i+1], string, len); i += len; } /*-------------------------------------- System variable function --------------------------------------*/ // Handshake (1: Success, 0: Fail) -bool DWIN_Handshake(); +bool dwinHandshake(); // DWIN startup -void DWIN_Startup(); +void dwinStartup(); #if HAS_LCD_BRIGHTNESS // Set the backlight brightness // brightness: (0x00-0xFF) - void DWIN_LCD_Brightness(const uint8_t brightness); + void dwinLCDBrightness(const uint8_t brightness); #endif // Set screen display direction // dir: 0=0°, 1=90°, 2=180°, 3=270° -void DWIN_Frame_SetDir(uint8_t dir); +void dwinFrameSetDir(uint8_t dir); // Update display -void DWIN_UpdateLCD(); +void dwinUpdateLCD(); /*---------------------------------------- Drawing functions ----------------------------------------*/ // Clear screen // color: Clear screen color -void DWIN_Frame_Clear(const uint16_t color); +void dwinFrameClear(const uint16_t color); // Draw a point // color: point color // width: point width 0x01-0x0F // height: point height 0x01-0x0F // x,y: upper left point -void DWIN_Draw_Point(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y); +void dwinDrawPoint(uint16_t color, uint8_t width, uint8_t height, uint16_t x, uint16_t y); // Draw a line // color: Line segment color // xStart/yStart: Start point // xEnd/yEnd: End point -void DWIN_Draw_Line(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); +void dwinDrawLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); // Draw a Horizontal line // color: Line segment color // xStart/yStart: Start point // xLength: Line Length -inline void DWIN_Draw_HLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xLength) { - DWIN_Draw_Line(color, xStart, yStart, xStart + xLength - 1, yStart); +inline void dwinDrawHLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xLength) { + dwinDrawLine(color, xStart, yStart, xStart + xLength - 1, yStart); } // Draw a Vertical line // color: Line segment color // xStart/yStart: Start point // yLength: Line Length -inline void DWIN_Draw_VLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t yLength) { - DWIN_Draw_Line(color, xStart, yStart, xStart, yStart + yLength - 1); +inline void dwinDrawVLine(uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t yLength) { + dwinDrawLine(color, xStart, yStart, xStart, yStart + yLength - 1); } // Draw a rectangle @@ -141,15 +141,15 @@ inline void DWIN_Draw_VLine(uint16_t color, uint16_t xStart, uint16_t yStart, ui // color: Rectangle color // xStart/yStart: upper left point // xEnd/yEnd: lower right point -void DWIN_Draw_Rectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); +void dwinDrawRectangle(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); // Draw a box // mode: 0=frame, 1=fill, 2=XOR fill // color: Rectangle color // xStart/yStart: upper left point // xSize/ySize: box size -inline void DWIN_Draw_Box(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xSize, uint16_t ySize) { - DWIN_Draw_Rectangle(mode, color, xStart, yStart, xStart + xSize - 1, yStart + ySize - 1); +inline void dwinDrawBox(uint8_t mode, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xSize, uint16_t ySize) { + dwinDrawRectangle(mode, color, xStart, yStart, xStart + xSize - 1, yStart + ySize - 1); } // Move a screen area @@ -159,7 +159,7 @@ inline void DWIN_Draw_Box(uint8_t mode, uint16_t color, uint16_t xStart, uint16_ // color: Fill color // xStart/yStart: upper left point // xEnd/yEnd: bottom right point -void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, +void dwinFrameAreaMove(uint8_t mode, uint8_t dir, uint16_t dis, uint16_t color, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd); @@ -173,15 +173,15 @@ void DWIN_Frame_AreaMove(uint8_t mode, uint8_t dir, uint16_t dis, // x/y: Upper-left coordinate of the string // *string: The string // rlimit: For draw less chars than string length use rlimit -void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const char * const string, uint16_t rlimit=0xFFFF); +void dwinDrawString(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, const char * const string, uint16_t rlimit=0xFFFF); -inline void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, FSTR_P const ftitle) { +inline void dwinDrawString(bool bShow, uint8_t size, uint16_t color, uint16_t bColor, uint16_t x, uint16_t y, FSTR_P const ftitle) { #ifdef __AVR__ char ctitle[strlen_P(FTOP(ftitle)) + 1]; strcpy_P(ctitle, FTOP(ftitle)); - DWIN_Draw_String(bShow, size, color, bColor, x, y, ctitle); + dwinDrawString(bShow, size, color, bColor, x, y, ctitle); #else - DWIN_Draw_String(bShow, size, color, bColor, x, y, FTOP(ftitle)); + dwinDrawString(bShow, size, color, bColor, x, y, FTOP(ftitle)); #endif } @@ -195,7 +195,7 @@ inline void DWIN_Draw_String(bool bShow, uint8_t size, uint16_t color, uint16_t // iNum: Number of digits // x/y: Upper-left coordinate // value: Integer value -void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, +void dwinDrawIntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, uint32_t value); // Draw a floating point number @@ -209,25 +209,25 @@ void DWIN_Draw_IntValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t // fNum: Number of decimal digits // x/y: Upper-left point // value: Float value -void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, +void dwinDrawFloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, int32_t value); // Draw a floating point number // value: positive unscaled float value -void DWIN_Draw_FloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, +void dwinDrawFloatValue(uint8_t bShow, bool zeroFill, uint8_t zeroMode, uint8_t size, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, float value); /*---------------------------------------- Picture related functions ----------------------------------------*/ // Draw JPG and cached in #0 virtual display area // id: Picture ID -void DWIN_JPG_ShowAndCache(const uint8_t id); +void dwinJPGShowAndCache(const uint8_t id); // Draw an Icon // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y); +void dwinIconShow(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y); // Draw an Icon // IBD: The icon background display: 0=Background filtering is not displayed, 1=Background display \\When setting the background filtering not to display, the background must be pure black @@ -236,7 +236,7 @@ void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y); // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWIN_ICON_Show(bool IBD, bool BIR, bool BFI, uint8_t libID, uint8_t picID, uint16_t x, uint16_t y); +void dwinIconShow(bool IBD, bool BIR, bool BFI, uint8_t libID, uint8_t picID, uint16_t x, uint16_t y); // Draw an Icon from SRAM // IBD: The icon background display: 0=Background filtering is not displayed, 1=Background display \\When setting the background filtering not to display, the background must be pure black @@ -244,16 +244,16 @@ void DWIN_ICON_Show(bool IBD, bool BIR, bool BFI, uint8_t libID, uint8_t picID, // BFI: Background filtering strength: 0=normal, 1=enhanced, (only valid when the icon background display=0) // x/y: Upper-left point // addr: SRAM address -void DWIN_ICON_Show(bool IBD, bool BIR, bool BFI, uint16_t x, uint16_t y, uint16_t addr); +void dwinIconShow(bool IBD, bool BIR, bool BFI, uint16_t x, uint16_t y, uint16_t addr); // Unzip the JPG picture to a virtual display area // n: Cache index // id: Picture ID -void DWIN_JPG_CacheToN(uint8_t n, uint8_t id); +void dwinJPGCacheToN(uint8_t n, uint8_t id); // Unzip the JPG picture to virtual display area #1 // id: Picture ID -inline void DWIN_JPG_CacheTo1(uint8_t id) { DWIN_JPG_CacheToN(1, id); } +inline void dwinJPGCacheTo1(uint8_t id) { dwinJPGCacheToN(1, id); } // Animate a series of icons // animID: Animation ID up to 16 @@ -263,8 +263,8 @@ inline void DWIN_JPG_CacheTo1(uint8_t id) { DWIN_JPG_CacheToN(1, id); } // picIDe: Icon ending ID // x/y: Upper-left point // interval: Display time interval, unit 10mS -void DWIN_ICON_Animation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval); +void dwinIconAnimation(uint8_t animID, bool animate, uint8_t libID, uint8_t picIDs, uint8_t picIDe, uint16_t x, uint16_t y, uint16_t interval); // Animation Control // state: 16 bits, each bit is the state of an animation id -void DWIN_ICON_AnimationControl(uint16_t state); +void dwinIconAnimationControl(uint16_t state); diff --git a/Marlin/src/lcd/e3v2/common/dwin_font.h b/Marlin/src/lcd/e3v2/common/dwin_font.h index 10bb104d27..b92bfcf99c 100644 --- a/Marlin/src/lcd/e3v2/common/dwin_font.h +++ b/Marlin/src/lcd/e3v2/common/dwin_font.h @@ -28,13 +28,15 @@ typedef uint8_t fontid_t; * 0x00=6*12 0x01=8*16 0x02=10*20 0x03=12*24 0x04=14*28 * 0x05=16*32 0x06=20*40 0x07=24*48 0x08=28*56 0x09=32*64 */ -#define font6x12 0x00 +#if DISABLED(TJC_DISPLAY) + #define font6x12 0x00 + #define font20x40 0x06 + #define font24x48 0x07 + #define font28x56 0x08 + #define font32x64 0x09 +#endif #define font8x16 0x01 #define font10x20 0x02 #define font12x24 0x03 #define font14x28 0x04 #define font16x32 0x05 -#define font20x40 0x06 -#define font24x48 0x07 -#define font28x56 0x08 -#define font32x64 0x09 diff --git a/Marlin/src/lcd/e3v2/common/encoder.cpp b/Marlin/src/lcd/e3v2/common/encoder.cpp index 5081e27690..2ff67059e9 100644 --- a/Marlin/src/lcd/e3v2/common/encoder.cpp +++ b/Marlin/src/lcd/e3v2/common/encoder.cpp @@ -46,7 +46,7 @@ #define ENCODER_PULSES_PER_STEP 4 #endif -ENCODER_Rate EncoderRate; +EncoderRate encoderRate; // TODO: Replace with ui.quick_feedback void Encoder_tick() { @@ -54,7 +54,7 @@ void Encoder_tick() { } // Encoder initialization -void Encoder_Configuration() { +void encoderConfiguration() { #if BUTTON_EXISTS(EN1) SET_INPUT_PULLUP(BTN_EN1); #endif @@ -70,7 +70,7 @@ void Encoder_Configuration() { } // Analyze encoder value and return state -EncoderState Encoder_ReceiveAnalyze() { +EncoderState encoderReceiveAnalyze() { const millis_t now = millis(); static uint8_t lastEncoderBits; uint8_t newbutton = 0; @@ -126,20 +126,20 @@ EncoderState Encoder_ReceiveAnalyze() { int32_t encoderMultiplier = 1; // if must encoder rati multiplier - if (EncoderRate.enabled) { + if (encoderRate.enabled) { const float abs_diff = ABS(temp_diff), encoderMovementSteps = abs_diff / (ENCODER_PULSES_PER_STEP); - if (EncoderRate.lastEncoderTime) { + if (encoderRate.lastEncoderTime) { // Note that the rate is always calculated between two passes through the // loop and that the abs of the temp_diff value is tracked. - const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000; + const float encoderStepRate = encoderMovementSteps / float(ms - encoderRate.lastEncoderTime) * 1000; if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100; else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; #if ENCODER_5X_STEPS_PER_SEC else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5; #endif } - EncoderRate.lastEncoderTime = ms; + encoderRate.lastEncoderTime = ms; } #else @@ -148,9 +148,9 @@ EncoderState Encoder_ReceiveAnalyze() { #endif - // EncoderRate.encoderMoveValue += (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); - EncoderRate.encoderMoveValue = (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); - if (EncoderRate.encoderMoveValue < 0) EncoderRate.encoderMoveValue = -EncoderRate.encoderMoveValue; + // encoderRate.encoderMoveValue += (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); + encoderRate.encoderMoveValue = (temp_diff * encoderMultiplier) / (ENCODER_PULSES_PER_STEP); + if (encoderRate.encoderMoveValue < 0) encoderRate.encoderMoveValue = -encoderRate.encoderMoveValue; temp_diff = 0; } diff --git a/Marlin/src/lcd/e3v2/common/encoder.h b/Marlin/src/lcd/e3v2/common/encoder.h index 3ab8c3bf42..72d37108dc 100644 --- a/Marlin/src/lcd/e3v2/common/encoder.h +++ b/Marlin/src/lcd/e3v2/common/encoder.h @@ -34,9 +34,9 @@ typedef struct { bool enabled = false; int encoderMoveValue = 0; millis_t lastEncoderTime = 0; -} ENCODER_Rate; +} EncoderRate; -extern ENCODER_Rate EncoderRate; +extern EncoderRate encoderRate; typedef enum { ENCODER_DIFF_NO = 0, // no state @@ -48,26 +48,26 @@ typedef enum { #define ENCODER_WAIT_MS 20 // Encoder initialization -void Encoder_Configuration(); +void encoderConfiguration(); // Analyze encoder value and return state -EncoderState Encoder_ReceiveAnalyze(); +EncoderState encoderReceiveAnalyze(); inline EncoderState get_encoder_state() { static millis_t Encoder_ms = 0; const millis_t ms = millis(); if (PENDING(ms, Encoder_ms)) return ENCODER_DIFF_NO; - const EncoderState state = Encoder_ReceiveAnalyze(); + const EncoderState state = encoderReceiveAnalyze(); if (state != ENCODER_DIFF_NO) Encoder_ms = ms + ENCODER_WAIT_MS; return state; } template -inline bool Apply_Encoder(const EncoderState &encoder_diffState, T &valref) { +inline bool applyEncoder(const EncoderState &encoder_diffState, T &valref) { if (encoder_diffState == ENCODER_DIFF_CW) - valref += EncoderRate.encoderMoveValue; + valref += encoderRate.encoderMoveValue; else if (encoder_diffState == ENCODER_DIFF_CCW) - valref -= EncoderRate.encoderMoveValue; + valref -= encoderRate.encoderMoveValue; return encoder_diffState == ENCODER_DIFF_ENTER; } diff --git a/Marlin/src/lcd/e3v2/common/limits.h b/Marlin/src/lcd/e3v2/common/limits.h new file mode 100644 index 0000000000..da75d9c982 --- /dev/null +++ b/Marlin/src/lcd/e3v2/common/limits.h @@ -0,0 +1,100 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 + +/***************************************************************************** + * @file lcd/e3v2/common/limits.h + * @brief Limits for UI values + ****************************************************************************/ + +#include "../../../inc/MarlinConfig.h" + +// If max edit values are not specified use default * DEFAULT_MAX_MULTIPLIER +#define DEFAULT_MAX_MULTIPLIER 2 + +// +// Feedrate limits +// +#define MIN_FEEDRATE_EDIT_VALUE 1 + +constexpr xyze_float_t min_feedrate_edit_values = LOGICAL_AXIS_ARRAY_1(MIN_FEEDRATE_EDIT_VALUE), + default_max_feedrate = DEFAULT_MAX_FEEDRATE, + max_feedrate_edit_values = + #ifdef MAX_FEEDRATE_EDIT_VALUES + MAX_FEEDRATE_EDIT_VALUES + #else + default_max_feedrate * float(DEFAULT_MAX_MULTIPLIER) + #endif + ; + +// +// Acceleration limits +// +#define MIN_ACCELERATION_EDIT_VALUE 1 + +constexpr xyze_float_t min_acceleration_edit_values = LOGICAL_AXIS_ARRAY_1(MIN_ACCELERATION_EDIT_VALUE), + default_max_acceleration = DEFAULT_MAX_ACCELERATION, + max_acceleration_edit_values = + #ifdef MAX_ACCEL_EDIT_VALUES + MAX_ACCEL_EDIT_VALUES + #else + default_max_acceleration * float(DEFAULT_MAX_MULTIPLIER) + #endif + ; + +// +// Max jerk limits +// +#define MIN_JERK_EDIT_VALUE 0.1 +#define DEFAULT_MAX_JERK_MULTIPLIER 2 + +#if HAS_CLASSIC_JERK + constexpr xyze_float_t min_jerk_edit_values = LOGICAL_AXIS_ARRAY_1(MIN_JERK_EDIT_VALUE), + default_jerk = LOGICAL_AXIS_ARRAY( + DEFAULT_EJERK, + DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, + DEFAULT_IJERK, DEFAULT_JJERK, DEFAULT_KJERK, + DEFAULT_UJERK, DEFAULT_VJERK, DEFAULT_WJERK + ), + max_jerk_edit_values = + #ifdef MAX_JERK_EDIT_VALUES + MAX_JERK_EDIT_VALUES + #else + default_jerk * float(DEFAULT_MAX_JERK_MULTIPLIER) + #endif + ; +#endif + +// +// Steps per mm limits +// +#define MIN_STEPS_EDIT_VALUE 1 + +constexpr xyze_float_t min_steps_edit_values = LOGICAL_AXIS_ARRAY_1(MIN_STEPS_EDIT_VALUE), + default_steps = DEFAULT_AXIS_STEPS_PER_UNIT, + max_steps_edit_values = + #ifdef MAX_STEPS_EDIT_VALUES + MAX_STEPS_EDIT_VALUES + #else + default_steps * float(DEFAULT_MAX_MULTIPLIER) + #endif + ; diff --git a/Marlin/src/lcd/e3v2/creality/dwin.cpp b/Marlin/src/lcd/e3v2/creality/dwin.cpp index 66baff1611..303807aa21 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin.cpp @@ -45,7 +45,7 @@ #define JUST_BABYSTEP 1 #endif -#include "../../fontutils.h" +#include "../../utf8.h" #include "../../marlinui.h" #include "../../../sd/cardreader.h" @@ -76,7 +76,7 @@ #include "../../../module/probe.h" #endif -#if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) +#if ANY(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) #include "../../../feature/babystep.h" #endif @@ -101,12 +101,6 @@ #define MIN_PRINT_SPEED 10 #define MAX_PRINT_SPEED 999 -// Feedspeed limit (max feedspeed = DEFAULT_MAX_FEEDRATE * 2) -#define MIN_MAXFEEDSPEED 1 -#define MIN_MAXACCELERATION 1 -#define MIN_MAXJERK 0.1 -#define MIN_STEP 1 - #define FEEDRATE_E (60) // Minimum unit (0.1) : multiple (10) @@ -134,8 +128,8 @@ constexpr uint16_t MROWS = TROWS - 1, // Last Row Index #define DWIN_RIGHT (DWIN_WIDTH-1) // Value Init -HMI_value_t HMI_ValueStruct; -HMI_flag_t HMI_flag{0}; +hmi_value_t hmiValues; +hmi_flag_t hmiFlag{0}; millis_t dwin_heat_time = 0; @@ -181,13 +175,6 @@ uint8_t index_file = MROWS, bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home -constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; -constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; - -#if HAS_CLASSIC_JERK - constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; -#endif - static uint8_t _card_percent = 0; static uint16_t _remain_time = 0; @@ -207,206 +194,206 @@ static uint16_t _remain_time = 0; #define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) // BL24CXX::check() uses 0x00 -inline bool HMI_IsChinese() { return HMI_flag.language == DWIN_CHINESE; } +inline bool hmiIsChinese() { return hmiFlag.language == DWIN_CHINESE; } -void HMI_SetLanguageCache() { - DWIN_JPG_CacheTo1(HMI_IsChinese() ? Language_Chinese : Language_English); +void hmiSetLanguageCache() { + dwinJPGCacheTo1(hmiIsChinese() ? Language_Chinese : Language_English); } -void HMI_SetLanguage() { - #if BOTH(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) - BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); +void hmiSetLanguage() { + #if ALL(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) + BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&hmiFlag.language, sizeof(hmiFlag.language)); #endif - HMI_SetLanguageCache(); + hmiSetLanguageCache(); } -void HMI_ToggleLanguage() { - HMI_flag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE; - HMI_SetLanguageCache(); - #if BOTH(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); +void hmiToggleLanguage() { + hmiFlag.language = hmiIsChinese() ? DWIN_ENGLISH : DWIN_CHINESE; + hmiSetLanguageCache(); + #if ALL(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&hmiFlag.language, sizeof(hmiFlag.language)); #endif } typedef struct { uint16_t x, y, w, h; } icon_info_t; typedef struct { uint16_t x, y[2], w, h; } text_info_t; -void ICON_Button(const bool here, const int iconid, const icon_info_t &ico, const text_info_t (&txt)[2]) { - const bool cn = HMI_IsChinese(); - DWIN_ICON_Show(ICON, iconid + here, ico.x, ico.y); - if (here) DWIN_Draw_Rectangle(0, Color_White, ico.x, ico.y, ico.x + ico.w - 1, ico.y + ico.h - 1); - DWIN_Frame_AreaCopy(1, txt[cn].x, txt[cn].y[here], txt[cn].x + txt[cn].w - 1, txt[cn].y[here] + txt[cn].h - 1, ico.x + (ico.w - txt[cn].w) / 2, (ico.y + ico.h - 28) - txt[cn].h/2); +void iconButton(const bool here, const int iconid, const icon_info_t &ico, const text_info_t (&txt)[2]) { + const bool cn = hmiIsChinese(); + dwinIconShow(ICON, iconid + here, ico.x, ico.y); + if (here) dwinDrawRectangle(0, Color_White, ico.x, ico.y, ico.x + ico.w - 1, ico.y + ico.h - 1); + dwinFrameAreaCopy(1, txt[cn].x, txt[cn].y[here], txt[cn].x + txt[cn].w - 1, txt[cn].y[here] + txt[cn].h - 1, ico.x + (ico.w - txt[cn].w) / 2, (ico.y + ico.h - 28) - txt[cn].h/2); } // // Main Menu: "Print" // -void ICON_Print() { +void iconPrint() { constexpr icon_info_t ico = { 17, 110, 110, 100 }; constexpr text_info_t txt[2] = { { 1, { 417, 449 }, 30, 14 }, { 1, { 405, 447 }, 27, 15 } }; - ICON_Button(select_page.now == PAGE_PRINT, ICON_Print_0, ico, txt); + iconButton(select_page.now == PAGE_PRINT, ICON_Print_0, ico, txt); } // // Main Menu: "Prepare" // -void ICON_Prepare() { +void iconPrepare() { constexpr icon_info_t ico = { 145, 110, 110, 100 }; constexpr text_info_t txt[2] = { { 33, { 417, 449 }, 51, 14 }, { 31, { 405, 447 }, 27, 15 } }; - ICON_Button(select_page.now == PAGE_PREPARE, ICON_Prepare_0, ico, txt); + iconButton(select_page.now == PAGE_PREPARE, ICON_Prepare_0, ico, txt); } // // Main Menu: "Control" // -void ICON_Control() { +void iconControl() { constexpr icon_info_t ico = { 17, 226, 110, 100 }; constexpr text_info_t txt[2] = { { 85, { 417, 449 }, 46, 14 }, { 61, { 405, 447 }, 27, 15 } }; - ICON_Button(select_page.now == PAGE_CONTROL, ICON_Control_0, ico, txt); + iconButton(select_page.now == PAGE_CONTROL, ICON_Control_0, ico, txt); } // // Main Menu: "Info" // -void ICON_StartInfo() { +void iconStartInfo() { constexpr icon_info_t ico = { 145, 226, 110, 100 }; constexpr text_info_t txt[2] = { { 133, { 417, 449 }, 23, 14 }, { 91, { 405, 447 }, 27, 15 } }; - ICON_Button(select_page.now == PAGE_INFO_LEVELING, ICON_Info_0, ico, txt); + iconButton(select_page.now == PAGE_INFO_LEVELING, ICON_Info_0, ico, txt); } // // Main Menu: "Level" // -void ICON_Leveling() { +void iconLeveling() { constexpr icon_info_t ico = { 145, 226, 110, 100 }; constexpr text_info_t txt[2] = { { 88, { 433, 464 }, 36, 14 }, { 211, { 405, 447 }, 27, 15 } }; - ICON_Button(select_page.now == PAGE_INFO_LEVELING, ICON_Leveling_0, ico, txt); + iconButton(select_page.now == PAGE_INFO_LEVELING, ICON_Leveling_0, ico, txt); } // // Printing: "Tune" // -void ICON_Tune() { +void iconTune() { constexpr icon_info_t ico = { 8, 232, 80, 100 }; constexpr text_info_t txt[2] = { { 0, { 433, 464 }, 32, 14 }, { 121, { 405, 447 }, 27, 15 } }; - ICON_Button(select_print.now == PRINT_SETUP, ICON_Setup_0, ico, txt); + iconButton(select_print.now == PRINT_SETUP, ICON_Setup_0, ico, txt); } // // Printing: "Pause" // -void ICON_Pause() { +void iconPause() { constexpr icon_info_t ico = { 96, 232, 80, 100 }; constexpr text_info_t txt[2] = { { 157, { 417, 449 }, 39, 14 }, { 181, { 405, 447 }, 27, 15 } }; - ICON_Button(select_print.now == PRINT_PAUSE_RESUME, ICON_Pause_0, ico, txt); + iconButton(select_print.now == PRINT_PAUSE_RESUME, ICON_Pause_0, ico, txt); } // // Printing: "Resume" // -void ICON_Resume() { +void iconResume() { constexpr icon_info_t ico = { 96, 232, 80, 100 }; constexpr text_info_t txt[2] = { { 33, { 433, 464 }, 53, 14 }, { 1, { 405, 447 }, 27, 15 } }; - ICON_Button(select_print.now == PRINT_PAUSE_RESUME, ICON_Continue_0, ico, txt); + iconButton(select_print.now == PRINT_PAUSE_RESUME, ICON_Continue_0, ico, txt); } -void ICON_ResumeOrPause() { - if (printingIsPaused() || HMI_flag.pause_flag || HMI_flag.pause_action) - ICON_Resume(); +void iconResumeOrPause() { + if (printingIsPaused() || hmiFlag.pause_flag || hmiFlag.pause_action) + iconResume(); else - ICON_Pause(); + iconPause(); } // // Printing: "Stop" // -void ICON_Stop() { +void iconStop() { constexpr icon_info_t ico = { 184, 232, 80, 100 }; constexpr text_info_t txt[2] = { { 196, { 417, 449 }, 29, 14 }, { 151, { 405, 447 }, 27, 12 } }; - ICON_Button(select_print.now == PRINT_STOP, ICON_Stop_0, ico, txt); + iconButton(select_print.now == PRINT_STOP, ICON_Stop_0, ico, txt); } -inline void Clear_Title_Bar() { - DWIN_Draw_Box(1, Color_Bg_Blue, 0, 0, DWIN_WIDTH, TITLE_HEIGHT); +inline void clearTitleBar() { + dwinDrawBox(1, Color_Bg_Blue, 0, 0, DWIN_WIDTH, TITLE_HEIGHT); } -void Draw_Title(FSTR_P ftitle) { - DWIN_Draw_String(false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, ftitle); +void drawTitle(FSTR_P ftitle) { + dwinDrawString(false, DWIN_FONT_HEAD, Color_White, Color_Bg_Blue, 14, 4, ftitle); } -inline void Clear_Menu_Area() { - DWIN_Draw_Box(1, Color_Bg_Black, 0, TITLE_HEIGHT, DWIN_WIDTH, STATUS_Y - TITLE_HEIGHT); +inline void clearMenuArea() { + dwinDrawBox(1, Color_Bg_Black, 0, TITLE_HEIGHT, DWIN_WIDTH, STATUS_Y - TITLE_HEIGHT); } -void Clear_Main_Window() { - Clear_Title_Bar(); - Clear_Menu_Area(); +void clearMainWindow() { + clearTitleBar(); + clearMenuArea(); } -void Clear_Popup_Area() { - Clear_Title_Bar(); - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); +void clearPopupArea() { + clearTitleBar(); + dwinDrawRectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); } -void Draw_Popup_Bkgd_105() { - DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 105, 258, 374); +void drawPopupBkgd105() { + dwinDrawRectangle(1, Color_Bg_Window, 14, 105, 258, 374); } -void Draw_More_Icon(const uint8_t line) { - DWIN_ICON_Show(ICON, ICON_More, 226, MBASE(line) - 3); +void drawMoreIcon(const uint8_t line) { + dwinIconShow(ICON, ICON_More, 226, MBASE(line) - 3); } -void Draw_Menu_Cursor(const uint8_t line) { - //DWIN_ICON_Show(ICON, ICON_Rectangle, 0, MBASE(line) - 18); - DWIN_Draw_Rectangle(1, Rectangle_Color, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); +void drawMenuCursor(const uint8_t line) { + //dwinIconShow(ICON, ICON_Rectangle, 0, MBASE(line) - 18); + dwinDrawRectangle(1, Rectangle_Color, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); } -void Erase_Menu_Cursor(const uint8_t line) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); +void eraseMenuCursor(const uint8_t line) { + dwinDrawRectangle(1, Color_Bg_Black, 0, MBASE(line) - 18, 14, MBASE(line + 1) - 20); } -void Move_Highlight(const int16_t from, const uint16_t newline) { - Erase_Menu_Cursor(newline - from); - Draw_Menu_Cursor(newline); +void moveHighlight(const int16_t from, const uint16_t newline) { + eraseMenuCursor(newline - from); + drawMenuCursor(newline); } -void Add_Menu_Line() { - Move_Highlight(1, MROWS); - DWIN_Draw_Line(Line_Color, 16, MBASE(MROWS + 1) - 20, 256, MBASE(MROWS + 1) - 19); +void addMenuLine() { + moveHighlight(1, MROWS); + dwinDrawLine(Line_Color, 16, MBASE(MROWS + 1) - 20, 256, MBASE(MROWS + 1) - 19); } -void Scroll_Menu(const uint8_t dir) { - DWIN_Frame_AreaMove(1, dir, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); +void scrollMenu(const uint8_t dir) { + dwinFrameAreaMove(1, dir, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); switch (dir) { - case DWIN_SCROLL_DOWN: Move_Highlight(-1, 0); break; - case DWIN_SCROLL_UP: Add_Menu_Line(); break; + case DWIN_SCROLL_DOWN: moveHighlight(-1, 0); break; + case DWIN_SCROLL_UP: addMenuLine(); break; } } @@ -414,61 +401,61 @@ inline uint16_t nr_sd_menu_items() { return card.get_num_items() + !card.flag.workDirIsRoot; } -void Erase_Menu_Text(const uint8_t line) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); +void eraseMenuText(const uint8_t line) { + dwinDrawRectangle(1, Color_Bg_Black, LBLX, MBASE(line) - 14, 271, MBASE(line) + 28); } -void Draw_Menu_Icon(const uint8_t line, const uint8_t icon) { - DWIN_ICON_Show(ICON, icon, 26, MBASE(line) - 3); +void drawMenuIcon(const uint8_t line, const uint8_t icon) { + dwinIconShow(ICON, icon, 26, MBASE(line) - 3); } -void _Decorate_Menu_Item(const uint8_t line, const uint8_t icon, bool more) { - if (icon) Draw_Menu_Icon(line, icon); - if (more) Draw_More_Icon(line); +void _decorateMenuItem(const uint8_t line, const uint8_t icon, bool more) { + if (icon) drawMenuIcon(line, icon); + if (more) drawMoreIcon(line); } -void Draw_Menu_Item(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr, bool more=false) { - if (label) DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, (char*)label); - _Decorate_Menu_Item(line, icon, more); +void drawMenuItem(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr, bool more=false) { + if (label) dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, (char*)label); + _decorateMenuItem(line, icon, more); } -void Draw_Menu_Item(const uint8_t line, const uint8_t icon=0, FSTR_P const flabel=nullptr, bool more=false) { - if (flabel) DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, flabel); - _Decorate_Menu_Item(line, icon, more); +void drawMenuItem(const uint8_t line, const uint8_t icon=0, FSTR_P const flabel=nullptr, bool more=false) { + if (flabel) dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(line) - 1, flabel); + _decorateMenuItem(line, icon, more); } -void Draw_Menu_Line(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr, bool more=false) { - Draw_Menu_Item(line, icon, label, more); - DWIN_Draw_Line(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); +void drawMenuLine(const uint8_t line, const uint8_t icon=0, const char * const label=nullptr, bool more=false) { + drawMenuItem(line, icon, label, more); + dwinDrawLine(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); } -void Draw_Menu_Line(const uint8_t line, const uint8_t icon, FSTR_P const flabel, bool more=false) { - Draw_Menu_Item(line, icon, flabel, more); - DWIN_Draw_Line(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); +void drawMenuLine(const uint8_t line, const uint8_t icon, FSTR_P const flabel, bool more=false) { + drawMenuItem(line, icon, flabel, more); + dwinDrawLine(Line_Color, 16, MBASE(line) + 33, 256, MBASE(line) + 34); } -void Draw_Checkbox_Line(const uint8_t line, const bool ison) { +void drawCheckboxLine(const uint8_t line, const bool ison) { const uint16_t x = 225, y = EBASE(line) - 2; - DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, x + 5, y, ison ? F("X") : F(" ")); - DWIN_Draw_Rectangle(0, Color_White, x + 2, y + 2, x + 16, y + 16); + dwinDrawString(true, font8x16, Color_White, Color_Bg_Black, x + 5, y, ison ? F("X") : F(" ")); + dwinDrawRectangle(0, Color_White, x + 2, y + 2, x + 16, y + 16); } // AreaCopy for a Menu Item -void Item_AreaCopy(const uint16_t x1, const uint16_t y1, const uint16_t x2, const uint16_t y2, const uint8_t row=0, const uint16_t inset=0, const uint16_t yadd=0) { - DWIN_Frame_AreaCopy(1, x1, y1, x2, y2, LBLX + inset, MBASE(row) + yadd); +void itemAreaCopy(const uint16_t x1, const uint16_t y1, const uint16_t x2, const uint16_t y2, const uint8_t row=0, const uint16_t inset=0, const uint16_t yadd=0) { + dwinFrameAreaCopy(1, x1, y1, x2, y2, LBLX + inset, MBASE(row) + yadd); } // AreaCopy for a Screen Title -void DWIN_Frame_TitleCopy(const uint16_t x1, const uint16_t y1, const uint16_t w, const uint16_t h) { - DWIN_Frame_AreaCopy(1, x1, y1, x1 + w - 1, y1 + h - 1, (DWIN_WIDTH - w) / 2, (TITLE_HEIGHT - h) / 2); +void dwinFrameTitleCopy(const uint16_t x1, const uint16_t y1, const uint16_t w, const uint16_t h) { + dwinFrameAreaCopy(1, x1, y1, x1 + w - 1, y1 + h - 1, (DWIN_WIDTH - w) / 2, (TITLE_HEIGHT - h) / 2); } // Draw "Back" line at the top -void Draw_Back_First(const bool is_sel=true) { - Draw_Menu_Line(0, ICON_Back); - if (HMI_IsChinese()) - Item_AreaCopy(129, 72, 156, 84); +void drawBackFirst(const bool is_sel=true) { + drawMenuLine(0, ICON_Back); + if (hmiIsChinese()) + itemAreaCopy(129, 72, 156, 84); else - Item_AreaCopy(223, 179, 254, 189); - if (is_sel) Draw_Menu_Cursor(0); + itemAreaCopy(223, 179, 254, 189); + if (is_sel) drawMenuCursor(0); } // @@ -488,7 +475,7 @@ void Draw_Back_First(const bool is_sel=true) { #define PREPARE_CASE_ZOFF (PREPARE_CASE_HOME + ENABLED(HAS_ZOFFSET_ITEM)) #define PREPARE_CASE_PLA (PREPARE_CASE_ZOFF + ENABLED(HAS_PREHEAT)) #define PREPARE_CASE_ABS (PREPARE_CASE_PLA + (TERN0(HAS_PREHEAT, PREHEAT_COUNT > 1))) -#define PREPARE_CASE_COOL (PREPARE_CASE_ABS + EITHER(HAS_HOTEND, HAS_HEATED_BED)) +#define PREPARE_CASE_COOL (PREPARE_CASE_ABS + ANY(HAS_HOTEND, HAS_HEATED_BED)) #define PREPARE_CASE_LANG (PREPARE_CASE_COOL + 1) #define PREPARE_CASE_TOTAL PREPARE_CASE_LANG @@ -533,323 +520,323 @@ void Draw_Back_First(const bool is_sel=true) { // void say_move_en(const uint8_t row) { - Item_AreaCopy( 69, 61, 102, 71, row); // "Move" + itemAreaCopy( 69, 61, 102, 71, row); // "Move" } void say_max_en(const uint8_t row) { - Item_AreaCopy( 75, 119, 100, 129, row); // "Max" + itemAreaCopy( 75, 119, 100, 129, row); // "Max" } void say_jerk_en(const uint8_t row) { - Item_AreaCopy(104, 119, 128, 129, row, 30); // "Jerk" + itemAreaCopy(104, 119, 128, 129, row, 30); // "Jerk" } void say_speed_en(const uint16_t inset, const uint8_t row) { - Item_AreaCopy(133, 119, 172, 132, row, inset); // "Speed" + itemAreaCopy(133, 119, 172, 132, row, inset); // "Speed" } void say_max_accel_en(const uint8_t row) { say_max_en(row); // "Max" - Item_AreaCopy( 0, 135, 79, 145, row, 30); // "Acceleration" + itemAreaCopy( 0, 135, 79, 145, row, 30); // "Acceleration" } void say_max_jerk_speed_en(const uint8_t row) { - Item_AreaCopy( 75, 119, 172, 132, row); // "Max Jerk Speed" + itemAreaCopy( 75, 119, 172, 132, row); // "Max Jerk Speed" } void say_x_en(const uint16_t inset, const uint8_t row) { - Item_AreaCopy(175, 119, 184, 129, row, inset); // "X" + itemAreaCopy(175, 119, 184, 129, row, inset); // "X" } void say_y_en(const uint16_t inset, const uint8_t row) { - Item_AreaCopy(184, 119, 192, 129, row, inset); // "Y" + itemAreaCopy(184, 119, 192, 129, row, inset); // "Y" } void say_z_en(const uint16_t inset, const uint8_t row) { - Item_AreaCopy(193, 119, 201, 129, row, inset); // "Z" + itemAreaCopy(193, 119, 201, 129, row, inset); // "Z" } void say_e_en(const uint16_t inset, const uint8_t row) { - Item_AreaCopy(201, 119, 209, 129, row, inset); // "E" + itemAreaCopy(201, 119, 209, 129, row, inset); // "E" } void say_pla_en(const uint16_t inset, const uint8_t row) { - Item_AreaCopy(131, 164, 153, 174, row, inset); // "PLA" + itemAreaCopy(131, 164, 153, 174, row, inset); // "PLA" } void say_abs_en(const uint16_t inset, const uint8_t row) { - Item_AreaCopy(157, 76, 181, 86, row, inset); // "ABS" + itemAreaCopy(157, 76, 181, 86, row, inset); // "ABS" } void say_home_offs_en(const uint8_t row) { - Item_AreaCopy(153, 193, 225, 203, row); // "Home Offset" + itemAreaCopy(153, 193, 225, 203, row); // "Home Offset" } void say_probe_offs_en(const uint8_t row) { - Item_AreaCopy(153, 205, 225, 215, row); // "Probe Offset" + itemAreaCopy(153, 205, 225, 215, row); // "Probe Offset" } void say_steps_per_mm_en(const uint8_t row) { - Item_AreaCopy( 1, 151, 91, 161, row); // "Steps-per-mm" + itemAreaCopy( 1, 151, 91, 161, row); // "Steps-per-mm" } -void DWIN_Draw_Label(const uint8_t row, char *string) { - DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(row), string); +void dwinDrawLabel(const uint8_t row, char *string) { + dwinDrawString(true, font8x16, Color_White, Color_Bg_Black, LBLX, MBASE(row), string); } -void DWIN_Draw_Label(const uint8_t row, FSTR_P title) { - DWIN_Draw_Label(row, (char*)title); +void dwinDrawLabel(const uint8_t row, FSTR_P title) { + dwinDrawLabel(row, (char*)title); } -void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, int32_t value) { - DWIN_Draw_String(true, size, Color_White, bColor, x - 8, y, value < 0 ? F("-") : F(" ")); - DWIN_Draw_FloatValue(true, true, 0, size, Color_White, bColor, iNum, fNum, x, y, value < 0 ? -value : value); +void dwinDrawSigned_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, int32_t value) { + dwinDrawString(true, size, Color_White, bColor, x - 8, y, value < 0 ? F("-") : F(" ")); + dwinDrawFloatValue(true, true, 0, size, Color_White, bColor, iNum, fNum, x, y, value < 0 ? -value : value); } -void Draw_Edit_Integer3(const uint8_t row, const uint16_t value, const bool active=false) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, active ? Select_Color : Color_Bg_Black, 3, 220, EBASE(row), value); +void drawEditInteger3(const uint8_t row, const uint16_t value, const bool active=false) { + dwinDrawIntValue(true, true, 0, font8x16, Color_White, active ? Select_Color : Color_Bg_Black, 3, 220, EBASE(row), value); } -void Draw_Edit_Integer4(const uint8_t row, const uint16_t value, const bool active=false) { - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, active ? Select_Color : Color_Bg_Black, 4, 220 - 1 * 8, EBASE(row), value); +void drawEditInteger4(const uint8_t row, const uint16_t value, const bool active=false) { + dwinDrawIntValue(true, true, 0, font8x16, Color_White, active ? Select_Color : Color_Bg_Black, 4, 220 - 1 * 8, EBASE(row), value); } -void Draw_Edit_Float3(const uint8_t row, const uint16_t value, const bool active=false) { - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, active ? Select_Color : Color_Bg_Black, 3, UNITFDIGITS, 220 - UNITFDIGITS * 8, EBASE(row), (int32_t)value); +void drawEditFloat3(const uint8_t row, const uint16_t value, const bool active=false) { + dwinDrawFloatValue(true, true, 0, font8x16, Color_White, active ? Select_Color : Color_Bg_Black, 3, UNITFDIGITS, 220 - UNITFDIGITS * 8, EBASE(row), (int32_t)value); } -void Draw_Edit_Signed_Float2(const uint8_t row, const float value, const bool active=false) { - DWIN_Draw_Signed_Float(font8x16, active ? Select_Color : Color_Bg_Black, 2, UNITFDIGITS + 1, 220 + 8 - UNITFDIGITS * 8, EBASE(row), value); +void drawEditSignedFloat2(const uint8_t row, const float value, const bool active=false) { + dwinDrawSigned_Float(font8x16, active ? Select_Color : Color_Bg_Black, 2, UNITFDIGITS + 1, 220 + 8 - UNITFDIGITS * 8, EBASE(row), value); } -void Draw_Edit_Signed_Float3(const uint8_t row, const float value, const bool active=false) { - DWIN_Draw_Signed_Float(font8x16, active ? Select_Color : Color_Bg_Black, 3, UNITFDIGITS, 220 - UNITFDIGITS * 8, EBASE(row), value); +void drawEditSignedFloat3(const uint8_t row, const float value, const bool active=false) { + dwinDrawSigned_Float(font8x16, active ? Select_Color : Color_Bg_Black, 3, UNITFDIGITS, 220 - UNITFDIGITS * 8, EBASE(row), value); } -void Draw_Stat_Int(const uint16_t xpos, const uint16_t ypos, const uint16_t value) { - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, xpos, ypos, value); +void drawStatInt(const uint16_t xpos, const uint16_t ypos, const uint16_t value) { + dwinDrawIntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, xpos, ypos, value); } -void Draw_Stat_Float(const uint16_t xpos, const uint16_t ypos, const float value) { - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 2, 2, xpos, ypos, value); +void drawStatFloat(const uint16_t xpos, const uint16_t ypos, const float value) { + dwinDrawFloatValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 2, 2, xpos, ypos, value); } // // Prepare Menu // -void Item_Prepare_Move(const uint8_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(159, 70, 200, 84, row); +void itemPrepareMove(const uint8_t row) { + if (hmiIsChinese()) + itemAreaCopy(159, 70, 200, 84, row); else say_move_en(row); // "Move" - Draw_Menu_Line(row, ICON_Axis); - Draw_More_Icon(row); + drawMenuLine(row, ICON_Axis); + drawMoreIcon(row); } -void Item_Prepare_Disable(const uint8_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(204, 70, 259, 82, row); +void itemPrepareDisable(const uint8_t row) { + if (hmiIsChinese()) + itemAreaCopy(204, 70, 259, 82, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_DISABLE_STEPPERS)); + dwinDrawLabel(row, GET_TEXT_F(MSG_DISABLE_STEPPERS)); #else - Item_AreaCopy(104, 61, 191, 74, row); // "Disable Stepper" + itemAreaCopy(104, 61, 191, 74, row); // "Disable Stepper" #endif } - Draw_Menu_Line(row, ICON_CloseMotor); + drawMenuLine(row, ICON_CloseMotor); } -void Item_Prepare_Home(const uint8_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(0, 89, 41, 101, row); +void itemPrepareHome(const uint8_t row) { + if (hmiIsChinese()) + itemAreaCopy(0, 89, 41, 101, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_AUTO_HOME)); + dwinDrawLabel(row, GET_TEXT_F(MSG_AUTO_HOME)); #else - Item_AreaCopy(202, 61, 271, 71, row); // "Auto Home" + itemAreaCopy(202, 61, 271, 71, row); // "Auto Home" #endif } - Draw_Menu_Line(row, ICON_Homing); + drawMenuLine(row, ICON_Homing); } #if HAS_ZOFFSET_ITEM - void Item_Prepare_Offset(const uint8_t row) { - if (HMI_IsChinese()) { + void itemPrepareOffset(const uint8_t row) { + if (hmiIsChinese()) { #if HAS_BED_PROBE - Item_AreaCopy(174, 164, 223, 177, row); + itemAreaCopy(174, 164, 223, 177, row); #else - Item_AreaCopy(43, 89, 98, 101, row); + itemAreaCopy(43, 89, 98, 101, row); #endif } else { #if HAS_BED_PROBE #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + dwinDrawLabel(row, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else - Item_AreaCopy( 94, 179, 143, 190, row); // "Z-Offset" + itemAreaCopy( 94, 179, 143, 190, row); // "Z-Offset" #endif #else #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_SET_HOME_OFFSETS)); + dwinDrawLabel(row, GET_TEXT_F(MSG_SET_HOME_OFFSETS)); #else - Item_AreaCopy( 1, 76, 103, 87, row); // "Set home offsets" + itemAreaCopy( 1, 76, 103, 87, row); // "Set home offsets" #endif #endif } - Draw_Edit_Signed_Float2(row, BABY_Z_VAR * 100); - Draw_Menu_Line(row, ICON_SetHome); + drawEditSignedFloat2(row, BABY_Z_VAR * 100); + drawMenuLine(row, ICON_SetHome); } #endif #if HAS_PREHEAT - void Item_Prepare_PLA(const uint8_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(100, 89, 151, 101, row); + void itemPrepare_PLA(const uint8_t row) { + if (hmiIsChinese()) + itemAreaCopy(100, 89, 151, 101, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_PREHEAT_1)); + dwinDrawLabel(row, GET_TEXT_F(MSG_PREHEAT_1)); #else - Item_AreaCopy(108, 76, 155, 87, row); // "Preheat" + itemAreaCopy(108, 76, 155, 87, row); // "Preheat" say_pla_en(52, row); // "PLA" #endif } - Draw_Menu_Line(row, ICON_PLAPreheat); + drawMenuLine(row, ICON_PLAPreheat); } #if PREHEAT_COUNT > 1 - void Item_Prepare_ABS(const uint8_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(180, 89, 233, 100, row); + void itemPrepare_ABS(const uint8_t row) { + if (hmiIsChinese()) + itemAreaCopy(180, 89, 233, 100, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, F("Preheat " PREHEAT_2_LABEL)); + dwinDrawLabel(row, F("Preheat " PREHEAT_2_LABEL)); #else - Item_AreaCopy(108, 76, 155, 87, row); // "Preheat" + itemAreaCopy(108, 76, 155, 87, row); // "Preheat" say_abs_en(52, row); // "ABS" #endif } - Draw_Menu_Line(row, ICON_ABSPreheat); + drawMenuLine(row, ICON_ABSPreheat); } #endif - void Item_Prepare_Cool(const uint8_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(1, 104, 56, 117, row); + void itemPrepareCool(const uint8_t row) { + if (hmiIsChinese()) + itemAreaCopy(1, 104, 56, 117, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_COOLDOWN)); + dwinDrawLabel(row, GET_TEXT_F(MSG_COOLDOWN)); #else - Item_AreaCopy(200, 76, 264, 86, row); // "Cooldown" + itemAreaCopy(200, 76, 264, 86, row); // "Cooldown" #endif } - Draw_Menu_Line(row, ICON_Cool); + drawMenuLine(row, ICON_Cool); } #endif -void Item_Prepare_Lang(const uint8_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(239, 134, 266, 146, row); +void itemPrepareLang(const uint8_t row) { + if (hmiIsChinese()) + itemAreaCopy(239, 134, 266, 146, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, F("UI Language")); + dwinDrawLabel(row, F("UI Language")); #else - Item_AreaCopy(1, 194, 96, 206, row); // "LCD Language" + itemAreaCopy(1, 194, 96, 206, row); // "LCD Language" #endif } - DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, 226, EBASE(row), HMI_IsChinese() ? F("CN") : F("EN")); - Draw_Menu_Icon(row, ICON_Language); + dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, 226, EBASE(row), hmiIsChinese() ? F("CN") : F("EN")); + drawMenuIcon(row, ICON_Language); } #define VISI(T,L,S) (WITHIN(L, T - MROWS, MROWS) || WITHIN(S, 0, MROWS)) -void Draw_Prepare_Menu() { - Clear_Main_Window(); +void drawPrepareMenu() { + clearMainWindow(); const int16_t scroll = MROWS - index_prepare; // Scrolled-up lines #define PSCROL(L) (scroll + (L)) #define PVISI(L) VISI(PREPARE_CASE_TOTAL, L, PSCROL(L)) - if (HMI_IsChinese()) - DWIN_Frame_TitleCopy(133, 1, 28, 13); // "Prepare" + if (hmiIsChinese()) + dwinFrameTitleCopy(133, 1, 28, 13); // "Prepare" else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_PREPARE)); + drawTitle(GET_TEXT_F(MSG_PREPARE)); #else - DWIN_Frame_TitleCopy(179, 0, 48, 14); // "Prepare" + dwinFrameTitleCopy(179, 0, 48, 14); // "Prepare" #endif } - if (PVISI(0)) Draw_Back_First(select_prepare.now == CASE_BACK); // < Back - if (PVISI(PREPARE_CASE_MOVE)) Item_Prepare_Move(PSCROL(PREPARE_CASE_MOVE)); // Move > - if (PVISI(PREPARE_CASE_DISA)) Item_Prepare_Disable(PSCROL(PREPARE_CASE_DISA)); // Disable Stepper - if (PVISI(PREPARE_CASE_HOME)) Item_Prepare_Home(PSCROL(PREPARE_CASE_HOME)); // Auto Home + if (PVISI(0)) drawBackFirst(select_prepare.now == CASE_BACK); // < Back + if (PVISI(PREPARE_CASE_MOVE)) itemPrepareMove(PSCROL(PREPARE_CASE_MOVE)); // Move > + if (PVISI(PREPARE_CASE_DISA)) itemPrepareDisable(PSCROL(PREPARE_CASE_DISA)); // Disable Stepper + if (PVISI(PREPARE_CASE_HOME)) itemPrepareHome(PSCROL(PREPARE_CASE_HOME)); // Auto Home #if HAS_ZOFFSET_ITEM - if (PVISI(PREPARE_CASE_ZOFF)) Item_Prepare_Offset(PSCROL(PREPARE_CASE_ZOFF)); // Edit Z-Offset / Babystep / Set Home Offset + if (PVISI(PREPARE_CASE_ZOFF)) itemPrepareOffset(PSCROL(PREPARE_CASE_ZOFF)); // Edit Z-Offset / Babystep / Set Home Offset #endif #if HAS_PREHEAT - if (PVISI(PREPARE_CASE_PLA)) Item_Prepare_PLA(PSCROL(PREPARE_CASE_PLA)); // Preheat PLA + if (PVISI(PREPARE_CASE_PLA)) itemPrepare_PLA(PSCROL(PREPARE_CASE_PLA)); // Preheat PLA #if PREHEAT_COUNT > 1 - if (PVISI(PREPARE_CASE_ABS)) Item_Prepare_ABS(PSCROL(PREPARE_CASE_ABS)); // Preheat ABS + if (PVISI(PREPARE_CASE_ABS)) itemPrepare_ABS(PSCROL(PREPARE_CASE_ABS)); // Preheat ABS #endif #endif #if HAS_HOTEND || HAS_HEATED_BED - if (PVISI(PREPARE_CASE_COOL)) Item_Prepare_Cool(PSCROL(PREPARE_CASE_COOL)); // Cooldown + if (PVISI(PREPARE_CASE_COOL)) itemPrepareCool(PSCROL(PREPARE_CASE_COOL)); // Cooldown #endif - if (PVISI(PREPARE_CASE_LANG)) Item_Prepare_Lang(PSCROL(PREPARE_CASE_LANG)); // Language CN/EN + if (PVISI(PREPARE_CASE_LANG)) itemPrepareLang(PSCROL(PREPARE_CASE_LANG)); // Language CN/EN - if (select_prepare.now != CASE_BACK) Draw_Menu_Cursor(PSCROL(select_prepare.now)); + if (select_prepare.now != CASE_BACK) drawMenuCursor(PSCROL(select_prepare.now)); } // // Control Menu // -void Item_Control_Temp(const uint16_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(57, 104, 84, 116, row); +void itemControlTemp(const uint16_t row) { + if (hmiIsChinese()) + itemAreaCopy(57, 104, 84, 116, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_TEMPERATURE)); + dwinDrawLabel(row, GET_TEXT_F(MSG_TEMPERATURE)); #else - Item_AreaCopy(1, 89, 83, 101, row); + itemAreaCopy(1, 89, 83, 101, row); #endif } - Draw_Menu_Line(row, ICON_Temperature); - Draw_More_Icon(row); + drawMenuLine(row, ICON_Temperature); + drawMoreIcon(row); } -void Item_Control_Motion(const uint16_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(87, 104, 114, 116, row); +void itemControlMotion(const uint16_t row) { + if (hmiIsChinese()) + itemAreaCopy(87, 104, 114, 116, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_MOTION)); + dwinDrawLabel(row, GET_TEXT_F(MSG_MOTION)); #else - Item_AreaCopy(84, 89, 128, 99, row); + itemAreaCopy(84, 89, 128, 99, row); #endif } - Draw_Menu_Line(row, ICON_Motion); - Draw_More_Icon(row); + drawMenuLine(row, ICON_Motion); + drawMoreIcon(row); } -void Item_Control_Advanced(const uint16_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(62, 180, 120, 192, row); +void itemControlAdvanced(const uint16_t row) { + if (hmiIsChinese()) + itemAreaCopy(62, 180, 120, 192, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_ADVANCED_SETTINGS)); + dwinDrawLabel(row, GET_TEXT_F(MSG_ADVANCED_SETTINGS)); #else - Item_AreaCopy(82, 135, 200, 149, row); + itemAreaCopy(82, 135, 200, 149, row); #endif } - Draw_Menu_Line(row, ICON_AdvSet); - Draw_More_Icon(row); + drawMenuLine(row, ICON_AdvSet); + drawMoreIcon(row); } -void Item_Control_Info(const uint16_t row) { - if (HMI_IsChinese()) - Item_AreaCopy(231, 104, 258, 116, row); +void itemControlInfo(const uint16_t row) { + if (hmiIsChinese()) + itemAreaCopy(231, 104, 258, 116, row); else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_INFO_SCREEN)); + dwinDrawLabel(row, GET_TEXT_F(MSG_INFO_SCREEN)); #else - Item_AreaCopy(0, 104, 24, 114, row); + itemAreaCopy(0, 104, 24, 114, row); #endif } - Draw_Menu_Line(row, ICON_Info); - Draw_More_Icon(row); + drawMenuLine(row, ICON_Info); + drawMoreIcon(row); } -void Draw_Control_Menu() { - Clear_Main_Window(); +void drawControlMenu() { + clearMainWindow(); #if CONTROL_CASE_TOTAL >= TROWS const int16_t scroll = MROWS - index_control; // Scrolled-up lines @@ -860,62 +847,62 @@ void Draw_Control_Menu() { #define CLINE(L) MBASE(CSCROL(L)) #define CVISI(L) VISI(CONTROL_CASE_TOTAL, L, CSCROL(L)) - if (HMI_IsChinese()) - DWIN_Frame_TitleCopy(103, 1, 28, 14); // "Control" + if (hmiIsChinese()) + dwinFrameTitleCopy(103, 1, 28, 14); // "Control" else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_CONTROL)); + drawTitle(GET_TEXT_F(MSG_CONTROL)); #else - DWIN_Frame_TitleCopy(128, 2, 49, 11); // "Control" + dwinFrameTitleCopy(128, 2, 49, 11); // "Control" #endif } - if (CVISI(0)) Draw_Back_First(select_control.now == CASE_BACK); // < Back - if (CVISI(CONTROL_CASE_TEMP)) Item_Control_Temp(CSCROL(CONTROL_CASE_TEMP)); // Temperature > - if (CVISI(CONTROL_CASE_MOVE)) Item_Control_Motion(CSCROL(CONTROL_CASE_MOVE)); // Motion > + if (CVISI(0)) drawBackFirst(select_control.now == CASE_BACK); // < Back + if (CVISI(CONTROL_CASE_TEMP)) itemControlTemp(CSCROL(CONTROL_CASE_TEMP)); // Temperature > + if (CVISI(CONTROL_CASE_MOVE)) itemControlMotion(CSCROL(CONTROL_CASE_MOVE)); // Motion > - if (HMI_IsChinese()) { + if (hmiIsChinese()) { #if ENABLED(EEPROM_SETTINGS) - Item_AreaCopy(117, 104, 172, 116, CSCROL(CONTROL_CASE_SAVE)); // "Store Configuration" - Item_AreaCopy(174, 103, 229, 116, CSCROL(CONTROL_CASE_LOAD)); // "Read Configuration" - Item_AreaCopy( 1, 118, 56, 131, CSCROL(CONTROL_CASE_RESET)); // "Reset Configuration" + itemAreaCopy(117, 104, 172, 116, CSCROL(CONTROL_CASE_SAVE)); // "Store Configuration" + itemAreaCopy(174, 103, 229, 116, CSCROL(CONTROL_CASE_LOAD)); // "Read Configuration" + itemAreaCopy( 1, 118, 56, 131, CSCROL(CONTROL_CASE_RESET)); // "Reset Configuration" #endif } else { #ifdef USE_STRING_TITLES #if ENABLED(EEPROM_SETTINGS) - if (CVISI(CONTROL_CASE_SAVE)) DWIN_Draw_Label(CSCROL(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); // "Store Configuration" - if (CVISI(CONTROL_CASE_LOAD)) DWIN_Draw_Label(CSCROL(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); // "Read Configuration" - if (CVISI(CONTROL_CASE_RESET)) DWIN_Draw_Label(CSCROL(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); // "Reset Configuration" + if (CVISI(CONTROL_CASE_SAVE)) dwinDrawLabel(CSCROL(CONTROL_CASE_SAVE), GET_TEXT_F(MSG_STORE_EEPROM)); // "Store Configuration" + if (CVISI(CONTROL_CASE_LOAD)) dwinDrawLabel(CSCROL(CONTROL_CASE_LOAD), GET_TEXT_F(MSG_LOAD_EEPROM)); // "Read Configuration" + if (CVISI(CONTROL_CASE_RESET)) dwinDrawLabel(CSCROL(CONTROL_CASE_RESET), GET_TEXT_F(MSG_RESTORE_DEFAULTS)); // "Reset Configuration" #endif #else #if ENABLED(EEPROM_SETTINGS) if (CVISI(CONTROL_CASE_SAVE)) - Item_AreaCopy(150, 89, 263, 102, CSCROL(CONTROL_CASE_SAVE)); // "Store Configuration" + itemAreaCopy(150, 89, 263, 102, CSCROL(CONTROL_CASE_SAVE)); // "Store Configuration" if (CVISI(CONTROL_CASE_LOAD)) { - Item_AreaCopy( 26, 104, 57, 114, CSCROL(CONTROL_CASE_LOAD)); // "Read" - Item_AreaCopy(182, 89, 263, 102, CSCROL(CONTROL_CASE_LOAD), 34); // "Configuration" + itemAreaCopy( 26, 104, 57, 114, CSCROL(CONTROL_CASE_LOAD)); // "Read" + itemAreaCopy(182, 89, 263, 102, CSCROL(CONTROL_CASE_LOAD), 34); // "Configuration" } if (CVISI(CONTROL_CASE_RESET)) { - Item_AreaCopy( 59, 104, 93, 114, CSCROL(CONTROL_CASE_RESET)); // "Reset" - Item_AreaCopy(182, 89, 263, 102, CSCROL(CONTROL_CASE_RESET), 37); // "Configuration" + itemAreaCopy( 59, 104, 93, 114, CSCROL(CONTROL_CASE_RESET)); // "Reset" + itemAreaCopy(182, 89, 263, 102, CSCROL(CONTROL_CASE_RESET), 37); // "Configuration" } #endif #endif } - if (CVISI(CONTROL_CASE_ADVSET)) Item_Control_Advanced(CSCROL(CONTROL_CASE_ADVSET)); - if (CVISI(CONTROL_CASE_INFO)) Item_Control_Info(CSCROL(CONTROL_CASE_INFO)); + if (CVISI(CONTROL_CASE_ADVSET)) itemControlAdvanced(CSCROL(CONTROL_CASE_ADVSET)); + if (CVISI(CONTROL_CASE_INFO)) itemControlInfo(CSCROL(CONTROL_CASE_INFO)); if (select_control.now != CASE_BACK && CVISI(select_control.now)) - Draw_Menu_Cursor(CSCROL(select_control.now)); + drawMenuCursor(CSCROL(select_control.now)); // Draw icons and lines #define _TEMP_ICON(N, I, M) do { \ if (CVISI(N)) { \ - Draw_Menu_Line(CSCROL(N), I); \ + drawMenuLine(CSCROL(N), I); \ if (M) { \ - Draw_More_Icon(CSCROL(N)); \ + drawMoreIcon(CSCROL(N)); \ } \ } \ } while(0) @@ -931,117 +918,117 @@ void Draw_Control_Menu() { // Tune Menu // -void Draw_Tune_Menu() { - Clear_Main_Window(); +void drawTuneMenu() { + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(73, 2, 28, 12); // "Tune" - Item_AreaCopy(116, 164, 171, 176, TUNE_CASE_SPEED); + if (hmiIsChinese()) { + dwinFrameTitleCopy(73, 2, 28, 12); // "Tune" + itemAreaCopy(116, 164, 171, 176, TUNE_CASE_SPEED); #if HAS_HOTEND - Item_AreaCopy(1, 134, 56, 146, TUNE_CASE_TEMP); + itemAreaCopy(1, 134, 56, 146, TUNE_CASE_TEMP); #endif #if HAS_HEATED_BED - Item_AreaCopy(58, 134, 113, 146, TUNE_CASE_BED); + itemAreaCopy(58, 134, 113, 146, TUNE_CASE_BED); #endif #if HAS_FAN - Item_AreaCopy(115, 134, 170, 146, TUNE_CASE_FAN); + itemAreaCopy(115, 134, 170, 146, TUNE_CASE_FAN); #endif #if HAS_ZOFFSET_ITEM - Item_AreaCopy(174, 164, 223, 177, TUNE_CASE_ZOFF); + itemAreaCopy(174, 164, 223, 177, TUNE_CASE_ZOFF); #endif } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_TUNE)); + drawTitle(GET_TEXT_F(MSG_TUNE)); #else - DWIN_Frame_TitleCopy(94, 2, 33, 11); // "Tune" + dwinFrameTitleCopy(94, 2, 33, 11); // "Tune" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(TUNE_CASE_SPEED, GET_TEXT_F(MSG_SPEED)); + dwinDrawLabel(TUNE_CASE_SPEED, GET_TEXT_F(MSG_SPEED)); #if HAS_HOTEND - DWIN_Draw_Label(TUNE_CASE_TEMP, GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + dwinDrawLabel(TUNE_CASE_TEMP, GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); #endif #if HAS_HEATED_BED - DWIN_Draw_Label(TUNE_CASE_BED, GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + dwinDrawLabel(TUNE_CASE_BED, GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); #endif #if HAS_FAN - DWIN_Draw_Label(TUNE_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); + dwinDrawLabel(TUNE_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); #endif - DWIN_Draw_Label(TUNE_CASE_ZOFF, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); + dwinDrawLabel(TUNE_CASE_ZOFF, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); #else - Item_AreaCopy(1, 179, 92, 190, TUNE_CASE_SPEED); // "Print speed" + itemAreaCopy(1, 179, 92, 190, TUNE_CASE_SPEED); // "Print speed" #if HAS_HOTEND - Item_AreaCopy(197, 104, 238, 114, TUNE_CASE_TEMP); // "Hotend" - Item_AreaCopy( 1, 89, 83, 101, TUNE_CASE_TEMP, 44); // "Temperature" + itemAreaCopy(197, 104, 238, 114, TUNE_CASE_TEMP); // "Hotend" + itemAreaCopy( 1, 89, 83, 101, TUNE_CASE_TEMP, 44); // "Temperature" #endif #if HAS_HEATED_BED - Item_AreaCopy(240, 104, 264, 114, TUNE_CASE_BED); // "Bed" - Item_AreaCopy( 1, 89, 83, 101, TUNE_CASE_BED, 27); // "Temperature" + itemAreaCopy(240, 104, 264, 114, TUNE_CASE_BED); // "Bed" + itemAreaCopy( 1, 89, 83, 101, TUNE_CASE_BED, 27); // "Temperature" #endif #if HAS_FAN - Item_AreaCopy(0, 119, 64, 132, TUNE_CASE_FAN); // "Fan speed" + itemAreaCopy(0, 119, 64, 132, TUNE_CASE_FAN); // "Fan speed" #endif #if HAS_ZOFFSET_ITEM - Item_AreaCopy(93, 179, 141, 189, TUNE_CASE_ZOFF); // "Z-offset" + itemAreaCopy(93, 179, 141, 189, TUNE_CASE_ZOFF); // "Z-offset" #endif #endif } - Draw_Back_First(select_tune.now == CASE_BACK); - if (select_tune.now != CASE_BACK) Draw_Menu_Cursor(select_tune.now); + drawBackFirst(select_tune.now == CASE_BACK); + if (select_tune.now != CASE_BACK) drawMenuCursor(select_tune.now); - Draw_Menu_Line(TUNE_CASE_SPEED, ICON_Speed); - Draw_Edit_Integer3(TUNE_CASE_SPEED, feedrate_percentage); + drawMenuLine(TUNE_CASE_SPEED, ICON_Speed); + drawEditInteger3(TUNE_CASE_SPEED, feedrate_percentage); #if HAS_HOTEND - Draw_Menu_Line(TUNE_CASE_TEMP, ICON_HotendTemp); - Draw_Edit_Integer3(TUNE_CASE_TEMP, thermalManager.degTargetHotend(0)); + drawMenuLine(TUNE_CASE_TEMP, ICON_HotendTemp); + drawEditInteger3(TUNE_CASE_TEMP, thermalManager.degTargetHotend(0)); #endif #if HAS_HEATED_BED - Draw_Menu_Line(TUNE_CASE_BED, ICON_BedTemp); - Draw_Edit_Integer3(TUNE_CASE_BED, thermalManager.degTargetBed()); + drawMenuLine(TUNE_CASE_BED, ICON_BedTemp); + drawEditInteger3(TUNE_CASE_BED, thermalManager.degTargetBed()); #endif #if HAS_FAN - Draw_Menu_Line(TUNE_CASE_FAN, ICON_FanSpeed); - Draw_Edit_Integer3(TUNE_CASE_FAN, thermalManager.fan_speed[0]); + drawMenuLine(TUNE_CASE_FAN, ICON_FanSpeed); + drawEditInteger3(TUNE_CASE_FAN, thermalManager.fan_speed[0]); #endif #if HAS_ZOFFSET_ITEM - Draw_Menu_Line(TUNE_CASE_ZOFF, ICON_Zoffset); - Draw_Edit_Signed_Float2(TUNE_CASE_ZOFF, BABY_Z_VAR * 100); + drawMenuLine(TUNE_CASE_ZOFF, ICON_Zoffset); + drawEditSignedFloat2(TUNE_CASE_ZOFF, BABY_Z_VAR * 100); #endif } // // Motion Menu // -void Draw_Motion_Menu() { - Clear_Main_Window(); +void drawMotionMenu() { + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 16, 28, 13); // "Motion" - Item_AreaCopy(173, 133, 228, 147, MOTION_CASE_RATE); // Max speed - Item_AreaCopy(173, 133, 200, 147, MOTION_CASE_ACCEL); // Max... - Item_AreaCopy(28, 149, 69, 161, MOTION_CASE_ACCEL, 30, 1); // ...Acceleration + if (hmiIsChinese()) { + dwinFrameTitleCopy(1, 16, 28, 13); // "Motion" + itemAreaCopy(173, 133, 228, 147, MOTION_CASE_RATE); // Max speed + itemAreaCopy(173, 133, 200, 147, MOTION_CASE_ACCEL); // Max... + itemAreaCopy(28, 149, 69, 161, MOTION_CASE_ACCEL, 30, 1); // ...Acceleration #if HAS_CLASSIC_JERK - Item_AreaCopy(173, 133, 200, 147, MOTION_CASE_JERK); // Max... - Item_AreaCopy(1, 180, 28, 192, MOTION_CASE_JERK, 30, 1); // ... - Item_AreaCopy(202, 133, 228, 147, MOTION_CASE_JERK, 57); // ...Jerk + itemAreaCopy(173, 133, 200, 147, MOTION_CASE_JERK); // Max... + itemAreaCopy(1, 180, 28, 192, MOTION_CASE_JERK, 30, 1); // ... + itemAreaCopy(202, 133, 228, 147, MOTION_CASE_JERK, 57); // ...Jerk #endif - Item_AreaCopy(153, 148, 194, 161, MOTION_CASE_STEPS); // Flow ratio + itemAreaCopy(153, 148, 194, 161, MOTION_CASE_STEPS); // Flow ratio } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_MOTION)); + drawTitle(GET_TEXT_F(MSG_MOTION)); #else - DWIN_Frame_TitleCopy(144, 16, 46, 11); // "Motion" + dwinFrameTitleCopy(144, 16, 46, 11); // "Motion" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(MOTION_CASE_RATE, F("Feedrate")); // "Feedrate" - DWIN_Draw_Label(MOTION_CASE_ACCEL, GET_TEXT_F(MSG_ACCELERATION)); // "Acceleration" + dwinDrawLabel(MOTION_CASE_RATE, F("Feedrate")); // "Feedrate" + dwinDrawLabel(MOTION_CASE_ACCEL, GET_TEXT_F(MSG_ACCELERATION)); // "Acceleration" #if HAS_CLASSIC_JERK - DWIN_Draw_Label(MOTION_CASE_JERK, GET_TEXT_F(MSG_JERK)); // "Jerk" + dwinDrawLabel(MOTION_CASE_JERK, GET_TEXT_F(MSG_JERK)); // "Jerk" #endif - DWIN_Draw_Label(MOTION_CASE_STEPS, GET_TEXT_F(MSG_STEPS_PER_MM)); // "Steps/mm" + dwinDrawLabel(MOTION_CASE_STEPS, GET_TEXT_F(MSG_STEPS_PER_MM)); // "Steps/mm" #else say_max_en(MOTION_CASE_RATE); say_speed_en(30, MOTION_CASE_RATE); // "Max Speed" say_max_accel_en(MOTION_CASE_ACCEL); // "Max Acceleration" @@ -1052,17 +1039,17 @@ void Draw_Motion_Menu() { #endif } - Draw_Back_First(select_motion.now == CASE_BACK); - if (select_motion.now != CASE_BACK) Draw_Menu_Cursor(select_motion.now); + drawBackFirst(select_motion.now == CASE_BACK); + if (select_motion.now != CASE_BACK) drawMenuCursor(select_motion.now); uint8_t i = 0; - #define _MOTION_ICON(N) Draw_Menu_Line(++i, ICON_MaxSpeed + (N) - 1) - _MOTION_ICON(MOTION_CASE_RATE); Draw_More_Icon(i); - _MOTION_ICON(MOTION_CASE_ACCEL); Draw_More_Icon(i); + #define _MOTION_ICON(N) drawMenuLine(++i, ICON_MaxSpeed + (N) - 1) + _MOTION_ICON(MOTION_CASE_RATE); drawMoreIcon(i); + _MOTION_ICON(MOTION_CASE_ACCEL); drawMoreIcon(i); #if HAS_CLASSIC_JERK - _MOTION_ICON(MOTION_CASE_JERK); Draw_More_Icon(i); + _MOTION_ICON(MOTION_CASE_JERK); drawMoreIcon(i); #endif - _MOTION_ICON(MOTION_CASE_STEPS); Draw_More_Icon(i); + _MOTION_ICON(MOTION_CASE_STEPS); drawMoreIcon(i); } // @@ -1071,339 +1058,339 @@ void Draw_Motion_Menu() { #if HAS_HOTEND || HAS_HEATED_BED - void DWIN_Popup_Temperature(const bool toohigh) { - Clear_Popup_Area(); - Draw_Popup_Bkgd_105(); + void dwinPopupTemperature(const bool toohigh) { + clearPopupArea(); + drawPopupBkgd105(); if (toohigh) { - DWIN_ICON_Show(ICON, ICON_TempTooHigh, 102, 165); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 103, 371, 237, 386, 52, 285); // Temp Too High - DWIN_Frame_AreaCopy(1, 151, 389, 185, 402, 187, 285); - DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); + dwinIconShow(ICON, ICON_TempTooHigh, 102, 165); + if (hmiIsChinese()) { + dwinFrameAreaCopy(1, 103, 371, 237, 386, 52, 285); // Temp Too High + dwinFrameAreaCopy(1, 151, 389, 185, 402, 187, 285); + dwinFrameAreaCopy(1, 189, 389, 271, 402, 95, 310); } else { - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too high")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too high")); } } else { - DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 165); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 103, 371, 270, 386, 52, 285); // Tenp Too Low - DWIN_Frame_AreaCopy(1, 189, 389, 271, 402, 95, 310); + dwinIconShow(ICON, ICON_TempTooLow, 102, 165); + if (hmiIsChinese()) { + dwinFrameAreaCopy(1, 103, 371, 270, 386, 52, 285); // Tenp Too Low + dwinFrameAreaCopy(1, 189, 389, 271, 402, 95, 310); } else { - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too low")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, 36, 300, F("Nozzle or Bed temperature")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, 92, 300, F("is too low")); } } } #endif -void Draw_Popup_Bkgd_60() { - DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 60, 258, 330); +void drawPopupBkgd60() { + dwinDrawRectangle(1, Color_Bg_Window, 14, 60, 258, 330); } #if HAS_HOTEND - void Popup_Window_ETempTooLow() { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - DWIN_ICON_Show(ICON, ICON_TempTooLow, 102, 105); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 103, 371, 136, 386, 69, 240); // Nozzle Too Cold - DWIN_Frame_AreaCopy(1, 170, 371, 270, 386, 69 + 33, 240); - DWIN_ICON_Show(ICON, ICON_Confirm_C, 86, 280); + void popupWindowETempTooLow() { + clearMainWindow(); + drawPopupBkgd60(); + dwinIconShow(ICON, ICON_TempTooLow, 102, 105); + if (hmiIsChinese()) { + dwinFrameAreaCopy(1, 103, 371, 136, 386, 69, 240); // Nozzle Too Cold + dwinFrameAreaCopy(1, 170, 371, 270, 386, 69 + 33, 240); + dwinIconShow(ICON, ICON_Confirm_C, 86, 280); } else { - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, 20, 235, F("Nozzle is too cold")); - DWIN_ICON_Show(ICON, ICON_Confirm_E, 86, 280); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, 20, 235, F("Nozzle is too cold")); + dwinIconShow(ICON, ICON_Confirm_E, 86, 280); } } #endif -void Popup_Window_Resume() { - Clear_Popup_Area(); - Draw_Popup_Bkgd_105(); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 160, 338, 235, 354, 98, 135); // Resume Interrupted Print - DWIN_Frame_AreaCopy(1, 103, 321, 271, 335, 52, 192); - DWIN_ICON_Show(ICON, ICON_Cancel_C, 26, 307); - DWIN_ICON_Show(ICON, ICON_Continue_C, 146, 307); +void popupWindowResume() { + clearPopupArea(); + drawPopupBkgd105(); + if (hmiIsChinese()) { + dwinFrameAreaCopy(1, 160, 338, 235, 354, 98, 135); // Resume Interrupted Print + dwinFrameAreaCopy(1, 103, 321, 271, 335, 52, 192); + dwinIconShow(ICON, ICON_Cancel_C, 26, 307); + dwinIconShow(ICON, ICON_Continue_C, 146, 307); } else { - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 14) / 2, 115, F("Continue Print")); - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 192, F("It looks like the last")); - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 212, F("file was interrupted.")); - DWIN_ICON_Show(ICON, ICON_Cancel_E, 26, 307); - DWIN_ICON_Show(ICON, ICON_Continue_E, 146, 307); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 14) / 2, 115, F("Continue Print")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 192, F("It looks like the last")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 22) / 2, 212, F("file was interrupted.")); + dwinIconShow(ICON, ICON_Cancel_E, 26, 307); + dwinIconShow(ICON, ICON_Continue_E, 146, 307); } } -void Popup_Window_Home(const bool parking/*=false*/) { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - DWIN_ICON_Show(ICON, ICON_BLTouch, 101, 105); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 0, 371, 33, 386, 85, 240); // Wait for Move to Complete - DWIN_Frame_AreaCopy(1, 203, 286, 271, 302, 118, 240); - DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); +void popupWindowHome(const bool parking/*=false*/) { + clearMainWindow(); + drawPopupBkgd60(); + dwinIconShow(ICON, ICON_BLTouch, 101, 105); + if (hmiIsChinese()) { + dwinFrameAreaCopy(1, 0, 371, 33, 386, 85, 240); // Wait for Move to Complete + dwinFrameAreaCopy(1, 203, 286, 271, 302, 118, 240); + dwinFrameAreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * (parking ? 7 : 10)) / 2, 230, parking ? F("Parking") : F("Homing XYZ")); - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * (parking ? 7 : 10)) / 2, 230, parking ? F("Parking") : F("Homing XYZ")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); } } #if HAS_ONESTEP_LEVELING - void Popup_Window_Leveling() { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - DWIN_ICON_Show(ICON, ICON_AutoLeveling, 101, 105); - if (HMI_IsChinese()) { - DWIN_Frame_AreaCopy(1, 0, 371, 100, 386, 84, 240); // Wait for Leveling - DWIN_Frame_AreaCopy(1, 0, 389, 150, 402, 61, 280); + void popupWindowLeveling() { + clearMainWindow(); + drawPopupBkgd60(); + dwinIconShow(ICON, ICON_AutoLeveling, 101, 105); + if (hmiIsChinese()) { + dwinFrameAreaCopy(1, 0, 371, 100, 386, 84, 240); // Wait for Leveling + dwinFrameAreaCopy(1, 0, 389, 150, 402, 61, 280); } else { - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 13) / 2, 230, GET_TEXT_F(MSG_BED_LEVELING)); - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 13) / 2, 230, GET_TEXT_F(MSG_BED_LEVELING)); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 23) / 2, 260, F("Please wait until done.")); } } #endif -void Draw_Select_Highlight(const bool sel) { - HMI_flag.select_flag = sel; +void drawSelectHighlight(const bool sel) { + hmiFlag.select_flag = sel; const uint16_t c1 = sel ? Select_Color : Color_Bg_Window, c2 = sel ? Color_Bg_Window : Select_Color; - DWIN_Draw_Rectangle(0, c1, 25, 279, 126, 318); - DWIN_Draw_Rectangle(0, c1, 24, 278, 127, 319); - DWIN_Draw_Rectangle(0, c2, 145, 279, 246, 318); - DWIN_Draw_Rectangle(0, c2, 144, 278, 247, 319); + dwinDrawRectangle(0, c1, 25, 279, 126, 318); + dwinDrawRectangle(0, c1, 24, 278, 127, 319); + dwinDrawRectangle(0, c2, 145, 279, 246, 318); + dwinDrawRectangle(0, c2, 144, 278, 247, 319); } -void Popup_window_PauseOrStop() { - Clear_Main_Window(); - Draw_Popup_Bkgd_60(); - if (HMI_IsChinese()) { - if (select_print.now == PRINT_PAUSE_RESUME) DWIN_Frame_AreaCopy(1, 237, 338, 269, 356, 98, 150); // Pause - else if (select_print.now == PRINT_STOP) DWIN_Frame_AreaCopy(1, 221, 320, 253, 336, 98, 150); // Stop - DWIN_Frame_AreaCopy(1, 220, 304, 264, 319, 130, 150); // Print - DWIN_ICON_Show(ICON, ICON_Confirm_C, 26, 280); - DWIN_ICON_Show(ICON, ICON_Cancel_C, 146, 280); +void popupwindowPauseOrStop() { + clearMainWindow(); + drawPopupBkgd60(); + if (hmiIsChinese()) { + if (select_print.now == PRINT_PAUSE_RESUME) dwinFrameAreaCopy(1, 237, 338, 269, 356, 98, 150); // Pause + else if (select_print.now == PRINT_STOP) dwinFrameAreaCopy(1, 221, 320, 253, 336, 98, 150); // Stop + dwinFrameAreaCopy(1, 220, 304, 264, 319, 130, 150); // Print + dwinIconShow(ICON, ICON_Confirm_C, 26, 280); + dwinIconShow(ICON, ICON_Cancel_C, 146, 280); } else { - if (select_print.now == PRINT_PAUSE_RESUME) DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 11) / 2, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); - else if (select_print.now == PRINT_STOP) DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 10) / 2, 150, GET_TEXT_F(MSG_STOP_PRINT)); - DWIN_ICON_Show(ICON, ICON_Confirm_E, 26, 280); - DWIN_ICON_Show(ICON, ICON_Cancel_E, 146, 280); + if (select_print.now == PRINT_PAUSE_RESUME) dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 11) / 2, 150, GET_TEXT_F(MSG_PAUSE_PRINT)); + else if (select_print.now == PRINT_STOP) dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, (272 - 8 * 10) / 2, 150, GET_TEXT_F(MSG_STOP_PRINT)); + dwinIconShow(ICON, ICON_Confirm_E, 26, 280); + dwinIconShow(ICON, ICON_Cancel_E, 146, 280); } - Draw_Select_Highlight(true); + drawSelectHighlight(true); } -void Draw_Printing_Screen() { +void drawPrintingScreen() { const uint16_t y = 168; - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(30, 1, 42, 14); // "Printing" - DWIN_Frame_AreaCopy(1, 0, 72, 63, 86, 43, y); // "Printing Time" - DWIN_Frame_AreaCopy(1, 65, 72, 128, 86, 178, y); // "Remain" + if (hmiIsChinese()) { + dwinFrameTitleCopy(30, 1, 42, 14); // "Printing" + dwinFrameAreaCopy(1, 0, 72, 63, 86, 43, y); // "Printing Time" + dwinFrameAreaCopy(1, 65, 72, 128, 86, 178, y); // "Remain" } else { - DWIN_Frame_TitleCopy(42, 0, 47, 14); // "Printing" - DWIN_Frame_AreaCopy(1, 1, 43, 97, 59, 43, y); // "Printing Time" - DWIN_Frame_AreaCopy(1, 100, 43, 152, 56, 178, y); // "Remain" + dwinFrameTitleCopy(42, 0, 47, 14); // "Printing" + dwinFrameAreaCopy(1, 1, 43, 97, 59, 43, y); // "Printing Time" + dwinFrameAreaCopy(1, 100, 43, 152, 56, 178, y); // "Remain" } } -void Draw_Print_ProgressBar() { +void drawPrintProgressBar() { constexpr uint16_t y = 93, h = 21; - DWIN_ICON_Show(ICON, ICON_Bar, 15, 93); - DWIN_Draw_Rectangle(1, BarFill_Color, 16 + _card_percent * 240 / 100, y, 256, y + h - 1); - DWIN_Draw_IntValue(true, true, 0, font8x16, Percent_Color, Color_Bg_Black, 2, 117, y + 40, _card_percent); - DWIN_Draw_String(false, font8x16, Percent_Color, Color_Bg_Black, 133, y + 40, F("%")); + dwinIconShow(ICON, ICON_Bar, 15, 93); + dwinDrawRectangle(1, BarFill_Color, 16 + _card_percent * 240 / 100, y, 256, y + h - 1); + dwinDrawIntValue(true, true, 0, font8x16, Percent_Color, Color_Bg_Black, 2, 117, y + 40, _card_percent); + dwinDrawString(false, font8x16, Percent_Color, Color_Bg_Black, 133, y + 40, F("%")); } -void Draw_Print_ProgressElapsed() { +void drawPrintProgressElapsed() { constexpr uint16_t x = 45, y = 192; duration_t elapsed = print_job_timer.duration(); // print timer - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, x, y, elapsed.value / 3600); - DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, x + 8 * 2, y, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, x + 8 * 3, y, (elapsed.value % 3600) / 60); + dwinDrawIntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, x, y, elapsed.value / 3600); + dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, x + 8 * 2, y, F(":")); + dwinDrawIntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, x + 8 * 3, y, (elapsed.value % 3600) / 60); } -void Draw_Print_ProgressRemain() { +void drawPrintProgressRemain() { constexpr uint16_t x = 179, y = 192; - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, x, y, _remain_time / 3600); - DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, x + 8 * 2, y, F(":")); - DWIN_Draw_IntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, x + 8 * 3, y, (_remain_time % 3600) / 60); + dwinDrawIntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, x, y, _remain_time / 3600); + dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, x + 8 * 2, y, F(":")); + dwinDrawIntValue(true, true, 1, font8x16, Color_White, Color_Bg_Black, 2, x + 8 * 3, y, (_remain_time % 3600) / 60); } -void Goto_PrintProcess() { +void gotoPrintProcess() { checkkey = PrintProcess; - Clear_Main_Window(); - Draw_Printing_Screen(); + clearMainWindow(); + drawPrintingScreen(); - ICON_Tune(); - ICON_ResumeOrPause(); - ICON_Stop(); + iconTune(); + iconResumeOrPause(); + iconStop(); // Copy into filebuf string before entry char * const name = card.longest_filename(); const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * MENU_CHR_W) / 2; - DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, npos, 60, name); + dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, npos, 60, name); - DWIN_ICON_Show(ICON, ICON_PrintTime, 17, 163); - DWIN_ICON_Show(ICON, ICON_RemainTime, 150, 161); + dwinIconShow(ICON, ICON_PrintTime, 17, 163); + dwinIconShow(ICON, ICON_RemainTime, 150, 161); - Draw_Print_ProgressBar(); - Draw_Print_ProgressElapsed(); - Draw_Print_ProgressRemain(); + drawPrintProgressBar(); + drawPrintProgressElapsed(); + drawPrintProgressRemain(); } -void Goto_MainMenu() { +void gotoMainMenu() { checkkey = MainMenu; - Clear_Main_Window(); + clearMainWindow(); - if (HMI_IsChinese()) - DWIN_Frame_TitleCopy(2, 2, 26, 13); // "Home" etc + if (hmiIsChinese()) + dwinFrameTitleCopy(2, 2, 26, 13); // "Home" etc else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_MAIN_MENU)); + drawTitle(GET_TEXT_F(MSG_MAIN_MENU)); #else - DWIN_Frame_TitleCopy(0, 2, 40, 11); // "Home" + dwinFrameTitleCopy(0, 2, 40, 11); // "Home" #endif } - DWIN_ICON_Show(ICON, ICON_LOGO, 71, 52); + dwinIconShow(ICON, ICON_LOGO, 71, 52); - ICON_Print(); - ICON_Prepare(); - ICON_Control(); - TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(); + iconPrint(); + iconPrepare(); + iconControl(); + TERN(HAS_ONESTEP_LEVELING, iconLeveling, iconStartInfo)(); } -void HMI_Plan_Move(const feedRate_t fr_mm_s) { +void hmiPlanMove(const feedRate_t fr_mm_s) { if (!planner.is_full()) { planner.synchronize(); planner.buffer_line(current_position, fr_mm_s); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } } -void HMI_Move_Done(const AxisEnum axis) { - EncoderRate.enabled = false; +void hmiMoveDone(const AxisEnum axis) { + encoderRate.enabled = false; planner.synchronize(); checkkey = AxisMove; - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void HMI_Move_X() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void hmiMoveX() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_X_scaled)) { - Draw_Edit_Float3(1, HMI_ValueStruct.Move_X_scaled); - return HMI_Move_Done(X_AXIS); + if (applyEncoder(encoder_diffState, hmiValues.Move_X_scaled)) { + drawEditFloat3(1, hmiValues.Move_X_scaled); + return hmiMoveDone(X_AXIS); } - LIMIT(HMI_ValueStruct.Move_X_scaled, (X_MIN_POS) * MINUNITMULT, (X_MAX_POS) * MINUNITMULT); - current_position.x = HMI_ValueStruct.Move_X_scaled / MINUNITMULT; - Draw_Edit_Float3(1, HMI_ValueStruct.Move_X_scaled, true); - DWIN_UpdateLCD(); - HMI_Plan_Move(homing_feedrate(X_AXIS)); + LIMIT(hmiValues.Move_X_scaled, (X_MIN_POS) * MINUNITMULT, (X_MAX_POS) * MINUNITMULT); + current_position.x = hmiValues.Move_X_scaled / MINUNITMULT; + drawEditFloat3(1, hmiValues.Move_X_scaled, true); + dwinUpdateLCD(); + hmiPlanMove(homing_feedrate(X_AXIS)); } -void HMI_Move_Y() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void hmiMoveY() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Y_scaled)) { - Draw_Edit_Float3(2, HMI_ValueStruct.Move_Y_scaled); - return HMI_Move_Done(Y_AXIS); + if (applyEncoder(encoder_diffState, hmiValues.Move_Y_scaled)) { + drawEditFloat3(2, hmiValues.Move_Y_scaled); + return hmiMoveDone(Y_AXIS); } - LIMIT(HMI_ValueStruct.Move_Y_scaled, (Y_MIN_POS) * MINUNITMULT, (Y_MAX_POS) * MINUNITMULT); - current_position.y = HMI_ValueStruct.Move_Y_scaled / MINUNITMULT; - Draw_Edit_Float3(2, HMI_ValueStruct.Move_Y_scaled, true); - DWIN_UpdateLCD(); - HMI_Plan_Move(homing_feedrate(Y_AXIS)); + LIMIT(hmiValues.Move_Y_scaled, (Y_MIN_POS) * MINUNITMULT, (Y_MAX_POS) * MINUNITMULT); + current_position.y = hmiValues.Move_Y_scaled / MINUNITMULT; + drawEditFloat3(2, hmiValues.Move_Y_scaled, true); + dwinUpdateLCD(); + hmiPlanMove(homing_feedrate(Y_AXIS)); } -void HMI_Move_Z() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void hmiMoveZ() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_Z_scaled)) { - Draw_Edit_Float3(3, HMI_ValueStruct.Move_Z_scaled); - return HMI_Move_Done(Z_AXIS); + if (applyEncoder(encoder_diffState, hmiValues.Move_Z_scaled)) { + drawEditFloat3(3, hmiValues.Move_Z_scaled); + return hmiMoveDone(Z_AXIS); } - LIMIT(HMI_ValueStruct.Move_Z_scaled, (Z_MIN_POS) * MINUNITMULT, (Z_MAX_POS) * MINUNITMULT); - current_position.z = HMI_ValueStruct.Move_Z_scaled / MINUNITMULT; - Draw_Edit_Float3(3, HMI_ValueStruct.Move_Z_scaled, true); - DWIN_UpdateLCD(); - HMI_Plan_Move(homing_feedrate(Z_AXIS)); + LIMIT(hmiValues.Move_Z_scaled, (Z_MIN_POS) * MINUNITMULT, (Z_MAX_POS) * MINUNITMULT); + current_position.z = hmiValues.Move_Z_scaled / MINUNITMULT; + drawEditFloat3(3, hmiValues.Move_Z_scaled, true); + dwinUpdateLCD(); + hmiPlanMove(homing_feedrate(Z_AXIS)); } #if HAS_HOTEND - void HMI_Move_E() { + void hmiMoveE() { static float last_E_scaled = 0; - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Move_E_scaled)) { - last_E_scaled = HMI_ValueStruct.Move_E_scaled; - Draw_Edit_Signed_Float3(4, last_E_scaled); - return HMI_Move_Done(E_AXIS); + if (applyEncoder(encoder_diffState, hmiValues.Move_E_scaled)) { + last_E_scaled = hmiValues.Move_E_scaled; + drawEditSignedFloat3(4, last_E_scaled); + return hmiMoveDone(E_AXIS); } - LIMIT(HMI_ValueStruct.Move_E_scaled, last_E_scaled - (EXTRUDE_MAXLENGTH) * MINUNITMULT, last_E_scaled + (EXTRUDE_MAXLENGTH) * MINUNITMULT); - current_position.e = HMI_ValueStruct.Move_E_scaled / MINUNITMULT; - Draw_Edit_Signed_Float3(4, HMI_ValueStruct.Move_E_scaled, true); - DWIN_UpdateLCD(); - HMI_Plan_Move(MMM_TO_MMS(FEEDRATE_E)); + LIMIT(hmiValues.Move_E_scaled, last_E_scaled - (EXTRUDE_MAXLENGTH) * MINUNITMULT, last_E_scaled + (EXTRUDE_MAXLENGTH) * MINUNITMULT); + current_position.e = hmiValues.Move_E_scaled / MINUNITMULT; + drawEditSignedFloat3(4, hmiValues.Move_E_scaled, true); + dwinUpdateLCD(); + hmiPlanMove(MMM_TO_MMS(FEEDRATE_E)); } #endif #if HAS_ZOFFSET_ITEM - void HMI_Zoffset() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + void hmiZoffset() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; uint8_t zoff_line; - switch (HMI_ValueStruct.show_mode) { + switch (hmiValues.show_mode) { case -4: zoff_line = PREPARE_CASE_ZOFF + MROWS - index_prepare; break; default: zoff_line = TUNE_CASE_ZOFF + MROWS - index_tune; } - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.offset_value)) { - EncoderRate.enabled = false; + if (applyEncoder(encoder_diffState, hmiValues.offset_value)) { + encoderRate.enabled = false; #if HAS_BED_PROBE probe.offset.z = dwin_zoffset; TERN_(EEPROM_SETTINGS, settings.save()); #endif - checkkey = HMI_ValueStruct.show_mode == -4 ? Prepare : Tune; - Draw_Edit_Signed_Float2(zoff_line, TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, HMI_ValueStruct.offset_value)); - DWIN_UpdateLCD(); + checkkey = hmiValues.show_mode == -4 ? Prepare : Tune; + drawEditSignedFloat2(zoff_line, TERN(HAS_BED_PROBE, BABY_Z_VAR * 100, hmiValues.offset_value)); + dwinUpdateLCD(); return; } - LIMIT(HMI_ValueStruct.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100, (Z_PROBE_OFFSET_RANGE_MAX) * 100); + LIMIT(hmiValues.offset_value, (Z_PROBE_OFFSET_RANGE_MIN) * 100, (Z_PROBE_OFFSET_RANGE_MAX) * 100); last_zoffset = dwin_zoffset; - dwin_zoffset = HMI_ValueStruct.offset_value / 100.0f; - #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) + dwin_zoffset = hmiValues.offset_value / 100.0f; + #if ANY(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) if (BABYSTEP_ALLOWED()) babystep.add_mm(Z_AXIS, dwin_zoffset - last_zoffset); #endif - Draw_Edit_Signed_Float2(zoff_line, HMI_ValueStruct.offset_value, true); - DWIN_UpdateLCD(); + drawEditSignedFloat2(zoff_line, hmiValues.offset_value, true); + dwinUpdateLCD(); } #endif // HAS_ZOFFSET_ITEM #if HAS_HOTEND - void HMI_ETemp() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + void hmiETemp() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; uint8_t temp_line; - switch (HMI_ValueStruct.show_mode) { + switch (hmiValues.show_mode) { case -1: temp_line = TEMP_CASE_TEMP; break; #if HAS_PREHEAT case -2: temp_line = PREHEAT_CASE_TEMP; break; @@ -1413,48 +1400,48 @@ void HMI_Move_Z() { #endif default: temp_line = TUNE_CASE_TEMP + MROWS - index_tune; } - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.E_Temp)) { - EncoderRate.enabled = false; + if (applyEncoder(encoder_diffState, hmiValues.E_Temp)) { + encoderRate.enabled = false; #if HAS_PREHEAT - if (HMI_ValueStruct.show_mode == -2) { + if (hmiValues.show_mode == -2) { checkkey = PLAPreheat; - ui.material_preset[0].hotend_temp = HMI_ValueStruct.E_Temp; - Draw_Edit_Integer3(temp_line, ui.material_preset[0].hotend_temp); + ui.material_preset[0].hotend_temp = hmiValues.E_Temp; + drawEditInteger3(temp_line, ui.material_preset[0].hotend_temp); return; } #if PREHEAT_COUNT > 1 - if (HMI_ValueStruct.show_mode == -3) { + if (hmiValues.show_mode == -3) { checkkey = ABSPreheat; - ui.material_preset[1].hotend_temp = HMI_ValueStruct.E_Temp; - Draw_Edit_Integer3(temp_line, ui.material_preset[1].hotend_temp); + ui.material_preset[1].hotend_temp = hmiValues.E_Temp; + drawEditInteger3(temp_line, ui.material_preset[1].hotend_temp); return; } #endif #endif - if (HMI_ValueStruct.show_mode == -1) // Temperature + if (hmiValues.show_mode == -1) // Temperature checkkey = TemperatureID; else checkkey = Tune; - Draw_Edit_Integer3(temp_line, HMI_ValueStruct.E_Temp); - thermalManager.setTargetHotend(HMI_ValueStruct.E_Temp, 0); + drawEditInteger3(temp_line, hmiValues.E_Temp); + thermalManager.setTargetHotend(hmiValues.E_Temp, 0); return; } // E_Temp limit - LIMIT(HMI_ValueStruct.E_Temp, HEATER_0_MINTEMP, thermalManager.hotend_max_target(0)); + LIMIT(hmiValues.E_Temp, HEATER_0_MINTEMP, thermalManager.hotend_max_target(0)); // E_Temp value - Draw_Edit_Integer3(temp_line, HMI_ValueStruct.E_Temp, true); + drawEditInteger3(temp_line, hmiValues.E_Temp, true); } #endif // HAS_HOTEND #if HAS_HEATED_BED - void HMI_BedTemp() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + void hmiBedTemp() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; uint8_t bed_line; - switch (HMI_ValueStruct.show_mode) { + switch (hmiValues.show_mode) { case -1: bed_line = TEMP_CASE_BED; break; #if HAS_PREHEAT case -2: bed_line = PREHEAT_CASE_BED; break; @@ -1464,175 +1451,171 @@ void HMI_Move_Z() { #endif default: bed_line = TUNE_CASE_BED + MROWS - index_tune; } - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Bed_Temp)) { - EncoderRate.enabled = false; + if (applyEncoder(encoder_diffState, hmiValues.Bed_Temp)) { + encoderRate.enabled = false; #if HAS_PREHEAT - if (HMI_ValueStruct.show_mode == -2) { + if (hmiValues.show_mode == -2) { checkkey = PLAPreheat; - ui.material_preset[0].bed_temp = HMI_ValueStruct.Bed_Temp; - Draw_Edit_Integer3(bed_line, ui.material_preset[0].bed_temp); + ui.material_preset[0].bed_temp = hmiValues.Bed_Temp; + drawEditInteger3(bed_line, ui.material_preset[0].bed_temp); return; } #if PREHEAT_COUNT > 1 - if (HMI_ValueStruct.show_mode == -3) { + if (hmiValues.show_mode == -3) { checkkey = ABSPreheat; - ui.material_preset[1].bed_temp = HMI_ValueStruct.Bed_Temp; - Draw_Edit_Integer3(bed_line, ui.material_preset[1].bed_temp); + ui.material_preset[1].bed_temp = hmiValues.Bed_Temp; + drawEditInteger3(bed_line, ui.material_preset[1].bed_temp); return; } #endif #endif - checkkey = HMI_ValueStruct.show_mode == -1 ? TemperatureID : Tune; - Draw_Edit_Integer3(bed_line, HMI_ValueStruct.Bed_Temp); - thermalManager.setTargetBed(HMI_ValueStruct.Bed_Temp); + checkkey = hmiValues.show_mode == -1 ? TemperatureID : Tune; + drawEditInteger3(bed_line, hmiValues.Bed_Temp); + thermalManager.setTargetBed(hmiValues.Bed_Temp); return; } // Bed_Temp limit - LIMIT(HMI_ValueStruct.Bed_Temp, BED_MINTEMP, BED_MAX_TARGET); + LIMIT(hmiValues.Bed_Temp, BED_MINTEMP, BED_MAX_TARGET); // Bed_Temp value - Draw_Edit_Integer3(bed_line, HMI_ValueStruct.Bed_Temp, true); + drawEditInteger3(bed_line, hmiValues.Bed_Temp, true); } #endif // HAS_HEATED_BED #if HAS_PREHEAT && HAS_FAN - void HMI_FanSpeed() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + void hmiFanSpeed() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; uint8_t fan_line; - switch (HMI_ValueStruct.show_mode) { + switch (hmiValues.show_mode) { case -1: fan_line = TEMP_CASE_FAN; break; case -2: fan_line = PREHEAT_CASE_FAN; break; case -3: fan_line = PREHEAT_CASE_FAN; break; default: fan_line = TUNE_CASE_FAN + MROWS - index_tune; } - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Fan_speed)) { - EncoderRate.enabled = false; - if (HMI_ValueStruct.show_mode == -2) { + if (applyEncoder(encoder_diffState, hmiValues.Fan_speed)) { + encoderRate.enabled = false; + if (hmiValues.show_mode == -2) { checkkey = PLAPreheat; - ui.material_preset[0].fan_speed = HMI_ValueStruct.Fan_speed; - Draw_Edit_Integer3(fan_line, ui.material_preset[0].fan_speed); + ui.material_preset[0].fan_speed = hmiValues.Fan_speed; + drawEditInteger3(fan_line, ui.material_preset[0].fan_speed); return; } #if PREHEAT_COUNT > 1 - if (HMI_ValueStruct.show_mode == -3) { + if (hmiValues.show_mode == -3) { checkkey = ABSPreheat; - ui.material_preset[1].fan_speed = HMI_ValueStruct.Fan_speed; - Draw_Edit_Integer3(fan_line, ui.material_preset[1].fan_speed); + ui.material_preset[1].fan_speed = hmiValues.Fan_speed; + drawEditInteger3(fan_line, ui.material_preset[1].fan_speed); return; } #endif - checkkey = HMI_ValueStruct.show_mode == -1 ? TemperatureID : Tune; - Draw_Edit_Integer3(fan_line, HMI_ValueStruct.Fan_speed); - thermalManager.set_fan_speed(0, HMI_ValueStruct.Fan_speed); + checkkey = hmiValues.show_mode == -1 ? TemperatureID : Tune; + drawEditInteger3(fan_line, hmiValues.Fan_speed); + thermalManager.set_fan_speed(0, hmiValues.Fan_speed); return; } // Fan_speed limit - LIMIT(HMI_ValueStruct.Fan_speed, 0, 255); + LIMIT(hmiValues.Fan_speed, 0, 255); // Fan_speed value - Draw_Edit_Integer3(fan_line, HMI_ValueStruct.Fan_speed, true); + drawEditInteger3(fan_line, hmiValues.Fan_speed, true); } #endif // HAS_PREHEAT && HAS_FAN -void HMI_PrintSpeed() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void hmiPrintSpeed() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.print_speed)) { + if (applyEncoder(encoder_diffState, hmiValues.print_speed)) { checkkey = Tune; - EncoderRate.enabled = false; - feedrate_percentage = HMI_ValueStruct.print_speed; - Draw_Edit_Integer3(select_tune.now + MROWS - index_tune, HMI_ValueStruct.print_speed); + encoderRate.enabled = false; + feedrate_percentage = hmiValues.print_speed; + drawEditInteger3(select_tune.now + MROWS - index_tune, hmiValues.print_speed); return; } // print_speed limit - LIMIT(HMI_ValueStruct.print_speed, MIN_PRINT_SPEED, MAX_PRINT_SPEED); + LIMIT(hmiValues.print_speed, MIN_PRINT_SPEED, MAX_PRINT_SPEED); // print_speed value - Draw_Edit_Integer3(select_tune.now + MROWS - index_tune, HMI_ValueStruct.print_speed, true); + drawEditInteger3(select_tune.now + MROWS - index_tune, hmiValues.print_speed, true); } #define LAST_AXIS TERN(HAS_HOTEND, E_AXIS, Z_AXIS) -void HMI_MaxFeedspeedXYZE() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void hmiMaxFeedspeedXYZE() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Feedspeed)) { + if (applyEncoder(encoder_diffState, hmiValues.Max_Feedspeed)) { checkkey = MaxSpeed; - EncoderRate.enabled = false; - if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, LAST_AXIS)) - planner.set_max_feedrate(HMI_flag.feedspeed_axis, HMI_ValueStruct.Max_Feedspeed); - Draw_Edit_Integer4(select_speed.now, HMI_ValueStruct.Max_Feedspeed); + encoderRate.enabled = false; + if (WITHIN(hmiFlag.feedspeed_axis, X_AXIS, LAST_AXIS)) + planner.set_max_feedrate(hmiFlag.feedspeed_axis, hmiValues.Max_Feedspeed); + drawEditInteger4(select_speed.now, hmiValues.Max_Feedspeed); return; } // MaxFeedspeed limit - 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; + if (WITHIN(hmiFlag.feedspeed_axis, X_AXIS, LAST_AXIS)) + LIMIT(hmiValues.Max_Feedspeed, min_feedrate_edit_values[hmiFlag.feedspeed_axis], max_feedrate_edit_values[hmiFlag.feedspeed_axis]); // MaxFeedspeed value - Draw_Edit_Integer4(select_speed.now, HMI_ValueStruct.Max_Feedspeed, true); + drawEditInteger4(select_speed.now, hmiValues.Max_Feedspeed, true); } -void HMI_MaxAccelerationXYZE() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void hmiMaxAccelerationXYZE() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Acceleration)) { + if (applyEncoder(encoder_diffState, hmiValues.Max_Acceleration)) { checkkey = MaxAcceleration; - EncoderRate.enabled = false; - if (WITHIN(HMI_flag.acc_axis, X_AXIS, LAST_AXIS)) - planner.set_max_acceleration(HMI_flag.acc_axis, HMI_ValueStruct.Max_Acceleration); - Draw_Edit_Integer4(select_acc.now, HMI_ValueStruct.Max_Acceleration); + encoderRate.enabled = false; + if (WITHIN(hmiFlag.acc_axis, X_AXIS, LAST_AXIS)) + planner.set_max_acceleration(hmiFlag.acc_axis, hmiValues.Max_Acceleration); + drawEditInteger4(select_acc.now, hmiValues.Max_Acceleration); return; } // MaxAcceleration limit - 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; + if (WITHIN(hmiFlag.acc_axis, X_AXIS, LAST_AXIS)) + LIMIT(hmiValues.Max_Acceleration, min_acceleration_edit_values[hmiFlag.acc_axis], max_acceleration_edit_values[hmiFlag.acc_axis]); // MaxAcceleration value - Draw_Edit_Integer4(select_acc.now, HMI_ValueStruct.Max_Acceleration, true); + drawEditInteger4(select_acc.now, hmiValues.Max_Acceleration, true); } #if HAS_CLASSIC_JERK - void HMI_MaxJerkXYZE() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + void hmiMaxJerkXYZE() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk_scaled)) { + if (applyEncoder(encoder_diffState, hmiValues.Max_Jerk_scaled)) { checkkey = MaxJerk; - EncoderRate.enabled = false; - if (WITHIN(HMI_flag.jerk_axis, X_AXIS, LAST_AXIS)) - planner.set_max_jerk(HMI_flag.jerk_axis, HMI_ValueStruct.Max_Jerk_scaled / 10); - Draw_Edit_Float3(select_jerk.now, HMI_ValueStruct.Max_Jerk_scaled); + encoderRate.enabled = false; + if (WITHIN(hmiFlag.jerk_axis, X_AXIS, LAST_AXIS)) + planner.set_max_jerk(hmiFlag.jerk_axis, hmiValues.Max_Jerk_scaled / MINUNITMULT); + drawEditFloat3(select_jerk.now, hmiValues.Max_Jerk_scaled); return; } // MaxJerk limit - 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); + if (WITHIN(hmiFlag.jerk_axis, X_AXIS, LAST_AXIS)) + LIMIT(hmiValues.Max_Jerk_scaled, min_jerk_edit_values[hmiFlag.jerk_axis] * MINUNITMULT, max_jerk_edit_values[hmiFlag.jerk_axis] * MINUNITMULT); // MaxJerk value - Draw_Edit_Float3(select_jerk.now, HMI_ValueStruct.Max_Jerk_scaled, true); + drawEditFloat3(select_jerk.now, hmiValues.Max_Jerk_scaled, true); } #endif // HAS_CLASSIC_JERK -void HMI_StepXYZE() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void hmiStepXYZE() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Step_scaled)) { + if (applyEncoder(encoder_diffState, hmiValues.Max_Step_scaled)) { checkkey = Step; - EncoderRate.enabled = false; - 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; - Draw_Edit_Float3(select_step.now, HMI_ValueStruct.Max_Step_scaled); + encoderRate.enabled = false; + if (WITHIN(hmiFlag.step_axis, X_AXIS, LAST_AXIS)) + planner.settings.axis_steps_per_mm[hmiFlag.step_axis] = hmiValues.Max_Step_scaled / MINUNITMULT; + drawEditFloat3(select_step.now, hmiValues.Max_Step_scaled); return; } // Step limit - 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); + if (WITHIN(hmiFlag.step_axis, X_AXIS, LAST_AXIS)) + LIMIT(hmiValues.Max_Step_scaled, min_steps_edit_values[hmiFlag.step_axis] * MINUNITMULT, max_steps_edit_values[hmiFlag.step_axis] * MINUNITMULT); // Step value - Draw_Edit_Float3(select_step.now, HMI_ValueStruct.Max_Step_scaled, true); + drawEditFloat3(select_step.now, hmiValues.Max_Step_scaled, true); } // Draw X, Y, Z and blink if in an un-homed or un-trusted state @@ -1648,11 +1631,11 @@ void _update_axis_value(const AxisEnum axis, const uint16_t x, const uint16_t y, if (force || changed || draw_qmark || draw_empty) { if (blink && draw_qmark) - DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, x, y, F("???.?")); + dwinDrawString(true, font8x16, Color_White, Color_Bg_Black, x, y, F("???.?")); else if (blink && draw_empty) - DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, x, y, F(" ")); + dwinDrawString(true, font8x16, Color_White, Color_Bg_Black, x, y, F(" ")); else - DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, x, y, p); + dwinDrawFloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, x, y, p); } } @@ -1699,27 +1682,27 @@ void update_variable() { // Tune page temperature update #if HAS_HOTEND if (_new_hotend_target) - Draw_Edit_Integer3(TUNE_CASE_TEMP + MROWS - index_tune, _hotendtarget); + drawEditInteger3(TUNE_CASE_TEMP + MROWS - index_tune, _hotendtarget); #endif #if HAS_HEATED_BED if (_new_bed_target) - Draw_Edit_Integer3(TUNE_CASE_BED + MROWS - index_tune, _bedtarget); + drawEditInteger3(TUNE_CASE_BED + MROWS - index_tune, _bedtarget); #endif #if HAS_FAN if (_new_fanspeed) - Draw_Edit_Integer3(TUNE_CASE_FAN + MROWS - index_tune, _fanspeed); + drawEditInteger3(TUNE_CASE_FAN + MROWS - index_tune, _fanspeed); #endif } else if (checkkey == TemperatureID) { // Temperature page temperature update #if HAS_HOTEND - if (_new_hotend_target) Draw_Edit_Integer3(TEMP_CASE_TEMP, _hotendtarget); + if (_new_hotend_target) drawEditInteger3(TEMP_CASE_TEMP, _hotendtarget); #endif #if HAS_HEATED_BED - if (_new_bed_target) Draw_Edit_Integer3(TEMP_CASE_BED, _bedtarget); + if (_new_bed_target) drawEditInteger3(TEMP_CASE_BED, _bedtarget); #endif #if HAS_FAN - if (_new_fanspeed) Draw_Edit_Integer3(TEMP_CASE_FAN, _fanspeed); + if (_new_fanspeed) drawEditInteger3(TEMP_CASE_FAN, _fanspeed); #endif } @@ -1727,34 +1710,34 @@ void update_variable() { #if HAS_HOTEND if (_new_hotend_temp) - Draw_Stat_Int(28, 384, _hotendtemp); + drawStatInt(28, 384, _hotendtemp); if (_new_hotend_target) - Draw_Stat_Int(25 + 4 * STAT_CHR_W + 6, 384, _hotendtarget); + drawStatInt(25 + 4 * STAT_CHR_W + 6, 384, _hotendtarget); static int16_t _flow = 0; if (_flow != planner.flow_percentage[0]) { _flow = planner.flow_percentage[0]; - Draw_Stat_Int(116 + 2 * STAT_CHR_W, 417, _flow); + drawStatInt(116 + 2 * STAT_CHR_W, 417, _flow); } #endif #if HAS_HEATED_BED if (_new_bed_temp) - Draw_Stat_Int(28, 417, _bedtemp); + drawStatInt(28, 417, _bedtemp); if (_new_bed_target) - Draw_Stat_Int(25 + 4 * STAT_CHR_W + 6, 417, _bedtarget); + drawStatInt(25 + 4 * STAT_CHR_W + 6, 417, _bedtarget); #endif static int16_t _feedrate = 0; if (_feedrate != feedrate_percentage) { _feedrate = feedrate_percentage; - Draw_Stat_Int(116 + 2 * STAT_CHR_W, 384, _feedrate); + drawStatInt(116 + 2 * STAT_CHR_W, 384, _feedrate); } #if HAS_FAN if (_new_fanspeed) { _fanspeed = thermalManager.fan_speed[0]; - Draw_Stat_Int(195 + 2 * STAT_CHR_W, 384, _fanspeed); + drawStatInt(195 + 2 * STAT_CHR_W, 384, _fanspeed); } #endif @@ -1762,12 +1745,12 @@ void update_variable() { if (BABY_Z_VAR != _offset) { _offset = BABY_Z_VAR; if (BABY_Z_VAR < 0) { - Draw_Stat_Float(207, 417, -_offset); - DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F("-")); + drawStatFloat(207, 417, -_offset); + dwinDrawString(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F("-")); } else { - Draw_Stat_Float(207, 417, _offset); - DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F(" ")); + drawStatFloat(207, 417, _offset); + dwinDrawString(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F(" ")); } } @@ -1782,10 +1765,6 @@ void update_variable() { * cache files here. */ -#ifndef strcasecmp_P - #define strcasecmp_P(a, b) strcasecmp((a), (b)) -#endif - void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_LIMIT) { char * const name = card.longest_filename(); size_t pos = strlen(name); // index of ending nul @@ -1809,15 +1788,15 @@ void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_LIMIT) while (pos--) dst[pos] = src[pos]; } -void HMI_SDCardInit() { card.cdroot(); } +void hmiSDCardInit() { card.cdroot(); } // Initialize or re-initialize the LCD -void MarlinUI::init_lcd() { DWIN_Startup(); } +void MarlinUI::init_lcd() { dwinStartup(); } void MarlinUI::refresh() { /* Nothing to see here */ } #if HAS_LCD_BRIGHTNESS - void MarlinUI::_set_brightness() { DWIN_LCD_Brightness(backlight ? brightness : 0); } + void MarlinUI::_set_brightness() { dwinLCDBrightness(backlight ? brightness : 0); } #endif #if ENABLED(SCROLL_LONG_FILENAMES) @@ -1827,7 +1806,7 @@ void MarlinUI::refresh() { /* Nothing to see here */ } millis_t shift_ms; // = 0 // Init the shift name based on the highlighted item - void Init_Shift_Name() { + void initShiftName() { const bool is_subdir = !card.flag.workDirIsRoot; const int8_t filenum = select_file.now - 1 - is_subdir; // Skip "Back" and ".." const int16_t fileCnt = card.get_num_items(); @@ -1838,7 +1817,7 @@ void MarlinUI::refresh() { /* Nothing to see here */ } } } - void Init_SDItem_Shift() { + void initSDItemShift() { shift_amt = 0; shift_ms = select_file.now != CASE_BACK && strlen(shift_name) > MENU_CHAR_LIMIT ? millis() + 750UL : 0; @@ -1849,11 +1828,11 @@ void MarlinUI::refresh() { /* Nothing to see here */ } /** * Display an SD item, adding a CDUP for subfolders. */ -void Draw_SDItem(const uint16_t item, int16_t row=-1) { +void drawSDItem(const uint16_t item, int16_t row=-1) { if (row < 0) row = item + 1 + MROWS - index_file; const bool is_subdir = !card.flag.workDirIsRoot; if (is_subdir && item == 0) { - Draw_Menu_Line(row, ICON_Folder, F("..")); + drawMenuLine(row, ICON_Folder, F("..")); return; } @@ -1865,19 +1844,19 @@ void Draw_SDItem(const uint16_t item, int16_t row=-1) { // This is used during scroll drawing if (item == select_file.now - 1) { make_name_without_ext(shift_name, name, 100); - Init_SDItem_Shift(); + initSDItemShift(); } #endif // Draw the file/folder with name aligned left char str[strlen(name) + 1]; make_name_without_ext(str, name); - Draw_Menu_Line(row, card.flag.filenameIsDir ? ICON_Folder : ICON_File, str); + drawMenuLine(row, card.flag.filenameIsDir ? ICON_Folder : ICON_File, str); } #if ENABLED(SCROLL_LONG_FILENAMES) - void Draw_SDItem_Shifted(uint8_t &shift) { + void drawSDItemShifted(uint8_t &shift) { // Limit to the number of chars past the cutoff const size_t len = strlen(shift_name); NOMORE(shift, _MAX(len - MENU_CHAR_LIMIT, 0U)); @@ -1889,8 +1868,8 @@ void Draw_SDItem(const uint16_t item, int16_t row=-1) { shift_name[lastchar] = '\0'; const uint8_t row = select_file.now + MROWS - index_file; // skip "Back" and scroll - Erase_Menu_Text(row); - Draw_Menu_Line(row, 0, &shift_name[shift]); + eraseMenuText(row); + drawMenuLine(row, 0, &shift_name[shift]); shift_name[lastchar] = c; } @@ -1898,57 +1877,57 @@ void Draw_SDItem(const uint16_t item, int16_t row=-1) { #endif // Redraw the first set of SD Files -void Redraw_SD_List() { +void redrawSDList() { select_file.reset(); index_file = MROWS; - Clear_Menu_Area(); // Leave title bar unchanged + clearMenuArea(); // Leave title bar unchanged - Draw_Back_First(); + drawBackFirst(); if (card.isMounted()) { // As many files as will fit - LOOP_L_N(i, _MIN(nr_sd_menu_items(), MROWS)) - Draw_SDItem(i, i + 1); + for (uint8_t i = 0; i < _MIN(nr_sd_menu_items(), MROWS); ++i) + drawSDItem(i, i + 1); - TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); + TERN_(SCROLL_LONG_FILENAMES, initSDItemShift()); } else { - DWIN_Draw_Rectangle(1, Color_Bg_Red, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); - DWIN_Draw_String(false, font16x32, Color_Yellow, Color_Bg_Red, ((DWIN_WIDTH) - 8 * 16) / 2, MBASE(3), F("No Media")); + dwinDrawRectangle(1, Color_Bg_Red, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); + dwinDrawString(false, font16x32, Color_Yellow, Color_Bg_Red, ((DWIN_WIDTH) - 8 * 16) / 2, MBASE(3), F("No Media")); } } bool DWIN_lcd_sd_status = false; -void SDCard_Up() { +void sdCardUp() { card.cdup(); - Redraw_SD_List(); + redrawSDList(); DWIN_lcd_sd_status = false; // On next DWIN_Update } -void SDCard_Folder(char * const dirname) { +void sdCardFolder(char * const dirname) { card.cd(dirname); - Redraw_SD_List(); + redrawSDList(); DWIN_lcd_sd_status = false; // On next DWIN_Update } // // Watch for media mount / unmount // -void HMI_SDCardUpdate() { - if (HMI_flag.home_flag) return; +void hmiSDCardUpdate() { + if (hmiFlag.home_flag) return; if (DWIN_lcd_sd_status != card.isMounted()) { DWIN_lcd_sd_status = card.isMounted(); //SERIAL_ECHOLNPGM("HMI_SDCardUpdate: ", DWIN_lcd_sd_status); if (DWIN_lcd_sd_status) { if (checkkey == SelectFile) - Redraw_SD_List(); + redrawSDList(); } else { // clean file icon if (checkkey == SelectFile) { - Redraw_SD_List(); + redrawSDList(); } else if (checkkey == PrintProcess || checkkey == Tune || printingIsActive()) { // TODO: Move card removed abort handling @@ -1958,7 +1937,7 @@ void HMI_SDCardUpdate() { dwin_abort_flag = true; // Reset feedrate, return to Home } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } } @@ -1966,139 +1945,139 @@ void HMI_SDCardUpdate() { // The status area is always on-screen, except during // full-screen modal dialogs. (TODO: Keep alive during dialogs) // -void Draw_Status_Area(const bool with_update) { +void drawStatusArea(const bool with_update) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); + dwinDrawRectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); #if HAS_HOTEND - DWIN_ICON_Show(ICON, ICON_HotendTemp, 10, 383); - Draw_Stat_Int(28, 384, thermalManager.wholeDegHotend(0)); - DWIN_Draw_String(false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); - Draw_Stat_Int(25 + 4 * STAT_CHR_W + 6, 384, thermalManager.degTargetHotend(0)); + dwinIconShow(ICON, ICON_HotendTemp, 10, 383); + drawStatInt(28, 384, thermalManager.wholeDegHotend(0)); + dwinDrawString(false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); + drawStatInt(25 + 4 * STAT_CHR_W + 6, 384, thermalManager.degTargetHotend(0)); - DWIN_ICON_Show(ICON, ICON_StepE, 112, 417); - Draw_Stat_Int(116 + 2 * STAT_CHR_W, 417, planner.flow_percentage[0]); - DWIN_Draw_String(false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 417, F("%")); + dwinIconShow(ICON, ICON_StepE, 112, 417); + drawStatInt(116 + 2 * STAT_CHR_W, 417, planner.flow_percentage[0]); + dwinDrawString(false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 417, F("%")); #endif #if HAS_HEATED_BED - DWIN_ICON_Show(ICON, ICON_BedTemp, 10, 416); - Draw_Stat_Int(28, 417, thermalManager.wholeDegBed()); - DWIN_Draw_String(false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); - Draw_Stat_Int(25 + 4 * STAT_CHR_W + 6, 417, thermalManager.degTargetBed()); + dwinIconShow(ICON, ICON_BedTemp, 10, 416); + drawStatInt(28, 417, thermalManager.wholeDegBed()); + dwinDrawString(false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); + drawStatInt(25 + 4 * STAT_CHR_W + 6, 417, thermalManager.degTargetBed()); #endif - DWIN_ICON_Show(ICON, ICON_Speed, 113, 383); - Draw_Stat_Int(116 + 2 * STAT_CHR_W, 384, feedrate_percentage); - DWIN_Draw_String(false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 384, F("%")); + dwinIconShow(ICON, ICON_Speed, 113, 383); + drawStatInt(116 + 2 * STAT_CHR_W, 384, feedrate_percentage); + dwinDrawString(false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 384, F("%")); #if HAS_FAN - DWIN_ICON_Show(ICON, ICON_FanSpeed, 187, 383); - Draw_Stat_Int(195 + 2 * STAT_CHR_W, 384, thermalManager.fan_speed[0]); + dwinIconShow(ICON, ICON_FanSpeed, 187, 383); + drawStatInt(195 + 2 * STAT_CHR_W, 384, thermalManager.fan_speed[0]); #endif #if HAS_ZOFFSET_ITEM - DWIN_ICON_Show(ICON, ICON_Zoffset, 187, 416); + dwinIconShow(ICON, ICON_Zoffset, 187, 416); #endif if (BABY_Z_VAR < 0) { - Draw_Stat_Float(207, 417, -BABY_Z_VAR * 100); - DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F("-")); + drawStatFloat(207, 417, -BABY_Z_VAR * 100); + dwinDrawString(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F("-")); } else { - Draw_Stat_Float(207, 417, BABY_Z_VAR * 100); - DWIN_Draw_String(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F(" ")); + drawStatFloat(207, 417, BABY_Z_VAR * 100); + dwinDrawString(true, font8x16, Color_White, Color_Bg_Black, 205, 419, F(" ")); } - DWIN_Draw_Rectangle(1, Line_Color, 0, 449, DWIN_WIDTH, 451); + dwinDrawRectangle(1, Line_Color, 0, 449, DWIN_WIDTH, 451); - DWIN_ICON_Show(ICON, ICON_MaxSpeedX, 10, 456); - DWIN_ICON_Show(ICON, ICON_MaxSpeedY, 95, 456); - DWIN_ICON_Show(ICON, ICON_MaxSpeedZ, 180, 456); + dwinIconShow(ICON, ICON_MaxSpeedX, 10, 456); + dwinIconShow(ICON, ICON_MaxSpeedY, 95, 456); + dwinIconShow(ICON, ICON_MaxSpeedZ, 180, 456); _draw_xyz_position(true); if (with_update) { - DWIN_UpdateLCD(); + dwinUpdateLCD(); delay(5); } } -void HMI_StartFrame(const bool with_update) { - Goto_MainMenu(); - Draw_Status_Area(with_update); +void hmiStartFrame(const bool with_update) { + gotoMainMenu(); + drawStatusArea(with_update); } -void Draw_Info_Menu() { - Clear_Main_Window(); +void drawInfoMenu() { + clearMainWindow(); - DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, F(MACHINE_SIZE)); - DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, F(SHORT_BUILD_VERSION)); + dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(MACHINE_SIZE) * MENU_CHR_W) / 2, 122, F(MACHINE_SIZE)); + dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(SHORT_BUILD_VERSION) * MENU_CHR_W) / 2, 195, F(SHORT_BUILD_VERSION)); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(30, 17, 28, 13); // "Info" + if (hmiIsChinese()) { + dwinFrameTitleCopy(30, 17, 28, 13); // "Info" - DWIN_Frame_AreaCopy(1, 197, 149, 252, 161, 108, 102); // "Size" - DWIN_Frame_AreaCopy(1, 1, 164, 56, 176, 108, 175); // "Firmware Version" - DWIN_Frame_AreaCopy(1, 58, 164, 113, 176, 105, 248); // "Contact Details" + dwinFrameAreaCopy(1, 197, 149, 252, 161, 108, 102); // "Size" + dwinFrameAreaCopy(1, 1, 164, 56, 176, 108, 175); // "Firmware Version" + dwinFrameAreaCopy(1, 58, 164, 113, 176, 105, 248); // "Contact Details" } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_INFO_SCREEN)); + drawTitle(GET_TEXT_F(MSG_INFO_SCREEN)); #else - DWIN_Frame_TitleCopy(192, 15, 23, 12); // "Info" + dwinFrameTitleCopy(192, 15, 23, 12); // "Info" #endif - DWIN_Frame_AreaCopy(1, 120, 150, 146, 161, 124, 102); // "Size" - DWIN_Frame_AreaCopy(1, 146, 151, 254, 161, 82, 175); // "Firmware Version" - DWIN_Frame_AreaCopy(1, 1, 164, 96, 175, 89, 248); // "Contact details" + dwinFrameAreaCopy(1, 120, 150, 146, 161, 124, 102); // "Size" + dwinFrameAreaCopy(1, 146, 151, 254, 161, 82, 175); // "Firmware Version" + dwinFrameAreaCopy(1, 1, 164, 96, 175, 89, 248); // "Contact details" } - DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE) * MENU_CHR_W) / 2, 268, F(CORP_WEBSITE)); + dwinDrawString(false, font8x16, Color_White, Color_Bg_Black, (DWIN_WIDTH - strlen(CORP_WEBSITE) * MENU_CHR_W) / 2, 268, F(CORP_WEBSITE)); - Draw_Back_First(); - LOOP_L_N(i, 3) { - DWIN_ICON_Show(ICON, ICON_PrintSize + i, 26, 99 + i * 73); - DWIN_Draw_Line(Line_Color, 16, MBASE(2) + i * 73, 256, 156 + i * 73); + drawBackFirst(); + for (uint8_t i = 0; i < 3; ++i) { + dwinIconShow(ICON, ICON_PrintSize + i, 26, 99 + i * 73); + dwinDrawLine(Line_Color, 16, MBASE(2) + i * 73, 256, 156 + i * 73); } } -void Draw_Print_File_Menu() { - Clear_Title_Bar(); +void drawPrintFileMenu() { + clearTitleBar(); - if (HMI_IsChinese()) - DWIN_Frame_TitleCopy(0, 31, 56, 14); // "Print file" + if (hmiIsChinese()) + dwinFrameTitleCopy(0, 31, 56, 14); // "Print file" else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_MEDIA_MENU)); + drawTitle(GET_TEXT_F(MSG_MEDIA_MENU)); #else - DWIN_Frame_TitleCopy(52, 31, 86, 11); // "Print file" + dwinFrameTitleCopy(52, 31, 86, 11); // "Print file" #endif } - Redraw_SD_List(); + redrawSDList(); } // Main Process -void HMI_MainMenu() { +void hmiMainMenu() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_CW) { if (select_page.inc(4)) { switch (select_page.now) { - case PAGE_PRINT: ICON_Print(); break; - case PAGE_PREPARE: ICON_Print(); ICON_Prepare(); break; - case PAGE_CONTROL: ICON_Prepare(); ICON_Control(); break; - case PAGE_INFO_LEVELING: ICON_Control(); TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(); break; + case PAGE_PRINT: iconPrint(); break; + case PAGE_PREPARE: iconPrint(); iconPrepare(); break; + case PAGE_CONTROL: iconPrepare(); iconControl(); break; + case PAGE_INFO_LEVELING: iconControl(); TERN(HAS_ONESTEP_LEVELING, iconLeveling, iconStartInfo)(); break; } } } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_page.dec()) { switch (select_page.now) { - case PAGE_PRINT: ICON_Print(); ICON_Prepare(); break; - case PAGE_PREPARE: ICON_Prepare(); ICON_Control(); break; - case PAGE_CONTROL: ICON_Control(); TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(); break; - case PAGE_INFO_LEVELING: TERN(HAS_ONESTEP_LEVELING, ICON_Leveling, ICON_StartInfo)(); break; + case PAGE_PRINT: iconPrint(); iconPrepare(); break; + case PAGE_PREPARE: iconPrepare(); iconControl(); break; + case PAGE_CONTROL: iconControl(); TERN(HAS_ONESTEP_LEVELING, iconLeveling, iconStartInfo)(); break; + case PAGE_INFO_LEVELING: TERN(HAS_ONESTEP_LEVELING, iconLeveling, iconStartInfo)(); break; } } } @@ -2106,39 +2085,39 @@ void HMI_MainMenu() { switch (select_page.now) { case PAGE_PRINT: checkkey = SelectFile; - Draw_Print_File_Menu(); + drawPrintFileMenu(); break; case PAGE_PREPARE: checkkey = Prepare; select_prepare.reset(); index_prepare = MROWS; - Draw_Prepare_Menu(); + drawPrepareMenu(); break; case PAGE_CONTROL: checkkey = Control; select_control.reset(); index_control = MROWS; - Draw_Control_Menu(); + drawControlMenu(); break; case PAGE_INFO_LEVELING: #if HAS_ONESTEP_LEVELING checkkey = Leveling; - HMI_Leveling(); + hmiLeveling(); #else checkkey = Info; - Draw_Info_Menu(); + drawInfoMenu(); #endif break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // Select (and Print) File -void HMI_SelectFile() { +void hmiSelectFile() { EncoderState encoder_diffState = get_encoder_state(); const uint16_t hasUpDir = !card.flag.workDirIsRoot; @@ -2151,8 +2130,8 @@ void HMI_SelectFile() { if (ELAPSED(ms, shift_ms)) { const bool was_reset = shift_amt < 0; shift_ms = ms + 375UL + was_reset * 250UL; // ms per character - uint8_t shift_new = shift_amt + 1; // Try to shift by... - Draw_SDItem_Shifted(shift_new); // Draw the item + uint8_t shift_new = shift_amt + 1; // Try to shift by... + drawSDItemShifted(shift_new); // Draw the item if (!was_reset && shift_new == 0) // Was it limited to 0? shift_ms = 0; // No scrolling needed else if (shift_new == shift_amt) // Scroll reached the end @@ -2173,52 +2152,52 @@ void HMI_SelectFile() { if (select_file.inc(1 + fullCnt)) { const uint8_t itemnum = select_file.now - 1; // -1 for "Back" if (TERN0(SCROLL_LONG_FILENAMES, shift_ms)) { // If line was shifted - Erase_Menu_Text(itemnum + MROWS - index_file); // Erase and - Draw_SDItem(itemnum - 1); // redraw + eraseMenuText(itemnum + MROWS - index_file); // Erase and + drawSDItem(itemnum - 1); // redraw } if (select_file.now > MROWS && select_file.now > index_file) { // Cursor past the bottom index_file = select_file.now; // New bottom line - Scroll_Menu(DWIN_SCROLL_UP); - Draw_SDItem(itemnum, MROWS); // Draw and init the shift name + scrollMenu(DWIN_SCROLL_UP); + drawSDItem(itemnum, MROWS); // Draw and init the shift name } else { - Move_Highlight(1, select_file.now + MROWS - index_file); // Just move highlight - TERN_(SCROLL_LONG_FILENAMES, Init_Shift_Name()); // ...and init the shift name + moveHighlight(1, select_file.now + MROWS - index_file); // Just move highlight + TERN_(SCROLL_LONG_FILENAMES, initShiftName()); // ...and init the shift name } - TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); + TERN_(SCROLL_LONG_FILENAMES, initSDItemShift()); } } else if (encoder_diffState == ENCODER_DIFF_CCW && fullCnt) { if (select_file.dec()) { const uint8_t itemnum = select_file.now - 1; // -1 for "Back" if (TERN0(SCROLL_LONG_FILENAMES, shift_ms)) { // If line was shifted - Erase_Menu_Text(select_file.now + 1 + MROWS - index_file); // Erase and - Draw_SDItem(itemnum + 1); // redraw + eraseMenuText(select_file.now + 1 + MROWS - index_file); // Erase and + drawSDItem(itemnum + 1); // redraw } if (select_file.now < index_file - MROWS) { // Cursor past the top index_file--; // New bottom line - Scroll_Menu(DWIN_SCROLL_DOWN); + scrollMenu(DWIN_SCROLL_DOWN); if (index_file == MROWS) { - Draw_Back_First(); + drawBackFirst(); TERN_(SCROLL_LONG_FILENAMES, shift_ms = 0); } else - Draw_SDItem(itemnum, 0); // Draw the item (and init shift name) + drawSDItem(itemnum, 0); // Draw the item (and init shift name) } else { - Move_Highlight(-1, select_file.now + MROWS - index_file); // Just move highlight - TERN_(SCROLL_LONG_FILENAMES, Init_Shift_Name()); // ...and init the shift name + moveHighlight(-1, select_file.now + MROWS - index_file); // Just move highlight + TERN_(SCROLL_LONG_FILENAMES, initShiftName()); // ...and init the shift name } - TERN_(SCROLL_LONG_FILENAMES, Init_SDItem_Shift()); // Reset left. Init timer. + TERN_(SCROLL_LONG_FILENAMES, initSDItemShift()); // Reset left. Init timer. } } else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (select_file.now == CASE_BACK) { // Back select_page.set(0); - Goto_MainMenu(); + gotoMainMenu(); } else if (hasUpDir && select_file.now == 1) { // CD-Up - SDCard_Up(); + sdCardUp(); goto HMI_SelectFileExit; } else { @@ -2227,7 +2206,7 @@ void HMI_SelectFile() { // Enter that folder! if (card.flag.filenameIsDir) { - SDCard_Folder(card.filename); + sdCardFolder(card.filename); goto HMI_SelectFileExit; } @@ -2236,9 +2215,9 @@ void HMI_SelectFile() { select_file.reset(); // Start choice and print SD file - HMI_flag.heat_flag = true; - HMI_flag.print_finish = false; - HMI_ValueStruct.show_mode = 0; + hmiFlag.heat_flag = true; + hmiFlag.print_finish = false; + hmiValues.show_mode = 0; card.openAndPrintFile(card.filename); @@ -2251,22 +2230,22 @@ void HMI_SelectFile() { _card_percent = 0; _remain_time = 0; - Goto_PrintProcess(); + gotoPrintProcess(); } } HMI_SelectFileExit: - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // Printing -void HMI_Printing() { +void hmiPrinting() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (HMI_flag.done_confirm_flag) { + if (hmiFlag.done_confirm_flag) { if (encoder_diffState == ENCODER_DIFF_ENTER) { - HMI_flag.done_confirm_flag = false; + hmiFlag.done_confirm_flag = false; dwin_abort_flag = true; // Reset feedrate, return to Home } return; @@ -2276,18 +2255,18 @@ void HMI_Printing() { if (encoder_diffState == ENCODER_DIFF_CW) { if (select_print.inc(3)) { switch (select_print.now) { - case PRINT_SETUP: ICON_Tune(); break; - case PRINT_PAUSE_RESUME: ICON_Tune(); ICON_ResumeOrPause(); break; - case PRINT_STOP: ICON_ResumeOrPause(); ICON_Stop(); break; + case PRINT_SETUP: iconTune(); break; + case PRINT_PAUSE_RESUME: iconTune(); iconResumeOrPause(); break; + case PRINT_STOP: iconResumeOrPause(); iconStop(); break; } } } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_print.dec()) { switch (select_print.now) { - case PRINT_SETUP: ICON_Tune(); ICON_ResumeOrPause(); break; - case PRINT_PAUSE_RESUME: ICON_ResumeOrPause(); ICON_Stop(); break; - case PRINT_STOP: ICON_Stop(); break; + case PRINT_SETUP: iconTune(); iconResumeOrPause(); break; + case PRINT_PAUSE_RESUME: iconResumeOrPause(); iconStop(); break; + case PRINT_STOP: iconStop(); break; } } } @@ -2295,23 +2274,23 @@ void HMI_Printing() { switch (select_print.now) { case PRINT_SETUP: checkkey = Tune; - HMI_ValueStruct.show_mode = 0; + hmiValues.show_mode = 0; select_tune.reset(); index_tune = MROWS; - Draw_Tune_Menu(); + drawTuneMenu(); break; case PRINT_PAUSE_RESUME: - if (HMI_flag.pause_flag) { - ICON_Pause(); + if (hmiFlag.pause_flag) { + iconPause(); char cmd[40]; cmd[0] = '\0'; - #if BOTH(HAS_HEATED_BED, PAUSE_HEAT) + #if ALL(HAS_HEATED_BED, PAUSE_HEAT) if (resume_bed_temp) sprintf_P(cmd, PSTR("M190 S%i\n"), resume_bed_temp); #endif - #if BOTH(HAS_HOTEND, PAUSE_HEAT) + #if ALL(HAS_HOTEND, PAUSE_HEAT) if (resume_hotend_temp) sprintf_P(&cmd[strlen(cmd)], PSTR("M109 S%i\n"), resume_hotend_temp); #endif @@ -2319,181 +2298,181 @@ void HMI_Printing() { queue.inject(cmd); } else { - HMI_flag.select_flag = true; + hmiFlag.select_flag = true; checkkey = Print_window; - Popup_window_PauseOrStop(); + popupwindowPauseOrStop(); } break; case PRINT_STOP: - HMI_flag.select_flag = true; + hmiFlag.select_flag = true; checkkey = Print_window; - Popup_window_PauseOrStop(); + popupwindowPauseOrStop(); break; default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // Pause and Stop window -void HMI_PauseOrStop() { +void hmiPauseOrStop() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_CW) - Draw_Select_Highlight(false); + drawSelectHighlight(false); else if (encoder_diffState == ENCODER_DIFF_CCW) - Draw_Select_Highlight(true); + drawSelectHighlight(true); else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (select_print.now == PRINT_PAUSE_RESUME) { - if (HMI_flag.select_flag) { - HMI_flag.pause_action = true; + if (hmiFlag.select_flag) { + hmiFlag.pause_action = true; queue.inject(F("M25")); } - Goto_PrintProcess(); + gotoPrintProcess(); } else if (select_print.now == PRINT_STOP) { - if (HMI_flag.select_flag) { + if (hmiFlag.select_flag) { checkkey = Back_Main; - wait_for_heatup = wait_for_user = false; // Stop waiting for heating/user - card.abortFilePrintSoon(); // Let the main loop handle SD abort - dwin_abort_flag = true; // Reset feedrate, return to Home + wait_for_heatup = wait_for_user = false; // Stop waiting for heating/user + card.abortFilePrintSoon(); // Let the main loop handle SD abort + dwin_abort_flag = true; // Reset feedrate, return to Home #ifdef ACTION_ON_CANCEL hostui.cancel(); #endif - Popup_Window_Home(true); - if (HMI_flag.home_flag) planner.synchronize(); // Wait for planner moves to finish! + popupWindowHome(true); + if (hmiFlag.home_flag) planner.synchronize(); // Wait for planner moves to finish! } else - Goto_PrintProcess(); // cancel stop + gotoPrintProcess(); // cancel stop } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void Draw_Move_Menu() { - Clear_Main_Window(); +void drawMoveMenu() { + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(192, 1, 42, 14); // "Move" - Item_AreaCopy(58, 118, 106, 132, 1); - Item_AreaCopy(109, 118, 157, 132, 2); - Item_AreaCopy(160, 118, 209, 132, 3); - TERN_(HAS_HOTEND, Item_AreaCopy(212, 118, 253, 131, 4)); + if (hmiIsChinese()) { + dwinFrameTitleCopy(192, 1, 42, 14); // "Move" + itemAreaCopy(58, 118, 106, 132, 1); + itemAreaCopy(109, 118, 157, 132, 2); + itemAreaCopy(160, 118, 209, 132, 3); + TERN_(HAS_HOTEND, itemAreaCopy(212, 118, 253, 131, 4)); } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_MOVE_AXIS)); + drawTitle(GET_TEXT_F(MSG_MOVE_AXIS)); #else - DWIN_Frame_TitleCopy(231, 2, 35, 11); // "Move" + dwinFrameTitleCopy(231, 2, 35, 11); // "Move" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(1, GET_TEXT_F(MSG_MOVE_X)); - DWIN_Draw_Label(2, GET_TEXT_F(MSG_MOVE_Y)); - DWIN_Draw_Label(3, GET_TEXT_F(MSG_MOVE_Z)); - TERN_(HAS_HOTEND, DWIN_Draw_Label(4, GET_TEXT_F(MSG_MOVE_E))); + dwinDrawLabel(1, GET_TEXT_F(MSG_MOVE_X)); + dwinDrawLabel(2, GET_TEXT_F(MSG_MOVE_Y)); + dwinDrawLabel(3, GET_TEXT_F(MSG_MOVE_Z)); + TERN_(HAS_HOTEND, dwinDrawLabel(4, GET_TEXT_F(MSG_MOVE_E))); #else say_move_en(1); say_x_en(38, 1); // "Move X" say_move_en(2); say_y_en(38, 2); // "Move Y" say_move_en(3); say_z_en(38, 3); // "Move Z" - TERN_(HAS_HOTEND, (say_move_en(4), Item_AreaCopy(99, 194, 151, 204, 4, 38))); // "Move Extruder" + TERN_(HAS_HOTEND, (say_move_en(4), itemAreaCopy(99, 194, 151, 204, 4, 38))); // "Move Extruder" #endif } - Draw_Back_First(select_axis.now == CASE_BACK); - if (select_axis.now != CASE_BACK) Draw_Menu_Cursor(select_axis.now); + drawBackFirst(select_axis.now == CASE_BACK); + if (select_axis.now != CASE_BACK) drawMenuCursor(select_axis.now); // Draw separators and icons - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MoveX + i); + for (uint8_t i = 0; i < 3 + ENABLED(HAS_HOTEND); ++i) drawMenuLine(i + 1, ICON_MoveX + i); } -void Item_Adv_HomeOffsets(const uint8_t row) { - if (false && HMI_IsChinese()) { +void itemAdvHomeOffsets(const uint8_t row) { + if (false && hmiIsChinese()) { // TODO: Chinese "Set Home Offsets" } else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_SET_HOME_OFFSETS)); + dwinDrawLabel(row, GET_TEXT_F(MSG_SET_HOME_OFFSETS)); #else - Item_AreaCopy(1, 76, 102, 87, row); // "Set Home Offsets" + itemAreaCopy(1, 76, 102, 87, row); // "Set Home Offsets" #endif } - Draw_Menu_Line(row, ICON_HomeOffset); - Draw_More_Icon(row); + drawMenuLine(row, ICON_HomeOffset); + drawMoreIcon(row); } #if HAS_ONESTEP_LEVELING - void Item_Adv_ProbeOffsets(const uint8_t row) { - if (false && HMI_IsChinese()) { + void itemAdvProbeOffsets(const uint8_t row) { + if (false && hmiIsChinese()) { // TODO: Chinese "Probe Offsets" } else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_ZPROBE_OFFSETS)); + dwinDrawLabel(row, GET_TEXT_F(MSG_ZPROBE_OFFSETS)); #else say_probe_offs_en(row); #endif } - Draw_Menu_Line(row, ICON_ProbeOffset); - Draw_More_Icon(row); + drawMenuLine(row, ICON_ProbeOffset); + drawMoreIcon(row); } #endif -void Item_Adv_HotendPID(const uint8_t row) { - if (false && HMI_IsChinese()) { +void itemAdvHotendPID(const uint8_t row) { + if (false && hmiIsChinese()) { // TODO: Chinese "Hotend PID" } else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, F("Hotend PID")); + dwinDrawLabel(row, F("Hotend PID")); #else - Item_AreaCopy(96, 104, 167, 114, row); // "Hotend PID" + itemAreaCopy(96, 104, 167, 114, row); // "Hotend PID" #endif } - Draw_Menu_Line(row, ICON_PIDNozzle); + drawMenuLine(row, ICON_PIDNozzle); } -void Item_Adv_BedPID(const uint8_t row) { - if (false && HMI_IsChinese()) { +void itemAdvBedPID(const uint8_t row) { + if (false && hmiIsChinese()) { // TODO: Chinese "Bed PID" } else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, F("Bed PID")); + dwinDrawLabel(row, F("Bed PID")); #else - Item_AreaCopy(241, 104, 263, 115, row); // "Bed" - Item_AreaCopy(145, 104, 167, 114, row, 27); // "PID" + itemAreaCopy(241, 104, 263, 115, row); // "Bed" + itemAreaCopy(145, 104, 167, 114, row, 27); // "PID" #endif } - Draw_Menu_Line(row, ICON_PIDbed); + drawMenuLine(row, ICON_PIDbed); } #if ENABLED(POWER_LOSS_RECOVERY) - void Item_Adv_PLR(const uint8_t row) { - if (false && HMI_IsChinese()) { + void itemAdv_PLR(const uint8_t row) { + if (false && hmiIsChinese()) { // TODO: Chinese "Power-loss Recovery" } else { #ifdef USE_STRING_TITLES - DWIN_Draw_Label(row, GET_TEXT_F(MSG_ZPROBE_OFFSETS)); + dwinDrawLabel(row, GET_TEXT_F(MSG_ZPROBE_OFFSETS)); #else - Item_AreaCopy(1, 208, 137, 221, row); // "Power-loss Recovery" + itemAreaCopy(1, 208, 137, 221, row); // "Power-loss Recovery" #endif } - Draw_Menu_Line(row, ICON_Motion); - Draw_Checkbox_Line(row, recovery.enabled); + drawMenuLine(row, ICON_Motion); + drawCheckboxLine(row, recovery.enabled); } #endif -void Draw_AdvancedSettings_Menu() { - Clear_Main_Window(); +void drawAdvancedSettingsMenu() { + clearMainWindow(); #if ADVSET_CASE_TOTAL >= TROWS const int16_t scroll = MROWS - index_advset; // Scrolled-up lines @@ -2503,128 +2482,128 @@ void Draw_AdvancedSettings_Menu() { #define ASCROL(L) (scroll + (L)) #define AVISI(L) VISI(ADVSET_CASE_TOTAL, L, ASCROL(L)) - if (false && HMI_IsChinese()) { + if (false && hmiIsChinese()) { // TODO: Chinese "Advanced Settings" } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_ADVANCED_SETTINGS)); + drawTitle(GET_TEXT_F(MSG_ADVANCED_SETTINGS)); #else - DWIN_Frame_TitleCopy(93, 401, 126, 15); // "Advanced Settings" + dwinFrameTitleCopy(93, 401, 126, 15); // "Advanced Settings" #endif } - if (AVISI(0)) Draw_Back_First(select_advset.now == CASE_BACK); - if (AVISI(ADVSET_CASE_HOMEOFF)) Item_Adv_HomeOffsets(ASCROL(ADVSET_CASE_HOMEOFF)); // Set Home Offsets > + if (AVISI(0)) drawBackFirst(select_advset.now == CASE_BACK); + if (AVISI(ADVSET_CASE_HOMEOFF)) itemAdvHomeOffsets(ASCROL(ADVSET_CASE_HOMEOFF)); // Set Home Offsets > #if HAS_ONESTEP_LEVELING - if (AVISI(ADVSET_CASE_PROBEOFF)) Item_Adv_ProbeOffsets(ASCROL(ADVSET_CASE_PROBEOFF)); // Probe Offsets > + if (AVISI(ADVSET_CASE_PROBEOFF)) itemAdvProbeOffsets(ASCROL(ADVSET_CASE_PROBEOFF)); // Probe Offsets > #endif - if (AVISI(ADVSET_CASE_HEPID)) Item_Adv_HotendPID(ASCROL(ADVSET_CASE_HEPID)); // Nozzle PID - if (AVISI(ADVSET_CASE_BEDPID)) Item_Adv_BedPID(ASCROL(ADVSET_CASE_BEDPID)); // Bed PID + if (AVISI(ADVSET_CASE_HEPID)) itemAdvHotendPID(ASCROL(ADVSET_CASE_HEPID)); // Nozzle PID + if (AVISI(ADVSET_CASE_BEDPID)) itemAdvBedPID(ASCROL(ADVSET_CASE_BEDPID)); // Bed PID #if ENABLED(POWER_LOSS_RECOVERY) - if (AVISI(ADVSET_CASE_PWRLOSSR)) Item_Adv_PLR(ASCROL(ADVSET_CASE_PWRLOSSR)); // Power-loss recovery + if (AVISI(ADVSET_CASE_PWRLOSSR)) itemAdv_PLR(ASCROL(ADVSET_CASE_PWRLOSSR)); // Power-loss recovery #endif - if (select_advset.now != CASE_BACK) Draw_Menu_Cursor(ASCROL(select_advset.now)); + if (select_advset.now != CASE_BACK) drawMenuCursor(ASCROL(select_advset.now)); } -void Item_HomeOffs_X(const uint8_t row) { - if (false && HMI_IsChinese()) { +void itemHomeOffs_X(const uint8_t row) { + if (false && hmiIsChinese()) { // TODO: Chinese "Home Offset X" } else { #ifdef USE_STRING_TITLES - Draw_Menu_Line(row, ICON_HomeOffsetX, GET_TEXT_F(MSG_HOME_OFFSET_X)); + drawMenuLine(row, ICON_HomeOffsetX, GET_TEXT_F(MSG_HOME_OFFSET_X)); #else say_home_offs_en(row); say_x_en(75, row); // "Home Offset X" #endif } - Draw_Menu_Line(row, ICON_HomeOffset); - Draw_Edit_Signed_Float3(row, HMI_ValueStruct.Home_OffX_scaled); + drawMenuLine(row, ICON_HomeOffset); + drawEditSignedFloat3(row, hmiValues.Home_OffX_scaled); } -void Item_HomeOffs_Y(const uint8_t row) { - if (false && HMI_IsChinese()) { +void itemHomeOffs_Y(const uint8_t row) { + if (false && hmiIsChinese()) { // TODO: Chinese "Home Offset Y" } else { #ifdef USE_STRING_TITLES - Draw_Menu_Line(row, ICON_HomeOffsetY, GET_TEXT_F(MSG_HOME_OFFSET_Y)); + drawMenuLine(row, ICON_HomeOffsetY, GET_TEXT_F(MSG_HOME_OFFSET_Y)); #else say_home_offs_en(row); say_y_en(75, row); // "Home Offset X" #endif } - Draw_Menu_Line(row, ICON_HomeOffset); - Draw_Edit_Signed_Float3(row, HMI_ValueStruct.Home_OffY_scaled); + drawMenuLine(row, ICON_HomeOffset); + drawEditSignedFloat3(row, hmiValues.Home_OffY_scaled); } -void Item_HomeOffs_Z(const uint8_t row) { - if (false && HMI_IsChinese()) { +void itemHomeOffs_Z(const uint8_t row) { + if (false && hmiIsChinese()) { // TODO: Chinese "Home Offset Z" } else { #ifdef USE_STRING_TITLES - Draw_Menu_Line(row, ICON_HomeOffsetZ, GET_TEXT_F(MSG_HOME_OFFSET_Z)); + drawMenuLine(row, ICON_HomeOffsetZ, GET_TEXT_F(MSG_HOME_OFFSET_Z)); #else say_home_offs_en(row); say_z_en(75, row); // "Home Offset Z" #endif } - Draw_Menu_Line(row, ICON_HomeOffset); - Draw_Edit_Signed_Float3(row, HMI_ValueStruct.Home_OffZ_scaled); + drawMenuLine(row, ICON_HomeOffset); + drawEditSignedFloat3(row, hmiValues.Home_OffZ_scaled); } -void Draw_HomeOff_Menu() { - Clear_Main_Window(); - if (false && HMI_IsChinese()) { +void drawHomeOffMenu() { + clearMainWindow(); + if (false && hmiIsChinese()) { // TODO: Chinese "Home Offsets" } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_SET_HOME_OFFSETS)); + drawTitle(GET_TEXT_F(MSG_SET_HOME_OFFSETS)); #else - DWIN_Frame_TitleCopy(1, 401, 91, 12); // "Home Offsets" + dwinFrameTitleCopy(1, 401, 91, 12); // "Home Offsets" #endif } - Draw_Back_First(select_item.now == CASE_BACK); - Item_HomeOffs_X(1); // "Home Offset X" - Item_HomeOffs_Y(2); // "Home Offset Y" - Item_HomeOffs_Z(3); // "Home Offset Z" - if (select_item.now != CASE_BACK) Draw_Menu_Cursor(select_item.now); + drawBackFirst(select_item.now == CASE_BACK); + itemHomeOffs_X(1); // "Home Offset X" + itemHomeOffs_Y(2); // "Home Offset Y" + itemHomeOffs_Z(3); // "Home Offset Z" + if (select_item.now != CASE_BACK) drawMenuCursor(select_item.now); } #if HAS_ONESTEP_LEVELING - void Draw_ProbeOff_Menu() { - Clear_Main_Window(); - Draw_Back_First(select_item.now == CASE_BACK); - if (false && HMI_IsChinese()) { + void drawProbeOffMenu() { + clearMainWindow(); + drawBackFirst(select_item.now == CASE_BACK); + if (false && hmiIsChinese()) { // TODO: Chinese "Probe Offsets" } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_ZPROBE_OFFSETS)); + drawTitle(GET_TEXT_F(MSG_ZPROBE_OFFSETS)); #else - DWIN_Frame_TitleCopy(124, 431, 91, 12); // "Probe Offsets" + dwinFrameTitleCopy(124, 431, 91, 12); // "Probe Offsets" #endif #ifdef USE_STRING_TITLES - Draw_Menu_Line(1, ICON_ProbeOffsetX, GET_TEXT_F(MSG_ZPROBE_XOFFSET)); // Probe X Offset - Draw_Menu_Line(2, ICON_ProbeOffsetY, GET_TEXT_F(MSG_ZPROBE_YOFFSET)); // Probe Y Offset + drawMenuLine(1, ICON_ProbeOffsetX, GET_TEXT_F(MSG_ZPROBE_XOFFSET)); // Probe X Offset + drawMenuLine(2, ICON_ProbeOffsetY, GET_TEXT_F(MSG_ZPROBE_YOFFSET)); // Probe Y Offset #else say_probe_offs_en(1); say_x_en(75, 1); // "Probe Offset X" say_probe_offs_en(2); say_y_en(75, 2); // "Probe Offset Y" #endif } - Draw_Edit_Signed_Float3(1, HMI_ValueStruct.Probe_OffX_scaled); - Draw_Edit_Signed_Float3(2, HMI_ValueStruct.Probe_OffY_scaled); + drawEditSignedFloat3(1, hmiValues.Probe_OffX_scaled); + drawEditSignedFloat3(2, hmiValues.Probe_OffY_scaled); - if (select_item.now != CASE_BACK) Draw_Menu_Cursor(select_item.now); + if (select_item.now != CASE_BACK) drawMenuCursor(select_item.now); } #endif #include "../../../libs/buzzer.h" -void HMI_AudioFeedback(const bool success=true) { +void hmiAudioFeedback(const bool success=true) { if (success) { BUZZ(100, 659); BUZZ(10, 0); @@ -2635,7 +2614,7 @@ void HMI_AudioFeedback(const bool success=true) { } // Prepare -void HMI_Prepare() { +void hmiPrepare() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; @@ -2646,22 +2625,22 @@ void HMI_Prepare() { index_prepare = select_prepare.now; // Scroll up and draw a blank bottom line - Scroll_Menu(DWIN_SCROLL_UP); - Draw_Menu_Icon(MROWS, ICON_Axis + select_prepare.now - 1); + scrollMenu(DWIN_SCROLL_UP); + drawMenuIcon(MROWS, ICON_Axis + select_prepare.now - 1); // Draw "More" icon for sub-menus - if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); + if (index_prepare < 7) drawMoreIcon(MROWS - index_prepare + 1); #if PREHEAT_COUNT > 1 - if (index_prepare == PREPARE_CASE_ABS) Item_Prepare_ABS(MROWS); + if (index_prepare == PREPARE_CASE_ABS) itemPrepare_ABS(MROWS); #endif #if HAS_HOTEND || HAS_HEATED_BED - if (index_prepare == PREPARE_CASE_COOL) Item_Prepare_Cool(MROWS); + if (index_prepare == PREPARE_CASE_COOL) itemPrepareCool(MROWS); #endif - if (index_prepare == PREPARE_CASE_LANG) Item_Prepare_Lang(MROWS); + if (index_prepare == PREPARE_CASE_LANG) itemPrepareLang(MROWS); } else { - Move_Highlight(1, select_prepare.now + MROWS - index_prepare); + moveHighlight(1, select_prepare.now + MROWS - index_prepare); } } } @@ -2669,21 +2648,21 @@ void HMI_Prepare() { if (select_prepare.dec()) { if (select_prepare.now < index_prepare - MROWS) { index_prepare--; - Scroll_Menu(DWIN_SCROLL_DOWN); + scrollMenu(DWIN_SCROLL_DOWN); if (index_prepare == MROWS) - Draw_Back_First(); + drawBackFirst(); else - Draw_Menu_Line(0, ICON_Axis + select_prepare.now - 1); + drawMenuLine(0, ICON_Axis + select_prepare.now - 1); - if (index_prepare < 7) Draw_More_Icon(MROWS - index_prepare + 1); + if (index_prepare < 7) drawMoreIcon(MROWS - index_prepare + 1); - if (index_prepare == 6) Item_Prepare_Move(0); - else if (index_prepare == 7) Item_Prepare_Disable(0); - else if (index_prepare == 8) Item_Prepare_Home(0); + if (index_prepare == 6) itemPrepareMove(0); + else if (index_prepare == 7) itemPrepareDisable(0); + else if (index_prepare == 8) itemPrepareHome(0); } else { - Move_Highlight(-1, select_prepare.now + MROWS - index_prepare); + moveHighlight(-1, select_prepare.now + MROWS - index_prepare); } } } @@ -2691,19 +2670,19 @@ void HMI_Prepare() { switch (select_prepare.now) { case CASE_BACK: select_page.set(1); - Goto_MainMenu(); + gotoMainMenu(); break; case PREPARE_CASE_MOVE: checkkey = AxisMove; select_axis.reset(); - Draw_Move_Menu(); + drawMoveMenu(); - Draw_Edit_Float3(1, current_position.x * MINUNITMULT); - Draw_Edit_Float3(2, current_position.y * MINUNITMULT); - Draw_Edit_Float3(3, current_position.z * MINUNITMULT); + drawEditFloat3(1, current_position.x * MINUNITMULT); + drawEditFloat3(2, current_position.y * MINUNITMULT); + drawEditFloat3(3, current_position.z * MINUNITMULT); #if HAS_HOTEND - HMI_ValueStruct.Move_E_scaled = current_position.e * MINUNITMULT; - Draw_Edit_Signed_Float3(4, HMI_ValueStruct.Move_E_scaled); + hmiValues.Move_E_scaled = current_position.e * MINUNITMULT; + drawEditSignedFloat3(4, hmiValues.Move_E_scaled); #endif break; @@ -2713,21 +2692,21 @@ void HMI_Prepare() { checkkey = Last_Prepare; index_prepare = MROWS; queue.inject_P(G28_STR); // G28 will set home_flag - Popup_Window_Home(); + popupWindowHome(); break; #if HAS_ZOFFSET_ITEM case PREPARE_CASE_ZOFF: - #if EITHER(HAS_BED_PROBE, BABYSTEPPING) + #if ANY(HAS_BED_PROBE, BABYSTEPPING) checkkey = Homeoffset; - HMI_ValueStruct.show_mode = -4; - HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; - Draw_Edit_Signed_Float2(PREPARE_CASE_ZOFF + MROWS - index_prepare, HMI_ValueStruct.offset_value, true); - EncoderRate.enabled = true; + hmiValues.show_mode = -4; + hmiValues.offset_value = BABY_Z_VAR * 100; + drawEditSignedFloat2(PREPARE_CASE_ZOFF + MROWS - index_prepare, hmiValues.offset_value, true); + encoderRate.enabled = true; #else // Apply workspace offset, making the current position 0,0,0 queue.inject(F("G92X0Y0Z0")); - HMI_AudioFeedback(); + hmiAudioFeedback(); #endif break; #endif @@ -2747,113 +2726,113 @@ void HMI_Prepare() { #endif case PREPARE_CASE_LANG: - HMI_ToggleLanguage(); - Draw_Prepare_Menu(); + hmiToggleLanguage(); + drawPrepareMenu(); break; default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void Draw_Temperature_Menu() { - Clear_Main_Window(); +void drawTemperatureMenu() { + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(236, 2, 28, 12); // "Temperature" + if (hmiIsChinese()) { + dwinFrameTitleCopy(236, 2, 28, 12); // "Temperature" #if HAS_HOTEND - Item_AreaCopy(1, 134, 56, 146, TEMP_CASE_TEMP); + itemAreaCopy(1, 134, 56, 146, TEMP_CASE_TEMP); #endif #if HAS_HEATED_BED - Item_AreaCopy(58, 134, 113, 146, TEMP_CASE_BED); + itemAreaCopy(58, 134, 113, 146, TEMP_CASE_BED); #endif #if HAS_FAN - Item_AreaCopy(115, 134, 170, 146, TEMP_CASE_FAN); + itemAreaCopy(115, 134, 170, 146, TEMP_CASE_FAN); #endif #if HAS_PREHEAT - Item_AreaCopy(100, 89, 178, 101, TEMP_CASE_PLA); + itemAreaCopy(100, 89, 178, 101, TEMP_CASE_PLA); #if PREHEAT_COUNT > 1 - Item_AreaCopy(180, 89, 260, 100, TEMP_CASE_ABS); + itemAreaCopy(180, 89, 260, 100, TEMP_CASE_ABS); #endif #endif } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_TEMPERATURE)); + drawTitle(GET_TEXT_F(MSG_TEMPERATURE)); #else - DWIN_Frame_TitleCopy(56, 15, 85, 14); // "Temperature" + dwinFrameTitleCopy(56, 15, 85, 14); // "Temperature" #endif #ifdef USE_STRING_TITLES #if HAS_HOTEND - DWIN_Draw_Label(TEMP_CASE_TEMP, GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); + dwinDrawLabel(TEMP_CASE_TEMP, GET_TEXT_F(MSG_UBL_SET_TEMP_HOTEND)); #endif #if HAS_HEATED_BED - DWIN_Draw_Label(TEMP_CASE_BED, GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); + dwinDrawLabel(TEMP_CASE_BED, GET_TEXT_F(MSG_UBL_SET_TEMP_BED)); #endif #if HAS_FAN - DWIN_Draw_Label(TEMP_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); + dwinDrawLabel(TEMP_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); #endif #if HAS_PREHEAT - DWIN_Draw_Label(TEMP_CASE_PLA, F(PREHEAT_1_LABEL " Preheat Settings")); + dwinDrawLabel(TEMP_CASE_PLA, F(PREHEAT_1_LABEL " Preheat Settings")); #if PREHEAT_COUNT > 1 - DWIN_Draw_Label(TEMP_CASE_ABS, F(PREHEAT_2_LABEL " Preheat Settings")); + dwinDrawLabel(TEMP_CASE_ABS, F(PREHEAT_2_LABEL " Preheat Settings")); #endif #endif #else #if HAS_HOTEND - Item_AreaCopy(197, 104, 238, 114, TEMP_CASE_TEMP); // "Nozzle" - Item_AreaCopy(1, 89, 83, 101, TEMP_CASE_TEMP, 44); // "Temperature" + itemAreaCopy(197, 104, 238, 114, TEMP_CASE_TEMP); // "Nozzle" + itemAreaCopy(1, 89, 83, 101, TEMP_CASE_TEMP, 44); // "Temperature" #endif #if HAS_HEATED_BED - Item_AreaCopy(240, 104, 264, 114, TEMP_CASE_BED); // "Bed" - Item_AreaCopy(1, 89, 83, 101, TEMP_CASE_BED, 27); // "Temperature" + itemAreaCopy(240, 104, 264, 114, TEMP_CASE_BED); // "Bed" + itemAreaCopy(1, 89, 83, 101, TEMP_CASE_BED, 27); // "Temperature" #endif #if HAS_FAN - Item_AreaCopy( 1, 119, 61, 132, TEMP_CASE_FAN); // "Fan speed" + itemAreaCopy( 1, 119, 61, 132, TEMP_CASE_FAN); // "Fan speed" #endif #if HAS_PREHEAT - Item_AreaCopy(107, 76, 156, 86, TEMP_CASE_PLA); // "Preheat" + itemAreaCopy(107, 76, 156, 86, TEMP_CASE_PLA); // "Preheat" say_pla_en(52, TEMP_CASE_PLA); // "PLA" - Item_AreaCopy(150, 135, 202, 148, TEMP_CASE_PLA, 79); // "Settings" + itemAreaCopy(150, 135, 202, 148, TEMP_CASE_PLA, 79); // "Settings" #if PREHEAT_COUNT > 1 - Item_AreaCopy(107, 76, 156, 86, TEMP_CASE_ABS); // "Preheat" + itemAreaCopy(107, 76, 156, 86, TEMP_CASE_ABS); // "Preheat" say_abs_en(52, TEMP_CASE_ABS); // "ABS" - Item_AreaCopy(150, 135, 202, 148, TEMP_CASE_ABS, 81); // "Settings" + itemAreaCopy(150, 135, 202, 148, TEMP_CASE_ABS, 81); // "Settings" #endif #endif #endif } - Draw_Back_First(select_temp.now == CASE_BACK); - if (select_temp.now != CASE_BACK) Draw_Menu_Cursor(select_temp.now); + drawBackFirst(select_temp.now == CASE_BACK); + if (select_temp.now != CASE_BACK) drawMenuCursor(select_temp.now); // Draw icons and lines uint8_t i = 0; - #define _TMENU_ICON(N) Draw_Menu_Line(++i, ICON_SetEndTemp + (N) - 1) + #define _TMENU_ICON(N) drawMenuLine(++i, ICON_SetEndTemp + (N) - 1) #if HAS_HOTEND _TMENU_ICON(TEMP_CASE_TEMP); - Draw_Edit_Integer3(i, thermalManager.degTargetHotend(0)); + drawEditInteger3(i, thermalManager.degTargetHotend(0)); #endif #if HAS_HEATED_BED _TMENU_ICON(TEMP_CASE_BED); - Draw_Edit_Integer3(i, thermalManager.degTargetBed()); + drawEditInteger3(i, thermalManager.degTargetBed()); #endif #if HAS_FAN _TMENU_ICON(TEMP_CASE_FAN); - Draw_Edit_Integer3(i, thermalManager.fan_speed[0]); + drawEditInteger3(i, thermalManager.fan_speed[0]); #endif #if HAS_PREHEAT // PLA/ABS items have submenus - _TMENU_ICON(TEMP_CASE_PLA); Draw_More_Icon(i); + _TMENU_ICON(TEMP_CASE_PLA); drawMoreIcon(i); #if PREHEAT_COUNT > 1 - _TMENU_ICON(TEMP_CASE_ABS); Draw_More_Icon(i); + _TMENU_ICON(TEMP_CASE_ABS); drawMoreIcon(i); #endif #endif } // Control -void HMI_Control() { +void hmiControl() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; @@ -2864,107 +2843,107 @@ void HMI_Control() { index_control = select_control.now; // Scroll up and draw a blank bottom line - Scroll_Menu(DWIN_SCROLL_UP); + scrollMenu(DWIN_SCROLL_UP); switch (index_control) { // Last menu items - case CONTROL_CASE_ADVSET: Item_Control_Advanced(MROWS); break; - case CONTROL_CASE_INFO: Item_Control_Info(MROWS); break; + case CONTROL_CASE_ADVSET: itemControlAdvanced(MROWS); break; + case CONTROL_CASE_INFO: itemControlInfo(MROWS); break; default: break; } } else - Move_Highlight(1, select_control.now + MROWS - index_control); + moveHighlight(1, select_control.now + MROWS - index_control); } } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_control.dec()) { if (select_control.now < index_control - MROWS) { index_control--; - Scroll_Menu(DWIN_SCROLL_DOWN); + scrollMenu(DWIN_SCROLL_DOWN); switch (index_control) { // First menu items - case MROWS: Draw_Back_First(); break; - case MROWS + 1: Item_Control_Temp(0); break; - case MROWS + 2: Item_Control_Motion(0); break; + case MROWS: drawBackFirst(); break; + case MROWS + 1: itemControlTemp(0); break; + case MROWS + 2: itemControlMotion(0); break; default: break; } } else - Move_Highlight(-1, select_control.now + MROWS - index_control); + moveHighlight(-1, select_control.now + MROWS - index_control); } } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_control.now) { case CASE_BACK: select_page.set(2); - Goto_MainMenu(); + gotoMainMenu(); break; case CONTROL_CASE_TEMP: checkkey = TemperatureID; - HMI_ValueStruct.show_mode = -1; + hmiValues.show_mode = -1; select_temp.reset(); - Draw_Temperature_Menu(); + drawTemperatureMenu(); break; case CONTROL_CASE_MOVE: checkkey = Motion; select_motion.reset(); - Draw_Motion_Menu(); + drawMotionMenu(); break; #if ENABLED(EEPROM_SETTINGS) case CONTROL_CASE_SAVE: { const bool success = settings.save(); - HMI_AudioFeedback(success); + hmiAudioFeedback(success); } break; case CONTROL_CASE_LOAD: { const bool success = settings.load(); - HMI_AudioFeedback(success); + hmiAudioFeedback(success); } break; case CONTROL_CASE_RESET: settings.reset(); - HMI_AudioFeedback(); + hmiAudioFeedback(); break; #endif case CONTROL_CASE_ADVSET: checkkey = AdvSet; select_advset.reset(); - Draw_AdvancedSettings_Menu(); + drawAdvancedSettingsMenu(); break; case CONTROL_CASE_INFO: checkkey = Info; - Draw_Info_Menu(); + drawInfoMenu(); break; default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #if HAS_ONESTEP_LEVELING // Leveling - void HMI_Leveling() { - Popup_Window_Leveling(); - DWIN_UpdateLCD(); + void hmiLeveling() { + popupWindowLeveling(); + dwinUpdateLCD(); queue.inject(F("G28O\nG29")); } #endif // Axis Move -void HMI_AxisMove() { +void hmiAxisMove() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; #if ENABLED(PREVENT_COLD_EXTRUSION) // popup window resume - if (HMI_flag.cold_flag) { + if (hmiFlag.cold_flag) { if (encoder_diffState == ENCODER_DIFF_ENTER) { - HMI_flag.cold_flag = false; - HMI_ValueStruct.Move_E_scaled = current_position.e * MINUNITMULT; - Draw_Move_Menu(); - Draw_Edit_Float3(1, HMI_ValueStruct.Move_X_scaled); - Draw_Edit_Float3(2, HMI_ValueStruct.Move_Y_scaled); - Draw_Edit_Float3(3, HMI_ValueStruct.Move_Z_scaled); - Draw_Edit_Signed_Float3(4, 0); - DWIN_UpdateLCD(); + hmiFlag.cold_flag = false; + hmiValues.Move_E_scaled = current_position.e * MINUNITMULT; + drawMoveMenu(); + drawEditFloat3(1, hmiValues.Move_X_scaled); + drawEditFloat3(2, hmiValues.Move_Y_scaled); + drawEditFloat3(3, hmiValues.Move_Z_scaled); + drawEditSignedFloat3(4, 0); + dwinUpdateLCD(); } return; } @@ -2972,10 +2951,10 @@ void HMI_AxisMove() { // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_axis.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_axis.now); + if (select_axis.inc(1 + 3 + ENABLED(HAS_HOTEND))) moveHighlight(1, select_axis.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_axis.dec()) Move_Highlight(-1, select_axis.now); + if (select_axis.dec()) moveHighlight(-1, select_axis.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_axis.now) { @@ -2983,58 +2962,58 @@ void HMI_AxisMove() { checkkey = Prepare; select_prepare.set(1); index_prepare = MROWS; - Draw_Prepare_Menu(); + drawPrepareMenu(); break; case 1: // X axis move checkkey = Move_X; - HMI_ValueStruct.Move_X_scaled = current_position.x * MINUNITMULT; - Draw_Edit_Float3(1, HMI_ValueStruct.Move_X_scaled, true); - EncoderRate.enabled = true; + hmiValues.Move_X_scaled = current_position.x * MINUNITMULT; + drawEditFloat3(1, hmiValues.Move_X_scaled, true); + encoderRate.enabled = true; break; case 2: // Y axis move checkkey = Move_Y; - HMI_ValueStruct.Move_Y_scaled = current_position.y * MINUNITMULT; - Draw_Edit_Float3(2, HMI_ValueStruct.Move_Y_scaled, true); - EncoderRate.enabled = true; + hmiValues.Move_Y_scaled = current_position.y * MINUNITMULT; + drawEditFloat3(2, hmiValues.Move_Y_scaled, true); + encoderRate.enabled = true; break; case 3: // Z axis move checkkey = Move_Z; - HMI_ValueStruct.Move_Z_scaled = current_position.z * MINUNITMULT; - Draw_Edit_Float3(3, HMI_ValueStruct.Move_Z_scaled, true); - EncoderRate.enabled = true; + hmiValues.Move_Z_scaled = current_position.z * MINUNITMULT; + drawEditFloat3(3, hmiValues.Move_Z_scaled, true); + encoderRate.enabled = true; break; #if HAS_HOTEND case 4: // Extruder #if ENABLED(PREVENT_COLD_EXTRUSION) if (thermalManager.tooColdToExtrude(0)) { - HMI_flag.cold_flag = true; - Popup_Window_ETempTooLow(); - DWIN_UpdateLCD(); + hmiFlag.cold_flag = true; + popupWindowETempTooLow(); + dwinUpdateLCD(); return; } #endif checkkey = Extruder; - HMI_ValueStruct.Move_E_scaled = current_position.e * MINUNITMULT; - Draw_Edit_Signed_Float3(4, HMI_ValueStruct.Move_E_scaled, true); - EncoderRate.enabled = true; + hmiValues.Move_E_scaled = current_position.e * MINUNITMULT; + drawEditSignedFloat3(4, hmiValues.Move_E_scaled, true); + encoderRate.enabled = true; break; #endif } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // TemperatureID -void HMI_Temperature() { +void hmiTemperature() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_temp.inc(1 + TEMP_CASE_TOTAL)) Move_Highlight(1, select_temp.now); + if (select_temp.inc(1 + TEMP_CASE_TOTAL)) moveHighlight(1, select_temp.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_temp.dec()) Move_Highlight(-1, select_temp.now); + if (select_temp.dec()) moveHighlight(-1, select_temp.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_temp.now) { @@ -3042,30 +3021,30 @@ void HMI_Temperature() { checkkey = Control; select_control.set(1); index_control = MROWS; - Draw_Control_Menu(); + drawControlMenu(); break; #if HAS_HOTEND case TEMP_CASE_TEMP: checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.degTargetHotend(0); - Draw_Edit_Integer3(1, HMI_ValueStruct.E_Temp, true); - EncoderRate.enabled = true; + hmiValues.E_Temp = thermalManager.degTargetHotend(0); + drawEditInteger3(1, hmiValues.E_Temp, true); + encoderRate.enabled = true; break; #endif #if HAS_HEATED_BED case TEMP_CASE_BED: checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.degTargetBed(); - Draw_Edit_Integer3(2, HMI_ValueStruct.Bed_Temp, true); - EncoderRate.enabled = true; + hmiValues.Bed_Temp = thermalManager.degTargetBed(); + drawEditInteger3(2, hmiValues.Bed_Temp, true); + encoderRate.enabled = true; break; #endif #if HAS_FAN case TEMP_CASE_FAN: checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - Draw_Edit_Integer3(3, HMI_ValueStruct.Fan_speed, true); - EncoderRate.enabled = true; + hmiValues.Fan_speed = thermalManager.fan_speed[0]; + drawEditInteger3(3, hmiValues.Fan_speed, true); + encoderRate.enabled = true; break; #endif @@ -3073,77 +3052,77 @@ void HMI_Temperature() { case TEMP_CASE_PLA: { checkkey = PLAPreheat; select_PLA.reset(); - HMI_ValueStruct.show_mode = -2; + hmiValues.show_mode = -2; - Clear_Main_Window(); + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(59, 16, 81, 14); // "PLA Settings" - Item_AreaCopy(100, 89, 124, 101, PREHEAT_CASE_TEMP); - Item_AreaCopy(1, 134, 56, 146, PREHEAT_CASE_TEMP, 24); // PLA nozzle temp + if (hmiIsChinese()) { + dwinFrameTitleCopy(59, 16, 81, 14); // "PLA Settings" + itemAreaCopy(100, 89, 124, 101, PREHEAT_CASE_TEMP); + itemAreaCopy(1, 134, 56, 146, PREHEAT_CASE_TEMP, 24); // PLA nozzle temp #if HAS_HEATED_BED - Item_AreaCopy(100, 89, 124, 101, PREHEAT_CASE_BED); - Item_AreaCopy(58, 134, 113, 146, PREHEAT_CASE_BED, 24); // PLA bed temp + itemAreaCopy(100, 89, 124, 101, PREHEAT_CASE_BED); + itemAreaCopy(58, 134, 113, 146, PREHEAT_CASE_BED, 24); // PLA bed temp #endif #if HAS_FAN - Item_AreaCopy(100, 89, 124, 101, PREHEAT_CASE_FAN); - Item_AreaCopy(115, 134, 170, 146, PREHEAT_CASE_FAN, 24); // PLA fan speed + itemAreaCopy(100, 89, 124, 101, PREHEAT_CASE_FAN); + itemAreaCopy(115, 134, 170, 146, PREHEAT_CASE_FAN, 24); // PLA fan speed #endif #if ENABLED(EEPROM_SETTINGS) - Item_AreaCopy(72, 148, 151, 162, PREHEAT_CASE_SAVE); // Save PLA configuration + itemAreaCopy(72, 148, 151, 162, PREHEAT_CASE_SAVE); // Save PLA configuration #endif } else { #ifdef USE_STRING_HEADINGS - Draw_Title(F(PREHEAT_1_LABEL " Settings")); // TODO: GET_TEXT_F + drawTitle(F(PREHEAT_1_LABEL " Settings")); // TODO: GET_TEXT_F #else - DWIN_Frame_TitleCopy(56, 15, 85, 14); // "Temperature" TODO: "PLA Settings" + dwinFrameTitleCopy(56, 15, 85, 14); // "Temperature" TODO: "PLA Settings" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(PREHEAT_CASE_TEMP, F("Nozzle Temp")); + dwinDrawLabel(PREHEAT_CASE_TEMP, F("Nozzle Temp")); #if HAS_HEATED_BED - DWIN_Draw_Label(PREHEAT_CASE_BED, F("Bed Temp")); + dwinDrawLabel(PREHEAT_CASE_BED, F("Bed Temp")); #endif #if HAS_FAN - DWIN_Draw_Label(PREHEAT_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); + dwinDrawLabel(PREHEAT_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); #endif #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_Label(PREHEAT_CASE_SAVE, GET_TEXT_F(MSG_STORE_EEPROM)); + dwinDrawLabel(PREHEAT_CASE_SAVE, GET_TEXT_F(MSG_STORE_EEPROM)); #endif #else say_pla_en(0, PREHEAT_CASE_TEMP); // "PLA" - Item_AreaCopy(198, 104, 237, 114, PREHEAT_CASE_TEMP, 27); // "Nozzle" - Item_AreaCopy(1, 89, 81, 102, PREHEAT_CASE_TEMP, 71); // "Temperature" + itemAreaCopy(198, 104, 237, 114, PREHEAT_CASE_TEMP, 27); // "Nozzle" + itemAreaCopy(1, 89, 81, 102, PREHEAT_CASE_TEMP, 71); // "Temperature" #if HAS_HEATED_BED say_pla_en(0, PREHEAT_CASE_BED); // "PLA" - Item_AreaCopy(240, 104, 264, 114, PREHEAT_CASE_BED, 27); // "Bed" - Item_AreaCopy(1, 89, 83, 101, PREHEAT_CASE_BED, 54); // "Temperature" + itemAreaCopy(240, 104, 264, 114, PREHEAT_CASE_BED, 27); // "Bed" + itemAreaCopy(1, 89, 83, 101, PREHEAT_CASE_BED, 54); // "Temperature" #endif #if HAS_FAN say_pla_en(0, PREHEAT_CASE_FAN); // "PLA" - Item_AreaCopy(0, 119, 64, 132, PREHEAT_CASE_FAN, 27); // "Fan speed" + itemAreaCopy(0, 119, 64, 132, PREHEAT_CASE_FAN, 27); // "Fan speed" #endif #if ENABLED(EEPROM_SETTINGS) - Item_AreaCopy(98, 164, 233, 177, PREHEAT_CASE_SAVE); // "Save PLA parameters" + itemAreaCopy(98, 164, 233, 177, PREHEAT_CASE_SAVE); // "Save PLA parameters" #endif #endif } - Draw_Back_First(); + drawBackFirst(); uint8_t i = 0; - Draw_Menu_Line(++i, ICON_SetEndTemp); - Draw_Edit_Integer3(i, ui.material_preset[0].hotend_temp); + drawMenuLine(++i, ICON_SetEndTemp); + drawEditInteger3(i, ui.material_preset[0].hotend_temp); #if HAS_HEATED_BED - Draw_Menu_Line(++i, ICON_SetBedTemp); - Draw_Edit_Integer3(i, ui.material_preset[0].bed_temp); + drawMenuLine(++i, ICON_SetBedTemp); + drawEditInteger3(i, ui.material_preset[0].bed_temp); #endif #if HAS_FAN - Draw_Menu_Line(++i, ICON_FanSpeed); - Draw_Edit_Integer3(i, ui.material_preset[0].fan_speed); + drawMenuLine(++i, ICON_FanSpeed); + drawEditInteger3(i, ui.material_preset[0].fan_speed); #endif #if ENABLED(EEPROM_SETTINGS) - Draw_Menu_Line(++i, ICON_WriteEEPROM); + drawMenuLine(++i, ICON_WriteEEPROM); #endif } break; #endif // HAS_PREHEAT @@ -3152,80 +3131,80 @@ void HMI_Temperature() { case TEMP_CASE_ABS: { // ABS preheat setting checkkey = ABSPreheat; select_ABS.reset(); - HMI_ValueStruct.show_mode = -3; + hmiValues.show_mode = -3; - Clear_Main_Window(); + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(142, 16, 82, 14); // "ABS Settings" + if (hmiIsChinese()) { + dwinFrameTitleCopy(142, 16, 82, 14); // "ABS Settings" - Item_AreaCopy(180, 89, 204, 100, PREHEAT_CASE_TEMP); - Item_AreaCopy(1, 134, 56, 146, PREHEAT_CASE_TEMP, 24); // ABS nozzle temp + itemAreaCopy(180, 89, 204, 100, PREHEAT_CASE_TEMP); + itemAreaCopy(1, 134, 56, 146, PREHEAT_CASE_TEMP, 24); // ABS nozzle temp #if HAS_HEATED_BED - Item_AreaCopy(180, 89, 204, 100, PREHEAT_CASE_BED); - Item_AreaCopy(58, 134, 113, 146, PREHEAT_CASE_BED, 24); // ABS bed temp + itemAreaCopy(180, 89, 204, 100, PREHEAT_CASE_BED); + itemAreaCopy(58, 134, 113, 146, PREHEAT_CASE_BED, 24); // ABS bed temp #endif #if HAS_FAN - Item_AreaCopy(180, 89, 204, 100, PREHEAT_CASE_FAN); - Item_AreaCopy(115, 134, 170, 146, PREHEAT_CASE_FAN, 24); // ABS fan speed + itemAreaCopy(180, 89, 204, 100, PREHEAT_CASE_FAN); + itemAreaCopy(115, 134, 170, 146, PREHEAT_CASE_FAN, 24); // ABS fan speed #endif #if ENABLED(EEPROM_SETTINGS) - Item_AreaCopy(72, 148, 151, 162, PREHEAT_CASE_SAVE); - Item_AreaCopy(180, 89, 204, 100, PREHEAT_CASE_SAVE, 28, 2); // Save ABS configuration + itemAreaCopy(72, 148, 151, 162, PREHEAT_CASE_SAVE); + itemAreaCopy(180, 89, 204, 100, PREHEAT_CASE_SAVE, 28, 2); // Save ABS configuration #endif } else { #ifdef USE_STRING_HEADINGS - Draw_Title(F("ABS Settings")); // TODO: GET_TEXT_F + drawTitle(F("ABS Settings")); // TODO: GET_TEXT_F #else - DWIN_Frame_TitleCopy(56, 15, 85, 14); // "Temperature" TODO: "ABS Settings" + dwinFrameTitleCopy(56, 15, 85, 14); // "Temperature" TODO: "ABS Settings" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(PREHEAT_CASE_TEMP, F("Nozzle Temp")); + dwinDrawLabel(PREHEAT_CASE_TEMP, F("Nozzle Temp")); #if HAS_HEATED_BED - DWIN_Draw_Label(PREHEAT_CASE_BED, F("Bed Temp")); + dwinDrawLabel(PREHEAT_CASE_BED, F("Bed Temp")); #endif #if HAS_FAN - DWIN_Draw_Label(PREHEAT_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); + dwinDrawLabel(PREHEAT_CASE_FAN, GET_TEXT_F(MSG_FAN_SPEED)); #endif #if ENABLED(EEPROM_SETTINGS) - DWIN_Draw_Label(PREHEAT_CASE_SAVE, GET_TEXT_F(MSG_STORE_EEPROM)); + dwinDrawLabel(PREHEAT_CASE_SAVE, GET_TEXT_F(MSG_STORE_EEPROM)); #endif #else say_abs_en(0, PREHEAT_CASE_TEMP); // "ABS" - Item_AreaCopy(197, 104, 238, 114, PREHEAT_CASE_TEMP, 29); // "Nozzle" - Item_AreaCopy(1, 89, 34, 102, PREHEAT_CASE_TEMP, 73); // "Temp" + itemAreaCopy(197, 104, 238, 114, PREHEAT_CASE_TEMP, 29); // "Nozzle" + itemAreaCopy(1, 89, 34, 102, PREHEAT_CASE_TEMP, 73); // "Temp" #if HAS_HEATED_BED say_abs_en(0, PREHEAT_CASE_BED); // "ABS" - Item_AreaCopy(240, 104, 264, 114, PREHEAT_CASE_BED, 29); // "Bed" - Item_AreaCopy(1, 89, 83, 102, PREHEAT_CASE_BED, 56); // "Temperature" + itemAreaCopy(240, 104, 264, 114, PREHEAT_CASE_BED, 29); // "Bed" + itemAreaCopy(1, 89, 83, 102, PREHEAT_CASE_BED, 56); // "Temperature" #endif #if HAS_FAN say_abs_en(0, PREHEAT_CASE_FAN); // "ABS" - Item_AreaCopy(0, 119, 64, 132, PREHEAT_CASE_FAN, 29); // "Fan speed" + itemAreaCopy(0, 119, 64, 132, PREHEAT_CASE_FAN, 29); // "Fan speed" #endif #if ENABLED(EEPROM_SETTINGS) - Item_AreaCopy(98, 165, 233, 177, PREHEAT_CASE_SAVE); // "Save PLA parameters" + itemAreaCopy(98, 165, 233, 177, PREHEAT_CASE_SAVE); // "Save PLA parameters" say_abs_en(33, PREHEAT_CASE_SAVE); // "ABS" #endif #endif } - Draw_Back_First(); + drawBackFirst(); uint8_t i = 0; - Draw_Menu_Line(++i, ICON_SetEndTemp); - Draw_Edit_Integer3(i, ui.material_preset[1].hotend_temp); + drawMenuLine(++i, ICON_SetEndTemp); + drawEditInteger3(i, ui.material_preset[1].hotend_temp); #if HAS_HEATED_BED - Draw_Menu_Line(++i, ICON_SetBedTemp); - Draw_Edit_Integer3(i, ui.material_preset[1].bed_temp); + drawMenuLine(++i, ICON_SetBedTemp); + drawEditInteger3(i, ui.material_preset[1].bed_temp); #endif #if HAS_FAN - Draw_Menu_Line(++i, ICON_FanSpeed); - Draw_Edit_Integer3(i, ui.material_preset[1].fan_speed); + drawMenuLine(++i, ICON_FanSpeed); + drawEditInteger3(i, ui.material_preset[1].fan_speed); #endif #if ENABLED(EEPROM_SETTINGS) - Draw_Menu_Line(++i, ICON_WriteEEPROM); + drawMenuLine(++i, ICON_WriteEEPROM); #endif } break; @@ -3233,42 +3212,42 @@ void HMI_Temperature() { #endif // PREHEAT_COUNT > 1 } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void Draw_Max_Speed_Menu() { - Clear_Main_Window(); +void drawMaxSpeedMenu() { + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 16, 28, 13); // "Max Speed (mm/s)" + if (hmiIsChinese()) { + dwinFrameTitleCopy(1, 16, 28, 13); // "Max Speed (mm/s)" auto say_max_speed_cn = [](const uint8_t line) { - Item_AreaCopy(173, 133, 228, 147, line); // "Max speed" + itemAreaCopy(173, 133, 228, 147, line); // "Max speed" }; say_max_speed_cn(1); // "Max speed" - Item_AreaCopy(229, 133, 236, 147, 1, 58); // "X" + itemAreaCopy(229, 133, 236, 147, 1, 58); // "X" say_max_speed_cn(2); // "Max speed" - Item_AreaCopy(1, 150, 7, 160, 2, 58, 3); // "Y" + itemAreaCopy(1, 150, 7, 160, 2, 58, 3); // "Y" say_max_speed_cn(3); // "Max speed" - Item_AreaCopy(9, 150, 16, 160, 3, 58, 3); // "Z" + itemAreaCopy(9, 150, 16, 160, 3, 58, 3); // "Z" #if HAS_HOTEND say_max_speed_cn(4); // "Max speed" - Item_AreaCopy(18, 150, 25, 160, 4, 58, 3); // "E" + itemAreaCopy(18, 150, 25, 160, 4, 58, 3); // "E" #endif } else { #ifdef USE_STRING_HEADINGS - Draw_Title(F("Max Speed (mm/s)")); // TODO: GET_TEXT_F + drawTitle(F("Max Speed (mm/s)")); // TODO: GET_TEXT_F #else - DWIN_Frame_TitleCopy(144, 16, 46, 11); // "Max Speed (mm/s)" + dwinFrameTitleCopy(144, 16, 46, 11); // "Max Speed (mm/s)" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(1, F("Max Feedrate X")); - DWIN_Draw_Label(2, F("Max Feedrate Y")); - DWIN_Draw_Label(3, F("Max Feedrate Z")); + dwinDrawLabel(1, F("Max Feedrate X")); + dwinDrawLabel(2, F("Max Feedrate Y")); + dwinDrawLabel(3, F("Max Feedrate Z")); #if HAS_HOTEND - DWIN_Draw_Label(4, F("Max Feedrate E")); + dwinDrawLabel(4, F("Max Feedrate E")); #endif #else say_max_en(1); say_speed_en(30, 1); say_x_en(73, 1); // "Max Speed X" @@ -3280,49 +3259,49 @@ void Draw_Max_Speed_Menu() { #endif } - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedX + i); - Draw_Edit_Integer4(1, planner.settings.max_feedrate_mm_s[X_AXIS]); - Draw_Edit_Integer4(2, planner.settings.max_feedrate_mm_s[Y_AXIS]); - Draw_Edit_Integer4(3, planner.settings.max_feedrate_mm_s[Z_AXIS]); + drawBackFirst(); + for (uint8_t i = 0; i < 3 + ENABLED(HAS_HOTEND); ++i) drawMenuLine(i + 1, ICON_MaxSpeedX + i); + drawEditInteger4(1, planner.settings.max_feedrate_mm_s[X_AXIS]); + drawEditInteger4(2, planner.settings.max_feedrate_mm_s[Y_AXIS]); + drawEditInteger4(3, planner.settings.max_feedrate_mm_s[Z_AXIS]); #if HAS_HOTEND - Draw_Edit_Integer4(4, planner.settings.max_feedrate_mm_s[E_AXIS]); + drawEditInteger4(4, planner.settings.max_feedrate_mm_s[E_AXIS]); #endif } -void Draw_Max_Accel_Menu() { - Clear_Main_Window(); +void drawMaxAccelMenu() { + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 16, 28, 13); // "Acceleration" + if (hmiIsChinese()) { + dwinFrameTitleCopy(1, 16, 28, 13); // "Acceleration" - Item_AreaCopy(173, 133, 200, 147, 1); - Item_AreaCopy( 28, 149, 69, 161, 1, 30, 1); - Item_AreaCopy(229, 133, 236, 147, 1, 74); // Max acceleration X - Item_AreaCopy(173, 133, 200, 147, 2); - Item_AreaCopy( 28, 149, 69, 161, 2, 30, 1); - Item_AreaCopy( 1, 150, 7, 160, 2, 74, 2); // Max acceleration Y - Item_AreaCopy(173, 133, 200, 147, 3); - Item_AreaCopy( 28, 149, 69, 161, 3, 30, 1); - Item_AreaCopy( 9, 150, 16, 160, 3, 74, 2); // Max acceleration Z + itemAreaCopy(173, 133, 200, 147, 1); + itemAreaCopy( 28, 149, 69, 161, 1, 30, 1); + itemAreaCopy(229, 133, 236, 147, 1, 74); // Max acceleration X + itemAreaCopy(173, 133, 200, 147, 2); + itemAreaCopy( 28, 149, 69, 161, 2, 30, 1); + itemAreaCopy( 1, 150, 7, 160, 2, 74, 2); // Max acceleration Y + itemAreaCopy(173, 133, 200, 147, 3); + itemAreaCopy( 28, 149, 69, 161, 3, 30, 1); + itemAreaCopy( 9, 150, 16, 160, 3, 74, 2); // Max acceleration Z #if HAS_HOTEND - Item_AreaCopy(173, 133, 200, 147, 4); - Item_AreaCopy( 28, 149, 69, 161, 4, 30, 1); - Item_AreaCopy( 18, 150, 25, 160, 4, 74, 2); // Max acceleration E + itemAreaCopy(173, 133, 200, 147, 4); + itemAreaCopy( 28, 149, 69, 161, 4, 30, 1); + itemAreaCopy( 18, 150, 25, 160, 4, 74, 2); // Max acceleration E #endif } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_ACCELERATION)); + drawTitle(GET_TEXT_F(MSG_ACCELERATION)); #else - DWIN_Frame_TitleCopy(144, 16, 46, 11); // "Acceleration" + dwinFrameTitleCopy(144, 16, 46, 11); // "Acceleration" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(1, F("Max Accel X")); - DWIN_Draw_Label(2, F("Max Accel Y")); - DWIN_Draw_Label(3, F("Max Accel Z")); + dwinDrawLabel(1, F("Max Accel X")); + dwinDrawLabel(2, F("Max Accel Y")); + dwinDrawLabel(3, F("Max Accel Z")); #if HAS_HOTEND - DWIN_Draw_Label(4, F("Max Accel E")); + dwinDrawLabel(4, F("Max Accel E")); #endif #else say_max_accel_en(1); say_x_en(112, 1); // "Max Acceleration X" @@ -3334,54 +3313,54 @@ void Draw_Max_Accel_Menu() { #endif } - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxAccX + i); - Draw_Edit_Integer4(1, planner.settings.max_acceleration_mm_per_s2[X_AXIS]); - Draw_Edit_Integer4(2, planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - Draw_Edit_Integer4(3, planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + drawBackFirst(); + for (uint8_t i = 0; i < 3 + ENABLED(HAS_HOTEND); ++i) drawMenuLine(i + 1, ICON_MaxAccX + i); + drawEditInteger4(1, planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + drawEditInteger4(2, planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + drawEditInteger4(3, planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); #if HAS_HOTEND - Draw_Edit_Integer4(4, planner.settings.max_acceleration_mm_per_s2[E_AXIS]); + drawEditInteger4(4, planner.settings.max_acceleration_mm_per_s2[E_AXIS]); #endif } #if HAS_CLASSIC_JERK - void Draw_Max_Jerk_Menu() { - Clear_Main_Window(); + void drawMaxJerkMenu() { + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 16, 28, 13); // "Jerk" + if (hmiIsChinese()) { + dwinFrameTitleCopy(1, 16, 28, 13); // "Jerk" - Item_AreaCopy(173, 133, 200, 147, 1); - Item_AreaCopy( 1, 180, 28, 192, 1, 30, 1); - Item_AreaCopy(202, 133, 228, 147, 1, 56); - Item_AreaCopy(229, 133, 236, 147, 1, 86); // Max Jerk speed X - Item_AreaCopy(173, 133, 200, 147, 2); - Item_AreaCopy( 1, 180, 28, 192, 2, 30, 1); - Item_AreaCopy(202, 133, 228, 147, 2, 56); - Item_AreaCopy( 1, 150, 7, 160, 2, 86, 3); // Max Jerk speed Y - Item_AreaCopy(173, 133, 200, 147, 3); - Item_AreaCopy( 1, 180, 28, 192, 3, 30, 1); - Item_AreaCopy(202, 133, 228, 147, 3, 56); - Item_AreaCopy( 9, 150, 16, 160, 3, 86, 3); // Max Jerk speed Z + itemAreaCopy(173, 133, 200, 147, 1); + itemAreaCopy( 1, 180, 28, 192, 1, 30, 1); + itemAreaCopy(202, 133, 228, 147, 1, 56); + itemAreaCopy(229, 133, 236, 147, 1, 86); // Max Jerk speed X + itemAreaCopy(173, 133, 200, 147, 2); + itemAreaCopy( 1, 180, 28, 192, 2, 30, 1); + itemAreaCopy(202, 133, 228, 147, 2, 56); + itemAreaCopy( 1, 150, 7, 160, 2, 86, 3); // Max Jerk speed Y + itemAreaCopy(173, 133, 200, 147, 3); + itemAreaCopy( 1, 180, 28, 192, 3, 30, 1); + itemAreaCopy(202, 133, 228, 147, 3, 56); + itemAreaCopy( 9, 150, 16, 160, 3, 86, 3); // Max Jerk speed Z #if HAS_HOTEND - Item_AreaCopy(173, 133, 200, 147, 4); - Item_AreaCopy( 1, 180, 28, 192, 4, 30, 1); - Item_AreaCopy(202, 133, 228, 147, 4, 56); - Item_AreaCopy( 18, 150, 25, 160, 4, 86, 3); // Max Jerk speed E + itemAreaCopy(173, 133, 200, 147, 4); + itemAreaCopy( 1, 180, 28, 192, 4, 30, 1); + itemAreaCopy(202, 133, 228, 147, 4, 56); + itemAreaCopy( 18, 150, 25, 160, 4, 86, 3); // Max Jerk speed E #endif } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_JERK)); + drawTitle(GET_TEXT_F(MSG_JERK)); #else - DWIN_Frame_TitleCopy(144, 16, 46, 11); // "Jerk" + dwinFrameTitleCopy(144, 16, 46, 11); // "Jerk" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(1, GET_TEXT_F(MSG_VA_JERK)); - DWIN_Draw_Label(2, GET_TEXT_F(MSG_VB_JERK)); - DWIN_Draw_Label(3, GET_TEXT_F(MSG_VC_JERK)); + dwinDrawLabel(1, GET_TEXT_F(MSG_VA_JERK)); + dwinDrawLabel(2, GET_TEXT_F(MSG_VB_JERK)); + dwinDrawLabel(3, GET_TEXT_F(MSG_VC_JERK)); #if HAS_HOTEND - DWIN_Draw_Label(4, GET_TEXT_F(MSG_VE_JERK)); + dwinDrawLabel(4, GET_TEXT_F(MSG_VE_JERK)); #endif #else say_max_jerk_speed_en(1); say_x_en(102, 1); // Max Jerk speed X @@ -3393,46 +3372,46 @@ void Draw_Max_Accel_Menu() { #endif } - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_MaxSpeedJerkX + i); - Draw_Edit_Float3(1, planner.max_jerk.x * MINUNITMULT); - Draw_Edit_Float3(2, planner.max_jerk.y * MINUNITMULT); - Draw_Edit_Float3(3, planner.max_jerk.z * MINUNITMULT); + drawBackFirst(); + for (uint8_t i = 0; i < 3 + ENABLED(HAS_HOTEND); ++i) drawMenuLine(i + 1, ICON_MaxSpeedJerkX + i); + drawEditFloat3(1, planner.max_jerk.x * MINUNITMULT); + drawEditFloat3(2, planner.max_jerk.y * MINUNITMULT); + drawEditFloat3(3, planner.max_jerk.z * MINUNITMULT); #if HAS_HOTEND - Draw_Edit_Float3(4, planner.max_jerk.e * MINUNITMULT); + drawEditFloat3(4, planner.max_jerk.e * MINUNITMULT); #endif } #endif -void Draw_Steps_Menu() { - Clear_Main_Window(); +void drawStepsMenu() { + clearMainWindow(); - if (HMI_IsChinese()) { - DWIN_Frame_TitleCopy(1, 16, 28, 13); // "Steps per mm" + if (hmiIsChinese()) { + dwinFrameTitleCopy(1, 16, 28, 13); // "Steps per mm" - Item_AreaCopy(153, 148, 194, 161, 1); - Item_AreaCopy(229, 133, 236, 147, 1, 44); // Transmission Ratio X - Item_AreaCopy(153, 148, 194, 161, 2); - Item_AreaCopy( 1, 150, 7, 160, 2, 44, 3); // Transmission Ratio Y - Item_AreaCopy(153, 148, 194, 161, 3); - Item_AreaCopy( 9, 150, 16, 160, 3, 44, 3); // Transmission Ratio Z + itemAreaCopy(153, 148, 194, 161, 1); + itemAreaCopy(229, 133, 236, 147, 1, 44); // Transmission Ratio X + itemAreaCopy(153, 148, 194, 161, 2); + itemAreaCopy( 1, 150, 7, 160, 2, 44, 3); // Transmission Ratio Y + itemAreaCopy(153, 148, 194, 161, 3); + itemAreaCopy( 9, 150, 16, 160, 3, 44, 3); // Transmission Ratio Z #if HAS_HOTEND - Item_AreaCopy(153, 148, 194, 161, 4); - Item_AreaCopy( 18, 150, 25, 160, 4, 44, 3); // Transmission Ratio E + itemAreaCopy(153, 148, 194, 161, 4); + itemAreaCopy( 18, 150, 25, 160, 4, 44, 3); // Transmission Ratio E #endif } else { #ifdef USE_STRING_HEADINGS - Draw_Title(GET_TEXT_F(MSG_STEPS_PER_MM)); + drawTitle(GET_TEXT_F(MSG_STEPS_PER_MM)); #else - DWIN_Frame_TitleCopy(144, 16, 46, 11); // "Steps per mm" + dwinFrameTitleCopy(144, 16, 46, 11); // "Steps per mm" #endif #ifdef USE_STRING_TITLES - DWIN_Draw_Label(1, GET_TEXT_F(MSG_A_STEPS)); - DWIN_Draw_Label(2, GET_TEXT_F(MSG_B_STEPS)); - DWIN_Draw_Label(3, GET_TEXT_F(MSG_C_STEPS)); + dwinDrawLabel(1, GET_TEXT_F(MSG_A_STEPS)); + dwinDrawLabel(2, GET_TEXT_F(MSG_B_STEPS)); + dwinDrawLabel(3, GET_TEXT_F(MSG_C_STEPS)); #if HAS_HOTEND - DWIN_Draw_Label(4, GET_TEXT_F(MSG_E_STEPS)); + dwinDrawLabel(4, GET_TEXT_F(MSG_E_STEPS)); #endif #else say_steps_per_mm_en(1); say_x_en(101, 1); // "Steps-per-mm X" @@ -3444,27 +3423,27 @@ void Draw_Steps_Menu() { #endif } - Draw_Back_First(); - LOOP_L_N(i, 3 + ENABLED(HAS_HOTEND)) Draw_Menu_Line(i + 1, ICON_StepX + i); - Draw_Edit_Float3(1, planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); - Draw_Edit_Float3(2, planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); - Draw_Edit_Float3(3, planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); + drawBackFirst(); + for (uint8_t i = 0; i < 3 + ENABLED(HAS_HOTEND); ++i) drawMenuLine(i + 1, ICON_StepX + i); + drawEditFloat3(1, planner.settings.axis_steps_per_mm[X_AXIS] * MINUNITMULT); + drawEditFloat3(2, planner.settings.axis_steps_per_mm[Y_AXIS] * MINUNITMULT); + drawEditFloat3(3, planner.settings.axis_steps_per_mm[Z_AXIS] * MINUNITMULT); #if HAS_HOTEND - Draw_Edit_Float3(4, planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); + drawEditFloat3(4, planner.settings.axis_steps_per_mm[E_AXIS] * MINUNITMULT); #endif } // Motion -void HMI_Motion() { +void hmiMotion() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_motion.inc(1 + MOTION_CASE_TOTAL)) Move_Highlight(1, select_motion.now); + if (select_motion.inc(1 + MOTION_CASE_TOTAL)) moveHighlight(1, select_motion.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_motion.dec()) Move_Highlight(-1, select_motion.now); + if (select_motion.dec()) moveHighlight(-1, select_motion.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_motion.now) { @@ -3472,38 +3451,38 @@ void HMI_Motion() { checkkey = Control; select_control.set(CONTROL_CASE_MOVE); index_control = MROWS; - Draw_Control_Menu(); + drawControlMenu(); break; case MOTION_CASE_RATE: checkkey = MaxSpeed; select_speed.reset(); - Draw_Max_Speed_Menu(); + drawMaxSpeedMenu(); break; case MOTION_CASE_ACCEL: checkkey = MaxAcceleration; select_acc.reset(); - Draw_Max_Accel_Menu(); + drawMaxAccelMenu(); break; #if HAS_CLASSIC_JERK case MOTION_CASE_JERK: checkkey = MaxJerk; select_jerk.reset(); - Draw_Max_Jerk_Menu(); + drawMaxJerkMenu(); break; #endif case MOTION_CASE_STEPS: checkkey = Step; select_step.reset(); - Draw_Steps_Menu(); + drawStepsMenu(); break; default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // Advanced Settings -void HMI_AdvSet() { +void hmiAdvSet() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; @@ -3514,7 +3493,7 @@ void HMI_AdvSet() { index_advset = select_advset.now; // Scroll up and draw a blank bottom line - Scroll_Menu(DWIN_SCROLL_UP); + scrollMenu(DWIN_SCROLL_UP); //switch (index_advset) { // Redraw last menu items // default: break; @@ -3522,7 +3501,7 @@ void HMI_AdvSet() { } else { - Move_Highlight(1, select_advset.now + MROWS - index_advset); + moveHighlight(1, select_advset.now + MROWS - index_advset); } } } @@ -3530,14 +3509,14 @@ void HMI_AdvSet() { if (select_advset.dec()) { if (select_advset.now < index_advset - MROWS) { index_advset--; - Scroll_Menu(DWIN_SCROLL_DOWN); + scrollMenu(DWIN_SCROLL_DOWN); //switch (index_advset) { // Redraw first menu items // default: break; //} } else { - Move_Highlight(-1, select_advset.now + MROWS - index_advset); + moveHighlight(-1, select_advset.now + MROWS - index_advset); } } } @@ -3547,17 +3526,17 @@ void HMI_AdvSet() { checkkey = Control; select_control.set(CONTROL_CASE_ADVSET); index_control = CONTROL_CASE_ADVSET; - Draw_Control_Menu(); + drawControlMenu(); break; #if HAS_HOME_OFFSET case ADVSET_CASE_HOMEOFF: checkkey = HomeOff; select_item.reset(); - HMI_ValueStruct.Home_OffX_scaled = home_offset.x * 10; - HMI_ValueStruct.Home_OffY_scaled = home_offset.y * 10; - HMI_ValueStruct.Home_OffZ_scaled = home_offset.z * 10; - Draw_HomeOff_Menu(); + hmiValues.Home_OffX_scaled = home_offset.x * 10; + hmiValues.Home_OffY_scaled = home_offset.y * 10; + hmiValues.Home_OffZ_scaled = home_offset.z * 10; + drawHomeOffMenu(); break; #endif @@ -3565,9 +3544,9 @@ void HMI_AdvSet() { case ADVSET_CASE_PROBEOFF: checkkey = ProbeOff; select_item.reset(); - HMI_ValueStruct.Probe_OffX_scaled = probe.offset.x * 10; - HMI_ValueStruct.Probe_OffY_scaled = probe.offset.y * 10; - Draw_ProbeOff_Menu(); + hmiValues.Probe_OffX_scaled = probe.offset.x * 10; + hmiValues.Probe_OffY_scaled = probe.offset.y * 10; + drawProbeOffMenu(); break; #endif @@ -3586,153 +3565,153 @@ void HMI_AdvSet() { #if ENABLED(POWER_LOSS_RECOVERY) case ADVSET_CASE_PWRLOSSR: recovery.enable(!recovery.enabled); - Draw_Checkbox_Line(ADVSET_CASE_PWRLOSSR + MROWS - index_advset, recovery.enabled); + drawCheckboxLine(ADVSET_CASE_PWRLOSSR + MROWS - index_advset, recovery.enabled); break; #endif default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #if HAS_HOME_OFFSET // Home Offset - void HMI_HomeOff() { + void hmiHomeOff() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_item.inc(1 + 3)) Move_Highlight(1, select_item.now); + if (select_item.inc(1 + 3)) moveHighlight(1, select_item.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_item.dec()) Move_Highlight(-1, select_item.now); + if (select_item.dec()) moveHighlight(-1, select_item.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_item.now) { case CASE_BACK: checkkey = AdvSet; select_advset.set(ADVSET_CASE_HOMEOFF); - Draw_AdvancedSettings_Menu(); + drawAdvancedSettingsMenu(); break; case 1: // Home Offset X checkkey = HomeOffX; - Draw_Edit_Signed_Float3(1, HMI_ValueStruct.Home_OffX_scaled, true); - EncoderRate.enabled = true; + drawEditSignedFloat3(1, hmiValues.Home_OffX_scaled, true); + encoderRate.enabled = true; break; case 2: // Home Offset Y checkkey = HomeOffY; - Draw_Edit_Signed_Float3(2, HMI_ValueStruct.Home_OffY_scaled, true); - EncoderRate.enabled = true; + drawEditSignedFloat3(2, hmiValues.Home_OffY_scaled, true); + encoderRate.enabled = true; break; case 3: // Home Offset Z checkkey = HomeOffZ; - Draw_Edit_Signed_Float3(3, HMI_ValueStruct.Home_OffZ_scaled, true); - EncoderRate.enabled = true; + drawEditSignedFloat3(3, hmiValues.Home_OffZ_scaled, true); + encoderRate.enabled = true; break; default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } - void HMI_HomeOffN(const AxisEnum axis, float &posScaled, const_float_t lo, const_float_t hi) { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + void hmiHomeOffN(const AxisEnum axis, float &posScaled, const_float_t lo, const_float_t hi) { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, posScaled)) { + if (applyEncoder(encoder_diffState, posScaled)) { checkkey = HomeOff; - EncoderRate.enabled = false; + encoderRate.enabled = false; set_home_offset(axis, posScaled / 10); - Draw_Edit_Signed_Float3(select_item.now, posScaled); + drawEditSignedFloat3(select_item.now, posScaled); return; } LIMIT(posScaled, lo, hi); - Draw_Edit_Signed_Float3(select_item.now, posScaled, true); + drawEditSignedFloat3(select_item.now, posScaled, true); } - void HMI_HomeOffX() { HMI_HomeOffN(X_AXIS, HMI_ValueStruct.Home_OffX_scaled, -500, 500); } - void HMI_HomeOffY() { HMI_HomeOffN(Y_AXIS, HMI_ValueStruct.Home_OffY_scaled, -500, 500); } - void HMI_HomeOffZ() { HMI_HomeOffN(Z_AXIS, HMI_ValueStruct.Home_OffZ_scaled, -20, 20); } + void hmiHomeOffX() { hmiHomeOffN(X_AXIS, hmiValues.Home_OffX_scaled, -500, 500); } + void hmiHomeOffY() { hmiHomeOffN(Y_AXIS, hmiValues.Home_OffY_scaled, -500, 500); } + void hmiHomeOffZ() { hmiHomeOffN(Z_AXIS, hmiValues.Home_OffZ_scaled, -20, 20); } #endif // HAS_HOME_OFFSET #if HAS_ONESTEP_LEVELING // Probe Offset - void HMI_ProbeOff() { + void hmiProbeOff() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_item.inc(1 + 2)) Move_Highlight(1, select_item.now); + if (select_item.inc(1 + 2)) moveHighlight(1, select_item.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_item.dec()) Move_Highlight(-1, select_item.now); + if (select_item.dec()) moveHighlight(-1, select_item.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_item.now) { case CASE_BACK: checkkey = AdvSet; select_advset.set(ADVSET_CASE_PROBEOFF); - Draw_AdvancedSettings_Menu(); + drawAdvancedSettingsMenu(); break; case 1: // Probe Offset X checkkey = ProbeOffX; - Draw_Edit_Signed_Float3(1, HMI_ValueStruct.Probe_OffX_scaled, true); - EncoderRate.enabled = true; + drawEditSignedFloat3(1, hmiValues.Probe_OffX_scaled, true); + encoderRate.enabled = true; break; case 2: // Probe Offset Y checkkey = ProbeOffY; - Draw_Edit_Signed_Float3(2, HMI_ValueStruct.Probe_OffY_scaled, true); - EncoderRate.enabled = true; + drawEditSignedFloat3(2, hmiValues.Probe_OffY_scaled, true); + encoderRate.enabled = true; break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } - void HMI_ProbeOffN(float &posScaled, float &offset_ref) { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + void hmiProbeOffN(float &posScaled, float &offset_ref) { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (Apply_Encoder(encoder_diffState, posScaled)) { + if (applyEncoder(encoder_diffState, posScaled)) { checkkey = ProbeOff; - EncoderRate.enabled = false; + encoderRate.enabled = false; offset_ref = posScaled / 10; - Draw_Edit_Signed_Float3(select_item.now, posScaled); + drawEditSignedFloat3(select_item.now, posScaled); return; } LIMIT(posScaled, -500, 500); - Draw_Edit_Signed_Float3(select_item.now, posScaled, true); + drawEditSignedFloat3(select_item.now, posScaled, true); } - void HMI_ProbeOffX() { HMI_ProbeOffN(HMI_ValueStruct.Probe_OffX_scaled, probe.offset.x); } - void HMI_ProbeOffY() { HMI_ProbeOffN(HMI_ValueStruct.Probe_OffY_scaled, probe.offset.y); } + void hmiProbeOffX() { hmiProbeOffN(hmiValues.Probe_OffX_scaled, probe.offset.x); } + void hmiProbeOffY() { hmiProbeOffN(hmiValues.Probe_OffY_scaled, probe.offset.y); } #endif // HAS_ONESTEP_LEVELING // Info -void HMI_Info() { +void hmiInfo() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_ENTER) { #if HAS_ONESTEP_LEVELING checkkey = Control; select_control.set(CONTROL_CASE_INFO); - Draw_Control_Menu(); + drawControlMenu(); #else select_page.set(3); - Goto_MainMenu(); + gotoMainMenu(); #endif } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // Tune -void HMI_Tune() { +void hmiTune() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; @@ -3741,343 +3720,343 @@ void HMI_Tune() { if (select_tune.inc(1 + TUNE_CASE_TOTAL)) { if (select_tune.now > MROWS && select_tune.now > index_tune) { index_tune = select_tune.now; - Scroll_Menu(DWIN_SCROLL_UP); + scrollMenu(DWIN_SCROLL_UP); } else - Move_Highlight(1, select_tune.now + MROWS - index_tune); + moveHighlight(1, select_tune.now + MROWS - index_tune); } } else if (encoder_diffState == ENCODER_DIFF_CCW) { if (select_tune.dec()) { if (select_tune.now < index_tune - MROWS) { index_tune--; - Scroll_Menu(DWIN_SCROLL_DOWN); - if (index_tune == MROWS) Draw_Back_First(); + scrollMenu(DWIN_SCROLL_DOWN); + if (index_tune == MROWS) drawBackFirst(); } else - Move_Highlight(-1, select_tune.now + MROWS - index_tune); + moveHighlight(-1, select_tune.now + MROWS - index_tune); } } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_tune.now) { case 0: { // Back select_print.set(0); - Goto_PrintProcess(); + gotoPrintProcess(); } break; case TUNE_CASE_SPEED: // Print speed checkkey = PrintSpeed; - HMI_ValueStruct.print_speed = feedrate_percentage; - Draw_Edit_Integer3(TUNE_CASE_SPEED + MROWS - index_tune, HMI_ValueStruct.print_speed, true); - EncoderRate.enabled = true; + hmiValues.print_speed = feedrate_percentage; + drawEditInteger3(TUNE_CASE_SPEED + MROWS - index_tune, hmiValues.print_speed, true); + encoderRate.enabled = true; break; #if HAS_HOTEND case TUNE_CASE_TEMP: // Nozzle temp checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.degTargetHotend(0); - Draw_Edit_Integer3(TUNE_CASE_TEMP + MROWS - index_tune, HMI_ValueStruct.E_Temp, true); - EncoderRate.enabled = true; + hmiValues.E_Temp = thermalManager.degTargetHotend(0); + drawEditInteger3(TUNE_CASE_TEMP + MROWS - index_tune, hmiValues.E_Temp, true); + encoderRate.enabled = true; break; #endif #if HAS_HEATED_BED case TUNE_CASE_BED: // Bed temp checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.degTargetBed(); - Draw_Edit_Integer3(TUNE_CASE_BED + MROWS - index_tune, HMI_ValueStruct.Bed_Temp, true); - EncoderRate.enabled = true; + hmiValues.Bed_Temp = thermalManager.degTargetBed(); + drawEditInteger3(TUNE_CASE_BED + MROWS - index_tune, hmiValues.Bed_Temp, true); + encoderRate.enabled = true; break; #endif #if HAS_FAN case TUNE_CASE_FAN: // Fan speed checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - Draw_Edit_Integer3(TUNE_CASE_FAN + MROWS - index_tune, HMI_ValueStruct.Fan_speed, true); - EncoderRate.enabled = true; + hmiValues.Fan_speed = thermalManager.fan_speed[0]; + drawEditInteger3(TUNE_CASE_FAN + MROWS - index_tune, hmiValues.Fan_speed, true); + encoderRate.enabled = true; break; #endif #if HAS_ZOFFSET_ITEM case TUNE_CASE_ZOFF: // Z-offset - #if EITHER(HAS_BED_PROBE, BABYSTEPPING) + #if ANY(HAS_BED_PROBE, BABYSTEPPING) checkkey = Homeoffset; - HMI_ValueStruct.offset_value = BABY_Z_VAR * 100; - Draw_Edit_Signed_Float2(TUNE_CASE_ZOFF + MROWS - index_tune, HMI_ValueStruct.offset_value, true); - EncoderRate.enabled = true; + hmiValues.offset_value = BABY_Z_VAR * 100; + drawEditSignedFloat2(TUNE_CASE_ZOFF + MROWS - index_tune, hmiValues.offset_value, true); + encoderRate.enabled = true; #else // Apply workspace offset, making the current position 0,0,0 queue.inject(F("G92X0Y0Z0")); - HMI_AudioFeedback(); + hmiAudioFeedback(); #endif break; #endif default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #if HAS_PREHEAT // PLA Preheat - void HMI_PLAPreheatSetting() { + void hmiPLAPreheatSetting() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_PLA.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_PLA.now); + if (select_PLA.inc(1 + PREHEAT_CASE_TOTAL)) moveHighlight(1, select_PLA.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_PLA.dec()) Move_Highlight(-1, select_PLA.now); + if (select_PLA.dec()) moveHighlight(-1, select_PLA.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_PLA.now) { case CASE_BACK: checkkey = TemperatureID; select_temp.now = TEMP_CASE_PLA; - HMI_ValueStruct.show_mode = -1; - Draw_Temperature_Menu(); + hmiValues.show_mode = -1; + drawTemperatureMenu(); break; #if HAS_HOTEND case PREHEAT_CASE_TEMP: checkkey = ETemp; - HMI_ValueStruct.E_Temp = ui.material_preset[0].hotend_temp; - Draw_Edit_Integer3(PREHEAT_CASE_TEMP, ui.material_preset[0].hotend_temp, true); - EncoderRate.enabled = true; + hmiValues.E_Temp = ui.material_preset[0].hotend_temp; + drawEditInteger3(PREHEAT_CASE_TEMP, ui.material_preset[0].hotend_temp, true); + encoderRate.enabled = true; break; #endif #if HAS_HEATED_BED case PREHEAT_CASE_BED: checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = ui.material_preset[0].bed_temp; - Draw_Edit_Integer3(PREHEAT_CASE_BED, ui.material_preset[0].bed_temp, true); - EncoderRate.enabled = true; + hmiValues.Bed_Temp = ui.material_preset[0].bed_temp; + drawEditInteger3(PREHEAT_CASE_BED, ui.material_preset[0].bed_temp, true); + encoderRate.enabled = true; break; #endif #if HAS_FAN case PREHEAT_CASE_FAN: checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = ui.material_preset[0].fan_speed; - Draw_Edit_Integer3(PREHEAT_CASE_FAN, ui.material_preset[0].fan_speed, true); - EncoderRate.enabled = true; + hmiValues.Fan_speed = ui.material_preset[0].fan_speed; + drawEditInteger3(PREHEAT_CASE_FAN, ui.material_preset[0].fan_speed, true); + encoderRate.enabled = true; break; #endif #if ENABLED(EEPROM_SETTINGS) case PREHEAT_CASE_SAVE: { const bool success = settings.save(); - HMI_AudioFeedback(success); + hmiAudioFeedback(success); } break; #endif default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #if PREHEAT_COUNT > 1 // ABS Preheat - void HMI_ABSPreheatSetting() { + void hmiABSPreheatSetting() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_ABS.inc(1 + PREHEAT_CASE_TOTAL)) Move_Highlight(1, select_ABS.now); + if (select_ABS.inc(1 + PREHEAT_CASE_TOTAL)) moveHighlight(1, select_ABS.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_ABS.dec()) Move_Highlight(-1, select_ABS.now); + if (select_ABS.dec()) moveHighlight(-1, select_ABS.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (select_ABS.now) { case CASE_BACK: checkkey = TemperatureID; select_temp.now = TEMP_CASE_ABS; - HMI_ValueStruct.show_mode = -1; - Draw_Temperature_Menu(); + hmiValues.show_mode = -1; + drawTemperatureMenu(); break; #if HAS_HOTEND case PREHEAT_CASE_TEMP: checkkey = ETemp; - HMI_ValueStruct.E_Temp = ui.material_preset[1].hotend_temp; - Draw_Edit_Integer3(PREHEAT_CASE_TEMP, ui.material_preset[1].hotend_temp, true); - EncoderRate.enabled = true; + hmiValues.E_Temp = ui.material_preset[1].hotend_temp; + drawEditInteger3(PREHEAT_CASE_TEMP, ui.material_preset[1].hotend_temp, true); + encoderRate.enabled = true; break; #endif #if HAS_HEATED_BED case PREHEAT_CASE_BED: checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = ui.material_preset[1].bed_temp; - Draw_Edit_Integer3(PREHEAT_CASE_BED, ui.material_preset[1].bed_temp, true); - EncoderRate.enabled = true; + hmiValues.Bed_Temp = ui.material_preset[1].bed_temp; + drawEditInteger3(PREHEAT_CASE_BED, ui.material_preset[1].bed_temp, true); + encoderRate.enabled = true; break; #endif #if HAS_FAN case PREHEAT_CASE_FAN: checkkey = FanSpeed; - HMI_ValueStruct.Fan_speed = ui.material_preset[1].fan_speed; - Draw_Edit_Integer3(PREHEAT_CASE_FAN, ui.material_preset[1].fan_speed, true); - EncoderRate.enabled = true; + hmiValues.Fan_speed = ui.material_preset[1].fan_speed; + drawEditInteger3(PREHEAT_CASE_FAN, ui.material_preset[1].fan_speed, true); + encoderRate.enabled = true; break; #endif #if ENABLED(EEPROM_SETTINGS) case PREHEAT_CASE_SAVE: { const bool success = settings.save(); - HMI_AudioFeedback(success); + hmiAudioFeedback(success); } break; #endif default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #endif // PREHEAT_COUNT > 1 #endif // HAS_PREHEAT // Max Speed -void HMI_MaxSpeed() { +void hmiMaxSpeed() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_speed.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_speed.now); + if (select_speed.inc(1 + 3 + ENABLED(HAS_HOTEND))) moveHighlight(1, select_speed.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_speed.dec()) Move_Highlight(-1, select_speed.now); + if (select_speed.dec()) moveHighlight(-1, select_speed.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (WITHIN(select_speed.now, 1, 4)) { checkkey = MaxSpeed_value; - HMI_flag.feedspeed_axis = AxisEnum(select_speed.now - 1); - HMI_ValueStruct.Max_Feedspeed = planner.settings.max_feedrate_mm_s[HMI_flag.feedspeed_axis]; - Draw_Edit_Integer4(select_speed.now, HMI_ValueStruct.Max_Feedspeed, true); - EncoderRate.enabled = true; + hmiFlag.feedspeed_axis = AxisEnum(select_speed.now - 1); + hmiValues.Max_Feedspeed = planner.settings.max_feedrate_mm_s[hmiFlag.feedspeed_axis]; + drawEditInteger4(select_speed.now, hmiValues.Max_Feedspeed, true); + encoderRate.enabled = true; } else { // Back checkkey = Motion; select_motion.now = MOTION_CASE_RATE; - Draw_Motion_Menu(); + drawMotionMenu(); } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // Max Acceleration -void HMI_MaxAcceleration() { +void hmiMaxAcceleration() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_acc.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_acc.now); + if (select_acc.inc(1 + 3 + ENABLED(HAS_HOTEND))) moveHighlight(1, select_acc.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_acc.dec()) Move_Highlight(-1, select_acc.now); + if (select_acc.dec()) moveHighlight(-1, select_acc.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (WITHIN(select_acc.now, 1, 4)) { checkkey = MaxAcceleration_value; - HMI_flag.acc_axis = AxisEnum(select_acc.now - 1); - HMI_ValueStruct.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[HMI_flag.acc_axis]; - Draw_Edit_Integer4(select_acc.now, HMI_ValueStruct.Max_Acceleration, true); - EncoderRate.enabled = true; + hmiFlag.acc_axis = AxisEnum(select_acc.now - 1); + hmiValues.Max_Acceleration = planner.settings.max_acceleration_mm_per_s2[hmiFlag.acc_axis]; + drawEditInteger4(select_acc.now, hmiValues.Max_Acceleration, true); + encoderRate.enabled = true; } else { // Back checkkey = Motion; select_motion.now = MOTION_CASE_ACCEL; - Draw_Motion_Menu(); + drawMotionMenu(); } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #if HAS_CLASSIC_JERK // Max Jerk - void HMI_MaxJerk() { + void hmiMaxJerk() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_jerk.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_jerk.now); + if (select_jerk.inc(1 + 3 + ENABLED(HAS_HOTEND))) moveHighlight(1, select_jerk.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_jerk.dec()) Move_Highlight(-1, select_jerk.now); + if (select_jerk.dec()) moveHighlight(-1, select_jerk.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (WITHIN(select_jerk.now, 1, 4)) { checkkey = MaxJerk_value; - HMI_flag.jerk_axis = AxisEnum(select_jerk.now - 1); - HMI_ValueStruct.Max_Jerk_scaled = planner.max_jerk[HMI_flag.jerk_axis] * MINUNITMULT; - Draw_Edit_Float3(select_jerk.now, HMI_ValueStruct.Max_Jerk_scaled, true); - EncoderRate.enabled = true; + hmiFlag.jerk_axis = AxisEnum(select_jerk.now - 1); + hmiValues.Max_Jerk_scaled = planner.max_jerk[hmiFlag.jerk_axis] * MINUNITMULT; + drawEditFloat3(select_jerk.now, hmiValues.Max_Jerk_scaled, true); + encoderRate.enabled = true; } else { // Back checkkey = Motion; select_motion.now = MOTION_CASE_JERK; - Draw_Motion_Menu(); + drawMotionMenu(); } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #endif // HAS_CLASSIC_JERK // Step -void HMI_Step() { +void hmiStep() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState == ENCODER_DIFF_NO) return; // Avoid flicker by updating only the previous menu if (encoder_diffState == ENCODER_DIFF_CW) { - if (select_step.inc(1 + 3 + ENABLED(HAS_HOTEND))) Move_Highlight(1, select_step.now); + if (select_step.inc(1 + 3 + ENABLED(HAS_HOTEND))) moveHighlight(1, select_step.now); } else if (encoder_diffState == ENCODER_DIFF_CCW) { - if (select_step.dec()) Move_Highlight(-1, select_step.now); + if (select_step.dec()) moveHighlight(-1, select_step.now); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (WITHIN(select_step.now, 1, 4)) { checkkey = Step_value; - HMI_flag.step_axis = AxisEnum(select_step.now - 1); - HMI_ValueStruct.Max_Step_scaled = planner.settings.axis_steps_per_mm[HMI_flag.step_axis] * MINUNITMULT; - Draw_Edit_Float3(select_step.now, HMI_ValueStruct.Max_Step_scaled, true); - EncoderRate.enabled = true; + hmiFlag.step_axis = AxisEnum(select_step.now - 1); + hmiValues.Max_Step_scaled = planner.settings.axis_steps_per_mm[hmiFlag.step_axis] * MINUNITMULT; + drawEditFloat3(select_step.now, hmiValues.Max_Step_scaled, true); + encoderRate.enabled = true; } else { // Back checkkey = Motion; select_motion.now = MOTION_CASE_STEPS; - Draw_Motion_Menu(); + drawMotionMenu(); } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void HMI_Init() { - HMI_SDCardInit(); +void hmiInit() { + hmiSDCardInit(); for (uint16_t t = 0; t <= 100; t += 2) { - DWIN_ICON_Show(ICON, ICON_Bar, 15, 260); - DWIN_Draw_Rectangle(1, Color_Bg_Black, 15 + t * 242 / 100, 260, 257, 280); - DWIN_UpdateLCD(); + dwinIconShow(ICON, ICON_Bar, 15, 260); + dwinDrawRectangle(1, Color_Bg_Black, 15 + t * 242 / 100, 260, 257, 280); + dwinUpdateLCD(); delay(20); } - HMI_SetLanguage(); + hmiSetLanguage(); } -void DWIN_InitScreen() { - Encoder_Configuration(); - HMI_Init(); - HMI_SetLanguageCache(); - HMI_StartFrame(true); +void dwinInitScreen() { + encoderConfiguration(); + hmiInit(); + hmiSetLanguageCache(); + hmiStartFrame(true); } -void DWIN_Update() { - EachMomentUpdate(); // Status update - HMI_SDCardUpdate(); // SD card update - DWIN_HandleScreen(); // Rotary encoder update +void dwinUpdate() { + eachMomentUpdate(); // Status update + hmiSDCardUpdate(); // SD card update + dwinHandleScreen(); // Rotary encoder update } -void EachMomentUpdate() { +void eachMomentUpdate() { static millis_t next_var_update_ms = 0, next_rts_update_ms = 0; const millis_t ms = millis(); @@ -4091,9 +4070,9 @@ void EachMomentUpdate() { if (checkkey == PrintProcess) { // if print done - if (HMI_flag.print_finish && !HMI_flag.done_confirm_flag) { - HMI_flag.print_finish = false; - HMI_flag.done_confirm_flag = true; + if (hmiFlag.print_finish && !hmiFlag.done_confirm_flag) { + hmiFlag.print_finish = false; + hmiFlag.done_confirm_flag = true; TERN_(POWER_LOSS_RECOVERY, recovery.cancel()); @@ -4101,22 +4080,22 @@ void EachMomentUpdate() { // show percent bar and value _card_percent = 0; - Draw_Print_ProgressBar(); + drawPrintProgressBar(); // show print done confirm - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 250, DWIN_WIDTH - 1, STATUS_Y); - DWIN_ICON_Show(ICON, HMI_IsChinese() ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); + dwinDrawRectangle(1, Color_Bg_Black, 0, 250, DWIN_WIDTH - 1, STATUS_Y); + dwinIconShow(ICON, hmiIsChinese() ? ICON_Confirm_C : ICON_Confirm_E, 86, 283); } - else if (HMI_flag.pause_flag != printingIsPaused()) { + else if (hmiFlag.pause_flag != printingIsPaused()) { // print status update - HMI_flag.pause_flag = printingIsPaused(); - ICON_ResumeOrPause(); + hmiFlag.pause_flag = printingIsPaused(); + iconResumeOrPause(); } } // pause after homing - if (HMI_flag.pause_action && printingIsPaused() && !planner.has_blocks_queued()) { - HMI_flag.pause_action = false; + if (hmiFlag.pause_action && printingIsPaused() && !planner.has_blocks_queued()) { + hmiFlag.pause_action = false; #if ENABLED(PAUSE_HEAT) TERN_(HAS_HOTEND, resume_hotend_temp = thermalManager.degTargetHotend(0)); TERN_(HAS_HEATED_BED, resume_bed_temp = thermalManager.degTargetBed()); @@ -4132,7 +4111,7 @@ void EachMomentUpdate() { last_cardpercentValue = card_pct; if (card_pct) { _card_percent = card_pct; - Draw_Print_ProgressBar(); + drawPrintProgressBar(); } } @@ -4143,174 +4122,174 @@ void EachMomentUpdate() { const uint16_t min = (elapsed.value % 3600) / 60; if (last_Printtime != min) { // 1 minute update last_Printtime = min; - Draw_Print_ProgressElapsed(); + drawPrintProgressElapsed(); } // Estimate remaining time every 20 seconds static millis_t next_remain_time_update = 0; - if (_card_percent > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag) { + if (_card_percent > 1 && ELAPSED(ms, next_remain_time_update) && !hmiFlag.heat_flag) { _remain_time = (elapsed.value - dwin_heat_time) / (_card_percent * 0.01f) - (elapsed.value - dwin_heat_time); next_remain_time_update += DWIN_REMAIN_TIME_UPDATE_INTERVAL; - Draw_Print_ProgressRemain(); + drawPrintProgressRemain(); } } - else if (dwin_abort_flag && !HMI_flag.home_flag) { // Print Stop + else if (dwin_abort_flag && !hmiFlag.home_flag) { // Print Stop dwin_abort_flag = false; - HMI_ValueStruct.print_speed = feedrate_percentage = 100; + hmiValues.print_speed = feedrate_percentage = 100; dwin_zoffset = BABY_Z_VAR; select_page.set(0); - Goto_MainMenu(); + gotoMainMenu(); } #if ENABLED(POWER_LOSS_RECOVERY) else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off recovery.dwin_flag = false; auto update_selection = [&](const bool sel) { - HMI_flag.select_flag = sel; + hmiFlag.select_flag = sel; const uint16_t c1 = sel ? Color_Bg_Window : Select_Color; - DWIN_Draw_Rectangle(0, c1, 25, 306, 126, 345); - DWIN_Draw_Rectangle(0, c1, 24, 305, 127, 346); + dwinDrawRectangle(0, c1, 25, 306, 126, 345); + dwinDrawRectangle(0, c1, 24, 305, 127, 346); const uint16_t c2 = sel ? Select_Color : Color_Bg_Window; - DWIN_Draw_Rectangle(0, c2, 145, 306, 246, 345); - DWIN_Draw_Rectangle(0, c2, 144, 305, 247, 346); + dwinDrawRectangle(0, c2, 145, 306, 246, 345); + dwinDrawRectangle(0, c2, 144, 305, 247, 346); }; - Popup_Window_Resume(); + popupWindowResume(); update_selection(true); char * const name = card.longest_filename(); const int8_t npos = _MAX(0U, DWIN_WIDTH - strlen(name) * (MENU_CHR_W)) / 2; - DWIN_Draw_String(true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name); - DWIN_UpdateLCD(); + dwinDrawString(true, font8x16, Popup_Text_Color, Color_Bg_Window, npos, 252, name); + dwinUpdateLCD(); bool recovery_flag = true; while (recovery_flag) { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (encoder_diffState == ENCODER_DIFF_ENTER) { recovery_flag = false; - if (HMI_flag.select_flag) break; + if (hmiFlag.select_flag) break; TERN_(POWER_LOSS_RECOVERY, queue.inject(F("M1000C"))); - HMI_StartFrame(true); + hmiStartFrame(true); return; } else update_selection(encoder_diffState == ENCODER_DIFF_CW); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } } select_print.set(0); - HMI_ValueStruct.show_mode = 0; + hmiValues.show_mode = 0; queue.inject(F("M1000")); - Goto_PrintProcess(); - Draw_Status_Area(true); + gotoPrintProcess(); + drawStatusArea(true); } #endif // POWER_LOSS_RECOVERY - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void DWIN_HandleScreen() { +void dwinHandleScreen() { switch (checkkey) { - case MainMenu: HMI_MainMenu(); break; - case SelectFile: HMI_SelectFile(); break; - case Prepare: HMI_Prepare(); break; - case Control: HMI_Control(); break; + case MainMenu: hmiMainMenu(); break; + case SelectFile: hmiSelectFile(); break; + case Prepare: hmiPrepare(); break; + case Control: hmiControl(); break; case Leveling: break; - case PrintProcess: HMI_Printing(); break; - case Print_window: HMI_PauseOrStop(); break; - case AxisMove: HMI_AxisMove(); break; - case TemperatureID: HMI_Temperature(); break; - case Motion: HMI_Motion(); break; - case AdvSet: HMI_AdvSet(); break; + case PrintProcess: hmiPrinting(); break; + case Print_window: hmiPauseOrStop(); break; + case AxisMove: hmiAxisMove(); break; + case TemperatureID: hmiTemperature(); break; + case Motion: hmiMotion(); break; + case AdvSet: hmiAdvSet(); break; #if HAS_HOME_OFFSET - case HomeOff: HMI_HomeOff(); break; - case HomeOffX: HMI_HomeOffX(); break; - case HomeOffY: HMI_HomeOffY(); break; - case HomeOffZ: HMI_HomeOffZ(); break; + case HomeOff: hmiHomeOff(); break; + case HomeOffX: hmiHomeOffX(); break; + case HomeOffY: hmiHomeOffY(); break; + case HomeOffZ: hmiHomeOffZ(); break; #endif #if HAS_ONESTEP_LEVELING - case ProbeOff: HMI_ProbeOff(); break; - case ProbeOffX: HMI_ProbeOffX(); break; - case ProbeOffY: HMI_ProbeOffY(); break; + case ProbeOff: hmiProbeOff(); break; + case ProbeOffX: hmiProbeOffX(); break; + case ProbeOffY: hmiProbeOffY(); break; #endif - case Info: HMI_Info(); break; - case Tune: HMI_Tune(); break; + case Info: hmiInfo(); break; + case Tune: hmiTune(); break; #if HAS_PREHEAT - case PLAPreheat: HMI_PLAPreheatSetting(); break; + case PLAPreheat: hmiPLAPreheatSetting(); break; #if PREHEAT_COUNT > 1 - case ABSPreheat: HMI_ABSPreheatSetting(); break; + case ABSPreheat: hmiABSPreheatSetting(); break; #endif #endif - case MaxSpeed: HMI_MaxSpeed(); break; - case MaxAcceleration: HMI_MaxAcceleration(); break; + case MaxSpeed: hmiMaxSpeed(); break; + case MaxAcceleration: hmiMaxAcceleration(); break; #if HAS_CLASSIC_JERK - case MaxJerk: HMI_MaxJerk(); break; + case MaxJerk: hmiMaxJerk(); break; #endif - case Step: HMI_Step(); break; - case Move_X: HMI_Move_X(); break; - case Move_Y: HMI_Move_Y(); break; - case Move_Z: HMI_Move_Z(); break; + case Step: hmiStep(); break; + case Move_X: hmiMoveX(); break; + case Move_Y: hmiMoveY(); break; + case Move_Z: hmiMoveZ(); break; #if HAS_HOTEND - case Extruder: HMI_Move_E(); break; - case ETemp: HMI_ETemp(); break; + case Extruder: hmiMoveE(); break; + case ETemp: hmiETemp(); break; #endif - #if EITHER(HAS_BED_PROBE, BABYSTEPPING) - case Homeoffset: HMI_Zoffset(); break; + #if ANY(HAS_BED_PROBE, BABYSTEPPING) + case Homeoffset: hmiZoffset(); break; #endif #if HAS_HEATED_BED - case BedTemp: HMI_BedTemp(); break; + case BedTemp: hmiBedTemp(); break; #endif #if HAS_PREHEAT && HAS_FAN - case FanSpeed: HMI_FanSpeed(); break; + case FanSpeed: hmiFanSpeed(); break; #endif - case PrintSpeed: HMI_PrintSpeed(); break; - case MaxSpeed_value: HMI_MaxFeedspeedXYZE(); break; - case MaxAcceleration_value: HMI_MaxAccelerationXYZE(); break; + case PrintSpeed: hmiPrintSpeed(); break; + case MaxSpeed_value: hmiMaxFeedspeedXYZE(); break; + case MaxAcceleration_value: hmiMaxAccelerationXYZE(); break; #if HAS_CLASSIC_JERK - case MaxJerk_value: HMI_MaxJerkXYZE(); break; + case MaxJerk_value: hmiMaxJerkXYZE(); break; #endif - case Step_value: HMI_StepXYZE(); break; + case Step_value: hmiStepXYZE(); break; default: break; } } -void DWIN_HomingDone() { - HMI_flag.home_flag = false; +void dwinHomingDone() { + hmiFlag.home_flag = false; dwin_zoffset = TERN0(HAS_BED_PROBE, probe.offset.z); if (checkkey == Last_Prepare) { checkkey = Prepare; select_prepare.now = PREPARE_CASE_HOME; index_prepare = MROWS; - Draw_Prepare_Menu(); + drawPrepareMenu(); } else if (checkkey == Back_Main) { - HMI_ValueStruct.print_speed = feedrate_percentage = 100; + hmiValues.print_speed = feedrate_percentage = 100; planner.finish_and_disable(); - Goto_MainMenu(); + gotoMainMenu(); } } -void DWIN_LevelingDone() { - if (checkkey == Leveling) Goto_MainMenu(); +void dwinLevelingDone() { + if (checkkey == Leveling) gotoMainMenu(); } -void DWIN_StatusChanged(const char * const cstr/*=nullptr*/) { - DWIN_Draw_Rectangle(1, Color_Bg_Blue, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 24); +void dwinStatusChanged(const char * const cstr/*=nullptr*/) { + dwinDrawRectangle(1, Color_Bg_Blue, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 24); const int8_t x = _MAX(0U, DWIN_WIDTH - strlen(cstr) * MENU_CHR_W) / 2; - DWIN_Draw_String(false, font8x16, Color_White, Color_Bg_Blue, x, STATUS_Y + 3, cstr); - DWIN_UpdateLCD(); + dwinDrawString(false, font8x16, Color_White, Color_Bg_Blue, x, STATUS_Y + 3, cstr); + dwinUpdateLCD(); } -void DWIN_StatusChanged(FSTR_P const fstr) { +void dwinStatusChanged(FSTR_P const fstr) { #ifdef __AVR__ char str[strlen_P(FTOP(fstr)) + 1]; strcpy_P(str, FTOP(fstr)); - DWIN_StatusChanged(str); + dwinStatusChanged(str); #else - DWIN_StatusChanged(FTOP(fstr)); + dwinStatusChanged(FTOP(fstr)); #endif } diff --git a/Marlin/src/lcd/e3v2/creality/dwin.h b/Marlin/src/lcd/e3v2/creality/dwin.h index 487f309ed9..0e2d42eee9 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin.h +++ b/Marlin/src/lcd/e3v2/creality/dwin.h @@ -27,6 +27,7 @@ #include "dwin_lcd.h" #include "../common/encoder.h" +#include "../common/limits.h" #include "../../../libs/BL24CXX.h" #include "../../../inc/MarlinConfigPre.h" @@ -132,7 +133,7 @@ typedef struct { float Home_OffZ_scaled = 0; float Probe_OffX_scaled = 0; float Probe_OffY_scaled = 0; -} HMI_value_t; +} hmi_value_t; #define DWIN_CHINESE 123 #define DWIN_ENGLISH 0 @@ -150,59 +151,59 @@ typedef struct { bool cold_flag:1; #endif AxisEnum feedspeed_axis, acc_axis, jerk_axis, step_axis; -} HMI_flag_t; +} hmi_flag_t; -extern HMI_value_t HMI_ValueStruct; -extern HMI_flag_t HMI_flag; +extern hmi_value_t hmiValues; +extern hmi_flag_t hmiFlag; #if HAS_HOTEND || HAS_HEATED_BED // Popup message window - void DWIN_Popup_Temperature(const bool toohigh); + void dwinPopupTemperature(const bool toohigh); #endif #if HAS_HOTEND - void Popup_Window_ETempTooLow(); + void popupWindowETempTooLow(); #endif -void Popup_Window_Resume(); -void Popup_Window_Home(const bool parking=false); -void Popup_Window_Leveling(); +void popupWindowResume(); +void popupWindowHome(const bool parking=false); +void popupWindowLeveling(); -void Goto_PrintProcess(); -void Goto_MainMenu(); +void gotoPrintProcess(); +void gotoMainMenu(); // Variable control -void HMI_Move_X(); -void HMI_Move_Y(); -void HMI_Move_Z(); -void HMI_Move_E(); +void hmiMoveX(); +void hmiMoveY(); +void hmiMoveZ(); +void hmiMoveE(); -void HMI_Zoffset(); +void hmiZoffset(); #if HAS_HOTEND - void HMI_ETemp(); + void hmiETemp(); #endif #if HAS_HEATED_BED - void HMI_BedTemp(); + void hmiBedTemp(); #endif #if HAS_FAN - void HMI_FanSpeed(); + void hmiFanSpeed(); #endif -void HMI_PrintSpeed(); +void hmiPrintSpeed(); -void HMI_MaxFeedspeedXYZE(); -void HMI_MaxAccelerationXYZE(); -void HMI_MaxJerkXYZE(); -void HMI_StepXYZE(); -void HMI_SetLanguageCache(); +void hmiMaxFeedspeedXYZE(); +void hmiMaxAccelerationXYZE(); +void hmiMaxJerkXYZE(); +void hmiStepXYZE(); +void hmiSetLanguageCache(); void update_variable(); -void DWIN_Draw_Signed_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); +void dwinDrawSigned_Float(uint8_t size, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, long value); // SD Card -void HMI_SDCardInit(); -void HMI_SDCardUpdate(); +void hmiSDCardInit(); +void hmiSDCardUpdate(); // Main Process void Icon_print(bool value); @@ -211,39 +212,39 @@ void Icon_temperature(bool value); void Icon_leveling(bool value); // Other -void Draw_Status_Area(const bool with_update); // Status Area -void HMI_StartFrame(const bool with_update); // Prepare the menu view -void HMI_MainMenu(); // Main process screen -void HMI_SelectFile(); // File page -void HMI_Printing(); // Print page -void HMI_Prepare(); // Prepare page -void HMI_Control(); // Control page -void HMI_Leveling(); // Level the page -void HMI_AxisMove(); // Axis movement menu -void HMI_Temperature(); // Temperature menu -void HMI_Motion(); // Sports menu -void HMI_Info(); // Information menu -void HMI_Tune(); // Adjust the menu +void drawStatusArea(const bool with_update); // Status Area +void hmiStartFrame(const bool with_update); // Prepare the menu view +void hmiMainMenu(); // Main process screen +void hmiSelectFile(); // File page +void hmiPrinting(); // Print page +void hmiPrepare(); // Prepare page +void hmiControl(); // Control page +void hmiLeveling(); // Level the page +void hmiAxisMove(); // Axis movement menu +void hmiTemperature(); // Temperature menu +void hmiMotion(); // Sports menu +void hmiInfo(); // Information menu +void hmiTune(); // Adjust the menu #if HAS_PREHEAT - void HMI_PLAPreheatSetting(); // PLA warm-up setting - void HMI_ABSPreheatSetting(); // ABS warm-up setting + void hmiPLAPreheatSetting(); // PLA warm-up setting + void hmiABSPreheatSetting(); // ABS warm-up setting #endif -void HMI_MaxSpeed(); // Maximum speed submenu -void HMI_MaxAcceleration(); // Maximum acceleration submenu -void HMI_MaxJerk(); // Maximum jerk speed submenu -void HMI_Step(); // Transmission ratio +void hmiMaxSpeed(); // Maximum speed submenu +void hmiMaxAcceleration(); // Maximum acceleration submenu +void hmiMaxJerk(); // Maximum jerk speed submenu +void hmiStep(); // Transmission ratio -void HMI_Init(); -void DWIN_InitScreen(); -void DWIN_Update(); -void EachMomentUpdate(); -void DWIN_HandleScreen(); -void DWIN_StatusChanged(const char * const cstr=nullptr); -void DWIN_StatusChanged(FSTR_P const fstr); +void hmiInit(); +void dwinInitScreen(); +void dwinUpdate(); +void eachMomentUpdate(); +void dwinHandleScreen(); +void dwinStatusChanged(const char * const cstr=nullptr); +void dwinStatusChanged(FSTR_P const fstr); -inline void DWIN_HomingStart() { HMI_flag.home_flag = true; } +inline void dwinHomingStart() { hmiFlag.home_flag = true; } -void DWIN_HomingDone(); -void DWIN_LevelingDone(); +void dwinHomingDone(); +void dwinLevelingDone(); diff --git a/Marlin/src/lcd/e3v2/creality/dwin_lcd.cpp b/Marlin/src/lcd/e3v2/creality/dwin_lcd.cpp index 3d60e32a79..7a0587df43 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin_lcd.cpp +++ b/Marlin/src/lcd/e3v2/creality/dwin_lcd.cpp @@ -41,16 +41,16 @@ /*-------------------------------------- System variable function --------------------------------------*/ -void DWIN_Startup() { +void dwinStartup() { DEBUG_ECHOPGM("\r\nDWIN handshake "); delay(750); // Delay here or init later in the boot process - if (DWIN_Handshake()) DEBUG_ECHOLNPGM("ok."); else DEBUG_ECHOLNPGM("error."); - DWIN_Frame_SetDir(1); + if (dwinHandshake()) DEBUG_ECHOLNPGM("ok."); else DEBUG_ECHOLNPGM("error."); + dwinFrameSetDir(1); #if DISABLED(SHOW_BOOTSCREEN) - DWIN_Frame_Clear(Color_Bg_Black); // MarlinUI handles the bootscreen so just clear here + dwinFrameClear(Color_Bg_Black); // MarlinUI handles the bootscreen so just clear here #endif - DWIN_JPG_ShowAndCache(3); - DWIN_UpdateLCD(); + dwinJPGShowAndCache(3); + dwinUpdateLCD(); } /*---------------------------------------- Picture related functions ----------------------------------------*/ @@ -59,8 +59,8 @@ void DWIN_Startup() { // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { - DWIN_ICON_Show(true, false, false, libID, picID, x, y); +void dwinIconShow(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { + dwinIconShow(true, false, false, libID, picID, x, y); } // Copy area from virtual display area to current screen @@ -68,17 +68,17 @@ void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { // xStart/yStart: Upper-left of virtual area // xEnd/yEnd: Lower-right of virtual area // x/y: Screen paste point -void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y) { +void dwinFrameAreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y) { size_t i = 0; - DWIN_Byte(i, 0x27); - DWIN_Byte(i, 0x80 | cacheID); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Send(i); + dwinByte(i, 0x27); + dwinByte(i, 0x80 | cacheID); + dwinWord(i, xStart); + dwinWord(i, yStart); + dwinWord(i, xEnd); + dwinWord(i, yEnd); + dwinWord(i, x); + dwinWord(i, y); + dwinSend(i); } #endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/e3v2/creality/dwin_lcd.h b/Marlin/src/lcd/e3v2/creality/dwin_lcd.h index b37a65977c..b60fe2970d 100644 --- a/Marlin/src/lcd/e3v2/creality/dwin_lcd.h +++ b/Marlin/src/lcd/e3v2/creality/dwin_lcd.h @@ -44,4 +44,4 @@ // xStart/yStart: Upper-left of virtual area // xEnd/yEnd: Lower-right of virtual area // x/y: Screen paste point -void DWIN_Frame_AreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y); +void dwinFrameAreaCopy(uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y); diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index e685fe16fd..b7b2629f99 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -58,10 +58,6 @@ #define HAS_ZOFFSET_ITEM 1 #endif -#ifndef strcasecmp_P - #define strcasecmp_P(a, b) strcasecmp((a), (b)) -#endif - #if HAS_LEVELING #include "../../../feature/bedlevel/bedlevel.h" #endif @@ -127,6 +123,11 @@ #define MIN_BED_TEMP 0 #endif +#define FEEDRATE_UNIT 1 +#define ACCELERATION_UNIT 1 +#define JERK_UNIT 10 +#define STEPS_UNIT 10 + /** * Custom menu items with jyersLCD */ @@ -155,13 +156,6 @@ constexpr uint16_t TROWS = 6, MROWS = TROWS - 1, #define MBASE(L) (49 + MLINE * (L)) -constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; -constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; -constexpr float default_steps[] = DEFAULT_AXIS_STEPS_PER_UNIT; -#if HAS_CLASSIC_JERK - constexpr float default_max_jerk[] = { DEFAULT_XJERK, DEFAULT_YJERK, DEFAULT_ZJERK, DEFAULT_EJERK }; -#endif - enum SelectItem : uint8_t { PAGE_PRINT = 0, PAGE_PREPARE, @@ -202,13 +196,13 @@ bool livemove = false; bool liveadjust = false; uint8_t preheatmode = 0; float zoffsetvalue = 0; -uint8_t gridpoint; +grid_count_t gridpoint; float corner_avg; float corner_pos; bool probe_deployed = false; -CrealityDWINClass CrealityDWIN; +CrealityDWIN crealityDWIN; template class TextScroller { @@ -297,29 +291,17 @@ private: matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); GRID_LOOP(i, j) { - float mx = bedlevel.get_mesh_x(i), - my = bedlevel.get_mesh_y(j), - mz = bedlevel.z_values[i][j]; + float mx = bedlevel.get_mesh_x(i), my = bedlevel.get_mesh_y(j), mz = bedlevel.z_values[i][j]; 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_ECHOLN(F("before rotation = ["), p_float_t(mx, 7), AS_CHAR(','), p_float_t(my, 7), AS_CHAR(','), p_float_t(mz, 7), F("] ---> ")); DEBUG_DELAY(20); } rotation.apply_rotation_xyz(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_ECHOLN(F("after rotation = ["), p_float_t(mx, 7), AS_CHAR(','), p_float_t(my, 7), AS_CHAR(','), p_float_t(mz, 7), AS_CHAR(']')); DEBUG_DELAY(20); } @@ -346,7 +328,7 @@ private: planner.synchronize(); } else { - CrealityDWIN.Popup_Handler(MoveWait); + crealityDWIN.popupHandler(MoveWait); sprintf_P(cmd, PSTR("G0 F300 Z%s"), dtostrf(Z_CLEARANCE_BETWEEN_PROBES, 1, 3, str_1)); gcode.process_subcommands_now(cmd); sprintf_P(cmd, PSTR("G42 F4000 I%i J%i"), mesh_x, mesh_y); @@ -355,7 +337,7 @@ private: current_position.z = goto_mesh_value ? bedlevel.z_values[mesh_x][mesh_y] : Z_CLEARANCE_BETWEEN_PROBES; planner.buffer_line(current_position, homing_feedrate(Z_AXIS), active_extruder); planner.synchronize(); - CrealityDWIN.Redraw_Menu(); + crealityDWIN.redrawMenu(); } } @@ -377,7 +359,7 @@ private: return min; } - void Draw_Bed_Mesh(const int16_t selected=-1, const uint8_t gridline_width=1, const uint16_t padding_x=8, const uint16_t padding_y_top=40 + 53 - 7) { + void drawBedMesh(const int16_t selected=-1, const uint8_t gridline_width=1, const uint16_t padding_x=8, const uint16_t padding_y_top=40 + 53 - 7) { drawing_mesh = true; const uint16_t total_width_px = DWIN_WIDTH - padding_x - padding_x, cell_width_px = total_width_px / (GRID_MAX_POINTS_X), @@ -385,13 +367,13 @@ private: const float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = _MAX(v_min, v_max); // Clear background from previous selection and select new square - DWIN_Draw_Rectangle(1, Color_Bg_Black, _MAX(0, padding_x - gridline_width), _MAX(0, padding_y_top - gridline_width), padding_x + total_width_px, padding_y_top + total_width_px); + dwinDrawRectangle(1, Color_Bg_Black, _MAX(0, padding_x - gridline_width), _MAX(0, padding_y_top - gridline_width), padding_x + total_width_px, padding_y_top + total_width_px); if (selected >= 0) { const auto selected_y = selected / (GRID_MAX_POINTS_X); const auto selected_x = selected - (GRID_MAX_POINTS_X) * selected_y; const auto start_y_px = padding_y_top + selected_y * cell_height_px; const auto start_x_px = padding_x + selected_x * cell_width_px; - DWIN_Draw_Rectangle(1, Color_White, _MAX(0, start_x_px - gridline_width), _MAX(0, start_y_px - gridline_width), start_x_px + cell_width_px, start_y_px + cell_height_px); + dwinDrawRectangle(1, Color_White, _MAX(0, start_x_px - gridline_width), _MAX(0, start_y_px - gridline_width), start_x_px + cell_width_px, start_y_px + cell_height_px); } // Draw value square grid @@ -401,7 +383,7 @@ private: const auto end_x_px = start_x_px + cell_width_px - 1 - gridline_width; const auto start_y_px = padding_y_top + (GRID_MAX_POINTS_Y - y - 1) * cell_height_px; const auto end_y_px = start_y_px + cell_height_px - 1 - gridline_width; - DWIN_Draw_Rectangle(1, // RGB565 colors: http://www.barth-dev.de/online/rgb565-color-picker/ + dwinDrawRectangle(1, // RGB565 colors: http://www.barth-dev.de/online/rgb565-color-picker/ isnan(bedlevel.z_values[x][y]) ? Color_Grey : ( // gray if undefined (bedlevel.z_values[x][y] < 0 ? (uint16_t)round(0x1F * -bedlevel.z_values[x][y] / (!viewer_asymmetric_range ? range : v_min)) << 11 : // red if mesh point value is negative @@ -417,7 +399,7 @@ private: if (viewer_print_value) { int8_t offset_x, offset_y = cell_height_px / 2 - 6; if (isnan(bedlevel.z_values[x][y])) { // undefined - DWIN_Draw_String(false, font6x12, Color_White, Color_Bg_Blue, start_x_px + cell_width_px / 2 - 5, start_y_px + offset_y, F("X")); + dwinDrawString(false, font6x12, Color_White, Color_Bg_Blue, start_x_px + cell_width_px / 2 - 5, start_y_px + offset_y, F("X")); } else { // has value if (GRID_MAX_POINTS_X < 10) @@ -426,8 +408,8 @@ private: sprintf_P(buf, PSTR("%02i"), (uint16_t)(abs(bedlevel.z_values[x][y] - (int16_t)bedlevel.z_values[x][y]) * 100)); offset_x = cell_width_px / 2 - 3 * (strlen(buf)) - 2; if (!(GRID_MAX_POINTS_X < 10)) - DWIN_Draw_String(false, font6x12, Color_White, Color_Bg_Blue, start_x_px - 2 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, F(".")); - DWIN_Draw_String(false, font6x12, Color_White, Color_Bg_Blue, start_x_px + 1 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, buf); + dwinDrawString(false, font6x12, Color_White, Color_Bg_Blue, start_x_px - 2 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, F(".")); + dwinDrawString(false, font6x12, Color_White, Color_Bg_Blue, start_x_px + 1 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, buf); } safe_delay(10); LCD_SERIAL.flushTX(); @@ -435,7 +417,7 @@ private: } } - void Set_Mesh_Viewer_Status() { // TODO: draw gradient with values as a legend instead + void setMeshViewerStatus() { // TODO: draw gradient with values as a legend instead float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = _MAX(v_min, v_max); if (v_min > 3e+10F) v_min = 0.0000001; if (v_max > 3e+10F) v_max = 0.0000001; @@ -450,7 +432,7 @@ private: dtostrf( range, 1, 3, str_2); } sprintf_P(msg, PSTR("Red %s..0..%s Green"), str_1, str_2); - CrealityDWIN.Update_Status(msg); + crealityDWIN.updateStatus(msg); drawing_mesh = false; } @@ -461,42 +443,42 @@ private: /* General Display Functions */ -struct CrealityDWINClass::EEPROM_Settings CrealityDWINClass::eeprom_settings{0}; -constexpr const char * const CrealityDWINClass::color_names[11]; -constexpr const char * const CrealityDWINClass::preheat_modes[3]; +struct CrealityDWIN::EEPROM_Settings CrealityDWIN::eeprom_settings{0}; +constexpr const char * const CrealityDWIN::color_names[11]; +constexpr const char * const CrealityDWIN::preheat_modes[3]; // Clear a part of the screen // 4=Entire screen // 3=Title bar and Menu area (default) // 2=Menu area // 1=Title bar -void CrealityDWINClass::Clear_Screen(const uint8_t e/*=3*/) { - if (e == 1 || e == 3 || e == 4) DWIN_Draw_Rectangle(1, GetColor(eeprom_settings.menu_top_bg, Color_Bg_Blue, false), 0, 0, DWIN_WIDTH, TITLE_HEIGHT); // Clear Title Bar - if (e == 2 || e == 3) DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y); // Clear Menu Area - if (e == 4) DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); // Clear Popup Area +void CrealityDWIN::clearScreen(const uint8_t e/*=3*/) { + if (e == 1 || e == 3 || e == 4) dwinDrawRectangle(1, getColor(eeprom_settings.menu_top_bg, Color_Bg_Blue, false), 0, 0, DWIN_WIDTH, TITLE_HEIGHT); // Clear Title Bar + if (e == 2 || e == 3) dwinDrawRectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y); // Clear Menu Area + if (e == 4) dwinDrawRectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, DWIN_HEIGHT); // Clear Popup Area } -void CrealityDWINClass::Draw_Float(const_float_t value, const uint8_t row, const bool selected/*=false*/, const uint8_t minunit/*=10*/) { +void CrealityDWIN::drawFloat(const_float_t value, const uint8_t row, const bool selected/*=false*/, const uint8_t minunit/*=10*/) { const uint8_t digits = (uint8_t)floor(log10(abs(value))) + log10(minunit) + (minunit > 1); const uint16_t bColor = selected ? Select_Color : Color_Bg_Black; const uint16_t xpos = 240 - (digits * 8); - DWIN_Draw_Rectangle(1, Color_Bg_Black, 194, MBASE(row), 234 - (digits * 8), MBASE(row) + 16); + dwinDrawRectangle(1, Color_Bg_Black, 194, MBASE(row), 234 - (digits * 8), MBASE(row) + 16); if (isnan(value)) - DWIN_Draw_String(true, DWIN_FONT_MENU, Color_White, bColor, xpos - 8, MBASE(row), F(" NaN")); + dwinDrawString(true, DWIN_FONT_MENU, Color_White, bColor, xpos - 8, MBASE(row), F(" NaN")); else { - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, Color_White, bColor, digits - log10(minunit) + 1, log10(minunit), xpos, MBASE(row), (value < 0 ? -value : value)); - DWIN_Draw_String(true, DWIN_FONT_MENU, Color_White, bColor, xpos - 8, MBASE(row), value < 0 ? F("-") : F(" ")); + dwinDrawFloatValue(true, true, 0, DWIN_FONT_MENU, Color_White, bColor, digits - log10(minunit) + 1, log10(minunit), xpos, MBASE(row), (value < 0 ? -value : value)); + dwinDrawString(true, DWIN_FONT_MENU, Color_White, bColor, xpos - 8, MBASE(row), value < 0 ? F("-") : F(" ")); } } -void CrealityDWINClass::Draw_Option(const uint8_t value, const char * const * options, const uint8_t row, const bool selected/*=false*/, const bool color/*=false*/) { +void CrealityDWIN::drawOption(const uint8_t value, const char * const * options, const uint8_t row, const bool selected/*=false*/, const bool color/*=false*/) { const uint16_t bColor = selected ? Select_Color : Color_Bg_Black, - tColor = color ? GetColor(value, Color_White, false) : Color_White; - DWIN_Draw_Rectangle(1, bColor, 202, MBASE(row) + 14, 258, MBASE(row) - 2); - DWIN_Draw_String(false, DWIN_FONT_MENU, tColor, bColor, 202, MBASE(row) - 1, options[value]); + tColor = color ? getColor(value, Color_White, false) : Color_White; + dwinDrawRectangle(1, bColor, 202, MBASE(row) + 14, 258, MBASE(row) - 2); + dwinDrawString(false, DWIN_FONT_MENU, tColor, bColor, 202, MBASE(row) - 1, options[value]); } -uint16_t CrealityDWINClass::GetColor(const uint8_t color, const uint16_t original, const bool light/*=false*/) { +uint16_t CrealityDWIN::getColor(const uint8_t color, const uint16_t original, const bool light/*=false*/) { switch (color) { case Default: return original; @@ -535,215 +517,215 @@ uint16_t CrealityDWINClass::GetColor(const uint8_t color, const uint16_t origina return Color_White; } -void CrealityDWINClass::Draw_Title(const char * const ctitle) { - DWIN_Draw_String(false, DWIN_FONT_HEAD, GetColor(eeprom_settings.menu_top_txt, Color_White, false), Color_Bg_Blue, (DWIN_WIDTH - strlen(ctitle) * STAT_CHR_W) / 2, 5, ctitle); +void CrealityDWIN::drawTitle(const char * const ctitle) { + dwinDrawString(false, DWIN_FONT_HEAD, getColor(eeprom_settings.menu_top_txt, Color_White, false), Color_Bg_Blue, (DWIN_WIDTH - strlen(ctitle) * STAT_CHR_W) / 2, 5, ctitle); } -void CrealityDWINClass::Draw_Title(FSTR_P const ftitle) { - DWIN_Draw_String(false, DWIN_FONT_HEAD, GetColor(eeprom_settings.menu_top_txt, Color_White, false), Color_Bg_Blue, (DWIN_WIDTH - strlen_P(FTOP(ftitle)) * STAT_CHR_W) / 2, 5, ftitle); +void CrealityDWIN::drawTitle(FSTR_P const ftitle) { + dwinDrawString(false, DWIN_FONT_HEAD, getColor(eeprom_settings.menu_top_txt, Color_White, false), Color_Bg_Blue, (DWIN_WIDTH - strlen_P(FTOP(ftitle)) * STAT_CHR_W) / 2, 5, ftitle); } -void _Decorate_Menu_Item(uint8_t row, uint8_t icon, bool more) { - if (icon) DWIN_ICON_Show(ICON, icon, 26, MBASE(row) - 3); //Draw Menu Icon - if (more) DWIN_ICON_Show(ICON, ICON_More, 226, MBASE(row) - 3); // Draw More Arrow - DWIN_Draw_Line(CrealityDWIN.GetColor(CrealityDWIN.eeprom_settings.menu_split_line, Line_Color, true), 16, MBASE(row) + 33, 256, MBASE(row) + 33); // Draw Menu Line +void _decorateMenuItem(uint8_t row, uint8_t icon, bool more) { + if (icon) dwinIconShow(ICON, icon, 26, MBASE(row) - 3); //Draw Menu Icon + if (more) dwinIconShow(ICON, ICON_More, 226, MBASE(row) - 3); // Draw More Arrow + dwinDrawLine(crealityDWIN.getColor(crealityDWIN.eeprom_settings.menu_split_line, Line_Color, true), 16, MBASE(row) + 33, 256, MBASE(row) + 33); // Draw Menu Line } -void CrealityDWINClass::Draw_Menu_Item(const uint8_t row, const uint8_t icon/*=0*/, const char * const label1, const char * const label2, const bool more/*=false*/, const bool centered/*=false*/) { +void CrealityDWIN::drawMenuItem(const uint8_t row, const uint8_t icon/*=0*/, const char * const label1, const char * const label2, const bool more/*=false*/, const bool centered/*=false*/) { const uint8_t label_offset_y = (label1 || label2) ? MENU_CHR_H * 3 / 5 : 0, label1_offset_x = !centered ? LBLX : LBLX * 4/5 + _MAX(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label1 ? strlen(label1) : 0) * MENU_CHR_W) / 2), label2_offset_x = !centered ? LBLX : LBLX * 4/5 + _MAX(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label2 ? strlen(label2) : 0) * MENU_CHR_W) / 2); - if (label1) DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label1_offset_x, MBASE(row) - 1 - label_offset_y, label1); // Draw Label - if (label2) DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label2_offset_x, MBASE(row) - 1 + label_offset_y, label2); // Draw Label - _Decorate_Menu_Item(row, icon, more); + if (label1) dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label1_offset_x, MBASE(row) - 1 - label_offset_y, label1); // Draw Label + if (label2) dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label2_offset_x, MBASE(row) - 1 + label_offset_y, label2); // Draw Label + _decorateMenuItem(row, icon, more); } -void CrealityDWINClass::Draw_Menu_Item(const uint8_t row, const uint8_t icon/*=0*/, FSTR_P const flabel1, FSTR_P const flabel2, const bool more/*=false*/, const bool centered/*=false*/) { +void CrealityDWIN::drawMenuItem(const uint8_t row, const uint8_t icon/*=0*/, FSTR_P const flabel1, FSTR_P const flabel2, const bool more/*=false*/, const bool centered/*=false*/) { const uint8_t label_offset_y = (flabel1 || flabel2) ? MENU_CHR_H * 3 / 5 : 0, label1_offset_x = !centered ? LBLX : LBLX * 4/5 + _MAX(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (flabel1 ? strlen_P(FTOP(flabel1)) : 0) * MENU_CHR_W) / 2), label2_offset_x = !centered ? LBLX : LBLX * 4/5 + _MAX(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (flabel2 ? strlen_P(FTOP(flabel2)) : 0) * MENU_CHR_W) / 2); - if (flabel1) DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label1_offset_x, MBASE(row) - 1 - label_offset_y, flabel1); // Draw Label - if (flabel2) DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label2_offset_x, MBASE(row) - 1 + label_offset_y, flabel2); // Draw Label - _Decorate_Menu_Item(row, icon, more); + if (flabel1) dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label1_offset_x, MBASE(row) - 1 - label_offset_y, flabel1); // Draw Label + if (flabel2) dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label2_offset_x, MBASE(row) - 1 + label_offset_y, flabel2); // Draw Label + _decorateMenuItem(row, icon, more); } -void CrealityDWINClass::Draw_Checkbox(const uint8_t row, const bool value) { +void CrealityDWIN::drawCheckbox(const uint8_t row, const bool value) { #if ENABLED(DWIN_CREALITY_LCD_CUSTOM_ICONS) // Draw appropriate checkbox icon - DWIN_ICON_Show(ICON, (value ? ICON_Checkbox_T : ICON_Checkbox_F), 226, MBASE(row) - 3); + dwinIconShow(ICON, (value ? ICON_Checkbox_T : ICON_Checkbox_F), 226, MBASE(row) - 3); #else // Draw a basic checkbox using rectangles and lines - DWIN_Draw_Rectangle(1, Color_Bg_Black, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); - DWIN_Draw_Rectangle(0, Color_White, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); + dwinDrawRectangle(1, Color_Bg_Black, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); + dwinDrawRectangle(0, Color_White, 226, MBASE(row) - 3, 226 + 20, MBASE(row) - 3 + 20); if (value) { - DWIN_Draw_Line(Check_Color, 227, MBASE(row) - 3 + 11, 226 + 8, MBASE(row) - 3 + 17); - DWIN_Draw_Line(Check_Color, 227 + 8, MBASE(row) - 3 + 17, 226 + 19, MBASE(row) - 3 + 1); - DWIN_Draw_Line(Check_Color, 227, MBASE(row) - 3 + 12, 226 + 8, MBASE(row) - 3 + 18); - DWIN_Draw_Line(Check_Color, 227 + 8, MBASE(row) - 3 + 18, 226 + 19, MBASE(row) - 3 + 2); - DWIN_Draw_Line(Check_Color, 227, MBASE(row) - 3 + 13, 226 + 8, MBASE(row) - 3 + 19); - DWIN_Draw_Line(Check_Color, 227 + 8, MBASE(row) - 3 + 19, 226 + 19, MBASE(row) - 3 + 3); + dwinDrawLine(Check_Color, 227, MBASE(row) - 3 + 11, 226 + 8, MBASE(row) - 3 + 17); + dwinDrawLine(Check_Color, 227 + 8, MBASE(row) - 3 + 17, 226 + 19, MBASE(row) - 3 + 1); + dwinDrawLine(Check_Color, 227, MBASE(row) - 3 + 12, 226 + 8, MBASE(row) - 3 + 18); + dwinDrawLine(Check_Color, 227 + 8, MBASE(row) - 3 + 18, 226 + 19, MBASE(row) - 3 + 2); + dwinDrawLine(Check_Color, 227, MBASE(row) - 3 + 13, 226 + 8, MBASE(row) - 3 + 19); + dwinDrawLine(Check_Color, 227 + 8, MBASE(row) - 3 + 19, 226 + 19, MBASE(row) - 3 + 3); } #endif } -void CrealityDWINClass::Draw_Menu(const uint8_t menu, const uint8_t select/*=0*/, const uint8_t scroll/*=0*/) { +void CrealityDWIN::drawMenu(const uint8_t menu, const uint8_t select/*=0*/, const uint8_t scroll/*=0*/) { if (active_menu != menu) { last_menu = active_menu; if (process == Menu) last_selection = selection; } - selection = _MIN(select, Get_Menu_Size(menu)); + selection = _MIN(select, getMenuSize(menu)); scrollpos = scroll; if (selection - scrollpos > MROWS) scrollpos = selection - MROWS; process = Menu; active_menu = menu; - Clear_Screen(); - Draw_Title(Get_Menu_Title(menu)); - LOOP_L_N(i, TROWS) Menu_Item_Handler(menu, i + scrollpos); - DWIN_Draw_Rectangle(1, GetColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + clearScreen(); + drawTitle(getMenuTitle(menu)); + for (uint8_t i = 0; i < TROWS; ++i) menuItemHandler(menu, i + scrollpos); + dwinDrawRectangle(1, getColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); } -void CrealityDWINClass::Redraw_Menu(const bool lastproc/*=true*/, const bool lastsel/*=false*/, const bool lastmenu/*=false*/) { +void CrealityDWIN::redrawMenu(const bool lastproc/*=true*/, const bool lastsel/*=false*/, const bool lastmenu/*=false*/) { switch (lastproc ? last_process : process) { case Menu: - Draw_Menu(lastmenu ? last_menu : active_menu, lastsel ? last_selection : selection, lastmenu ? 0 : scrollpos); + drawMenu(lastmenu ? last_menu : active_menu, lastsel ? last_selection : selection, lastmenu ? 0 : scrollpos); break; - case Main: Draw_Main_Menu(lastsel ? last_selection : selection); break; - case Print: Draw_Print_Screen(); break; - case File: Draw_SD_List(); break; + case Main: drawMainMenu(lastsel ? last_selection : selection); break; + case Print: drawPrintScreen(); break; + case File: drawSDList(); break; default: break; } } -void CrealityDWINClass::Redraw_Screen() { - Redraw_Menu(false); - Draw_Status_Area(true); - Update_Status_Bar(true); +void CrealityDWIN::redrawScreen() { + redrawMenu(false); + drawStatusArea(true); + updateStatusBar(true); } /* Primary Menus and Screen Elements */ -void CrealityDWINClass::Main_Menu_Icons() { +void CrealityDWIN::mainMenuIcons() { if (selection == 0) { - DWIN_ICON_Show(ICON, ICON_Print_1, 17, 130); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 17, 130, 126, 229); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 52, 200, F("Print")); + dwinIconShow(ICON, ICON_Print_1, 17, 130); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 17, 130, 126, 229); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 52, 200, F("Print")); } else { - DWIN_ICON_Show(ICON, ICON_Print_0, 17, 130); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 52, 200, F("Print")); + dwinIconShow(ICON, ICON_Print_0, 17, 130); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 52, 200, F("Print")); } if (selection == 1) { - DWIN_ICON_Show(ICON, ICON_Prepare_1, 145, 130); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 145, 130, 254, 229); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 170, 200, F("Prepare")); + dwinIconShow(ICON, ICON_Prepare_1, 145, 130); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 145, 130, 254, 229); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 170, 200, F("Prepare")); } else { - DWIN_ICON_Show(ICON, ICON_Prepare_0, 145, 130); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 170, 200, F("Prepare")); + dwinIconShow(ICON, ICON_Prepare_0, 145, 130); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 170, 200, F("Prepare")); } if (selection == 2) { - DWIN_ICON_Show(ICON, ICON_Control_1, 17, 246); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 17, 246, 126, 345); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 43, 317, F("Control")); + dwinIconShow(ICON, ICON_Control_1, 17, 246); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 17, 246, 126, 345); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 43, 317, F("Control")); } else { - DWIN_ICON_Show(ICON, ICON_Control_0, 17, 246); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 43, 317, F("Control")); + dwinIconShow(ICON, ICON_Control_0, 17, 246); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 43, 317, F("Control")); } #if HAS_ABL_OR_UBL if (selection == 3) { - DWIN_ICON_Show(ICON, ICON_Leveling_1, 145, 246); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 145, 246, 254, 345); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 179, 317, F("Level")); + dwinIconShow(ICON, ICON_Leveling_1, 145, 246); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 145, 246, 254, 345); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 179, 317, F("Level")); } else { - DWIN_ICON_Show(ICON, ICON_Leveling_0, 145, 246); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 179, 317, F("Level")); + dwinIconShow(ICON, ICON_Leveling_0, 145, 246); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 179, 317, F("Level")); } #else if (selection == 3) { - DWIN_ICON_Show(ICON, ICON_Info_1, 145, 246); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 145, 246, 254, 345); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 181, 317, F("Info")); + dwinIconShow(ICON, ICON_Info_1, 145, 246); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 145, 246, 254, 345); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 181, 317, F("Info")); } else { - DWIN_ICON_Show(ICON, ICON_Info_0, 145, 246); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 181, 317, F("Info")); + dwinIconShow(ICON, ICON_Info_0, 145, 246); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 181, 317, F("Info")); } #endif } -void CrealityDWINClass::Draw_Main_Menu(const uint8_t select/*=0*/) { +void CrealityDWIN::drawMainMenu(const uint8_t select/*=0*/) { process = Main; active_menu = MainMenu; selection = select; - Clear_Screen(); - Draw_Title(Get_Menu_Title(MainMenu)); + clearScreen(); + drawTitle(getMenuTitle(MainMenu)); SERIAL_ECHOPGM("\nDWIN handshake "); - DWIN_ICON_Show(ICON, ICON_LOGO, 71, 72); - Main_Menu_Icons(); + dwinIconShow(ICON, ICON_LOGO, 71, 72); + mainMenuIcons(); } -void CrealityDWINClass::Print_Screen_Icons() { +void CrealityDWIN::printScreenIcons() { if (selection == 0) { - DWIN_ICON_Show(ICON, ICON_Setup_1, 8, 252); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 8, 252, 87, 351); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 30, 322, F("Tune")); + dwinIconShow(ICON, ICON_Setup_1, 8, 252); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 8, 252, 87, 351); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 30, 322, F("Tune")); } else { - DWIN_ICON_Show(ICON, ICON_Setup_0, 8, 252); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 30, 322, F("Tune")); + dwinIconShow(ICON, ICON_Setup_0, 8, 252); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 30, 322, F("Tune")); } if (selection == 2) { - DWIN_ICON_Show(ICON, ICON_Stop_1, 184, 252); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 184, 252, 263, 351); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 205, 322, F("Stop")); + dwinIconShow(ICON, ICON_Stop_1, 184, 252); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 184, 252, 263, 351); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 205, 322, F("Stop")); } else { - DWIN_ICON_Show(ICON, ICON_Stop_0, 184, 252); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 205, 322, F("Stop")); + dwinIconShow(ICON, ICON_Stop_0, 184, 252); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 205, 322, F("Stop")); } if (paused) { if (selection == 1) { - DWIN_ICON_Show(ICON, ICON_Continue_1, 96, 252); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 96, 252, 175, 351); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 114, 322, F("Print")); + dwinIconShow(ICON, ICON_Continue_1, 96, 252); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 96, 252, 175, 351); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 114, 322, F("Print")); } else { - DWIN_ICON_Show(ICON, ICON_Continue_0, 96, 252); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 114, 322, F("Print")); + dwinIconShow(ICON, ICON_Continue_0, 96, 252); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 114, 322, F("Print")); } } else { if (selection == 1) { - DWIN_ICON_Show(ICON, ICON_Pause_1, 96, 252); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 96, 252, 175, 351); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 114, 322, F("Pause")); + dwinIconShow(ICON, ICON_Pause_1, 96, 252); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 96, 252, 175, 351); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 114, 322, F("Pause")); } else { - DWIN_ICON_Show(ICON, ICON_Pause_0, 96, 252); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 114, 322, F("Pause")); + dwinIconShow(ICON, ICON_Pause_0, 96, 252); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Blue, 114, 322, F("Pause")); } } } -void CrealityDWINClass::Draw_Print_Screen() { +void CrealityDWIN::drawPrintScreen() { process = Print; selection = 0; - Clear_Screen(); - DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 352, DWIN_WIDTH - 8, 376); - Draw_Title("Printing..."); - Print_Screen_Icons(); - DWIN_ICON_Show(ICON, ICON_PrintTime, 14, 171); - DWIN_ICON_Show(ICON, ICON_RemainTime, 147, 169); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, 41, 163, F("Elapsed")); - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, 176, 163, F("Remaining")); - Update_Status_Bar(true); - Draw_Print_ProgressBar(); - Draw_Print_ProgressElapsed(); - TERN_(SET_REMAINING_TIME, Draw_Print_ProgressRemain()); - Draw_Print_Filename(true); + clearScreen(); + dwinDrawRectangle(1, Color_Bg_Black, 8, 352, DWIN_WIDTH - 8, 376); + drawTitle("Printing..."); + printScreenIcons(); + dwinIconShow(ICON, ICON_PrintTime, 14, 171); + dwinIconShow(ICON, ICON_RemainTime, 147, 169); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, 41, 163, F("Elapsed")); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, 176, 163, F("Remaining")); + updateStatusBar(true); + drawPrintProgressBar(); + drawPrintProgressElapsed(); + TERN_(SET_REMAINING_TIME, drawPrintProgressRemain()); + drawPrintFilename(true); } -void CrealityDWINClass::Draw_Print_Filename(const bool reset/*=false*/) { +void CrealityDWIN::drawPrintFilename(const bool reset/*=false*/) { typedef TextScroller<30> Scroller; static Scroller scroller; if (reset) scroller.reset(); @@ -751,61 +733,61 @@ void CrealityDWINClass::Draw_Print_Filename(const bool reset/*=false*/) { Scroller::Buffer buf; size_t outlen = 0; const char* outstr = scroller.scroll(outlen, buf, filename); - DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 50, DWIN_WIDTH - 8, 80); + dwinDrawRectangle(1, Color_Bg_Black, 8, 50, DWIN_WIDTH - 8, 80); const int8_t npos = (DWIN_WIDTH - outlen * MENU_CHR_W) / 2; - DWIN_Draw_String(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, npos, 60, outstr); + dwinDrawString(false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, npos, 60, outstr); } } -void CrealityDWINClass::Draw_Print_ProgressBar() { +void CrealityDWIN::drawPrintProgressBar() { uint8_t printpercent = sdprint ? card.percentDone() : (ui._get_progress() / 100); - DWIN_ICON_Show(ICON, ICON_Bar, 15, 93); - DWIN_Draw_Rectangle(1, BarFill_Color, 16 + printpercent * 240 / 100, 93, 256, 113); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_percent, Percent_Color), Color_Bg_Black, 3, 109, 133, printpercent); - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_percent, Percent_Color), Color_Bg_Black, 133, 133, F("%")); + dwinIconShow(ICON, ICON_Bar, 15, 93); + dwinDrawRectangle(1, BarFill_Color, 16 + printpercent * 240 / 100, 93, 256, 113); + dwinDrawIntValue(true, true, 0, DWIN_FONT_MENU, getColor(eeprom_settings.progress_percent, Percent_Color), Color_Bg_Black, 3, 109, 133, printpercent); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.progress_percent, Percent_Color), Color_Bg_Black, 133, 133, F("%")); } #if ENABLED(SET_REMAINING_TIME) - void CrealityDWINClass::Draw_Print_ProgressRemain() { + void CrealityDWIN::drawPrintProgressRemain() { uint16_t remainingtime = ui.get_remaining_time(); - DWIN_Draw_IntValue(true, true, 1, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 2, 176, 187, remainingtime / 3600); - DWIN_Draw_IntValue(true, true, 1, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 2, 200, 187, (remainingtime % 3600) / 60); + dwinDrawIntValue(true, true, 1, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 2, 176, 187, remainingtime / 3600); + dwinDrawIntValue(true, true, 1, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 2, 200, 187, (remainingtime % 3600) / 60); if (eeprom_settings.time_format_textual) { - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 192, 187, F("h")); - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 216, 187, F("m")); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 192, 187, F("h")); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 216, 187, F("m")); } else - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 192, 187, F(":")); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 192, 187, F(":")); } #endif -void CrealityDWINClass::Draw_Print_ProgressElapsed() { +void CrealityDWIN::drawPrintProgressElapsed() { duration_t elapsed = print_job_timer.duration(); - DWIN_Draw_IntValue(true, true, 1, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 2, 42, 187, elapsed.value / 3600); - DWIN_Draw_IntValue(true, true, 1, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 2, 66, 187, (elapsed.value % 3600) / 60); + dwinDrawIntValue(true, true, 1, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 2, 42, 187, elapsed.value / 3600); + dwinDrawIntValue(true, true, 1, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 2, 66, 187, (elapsed.value % 3600) / 60); if (eeprom_settings.time_format_textual) { - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 58, 187, F("h")); - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 82, 187, F("m")); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 58, 187, F("h")); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 82, 187, F("m")); } else - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 58, 187, F(":")); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.progress_time, Color_White), Color_Bg_Black, 58, 187, F(":")); } -void CrealityDWINClass::Draw_Print_confirm() { - Draw_Print_Screen(); +void CrealityDWIN::drawPrintConfirm() { + drawPrintScreen(); process = Confirm; popup = Complete; - DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 252, 263, 351); - DWIN_ICON_Show(ICON, ICON_Confirm_E, 87, 283); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 86, 282, 187, 321); - DWIN_Draw_Rectangle(0, GetColor(eeprom_settings.highlight_box, Color_White), 85, 281, 188, 322); + dwinDrawRectangle(1, Color_Bg_Black, 8, 252, 263, 351); + dwinIconShow(ICON, ICON_Confirm_E, 87, 283); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 86, 282, 187, 321); + dwinDrawRectangle(0, getColor(eeprom_settings.highlight_box, Color_White), 85, 281, 188, 322); } -void CrealityDWINClass::Draw_SD_Item(const uint8_t item, const uint8_t row) { +void CrealityDWIN::drawSDItem(const uint8_t item, const uint8_t row) { if (item == 0) - Draw_Menu_Item(0, ICON_Back, card.flag.workDirIsRoot ? F("Back") : F("..")); + drawMenuItem(0, ICON_Back, card.flag.workDirIsRoot ? F("Back") : F("..")); else { card.selectFileByIndexSorted(item - 1); char * const filename = card.longest_filename(); @@ -816,35 +798,35 @@ void CrealityDWINClass::Draw_SD_Item(const uint8_t item, const uint8_t row) { len = pos; if (len > max) len = max; char name[len + 1]; - LOOP_L_N(i, len) name[i] = filename[i]; + for (uint8_t i = 0; i < len; ++i) name[i] = filename[i]; if (pos > max) - LOOP_S_L_N(i, len - 3, len) name[i] = '.'; + for (uint8_t i = len - 3; i < len; ++i) name[i] = '.'; name[len] = '\0'; - Draw_Menu_Item(row, card.flag.filenameIsDir ? ICON_More : ICON_File, name); + drawMenuItem(row, card.flag.filenameIsDir ? ICON_More : ICON_File, name); } } -void CrealityDWINClass::Draw_SD_List(const bool removed/*=false*/) { - Clear_Screen(); - Draw_Title("Select File"); +void CrealityDWIN::drawSDList(const bool removed/*=false*/) { + clearScreen(); + drawTitle("Select File"); selection = 0; scrollpos = 0; process = File; if (card.isMounted() && !removed) { - LOOP_L_N(i, _MIN(card.get_num_items() + 1, TROWS)) - Draw_SD_Item(i, i); + for (uint8_t i = 0; i < _MIN(card.get_num_items() + 1, TROWS); ++i) + drawSDItem(i, i); } else { - Draw_Menu_Item(0, ICON_Back, F("Back")); - DWIN_Draw_Rectangle(1, Color_Bg_Red, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); - DWIN_Draw_String(false, font16x32, Color_Yellow, Color_Bg_Red, ((DWIN_WIDTH) - 8 * 16) / 2, MBASE(3), F("No Media")); + drawMenuItem(0, ICON_Back, F("Back")); + dwinDrawRectangle(1, Color_Bg_Red, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); + dwinDrawString(false, font16x32, Color_Yellow, Color_Bg_Red, ((DWIN_WIDTH) - 8 * 16) / 2, MBASE(3), F("No Media")); } - DWIN_Draw_Rectangle(1, GetColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(0) - 18, 14, MBASE(0) + 33); + dwinDrawRectangle(1, getColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(0) - 18, 14, MBASE(0) + 33); } -void CrealityDWINClass::Draw_Status_Area(const bool icons/*=false*/) { +void CrealityDWIN::drawStatusArea(const bool icons/*=false*/) { - if (icons) DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); + if (icons) dwinDrawRectangle(1, Color_Bg_Black, 0, STATUS_Y, DWIN_WIDTH, DWIN_HEIGHT - 1); #if HAS_HOTEND static float hotend = -1; @@ -852,27 +834,27 @@ void CrealityDWINClass::Draw_Status_Area(const bool icons/*=false*/) { if (icons) { hotend = -1; hotendtarget = -1; - DWIN_ICON_Show(ICON, ICON_HotendTemp, 10, 383); - DWIN_Draw_String(false, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); + dwinIconShow(ICON, ICON_HotendTemp, 10, 383); + dwinDrawString(false, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); } if (thermalManager.temp_hotend[0].celsius != hotend) { hotend = thermalManager.temp_hotend[0].celsius; - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 28, 384, thermalManager.temp_hotend[0].celsius); - DWIN_Draw_DegreeSymbol(GetColor(eeprom_settings.status_area_text, Color_White), 25 + 3 * STAT_CHR_W + 5, 386); + dwinDrawIntValue(true, true, 0, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 28, 384, thermalManager.temp_hotend[0].celsius); + dwinDrawDegreeSymbol(getColor(eeprom_settings.status_area_text, Color_White), 25 + 3 * STAT_CHR_W + 5, 386); } if (thermalManager.temp_hotend[0].target != hotendtarget) { hotendtarget = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.temp_hotend[0].target); - DWIN_Draw_DegreeSymbol(GetColor(eeprom_settings.status_area_text, Color_White), 25 + 4 * STAT_CHR_W + 39, 386); + dwinDrawIntValue(true, true, 0, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.temp_hotend[0].target); + dwinDrawDegreeSymbol(getColor(eeprom_settings.status_area_text, Color_White), 25 + 4 * STAT_CHR_W + 39, 386); } if (icons) { flow = -1; - DWIN_ICON_Show(ICON, ICON_StepE, 112, 417); - DWIN_Draw_String(false, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 417, F("%")); + dwinIconShow(ICON, ICON_StepE, 112, 417); + dwinDrawString(false, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 417, F("%")); } if (planner.flow_percentage[0] != flow) { flow = planner.flow_percentage[0]; - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 417, planner.flow_percentage[0]); + dwinDrawIntValue(true, true, 0, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 417, planner.flow_percentage[0]); } #endif @@ -882,18 +864,18 @@ void CrealityDWINClass::Draw_Status_Area(const bool icons/*=false*/) { if (icons) { bed = -1; bedtarget = -1; - DWIN_ICON_Show(ICON, ICON_BedTemp, 10, 416); - DWIN_Draw_String(false, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); + dwinIconShow(ICON, ICON_BedTemp, 10, 416); + dwinDrawString(false, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); } if (thermalManager.temp_bed.celsius != bed) { bed = thermalManager.temp_bed.celsius; - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 28, 417, thermalManager.temp_bed.celsius); - DWIN_Draw_DegreeSymbol(GetColor(eeprom_settings.status_area_text, Color_White), 25 + 3 * STAT_CHR_W + 5, 419); + dwinDrawIntValue(true, true, 0, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 28, 417, thermalManager.temp_bed.celsius); + dwinDrawDegreeSymbol(getColor(eeprom_settings.status_area_text, Color_White), 25 + 3 * STAT_CHR_W + 5, 419); } if (thermalManager.temp_bed.target != bedtarget) { bedtarget = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.temp_bed.target); - DWIN_Draw_DegreeSymbol(GetColor(eeprom_settings.status_area_text, Color_White), 25 + 4 * STAT_CHR_W + 39, 419); + dwinDrawIntValue(true, true, 0, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.temp_bed.target); + dwinDrawDegreeSymbol(getColor(eeprom_settings.status_area_text, Color_White), 25 + 4 * STAT_CHR_W + 39, 419); } #endif @@ -901,11 +883,11 @@ void CrealityDWINClass::Draw_Status_Area(const bool icons/*=false*/) { static uint8_t fan = -1; if (icons) { fan = -1; - DWIN_ICON_Show(ICON, ICON_FanSpeed, 187, 383); + dwinIconShow(ICON, ICON_FanSpeed, 187, 383); } if (thermalManager.fan_speed[0] != fan) { fan = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 195 + 2 * STAT_CHR_W, 384, thermalManager.fan_speed[0]); + dwinDrawIntValue(true, true, 0, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 195 + 2 * STAT_CHR_W, 384, thermalManager.fan_speed[0]); } #endif @@ -914,24 +896,24 @@ void CrealityDWINClass::Draw_Status_Area(const bool icons/*=false*/) { if (icons) { offset = -1; - DWIN_ICON_Show(ICON, ICON_Zoffset, 187, 416); + dwinIconShow(ICON, ICON_Zoffset, 187, 416); } if (zoffsetvalue != offset) { offset = zoffsetvalue; - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 2, 2, 207, 417, (zoffsetvalue < 0 ? -zoffsetvalue : zoffsetvalue)); - DWIN_Draw_String(true, DWIN_FONT_MENU, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 205, 419, zoffsetvalue < 0 ? F("-") : F(" ")); + dwinDrawFloatValue(true, true, 0, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 2, 2, 207, 417, (zoffsetvalue < 0 ? -zoffsetvalue : zoffsetvalue)); + dwinDrawString(true, DWIN_FONT_MENU, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 205, 419, zoffsetvalue < 0 ? F("-") : F(" ")); } #endif static int16_t feedrate = -1; if (icons) { feedrate = -1; - DWIN_ICON_Show(ICON, ICON_Speed, 113, 383); - DWIN_Draw_String(false, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 384, F("%")); + dwinIconShow(ICON, ICON_Speed, 113, 383); + dwinDrawString(false, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 116 + 5 * STAT_CHR_W + 2, 384, F("%")); } if (feedrate_percentage != feedrate) { feedrate = feedrate_percentage; - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, GetColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 384, feedrate_percentage); + dwinDrawIntValue(true, true, 0, DWIN_FONT_STAT, getColor(eeprom_settings.status_area_text, Color_White), Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 384, feedrate_percentage); } static float x = -1, y = -1, z = -1; @@ -941,75 +923,75 @@ void CrealityDWINClass::Draw_Status_Area(const bool icons/*=false*/) { update_z = (current_position.z != z || axis_should_home(Z_AXIS) || update_z); if (icons) { x = y = z = -1; - DWIN_Draw_Line(GetColor(eeprom_settings.coordinates_split_line, Line_Color, true), 16, 450, 256, 450); - DWIN_ICON_Show(ICON, ICON_MaxSpeedX, 10, 456); - DWIN_ICON_Show(ICON, ICON_MaxSpeedY, 95, 456); - DWIN_ICON_Show(ICON, ICON_MaxSpeedZ, 180, 456); + dwinDrawLine(getColor(eeprom_settings.coordinates_split_line, Line_Color, true), 16, 450, 256, 450); + dwinIconShow(ICON, ICON_MaxSpeedX, 10, 456); + dwinIconShow(ICON, ICON_MaxSpeedY, 95, 456); + dwinIconShow(ICON, ICON_MaxSpeedZ, 180, 456); } if (update_x) { x = current_position.x; if ((update_x = axis_should_home(X_AXIS) && ui.get_blink())) - DWIN_Draw_String(true, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 35, 459, F(" -?- ")); + dwinDrawString(true, DWIN_FONT_MENU, getColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 35, 459, F(" -?- ")); else - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 1, 35, 459, current_position.x); + dwinDrawFloatValue(true, true, 0, DWIN_FONT_MENU, getColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 1, 35, 459, current_position.x); } if (update_y) { y = current_position.y; if ((update_y = axis_should_home(Y_AXIS) && ui.get_blink())) - DWIN_Draw_String(true, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 120, 459, F(" -?- ")); + dwinDrawString(true, DWIN_FONT_MENU, getColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 120, 459, F(" -?- ")); else - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 1, 120, 459, current_position.y); + dwinDrawFloatValue(true, true, 0, DWIN_FONT_MENU, getColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 1, 120, 459, current_position.y); } if (update_z) { z = current_position.z; if ((update_z = axis_should_home(Z_AXIS) && ui.get_blink())) - DWIN_Draw_String(true, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 205, 459, F(" -?- ")); + dwinDrawString(true, DWIN_FONT_MENU, getColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 205, 459, F(" -?- ")); else - DWIN_Draw_FloatValue(true, true, 0, DWIN_FONT_MENU, GetColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 2, 205, 459, current_position.z >= 0 ? current_position.z : 0); + dwinDrawFloatValue(true, true, 0, DWIN_FONT_MENU, getColor(eeprom_settings.coordinates_text, Color_White), Color_Bg_Black, 3, 2, 205, 459, current_position.z >= 0 ? current_position.z : 0); } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void CrealityDWINClass::Draw_Popup(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, uint8_t mode, uint8_t icon/*=0*/) { +void CrealityDWIN::drawPopup(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, uint8_t mode, uint8_t icon/*=0*/) { if (process != Confirm && process != Popup && process != Wait) last_process = process; if ((process == Menu || process == Wait) && mode == Popup) last_selection = selection; process = mode; - Clear_Screen(); - DWIN_Draw_Rectangle(0, Color_White, 13, 59, 259, 351); - DWIN_Draw_Rectangle(1, Color_Bg_Window, 14, 60, 258, 350); + clearScreen(); + dwinDrawRectangle(0, Color_White, 13, 59, 259, 351); + dwinDrawRectangle(1, Color_Bg_Window, 14, 60, 258, 350); const uint8_t ypos = (mode == Popup || mode == Confirm) ? 150 : 230; - if (icon > 0) DWIN_ICON_Show(ICON, icon, 101, 105); - DWIN_Draw_String(true, DWIN_FONT_MENU, Popup_Text_Color, Color_Bg_Window, (272 - 8 * strlen_P(FTOP(line1))) / 2, ypos, line1); - DWIN_Draw_String(true, DWIN_FONT_MENU, Popup_Text_Color, Color_Bg_Window, (272 - 8 * strlen_P(FTOP(line2))) / 2, ypos + 30, line2); - DWIN_Draw_String(true, DWIN_FONT_MENU, Popup_Text_Color, Color_Bg_Window, (272 - 8 * strlen_P(FTOP(line3))) / 2, ypos + 60, line3); + if (icon > 0) dwinIconShow(ICON, icon, 101, 105); + dwinDrawString(true, DWIN_FONT_MENU, Popup_Text_Color, Color_Bg_Window, (272 - 8 * strlen_P(FTOP(line1))) / 2, ypos, line1); + dwinDrawString(true, DWIN_FONT_MENU, Popup_Text_Color, Color_Bg_Window, (272 - 8 * strlen_P(FTOP(line2))) / 2, ypos + 30, line2); + dwinDrawString(true, DWIN_FONT_MENU, Popup_Text_Color, Color_Bg_Window, (272 - 8 * strlen_P(FTOP(line3))) / 2, ypos + 60, line3); if (mode == Popup) { selection = 0; - DWIN_Draw_Rectangle(1, Confirm_Color, 26, 280, 125, 317); - DWIN_Draw_Rectangle(1, Cancel_Color, 146, 280, 245, 317); - DWIN_Draw_String(false, DWIN_FONT_STAT, Color_White, Color_Bg_Window, 39, 290, F("Confirm")); - DWIN_Draw_String(false, DWIN_FONT_STAT, Color_White, Color_Bg_Window, 165, 290, F("Cancel")); - Popup_Select(); + dwinDrawRectangle(1, Confirm_Color, 26, 280, 125, 317); + dwinDrawRectangle(1, Cancel_Color, 146, 280, 245, 317); + dwinDrawString(false, DWIN_FONT_STAT, Color_White, Color_Bg_Window, 39, 290, F("Confirm")); + dwinDrawString(false, DWIN_FONT_STAT, Color_White, Color_Bg_Window, 165, 290, F("Cancel")); + popupSelect(); } else if (mode == Confirm) { - DWIN_Draw_Rectangle(1, Confirm_Color, 87, 280, 186, 317); - DWIN_Draw_String(false, DWIN_FONT_STAT, Color_White, Color_Bg_Window, 96, 290, F("Continue")); + dwinDrawRectangle(1, Confirm_Color, 87, 280, 186, 317); + dwinDrawString(false, DWIN_FONT_STAT, Color_White, Color_Bg_Window, 96, 290, F("Continue")); } } void MarlinUI::kill_screen(FSTR_P const error, FSTR_P const) { - CrealityDWIN.Draw_Popup(F("Printer Kill Reason:"), error, F("Restart Required"), Wait, ICON_BLTouch); + crealityDWIN.drawPopup(F("Printer Kill Reason:"), error, F("Restart Required"), Wait, ICON_BLTouch); } -void CrealityDWINClass::Popup_Select() { - const uint16_t c1 = selection ? Color_Bg_Window : GetColor(eeprom_settings.highlight_box, Color_White), - c2 = selection ? GetColor(eeprom_settings.highlight_box, Color_White) : Color_Bg_Window; - DWIN_Draw_Rectangle(0, c1, 25, 279, 126, 318); - DWIN_Draw_Rectangle(0, c1, 24, 278, 127, 319); - DWIN_Draw_Rectangle(0, c2, 145, 279, 246, 318); - DWIN_Draw_Rectangle(0, c2, 144, 278, 247, 319); +void CrealityDWIN::popupSelect() { + const uint16_t c1 = selection ? Color_Bg_Window : getColor(eeprom_settings.highlight_box, Color_White), + c2 = selection ? getColor(eeprom_settings.highlight_box, Color_White) : Color_Bg_Window; + dwinDrawRectangle(0, c1, 25, 279, 126, 318); + dwinDrawRectangle(0, c1, 24, 278, 127, 319); + dwinDrawRectangle(0, c2, 145, 279, 246, 318); + dwinDrawRectangle(0, c2, 144, 278, 247, 319); } -void CrealityDWINClass::Update_Status_Bar(const bool refresh/*=false*/) { +void CrealityDWIN::updateStatusBar(const bool refresh/*=false*/) { typedef TextScroller<30> Scroller; static bool new_msg; static Scroller scroller; @@ -1025,21 +1007,21 @@ void CrealityDWINClass::Update_Status_Bar(const bool refresh/*=false*/) { if (new_msg) { new_msg = false; if (process == Print) { - DWIN_Draw_Rectangle(1, Color_Grey, 8, 214, DWIN_WIDTH - 8, 238); + dwinDrawRectangle(1, Color_Grey, 8, 214, DWIN_WIDTH - 8, 238); const int8_t npos = (DWIN_WIDTH - len * MENU_CHR_W) / 2; - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.status_bar_text, Color_White), Color_Bg_Black, npos, 219, dispmsg); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.status_bar_text, Color_White), Color_Bg_Black, npos, 219, dispmsg); } else { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 8, 352, DWIN_WIDTH - 8, 376); + dwinDrawRectangle(1, Color_Bg_Black, 8, 352, DWIN_WIDTH - 8, 376); const int8_t npos = (DWIN_WIDTH - len * MENU_CHR_W) / 2; - DWIN_Draw_String(false, DWIN_FONT_MENU, GetColor(eeprom_settings.status_bar_text, Color_White), Color_Bg_Black, npos, 357, dispmsg); + dwinDrawString(false, DWIN_FONT_MENU, getColor(eeprom_settings.status_bar_text, Color_White), Color_Bg_Black, npos, 357, dispmsg); } } } /* Menu Item Config */ -void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item, bool draw/*=true*/) { +void CrealityDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool draw/*=true*/) { const uint8_t row = item - scrollpos; #if HAS_LEVELING static bool level_state; @@ -1057,38 +1039,38 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case PREHEAT_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(TempMenu, sel); + drawMenu(TempMenu, sel); break; #if HAS_HOTEND case PREHEAT_SUBMENU_HOTEND: if (draw) { - Draw_Menu_Item(row, ICON_SetEndTemp, F("Hotend")); - Draw_Float(ui.material_preset[index].hotend_temp, row, false, 1); + drawMenuItem(row, ICON_SetEndTemp, F("Hotend")); + drawFloat(ui.material_preset[index].hotend_temp, row, false, 1); } else - Modify_Value(ui.material_preset[index].hotend_temp, MIN_E_TEMP, MAX_E_TEMP, 1); + modifyValue(ui.material_preset[index].hotend_temp, MIN_E_TEMP, MAX_E_TEMP, 1); break; #endif #if HAS_HEATED_BED case PREHEAT_SUBMENU_BED: if (draw) { - Draw_Menu_Item(row, ICON_SetBedTemp, F("Bed")); - Draw_Float(ui.material_preset[index].bed_temp, row, false, 1); + drawMenuItem(row, ICON_SetBedTemp, F("Bed")); + drawFloat(ui.material_preset[index].bed_temp, row, false, 1); } else - Modify_Value(ui.material_preset[index].bed_temp, MIN_BED_TEMP, MAX_BED_TEMP, 1); + modifyValue(ui.material_preset[index].bed_temp, MIN_BED_TEMP, MAX_BED_TEMP, 1); break; #endif #if HAS_FAN case PREHEAT_SUBMENU_FAN: if (draw) { - Draw_Menu_Item(row, ICON_FanSpeed, F("Fan")); - Draw_Float(ui.material_preset[index].fan_speed, row, false, 1); + drawMenuItem(row, ICON_FanSpeed, F("Fan")); + drawFloat(ui.material_preset[index].fan_speed, row, false, 1); } else - Modify_Value(ui.material_preset[index].fan_speed, MIN_FAN_SPEED, MAX_FAN_SPEED, 1); + modifyValue(ui.material_preset[index].fan_speed, MIN_FAN_SPEED, MAX_FAN_SPEED, 1); break; #endif } @@ -1106,7 +1088,7 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #define PREPARE_MANUALLEVEL (PREPARE_HOME + 1) #define PREPARE_ZOFFSET (PREPARE_MANUALLEVEL + ENABLED(HAS_ZOFFSET_ITEM)) #define PREPARE_PREHEAT (PREPARE_ZOFFSET + ENABLED(HAS_PREHEAT)) - #define PREPARE_COOLDOWN (PREPARE_PREHEAT + EITHER(HAS_HOTEND, HAS_HEATED_BED)) + #define PREPARE_COOLDOWN (PREPARE_PREHEAT + ANY(HAS_HOTEND, HAS_HEATED_BED)) #define PREPARE_CHANGEFIL (PREPARE_COOLDOWN + ENABLED(ADVANCED_PAUSE_FEATURE)) #define PREPARE_CUSTOM_MENU (PREPARE_CHANGEFIL + ENABLED(HAS_CUSTOM_MENU)) #define PREPARE_TOTAL PREPARE_CUSTOM_MENU @@ -1114,54 +1096,54 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case PREPARE_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Main_Menu(1); + drawMainMenu(1); break; case PREPARE_MOVE: if (draw) - Draw_Menu_Item(row, ICON_Axis, F("Move"), nullptr, true); + drawMenuItem(row, ICON_Axis, F("Move"), nullptr, true); else - Draw_Menu(Move); + drawMenu(Move); break; case PREPARE_DISABLE: if (draw) - Draw_Menu_Item(row, ICON_CloseMotor, F("Disable Stepper")); + drawMenuItem(row, ICON_CloseMotor, F("Disable Stepper")); else queue.inject(F("M84")); break; case PREPARE_HOME: if (draw) - Draw_Menu_Item(row, ICON_SetHome, F("Homing"), nullptr, true); + drawMenuItem(row, ICON_SetHome, F("Homing"), nullptr, true); else - Draw_Menu(HomeMenu); + drawMenu(HomeMenu); break; case PREPARE_MANUALLEVEL: if (draw) - Draw_Menu_Item(row, ICON_PrintSize, F("Manual Leveling"), nullptr, true); + drawMenuItem(row, ICON_PrintSize, F("Manual Leveling"), nullptr, true); else { if (axes_should_home()) { - Popup_Handler(Home); + popupHandler(Home); gcode.home_all_axes(true); } #if HAS_LEVELING level_state = planner.leveling_active; set_bed_leveling_enabled(false); #endif - Draw_Menu(ManualLevel); + drawMenu(ManualLevel); } break; #if HAS_ZOFFSET_ITEM case PREPARE_ZOFFSET: if (draw) - Draw_Menu_Item(row, ICON_Zoffset, F("Z-Offset"), nullptr, true); + drawMenuItem(row, ICON_Zoffset, F("Z-Offset"), nullptr, true); else { #if HAS_LEVELING level_state = planner.leveling_active; set_bed_leveling_enabled(false); #endif - Draw_Menu(ZOffset); + drawMenu(ZOffset); } break; #endif @@ -1169,16 +1151,16 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if HAS_PREHEAT case PREPARE_PREHEAT: if (draw) - Draw_Menu_Item(row, ICON_Temperature, F("Preheat"), nullptr, true); + drawMenuItem(row, ICON_Temperature, F("Preheat"), nullptr, true); else - Draw_Menu(Preheat); + drawMenu(Preheat); break; #endif #if HAS_HOTEND || HAS_HEATED_BED case PREPARE_COOLDOWN: if (draw) - Draw_Menu_Item(row, ICON_Cool, F("Cooldown")); + drawMenuItem(row, ICON_Cool, F("Cooldown")); else thermalManager.cooldown(); break; @@ -1190,16 +1172,16 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #define CUSTOM_MENU_CONFIG_TITLE "Custom Commands" #endif if (draw) - Draw_Menu_Item(row, ICON_Version, F(CUSTOM_MENU_CONFIG_TITLE)); + drawMenuItem(row, ICON_Version, F(CUSTOM_MENU_CONFIG_TITLE)); else - Draw_Menu(MenuCustom); + drawMenu(MenuCustom); break; #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) case PREPARE_CHANGEFIL: if (draw) { - Draw_Menu_Item(row, ICON_ResumeEEPROM, GET_TEXT_F(MSG_FILAMENTCHANGE) + drawMenuItem(row, ICON_ResumeEEPROM, GET_TEXT_F(MSG_FILAMENTCHANGE) #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) , nullptr, true #endif @@ -1207,16 +1189,16 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item } else { #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) - Draw_Menu(ChangeFilament); + drawMenu(ChangeFilament); #else if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) - Popup_Handler(ETemp); + popupHandler(ETemp); else { if (thermalManager.temp_hotend[0].is_below_target(2)) { - Popup_Handler(Heating); + popupHandler(Heating); thermalManager.wait_for_hotend(0); } - Popup_Handler(FilChange); + popupHandler(FilChange); sprintf_P(cmd, PSTR("M600 B1 R%i"), thermalManager.temp_hotend[0].target); gcode.process_subcommands_now(cmd); } @@ -1240,55 +1222,55 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case HOME_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Prepare, PREPARE_HOME); + drawMenu(Prepare, PREPARE_HOME); break; case HOME_ALL: if (draw) - Draw_Menu_Item(row, ICON_Homing, F("Home All")); + drawMenuItem(row, ICON_Homing, F("Home All")); else { - Popup_Handler(Home); + popupHandler(Home); gcode.home_all_axes(true); - Redraw_Menu(); + redrawMenu(); } break; case HOME_X: if (draw) - Draw_Menu_Item(row, ICON_MoveX, F("Home X")); + drawMenuItem(row, ICON_MoveX, F("Home X")); else { - Popup_Handler(Home); + popupHandler(Home); gcode.process_subcommands_now(F("G28 X")); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } break; case HOME_Y: if (draw) - Draw_Menu_Item(row, ICON_MoveY, F("Home Y")); + drawMenuItem(row, ICON_MoveY, F("Home Y")); else { - Popup_Handler(Home); + popupHandler(Home); gcode.process_subcommands_now(F("G28 Y")); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } break; case HOME_Z: if (draw) - Draw_Menu_Item(row, ICON_MoveZ, F("Home Z")); + drawMenuItem(row, ICON_MoveZ, F("Home Z")); else { - Popup_Handler(Home); + popupHandler(Home); gcode.process_subcommands_now(F("G28 Z")); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } break; case HOME_SET: if (draw) - Draw_Menu_Item(row, ICON_SetHome, F("Set Home Position")); + drawMenuItem(row, ICON_SetHome, F("Set Home Position")); else { gcode.process_subcommands_now(F("G92X0Y0Z0")); - AudioFeedback(); + audioFeedback(); } break; } @@ -1308,61 +1290,61 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case MOVE_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else { #if HAS_BED_PROBE probe_deployed = false; probe.set_deployed(probe_deployed); #endif - Draw_Menu(Prepare, PREPARE_MOVE); + drawMenu(Prepare, PREPARE_MOVE); } break; case MOVE_X: if (draw) { - Draw_Menu_Item(row, ICON_MoveX, F("Move X")); - Draw_Float(current_position.x, row, false); + drawMenuItem(row, ICON_MoveX, F("Move X")); + drawFloat(current_position.x, row, false); } else - Modify_Value(current_position.x, X_MIN_POS, X_MAX_POS, 10); + modifyValue(current_position.x, X_MIN_POS, X_MAX_POS, 10); break; case MOVE_Y: if (draw) { - Draw_Menu_Item(row, ICON_MoveY, F("Move Y")); - Draw_Float(current_position.y, row); + drawMenuItem(row, ICON_MoveY, F("Move Y")); + drawFloat(current_position.y, row); } else - Modify_Value(current_position.y, Y_MIN_POS, Y_MAX_POS, 10); + modifyValue(current_position.y, Y_MIN_POS, Y_MAX_POS, 10); break; case MOVE_Z: if (draw) { - Draw_Menu_Item(row, ICON_MoveZ, F("Move Z")); - Draw_Float(current_position.z, row); + drawMenuItem(row, ICON_MoveZ, F("Move Z")); + drawFloat(current_position.z, row); } else - Modify_Value(current_position.z, Z_MIN_POS, Z_MAX_POS, 10); + modifyValue(current_position.z, Z_MIN_POS, Z_MAX_POS, 10); break; #if HAS_HOTEND case MOVE_E: if (draw) { - Draw_Menu_Item(row, ICON_Extruder, F("Extruder")); + drawMenuItem(row, ICON_Extruder, F("Extruder")); current_position.e = 0; sync_plan_position(); - Draw_Float(current_position.e, row); + drawFloat(current_position.e, row); } else { if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) { - Popup_Handler(ETemp); + popupHandler(ETemp); } else { if (thermalManager.temp_hotend[0].is_below_target(2)) { - Popup_Handler(Heating); + popupHandler(Heating); thermalManager.wait_for_hotend(0); - Redraw_Menu(); + redrawMenu(); } current_position.e = 0; sync_plan_position(); - Modify_Value(current_position.e, -500, 500, 10); + modifyValue(current_position.e, -500, 500, 10); } } break; @@ -1371,30 +1353,30 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if HAS_BED_PROBE case MOVE_P: if (draw) { - Draw_Menu_Item(row, ICON_StockConfiguration, F("Probe")); - Draw_Checkbox(row, probe_deployed); + drawMenuItem(row, ICON_StockConfiguration, F("Probe")); + drawCheckbox(row, probe_deployed); } else { probe_deployed = !probe_deployed; probe.set_deployed(probe_deployed); - Draw_Checkbox(row, probe_deployed); + drawCheckbox(row, probe_deployed); } break; #endif case MOVE_LIVE: if (draw) { - Draw_Menu_Item(row, ICON_Axis, F("Live Movement")); - Draw_Checkbox(row, livemove); + drawMenuItem(row, ICON_Axis, F("Live Movement")); + drawCheckbox(row, livemove); } else { livemove = !livemove; - Draw_Checkbox(row, livemove); + drawCheckbox(row, livemove); } break; } break; - case ManualLevel: + case ManualLevel: { #define MLEVEL_BACK 0 #define MLEVEL_PROBE (MLEVEL_BACK + ENABLED(HAS_BED_PROBE)) @@ -1409,156 +1391,170 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item static float mlev_z_pos = 0; static bool use_probe = false; + #if HAS_BED_PROBE + const float probe_x_min = _MAX(0 + corner_pos, X_MIN_POS + probe.offset.x, X_MIN_POS + PROBING_MARGIN) - probe.offset.x, + probe_x_max = _MIN((X_BED_SIZE + X_MIN_POS) - corner_pos, X_MAX_POS + probe.offset.x, X_MAX_POS - PROBING_MARGIN) - probe.offset.x, + probe_y_min = _MAX(0 + corner_pos, Y_MIN_POS + probe.offset.y, Y_MIN_POS + PROBING_MARGIN) - probe.offset.y, + probe_y_max = _MIN((Y_BED_SIZE + Y_MIN_POS) - corner_pos, Y_MAX_POS + probe.offset.y, Y_MAX_POS - PROBING_MARGIN) - probe.offset.y; + #endif + switch (item) { case MLEVEL_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else { TERN_(HAS_LEVELING, set_bed_leveling_enabled(level_state)); - Draw_Menu(Prepare, PREPARE_MANUALLEVEL); + drawMenu(Prepare, PREPARE_MANUALLEVEL); } break; + #if HAS_BED_PROBE case MLEVEL_PROBE: if (draw) { - Draw_Menu_Item(row, ICON_Zoffset, F("Use Probe")); - Draw_Checkbox(row, use_probe); + drawMenuItem(row, ICON_Zoffset, F("Use Probe")); + drawCheckbox(row, use_probe); } else { - use_probe = !use_probe; - Draw_Checkbox(row, use_probe); + use_probe ^= true; + drawCheckbox(row, use_probe); if (use_probe) { - Popup_Handler(Level); + popupHandler(Level); + const struct { xy_pos_t p; ProbePtRaise r; } points[] = { + { { probe_x_min, probe_y_min }, PROBE_PT_RAISE }, + { { probe_x_min, probe_y_max }, PROBE_PT_RAISE }, + { { probe_x_max, probe_y_max }, PROBE_PT_RAISE }, + { { probe_x_max, probe_y_min }, PROBE_PT_STOW } + }; corner_avg = 0; - #define PROBE_X_MIN _MAX(0 + corner_pos, X_MIN_POS + probe.offset.x, X_MIN_POS + PROBING_MARGIN) - probe.offset.x - #define PROBE_X_MAX _MIN((X_BED_SIZE + X_MIN_POS) - corner_pos, X_MAX_POS + probe.offset.x, X_MAX_POS - PROBING_MARGIN) - probe.offset.x - #define PROBE_Y_MIN _MAX(0 + corner_pos, Y_MIN_POS + probe.offset.y, Y_MIN_POS + PROBING_MARGIN) - probe.offset.y - #define PROBE_Y_MAX _MIN((Y_BED_SIZE + Y_MIN_POS) - corner_pos, Y_MAX_POS + probe.offset.y, Y_MAX_POS - PROBING_MARGIN) - probe.offset.y - corner_avg += probe.probe_at_point(PROBE_X_MIN, PROBE_Y_MIN, PROBE_PT_RAISE, 0, false); - corner_avg += probe.probe_at_point(PROBE_X_MIN, PROBE_Y_MAX, PROBE_PT_RAISE, 0, false); - corner_avg += probe.probe_at_point(PROBE_X_MAX, PROBE_Y_MAX, PROBE_PT_RAISE, 0, false); - corner_avg += probe.probe_at_point(PROBE_X_MAX, PROBE_Y_MIN, PROBE_PT_STOW, 0, false); + for (uint8_t i = 0; i < COUNT(points); i++) { + const float mz = probe.probe_at_point(points[i].p, points[i].r, 0, false); + if (isnan(mz)) { corner_avg = 0; break; } + corner_avg += mz; + } corner_avg /= 4; - Redraw_Menu(); + redrawMenu(); } } break; #endif + case MLEVEL_BL: if (draw) - Draw_Menu_Item(row, ICON_AxisBL, F("Bottom Left")); + drawMenuItem(row, ICON_AxisBL, F("Bottom Left")); else { - Popup_Handler(MoveWait); + popupHandler(MoveWait); if (use_probe) { #if HAS_BED_PROBE - sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(PROBE_X_MIN, 1, 3, str_1), dtostrf(PROBE_Y_MIN, 1, 3, str_2)); + sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(probe_x_min, 1, 3, str_1), dtostrf(probe_y_min, 1, 3, str_2)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Popup_Handler(ManualProbing); + popupHandler(ManualProbing); #endif } else { sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s\nG0 F300 Z%s"), dtostrf(corner_pos, 1, 3, str_1), dtostrf(corner_pos, 1, 3, str_2), dtostrf(mlev_z_pos, 1, 3, str_3)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } } break; case MLEVEL_TL: if (draw) - Draw_Menu_Item(row, ICON_AxisTL, F("Top Left")); + drawMenuItem(row, ICON_AxisTL, F("Top Left")); else { - Popup_Handler(MoveWait); + popupHandler(MoveWait); if (use_probe) { #if HAS_BED_PROBE - sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(PROBE_X_MIN, 1, 3, str_1), dtostrf(PROBE_Y_MAX, 1, 3, str_2)); + sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(probe_x_min, 1, 3, str_1), dtostrf(probe_y_max, 1, 3, str_2)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Popup_Handler(ManualProbing); + popupHandler(ManualProbing); #endif } else { sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s\nG0 F300 Z%s"), dtostrf(corner_pos, 1, 3, str_1), dtostrf((Y_BED_SIZE + Y_MIN_POS) - corner_pos, 1, 3, str_2), dtostrf(mlev_z_pos, 1, 3, str_3)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } } break; case MLEVEL_TR: if (draw) - Draw_Menu_Item(row, ICON_AxisTR, F("Top Right")); + drawMenuItem(row, ICON_AxisTR, F("Top Right")); else { - Popup_Handler(MoveWait); + popupHandler(MoveWait); if (use_probe) { #if HAS_BED_PROBE - sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(PROBE_X_MAX, 1, 3, str_1), dtostrf(PROBE_Y_MAX, 1, 3, str_2)); + sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(probe_x_max, 1, 3, str_1), dtostrf(probe_y_max, 1, 3, str_2)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Popup_Handler(ManualProbing); + popupHandler(ManualProbing); #endif } else { sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s\nG0 F300 Z%s"), dtostrf((X_BED_SIZE + X_MIN_POS) - corner_pos, 1, 3, str_1), dtostrf((Y_BED_SIZE + Y_MIN_POS) - corner_pos, 1, 3, str_2), dtostrf(mlev_z_pos, 1, 3, str_3)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } } break; case MLEVEL_BR: if (draw) - Draw_Menu_Item(row, ICON_AxisBR, F("Bottom Right")); + drawMenuItem(row, ICON_AxisBR, F("Bottom Right")); else { - Popup_Handler(MoveWait); + popupHandler(MoveWait); if (use_probe) { #if HAS_BED_PROBE - sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(PROBE_X_MAX, 1, 3, str_1), dtostrf(PROBE_Y_MIN, 1, 3, str_2)); + sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(probe_x_max, 1, 3, str_1), dtostrf(probe_y_min, 1, 3, str_2)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Popup_Handler(ManualProbing); + popupHandler(ManualProbing); #endif } else { sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s\nG0 F300 Z%s"), dtostrf((X_BED_SIZE + X_MIN_POS) - corner_pos, 1, 3, str_1), dtostrf(corner_pos, 1, 3, str_2), dtostrf(mlev_z_pos, 1, 3, str_3)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } } break; case MLEVEL_C: if (draw) - Draw_Menu_Item(row, ICON_AxisC, F("Center")); + drawMenuItem(row, ICON_AxisC, F("Center")); else { - Popup_Handler(MoveWait); + popupHandler(MoveWait); if (use_probe) { #if HAS_BED_PROBE sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s"), dtostrf(X_MAX_POS / 2.0f - probe.offset.x, 1, 3, str_1), dtostrf(Y_MAX_POS / 2.0f - probe.offset.y, 1, 3, str_2)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Popup_Handler(ManualProbing); + popupHandler(ManualProbing); #endif } else { sprintf_P(cmd, PSTR("G0 F4000\nG0 Z10\nG0 X%s Y%s\nG0 F300 Z%s"), dtostrf((X_BED_SIZE + X_MIN_POS) / 2.0f, 1, 3, str_1), dtostrf((Y_BED_SIZE + Y_MIN_POS) / 2.0f, 1, 3, str_2), dtostrf(mlev_z_pos, 1, 3, str_3)); gcode.process_subcommands_now(cmd); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } } break; case MLEVEL_ZPOS: if (draw) { - Draw_Menu_Item(row, ICON_SetZOffset, F("Z Position")); - Draw_Float(mlev_z_pos, row, false, 100); + drawMenuItem(row, ICON_SetZOffset, F("Z Position")); + drawFloat(mlev_z_pos, row, false, 100); } else - Modify_Value(mlev_z_pos, 0, MAX_Z_OFFSET, 100); + modifyValue(mlev_z_pos, 0, MAX_Z_OFFSET, 100); break; } - break; + + } break; + #if HAS_ZOFFSET_ITEM case ZOffset: @@ -1574,20 +1570,20 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case ZOFFSET_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else { liveadjust = false; TERN_(HAS_LEVELING, set_bed_leveling_enabled(level_state)); - Draw_Menu(Prepare, PREPARE_ZOFFSET); + drawMenu(Prepare, PREPARE_ZOFFSET); } break; case ZOFFSET_HOME: if (draw) - Draw_Menu_Item(row, ICON_Homing, F("Home Z Axis")); + drawMenuItem(row, ICON_Homing, F("Home Z Axis")); else { - Popup_Handler(Home); + popupHandler(Home); gcode.process_subcommands_now(F("G28 Z")); - Popup_Handler(MoveWait); + popupHandler(MoveWait); #if ENABLED(Z_SAFE_HOMING) planner.synchronize(); sprintf_P(cmd, PSTR("G0 F4000 X%s Y%s"), dtostrf(Z_SAFE_HOMING_X_POINT, 1, 3, str_1), dtostrf(Z_SAFE_HOMING_Y_POINT, 1, 3, str_2)); @@ -1597,21 +1593,21 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #endif gcode.process_subcommands_now(F("G0 F300 Z0")); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } break; case ZOFFSET_MODE: if (draw) { - Draw_Menu_Item(row, ICON_Zoffset, F("Live Adjustment")); - Draw_Checkbox(row, liveadjust); + drawMenuItem(row, ICON_Zoffset, F("Live Adjustment")); + drawCheckbox(row, liveadjust); } else { if (!liveadjust) { if (axes_should_home()) { - Popup_Handler(Home); + popupHandler(Home); gcode.home_all_axes(true); } - Popup_Handler(MoveWait); + popupHandler(MoveWait); #if ENABLED(Z_SAFE_HOMING) planner.synchronize(); sprintf_P(cmd, PSTR("G0 F4000 X%s Y%s"), dtostrf(Z_SAFE_HOMING_X_POINT, 1, 3, str_1), dtostrf(Z_SAFE_HOMING_Y_POINT, 1, 3, str_2)); @@ -1621,23 +1617,23 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #endif gcode.process_subcommands_now(F("G0 F300 Z0")); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } liveadjust = !liveadjust; - Draw_Checkbox(row, liveadjust); + drawCheckbox(row, liveadjust); } break; case ZOFFSET_OFFSET: if (draw) { - Draw_Menu_Item(row, ICON_SetZOffset, F("Z Offset")); - Draw_Float(zoffsetvalue, row, false, 100); + drawMenuItem(row, ICON_SetZOffset, F("Z Offset")); + drawFloat(zoffsetvalue, row, false, 100); } else - Modify_Value(zoffsetvalue, MIN_Z_OFFSET, MAX_Z_OFFSET, 100); + modifyValue(zoffsetvalue, MIN_Z_OFFSET, MAX_Z_OFFSET, 100); break; case ZOFFSET_UP: if (draw) - Draw_Menu_Item(row, ICON_Axis, F("Microstep Up")); + drawMenuItem(row, ICON_Axis, F("Microstep Up")); else { if (zoffsetvalue < MAX_Z_OFFSET) { if (liveadjust) { @@ -1645,13 +1641,13 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item planner.synchronize(); } zoffsetvalue += 0.01; - Draw_Float(zoffsetvalue, row - 1, false, 100); + drawFloat(zoffsetvalue, row - 1, false, 100); } } break; case ZOFFSET_DOWN: if (draw) - Draw_Menu_Item(row, ICON_AxisD, F("Microstep Down")); + drawMenuItem(row, ICON_AxisD, F("Microstep Down")); else { if (zoffsetvalue > MIN_Z_OFFSET) { if (liveadjust) { @@ -1659,16 +1655,16 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item planner.synchronize(); } zoffsetvalue -= 0.01; - Draw_Float(zoffsetvalue, row - 2, false, 100); + drawFloat(zoffsetvalue, row - 2, false, 100); } } break; #if ENABLED(EEPROM_SETTINGS) case ZOFFSET_SAVE: if (draw) - Draw_Menu_Item(row, ICON_WriteEEPROM, F("Save")); + drawMenuItem(row, ICON_WriteEEPROM, F("Save")); else - AudioFeedback(settings.save()); + audioFeedback(settings.save()); break; #endif } @@ -1694,23 +1690,23 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case PREHEAT_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Prepare, PREPARE_PREHEAT); + drawMenu(Prepare, PREPARE_PREHEAT); break; case PREHEAT_MODE: if (draw) { - Draw_Menu_Item(row, ICON_Homing, F("Preheat Mode")); - Draw_Option(preheatmode, preheat_modes, row); + drawMenuItem(row, ICON_Homing, F("Preheat Mode")); + drawOption(preheatmode, preheat_modes, row); } else - Modify_Option(preheatmode, preheat_modes, 2); + modifyOption(preheatmode, preheat_modes, 2); break; #define _PREHEAT_CASE(N) \ case PREHEAT_##N: { \ - if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_## N ##_LABEL)); \ + if (draw) drawMenuItem(row, ICON_Temperature, F(PREHEAT_## N ##_LABEL)); \ else do_preheat(N - 1); \ } break; @@ -1731,59 +1727,59 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case CHANGEFIL_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Prepare, PREPARE_CHANGEFIL); + drawMenu(Prepare, PREPARE_CHANGEFIL); break; case CHANGEFIL_LOAD: if (draw) - Draw_Menu_Item(row, ICON_WriteEEPROM, GET_TEXT_F(MSG_FILAMENTLOAD)); + drawMenuItem(row, ICON_WriteEEPROM, GET_TEXT_F(MSG_FILAMENTLOAD)); else { if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) - Popup_Handler(ETemp); + popupHandler(ETemp); else { if (thermalManager.temp_hotend[0].is_below_target(2)) { - Popup_Handler(Heating); + popupHandler(Heating); thermalManager.wait_for_hotend(0); } - Popup_Handler(FilLoad); + popupHandler(FilLoad); gcode.process_subcommands_now(F("M701")); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } } break; case CHANGEFIL_UNLOAD: if (draw) - Draw_Menu_Item(row, ICON_ReadEEPROM, GET_TEXT_F(MSG_FILAMENTUNLOAD)); + drawMenuItem(row, ICON_ReadEEPROM, GET_TEXT_F(MSG_FILAMENTUNLOAD)); else { if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) { - Popup_Handler(ETemp); + popupHandler(ETemp); } else { if (thermalManager.temp_hotend[0].is_below_target(2)) { - Popup_Handler(Heating); + popupHandler(Heating); thermalManager.wait_for_hotend(0); } - Popup_Handler(FilLoad, true); + popupHandler(FilLoad, true); gcode.process_subcommands_now(F("M702")); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } } break; case CHANGEFIL_CHANGE: if (draw) - Draw_Menu_Item(row, ICON_ResumeEEPROM, GET_TEXT_F(MSG_FILAMENTCHANGE)); + drawMenuItem(row, ICON_ResumeEEPROM, GET_TEXT_F(MSG_FILAMENTCHANGE)); else { if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) - Popup_Handler(ETemp); + popupHandler(ETemp); else { if (thermalManager.temp_hotend[0].is_below_target(2)) { - Popup_Handler(Heating); + popupHandler(Heating); thermalManager.wait_for_hotend(0); } - Popup_Handler(FilChange); + popupHandler(FilChange); sprintf_P(cmd, PSTR("M600 B1 R%i"), thermalManager.temp_hotend[0].target); gcode.process_subcommands_now(cmd); } @@ -1808,23 +1804,23 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case CUSTOM_MENU_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Prepare, PREPARE_CUSTOM_MENU); + drawMenu(Prepare, PREPARE_CUSTOM_MENU); break; #if CUSTOM_MENU_COUNT >= 1 case CUSTOM_MENU_1: if (draw) - Draw_Menu_Item(row, ICON_Info, F(CONFIG_MENU_ITEM_1_DESC)); + drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_1_DESC)); else { - Popup_Handler(Custom); + popupHandler(Custom); //queue.inject(F(CONFIG_MENU_ITEM_1_GCODE)); // Old code gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_1_GCODE)); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) - AudioFeedback(); + audioFeedback(); #endif #ifdef CUSTOM_MENU_CONFIG_SCRIPT_RETURN queue.inject(F(CUSTOM_MENU_CONFIG_SCRIPT_DONE)); @@ -1836,14 +1832,14 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if CUSTOM_MENU_COUNT >= 2 case CUSTOM_MENU_2: if (draw) - Draw_Menu_Item(row, ICON_Info, F(CONFIG_MENU_ITEM_2_DESC)); + drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_2_DESC)); else { - Popup_Handler(Custom); + popupHandler(Custom); gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_2_GCODE)); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) - AudioFeedback(); + audioFeedback(); #endif #ifdef CUSTOM_MENU_CONFIG_SCRIPT_RETURN queue.inject(F(CUSTOM_MENU_CONFIG_SCRIPT_DONE)); @@ -1855,14 +1851,14 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if CUSTOM_MENU_COUNT >= 3 case CUSTOM_MENU_3: if (draw) - Draw_Menu_Item(row, ICON_Info, F(CONFIG_MENU_ITEM_3_DESC)); + drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_3_DESC)); else { - Popup_Handler(Custom); + popupHandler(Custom); gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_3_GCODE)); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) - AudioFeedback(); + audioFeedback(); #endif #ifdef CUSTOM_MENU_CONFIG_SCRIPT_RETURN queue.inject(F(CUSTOM_MENU_CONFIG_SCRIPT_DONE)); @@ -1874,14 +1870,14 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if CUSTOM_MENU_COUNT >= 4 case CUSTOM_MENU_4: if (draw) - Draw_Menu_Item(row, ICON_Info, F(CONFIG_MENU_ITEM_4_DESC)); + drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_4_DESC)); else { - Popup_Handler(Custom); + popupHandler(Custom); gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_4_GCODE)); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) - AudioFeedback(); + audioFeedback(); #endif #ifdef CUSTOM_MENU_CONFIG_SCRIPT_RETURN queue.inject(F(CUSTOM_MENU_CONFIG_SCRIPT_DONE)); @@ -1893,14 +1889,14 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if CUSTOM_MENU_COUNT >= 5 case CUSTOM_MENU_5: if (draw) - Draw_Menu_Item(row, ICON_Info, F(CONFIG_MENU_ITEM_5_DESC)); + drawMenuItem(row, ICON_Info, F(CONFIG_MENU_ITEM_5_DESC)); else { - Popup_Handler(Custom); + popupHandler(Custom); gcode.process_subcommands_now(F(CONFIG_MENU_ITEM_5_GCODE)); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); #if ENABLED(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK) - AudioFeedback(); + audioFeedback(); #endif #ifdef CUSTOM_MENU_CONFIG_SCRIPT_RETURN queue.inject(F(CUSTOM_MENU_CONFIG_SCRIPT_DONE)); @@ -1929,61 +1925,61 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case CONTROL_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Main_Menu(2); + drawMainMenu(2); break; case CONTROL_TEMP: if (draw) - Draw_Menu_Item(row, ICON_Temperature, F("Temperature"), nullptr, true); + drawMenuItem(row, ICON_Temperature, F("Temperature"), nullptr, true); else - Draw_Menu(TempMenu); + drawMenu(TempMenu); break; case CONTROL_MOTION: if (draw) - Draw_Menu_Item(row, ICON_Motion, F("Motion"), nullptr, true); + drawMenuItem(row, ICON_Motion, F("Motion"), nullptr, true); else - Draw_Menu(Motion); + drawMenu(Motion); break; case CONTROL_VISUAL: if (draw) - Draw_Menu_Item(row, ICON_PrintSize, F("Visual"), nullptr, true); + drawMenuItem(row, ICON_PrintSize, F("Visual"), nullptr, true); else - Draw_Menu(Visual); + drawMenu(Visual); break; case CONTROL_ADVANCED: if (draw) - Draw_Menu_Item(row, ICON_Version, F("Advanced"), nullptr, true); + drawMenuItem(row, ICON_Version, F("Advanced"), nullptr, true); else - Draw_Menu(Advanced); + drawMenu(Advanced); break; #if ENABLED(EEPROM_SETTINGS) case CONTROL_SAVE: if (draw) - Draw_Menu_Item(row, ICON_WriteEEPROM, F("Store Settings")); + drawMenuItem(row, ICON_WriteEEPROM, F("Store Settings")); else - AudioFeedback(settings.save()); + audioFeedback(settings.save()); break; case CONTROL_RESTORE: if (draw) - Draw_Menu_Item(row, ICON_ReadEEPROM, F("Restore Settings")); + drawMenuItem(row, ICON_ReadEEPROM, F("Restore Settings")); else - AudioFeedback(settings.load()); + audioFeedback(settings.load()); break; case CONTROL_RESET: if (draw) - Draw_Menu_Item(row, ICON_Temperature, F("Reset to Defaults")); + drawMenuItem(row, ICON_Temperature, F("Reset to Defaults")); else { settings.reset(); - AudioFeedback(); + audioFeedback(); } break; #endif case CONTROL_INFO: if (draw) - Draw_Menu_Item(row, ICON_Info, F("Info")); + drawMenuItem(row, ICON_Info, F("Info")); else - Draw_Menu(Info); + drawMenu(Info); break; } break; @@ -2005,53 +2001,53 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case TEMP_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Control, CONTROL_TEMP); + drawMenu(Control, CONTROL_TEMP); break; #if HAS_HOTEND case TEMP_HOTEND: if (draw) { - Draw_Menu_Item(row, ICON_SetEndTemp, F("Hotend")); - Draw_Float(thermalManager.temp_hotend[0].target, row, false, 1); + drawMenuItem(row, ICON_SetEndTemp, F("Hotend")); + drawFloat(thermalManager.temp_hotend[0].target, row, false, 1); } else - Modify_Value(thermalManager.temp_hotend[0].target, MIN_E_TEMP, MAX_E_TEMP, 1); + modifyValue(thermalManager.temp_hotend[0].target, MIN_E_TEMP, MAX_E_TEMP, 1); break; #endif #if HAS_HEATED_BED case TEMP_BED: if (draw) { - Draw_Menu_Item(row, ICON_SetBedTemp, F("Bed")); - Draw_Float(thermalManager.temp_bed.target, row, false, 1); + drawMenuItem(row, ICON_SetBedTemp, F("Bed")); + drawFloat(thermalManager.temp_bed.target, row, false, 1); } else - Modify_Value(thermalManager.temp_bed.target, MIN_BED_TEMP, MAX_BED_TEMP, 1); + modifyValue(thermalManager.temp_bed.target, MIN_BED_TEMP, MAX_BED_TEMP, 1); break; #endif #if HAS_FAN case TEMP_FAN: if (draw) { - Draw_Menu_Item(row, ICON_FanSpeed, F("Fan")); - Draw_Float(thermalManager.fan_speed[0], row, false, 1); + drawMenuItem(row, ICON_FanSpeed, F("Fan")); + drawFloat(thermalManager.fan_speed[0], row, false, 1); } else - Modify_Value(thermalManager.fan_speed[0], MIN_FAN_SPEED, MAX_FAN_SPEED, 1); + modifyValue(thermalManager.fan_speed[0], MIN_FAN_SPEED, MAX_FAN_SPEED, 1); break; #endif #if HAS_HOTEND || HAS_HEATED_BED case TEMP_PID: if (draw) - Draw_Menu_Item(row, ICON_Step, F("PID"), nullptr, true); + drawMenuItem(row, ICON_Step, F("PID"), nullptr, true); else - Draw_Menu(PID); + drawMenu(PID); break; #endif #define _TEMP_PREHEAT_CASE(N) \ case TEMP_PREHEAT##N: { \ - if (draw) Draw_Menu_Item(row, ICON_Step, F(PREHEAT_## N ##_LABEL), nullptr, true); \ - else Draw_Menu(Preheat##N); \ + if (draw) drawMenuItem(row, ICON_Step, F(PREHEAT_## N ##_LABEL), nullptr, true); \ + else drawMenu(Preheat##N); \ } break; REPEAT_1(PREHEAT_COUNT, _TEMP_PREHEAT_CASE) @@ -2072,33 +2068,33 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case PID_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(TempMenu, TEMP_PID); + drawMenu(TempMenu, TEMP_PID); break; #if HAS_HOTEND case PID_HOTEND: if (draw) - Draw_Menu_Item(row, ICON_HotendTemp, F("Hotend"), nullptr, true); + drawMenuItem(row, ICON_HotendTemp, F("Hotend"), nullptr, true); else - Draw_Menu(HotendPID); + drawMenu(HotendPID); break; #endif #if HAS_HEATED_BED case PID_BED: if (draw) - Draw_Menu_Item(row, ICON_BedTemp, F("Bed"), nullptr, true); + drawMenuItem(row, ICON_BedTemp, F("Bed"), nullptr, true); else - Draw_Menu(BedPID); + drawMenu(BedPID); break; #endif case PID_CYCLES: if (draw) { - Draw_Menu_Item(row, ICON_FanSpeed, F("Cycles")); - Draw_Float(PID_cycles, row, false, 1); + drawMenuItem(row, ICON_FanSpeed, F("Cycles")); + drawFloat(PID_cycles, row, false, 1); } else - Modify_Value(PID_cycles, 3, 50, 1); + modifyValue(PID_cycles, 3, 50, 1); break; } break; @@ -2120,52 +2116,52 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case HOTENDPID_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(PID, PID_HOTEND); + drawMenu(PID, PID_HOTEND); break; case HOTENDPID_TUNE: if (draw) - Draw_Menu_Item(row, ICON_HotendTemp, F("Autotune")); + drawMenuItem(row, ICON_HotendTemp, F("Autotune")); else { - Popup_Handler(PIDWait); + popupHandler(PIDWait); sprintf_P(cmd, PSTR("M303 E0 C%i S%i U1"), PID_cycles, PID_e_temp); gcode.process_subcommands_now(cmd); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } break; case HOTENDPID_TEMP: if (draw) { - Draw_Menu_Item(row, ICON_Temperature, F("Temperature")); - Draw_Float(PID_e_temp, row, false, 1); + drawMenuItem(row, ICON_Temperature, F("Temperature")); + drawFloat(PID_e_temp, row, false, 1); } else - Modify_Value(PID_e_temp, MIN_E_TEMP, MAX_E_TEMP, 1); + modifyValue(PID_e_temp, MIN_E_TEMP, MAX_E_TEMP, 1); break; case HOTENDPID_KP: if (draw) { - Draw_Menu_Item(row, ICON_Version, F("Kp Value")); - Draw_Float(thermalManager.temp_hotend[0].pid.p(), row, false, 100); + drawMenuItem(row, ICON_Version, F("Kp Value")); + drawFloat(thermalManager.temp_hotend[0].pid.p(), row, false, 100); } else - Modify_Value(thermalManager.temp_hotend[0].pid.Kp, 0, 5000, 100, thermalManager.updatePID); + modifyValue(thermalManager.temp_hotend[0].pid.Kp, 0, 5000, 100, thermalManager.updatePID); break; case HOTENDPID_KI: if (draw) { - Draw_Menu_Item(row, ICON_Version, F("Ki Value")); - Draw_Float(thermalManager.temp_hotend[0].pid.i(), row, false, 100); + drawMenuItem(row, ICON_Version, F("Ki Value")); + drawFloat(thermalManager.temp_hotend[0].pid.i(), row, false, 100); } else - Modify_Value(thermalManager.temp_hotend[0].pid.Ki, 0, 5000, 100, thermalManager.updatePID); + modifyValue(thermalManager.temp_hotend[0].pid.Ki, 0, 5000, 100, thermalManager.updatePID); break; case HOTENDPID_KD: if (draw) { - Draw_Menu_Item(row, ICON_Version, F("Kd Value")); - Draw_Float(thermalManager.temp_hotend[0].pid.d(), row, false, 100); + drawMenuItem(row, ICON_Version, F("Kd Value")); + drawFloat(thermalManager.temp_hotend[0].pid.d(), row, false, 100); } else - Modify_Value(thermalManager.temp_hotend[0].pid.Kd, 0, 5000, 100, thermalManager.updatePID); + modifyValue(thermalManager.temp_hotend[0].pid.Kd, 0, 5000, 100, thermalManager.updatePID); break; } break; @@ -2187,53 +2183,53 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case BEDPID_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(PID, PID_BED); + drawMenu(PID, PID_BED); break; case BEDPID_TUNE: if (draw) - Draw_Menu_Item(row, ICON_HotendTemp, F("Autotune")); + drawMenuItem(row, ICON_HotendTemp, F("Autotune")); else { - Popup_Handler(PIDWait); + popupHandler(PIDWait); sprintf_P(cmd, PSTR("M303 E-1 C%i S%i U1"), PID_cycles, PID_bed_temp); gcode.process_subcommands_now(cmd); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } break; case BEDPID_TEMP: if (draw) { - Draw_Menu_Item(row, ICON_Temperature, F("Temperature")); - Draw_Float(PID_bed_temp, row, false, 1); + drawMenuItem(row, ICON_Temperature, F("Temperature")); + drawFloat(PID_bed_temp, row, false, 1); } else - Modify_Value(PID_bed_temp, MIN_BED_TEMP, MAX_BED_TEMP, 1); + modifyValue(PID_bed_temp, MIN_BED_TEMP, MAX_BED_TEMP, 1); break; case BEDPID_KP: if (draw) { - Draw_Menu_Item(row, ICON_Version, F("Kp Value")); - Draw_Float(thermalManager.temp_bed.pid.p(), row, false, 100); + drawMenuItem(row, ICON_Version, F("Kp Value")); + drawFloat(thermalManager.temp_bed.pid.p(), row, false, 100); } else { - Modify_Value(thermalManager.temp_bed.pid.Kp, 0, 5000, 100, thermalManager.updatePID); + modifyValue(thermalManager.temp_bed.pid.Kp, 0, 5000, 100, thermalManager.updatePID); } break; case BEDPID_KI: if (draw) { - Draw_Menu_Item(row, ICON_Version, F("Ki Value")); - Draw_Float(thermalManager.temp_bed.pid.i(), row, false, 100); + drawMenuItem(row, ICON_Version, F("Ki Value")); + drawFloat(thermalManager.temp_bed.pid.i(), row, false, 100); } else - Modify_Value(thermalManager.temp_bed.pid.Ki, 0, 5000, 100, thermalManager.updatePID); + modifyValue(thermalManager.temp_bed.pid.Ki, 0, 5000, 100, thermalManager.updatePID); break; case BEDPID_KD: if (draw) { - Draw_Menu_Item(row, ICON_Version, F("Kd Value")); - Draw_Float(thermalManager.temp_bed.pid.d(), row, false, 100); + drawMenuItem(row, ICON_Version, F("Kd Value")); + drawFloat(thermalManager.temp_bed.pid.d(), row, false, 100); } else - Modify_Value(thermalManager.temp_bed.pid.Kd, 0, 5000, 100, thermalManager.updatePID); + modifyValue(thermalManager.temp_bed.pid.Kd, 0, 5000, 100, thermalManager.updatePID); break; } break; @@ -2258,50 +2254,50 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case MOTION_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Control, CONTROL_MOTION); + drawMenu(Control, CONTROL_MOTION); break; case MOTION_HOMEOFFSETS: if (draw) - Draw_Menu_Item(row, ICON_SetHome, F("Home Offsets"), nullptr, true); + drawMenuItem(row, ICON_SetHome, F("Home Offsets"), nullptr, true); else - Draw_Menu(HomeOffsets); + drawMenu(HomeOffsets); break; case MOTION_SPEED: if (draw) - Draw_Menu_Item(row, ICON_MaxSpeed, F("Max Speed"), nullptr, true); + drawMenuItem(row, ICON_MaxSpeed, F("Max Speed"), nullptr, true); else - Draw_Menu(MaxSpeed); + drawMenu(MaxSpeed); break; case MOTION_ACCEL: if (draw) - Draw_Menu_Item(row, ICON_MaxAccelerated, F("Max Acceleration"), nullptr, true); + drawMenuItem(row, ICON_MaxAccelerated, F("Max Acceleration"), nullptr, true); else - Draw_Menu(MaxAcceleration); + drawMenu(MaxAcceleration); break; #if HAS_CLASSIC_JERK case MOTION_JERK: if (draw) - Draw_Menu_Item(row, ICON_MaxJerk, F("Max Jerk"), nullptr, true); + drawMenuItem(row, ICON_MaxJerk, F("Max Jerk"), nullptr, true); else - Draw_Menu(MaxJerk); + drawMenu(MaxJerk); break; #endif case MOTION_STEPS: if (draw) - Draw_Menu_Item(row, ICON_Step, F("Steps/mm"), nullptr, true); + drawMenuItem(row, ICON_Step, F("Steps/mm"), nullptr, true); else - Draw_Menu(Steps); + drawMenu(Steps); break; #if HAS_HOTEND case MOTION_FLOW: if (draw) { - Draw_Menu_Item(row, ICON_Speed, F("Flow Rate")); - Draw_Float(planner.flow_percentage[0], row, false, 1); + drawMenuItem(row, ICON_Speed, F("Flow Rate")); + drawFloat(planner.flow_percentage[0], row, false, 1); } else - Modify_Value(planner.flow_percentage[0], MIN_FLOW_RATE, MAX_FLOW_RATE, 1, []{ planner.refresh_e_factor(0); }); + modifyValue(planner.flow_percentage[0], MIN_FLOW_RATE, MAX_FLOW_RATE, 1, []{ planner.refresh_e_factor(0); }); break; #endif } @@ -2317,25 +2313,25 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case HOMEOFFSETS_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Motion, MOTION_HOMEOFFSETS); + drawMenu(Motion, MOTION_HOMEOFFSETS); break; case HOMEOFFSETS_XOFFSET: if (draw) { - Draw_Menu_Item(row, ICON_StepX, F("X Offset")); - Draw_Float(home_offset.x, row, false, 100); + drawMenuItem(row, ICON_StepX, F("X Offset")); + drawFloat(home_offset.x, row, false, 100); } else - Modify_Value(home_offset.x, -MAX_XY_OFFSET, MAX_XY_OFFSET, 100); + modifyValue(home_offset.x, -MAX_XY_OFFSET, MAX_XY_OFFSET, 100); break; case HOMEOFFSETS_YOFFSET: if (draw) { - Draw_Menu_Item(row, ICON_StepY, F("Y Offset")); - Draw_Float(home_offset.y, row, false, 100); + drawMenuItem(row, ICON_StepY, F("Y Offset")); + drawFloat(home_offset.y, row, false, 100); } else - Modify_Value(home_offset.y, -MAX_XY_OFFSET, MAX_XY_OFFSET, 100); + modifyValue(home_offset.y, -MAX_XY_OFFSET, MAX_XY_OFFSET, 100); break; } break; @@ -2351,49 +2347,51 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case SPEED_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Motion, MOTION_SPEED); - break; - case SPEED_X: - if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeedX, F("X Axis")); - Draw_Float(planner.settings.max_feedrate_mm_s[X_AXIS], row, false, 1); - } - else - Modify_Value(planner.settings.max_feedrate_mm_s[X_AXIS], 0, default_max_feedrate[X_AXIS] * 2, 1); + drawMenu(Motion, MOTION_SPEED); break; + #if HAS_X_AXIS + case SPEED_X: + if (draw) { + drawMenuItem(row, ICON_MaxSpeedX, F("X Axis")); + drawFloat(planner.settings.max_feedrate_mm_s[X_AXIS], row, false, FEEDRATE_UNIT); + } + else + modifyValue(planner.settings.max_feedrate_mm_s[X_AXIS], min_feedrate_edit_values.x, max_feedrate_edit_values.x, FEEDRATE_UNIT); + break; + #endif #if HAS_Y_AXIS case SPEED_Y: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeedY, F("Y Axis")); - Draw_Float(planner.settings.max_feedrate_mm_s[Y_AXIS], row, false, 1); + drawMenuItem(row, ICON_MaxSpeedY, F("Y Axis")); + drawFloat(planner.settings.max_feedrate_mm_s[Y_AXIS], row, false, FEEDRATE_UNIT); } else - Modify_Value(planner.settings.max_feedrate_mm_s[Y_AXIS], 0, default_max_feedrate[Y_AXIS] * 2, 1); + modifyValue(planner.settings.max_feedrate_mm_s[Y_AXIS], min_feedrate_edit_values.y, max_feedrate_edit_values.y, FEEDRATE_UNIT); break; #endif #if HAS_Z_AXIS case SPEED_Z: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeedZ, F("Z Axis")); - Draw_Float(planner.settings.max_feedrate_mm_s[Z_AXIS], row, false, 1); + drawMenuItem(row, ICON_MaxSpeedZ, F("Z Axis")); + drawFloat(planner.settings.max_feedrate_mm_s[Z_AXIS], row, false, FEEDRATE_UNIT); } else - Modify_Value(planner.settings.max_feedrate_mm_s[Z_AXIS], 0, default_max_feedrate[Z_AXIS] * 2, 1); + modifyValue(planner.settings.max_feedrate_mm_s[Z_AXIS], min_feedrate_edit_values.z, max_feedrate_edit_values.z, FEEDRATE_UNIT); break; #endif #if HAS_HOTEND case SPEED_E: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeedE, F("Extruder")); - Draw_Float(planner.settings.max_feedrate_mm_s[E_AXIS], row, false, 1); + drawMenuItem(row, ICON_MaxSpeedE, F("Extruder")); + drawFloat(planner.settings.max_feedrate_mm_s[E_AXIS], row, false, FEEDRATE_UNIT); } else - Modify_Value(planner.settings.max_feedrate_mm_s[E_AXIS], 0, default_max_feedrate[E_AXIS] * 2, 1); + modifyValue(planner.settings.max_feedrate_mm_s[E_AXIS], min_feedrate_edit_values.e, max_feedrate_edit_values.e, FEEDRATE_UNIT); break; #endif } @@ -2411,42 +2409,42 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case ACCEL_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Motion, MOTION_ACCEL); + drawMenu(Motion, MOTION_ACCEL); break; case ACCEL_X: if (draw) { - Draw_Menu_Item(row, ICON_MaxAccX, F("X Axis")); - Draw_Float(planner.settings.max_acceleration_mm_per_s2[X_AXIS], row, false, 1); + drawMenuItem(row, ICON_MaxAccX, F("X Axis")); + drawFloat(planner.settings.max_acceleration_mm_per_s2[X_AXIS], row, false, ACCELERATION_UNIT); } else - Modify_Value(planner.settings.max_acceleration_mm_per_s2[X_AXIS], 0, default_max_acceleration[X_AXIS] * 2, 1); + modifyValue(planner.settings.max_acceleration_mm_per_s2[X_AXIS], min_acceleration_edit_values.x, max_acceleration_edit_values.x, ACCELERATION_UNIT); break; case ACCEL_Y: if (draw) { - Draw_Menu_Item(row, ICON_MaxAccY, F("Y Axis")); - Draw_Float(planner.settings.max_acceleration_mm_per_s2[Y_AXIS], row, false, 1); + drawMenuItem(row, ICON_MaxAccY, F("Y Axis")); + drawFloat(planner.settings.max_acceleration_mm_per_s2[Y_AXIS], row, false, ACCELERATION_UNIT); } else - Modify_Value(planner.settings.max_acceleration_mm_per_s2[Y_AXIS], 0, default_max_acceleration[Y_AXIS] * 2, 1); + modifyValue(planner.settings.max_acceleration_mm_per_s2[Y_AXIS], min_acceleration_edit_values.y, max_acceleration_edit_values.y, ACCELERATION_UNIT); break; case ACCEL_Z: if (draw) { - Draw_Menu_Item(row, ICON_MaxAccZ, F("Z Axis")); - Draw_Float(planner.settings.max_acceleration_mm_per_s2[Z_AXIS], row, false, 1); + drawMenuItem(row, ICON_MaxAccZ, F("Z Axis")); + drawFloat(planner.settings.max_acceleration_mm_per_s2[Z_AXIS], row, false, ACCELERATION_UNIT); } else - Modify_Value(planner.settings.max_acceleration_mm_per_s2[Z_AXIS], 0, default_max_acceleration[Z_AXIS] * 2, 1); + modifyValue(planner.settings.max_acceleration_mm_per_s2[Z_AXIS], min_acceleration_edit_values.z, max_acceleration_edit_values.z, ACCELERATION_UNIT); break; #if HAS_HOTEND case ACCEL_E: if (draw) { - Draw_Menu_Item(row, ICON_MaxAccE, F("Extruder")); - Draw_Float(planner.settings.max_acceleration_mm_per_s2[E_AXIS], row, false, 1); + drawMenuItem(row, ICON_MaxAccE, F("Extruder")); + drawFloat(planner.settings.max_acceleration_mm_per_s2[E_AXIS], row, false, ACCELERATION_UNIT); } else - Modify_Value(planner.settings.max_acceleration_mm_per_s2[E_AXIS], 0, default_max_acceleration[E_AXIS] * 2, 1); + modifyValue(planner.settings.max_acceleration_mm_per_s2[E_AXIS], min_acceleration_edit_values.e, max_acceleration_edit_values.e, ACCELERATION_UNIT); break; #endif } @@ -2464,42 +2462,48 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case JERK_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Motion, MOTION_JERK); - break; - case JERK_X: - if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeedJerkX, F("X Axis")); - Draw_Float(planner.max_jerk.x, row, false, 10); - } - else - Modify_Value(planner.max_jerk.x, 0, default_max_jerk[X_AXIS] * 2, 10); - break; - case JERK_Y: - if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeedJerkY, F("Y Axis")); - Draw_Float(planner.max_jerk.y, row, false, 10); - } - else - Modify_Value(planner.max_jerk.y, 0, default_max_jerk[Y_AXIS] * 2, 10); - break; - case JERK_Z: - if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeedJerkZ, F("Z Axis")); - Draw_Float(planner.max_jerk.z, row, false, 10); - } - else - Modify_Value(planner.max_jerk.z, 0, default_max_jerk[Z_AXIS] * 2, 10); + drawMenu(Motion, MOTION_JERK); break; + #if HAS_X_AXIS + case JERK_X: + if (draw) { + drawMenuItem(row, ICON_MaxSpeedJerkX, F("X Axis")); + drawFloat(planner.max_jerk.x, row, false, JERK_UNIT); + } + else + modifyValue(planner.max_jerk.x, min_jerk_edit_values.x, max_jerk_edit_values.x, JERK_UNIT); + break; + #endif + #if HAS_Y_AXIS + case JERK_Y: + if (draw) { + drawMenuItem(row, ICON_MaxSpeedJerkY, F("Y Axis")); + drawFloat(planner.max_jerk.y, row, false, JERK_UNIT); + } + else + modifyValue(planner.max_jerk.y, min_jerk_edit_values.y, max_jerk_edit_values.y, JERK_UNIT); + break; + #endif + #if HAS_Z_AXIS + case JERK_Z: + if (draw) { + drawMenuItem(row, ICON_MaxSpeedJerkZ, F("Z Axis")); + drawFloat(planner.max_jerk.z, row, false, JERK_UNIT); + } + else + modifyValue(planner.max_jerk.z, min_jerk_edit_values.z, max_jerk_edit_values.z, JERK_UNIT); + break; + #endif #if HAS_HOTEND case JERK_E: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeedJerkE, F("Extruder")); - Draw_Float(planner.max_jerk.e, row, false, 10); + drawMenuItem(row, ICON_MaxSpeedJerkE, F("Extruder")); + drawFloat(planner.max_jerk.e, row, false, JERK_UNIT); } else - Modify_Value(planner.max_jerk.e, 0, default_max_jerk[E_AXIS] * 2, 10); + modifyValue(planner.max_jerk.e, min_jerk_edit_values.e, max_jerk_edit_values.e, JERK_UNIT); break; #endif } @@ -2517,42 +2521,48 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case STEPS_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Motion, MOTION_STEPS); - break; - case STEPS_X: - if (draw) { - Draw_Menu_Item(row, ICON_StepX, F("X Axis")); - Draw_Float(planner.settings.axis_steps_per_mm[X_AXIS], row, false, 10); - } - else - Modify_Value(planner.settings.axis_steps_per_mm[X_AXIS], 0, default_steps[X_AXIS] * 2, 10); - break; - case STEPS_Y: - if (draw) { - Draw_Menu_Item(row, ICON_StepY, F("Y Axis")); - Draw_Float(planner.settings.axis_steps_per_mm[Y_AXIS], row, false, 10); - } - else - Modify_Value(planner.settings.axis_steps_per_mm[Y_AXIS], 0, default_steps[Y_AXIS] * 2, 10); - break; - case STEPS_Z: - if (draw) { - Draw_Menu_Item(row, ICON_StepZ, F("Z Axis")); - Draw_Float(planner.settings.axis_steps_per_mm[Z_AXIS], row, false, 10); - } - else - Modify_Value(planner.settings.axis_steps_per_mm[Z_AXIS], 0, default_steps[Z_AXIS] * 2, 10); + drawMenu(Motion, MOTION_STEPS); break; + #if HAS_X_AXIS + case STEPS_X: + if (draw) { + drawMenuItem(row, ICON_StepX, F("X Axis")); + drawFloat(planner.settings.axis_steps_per_mm[X_AXIS], row, false, STEPS_UNIT); + } + else + modifyValue(planner.settings.axis_steps_per_mm[X_AXIS], min_steps_edit_values.x, max_steps_edit_values.x, STEPS_UNIT); + break; + #endif + #if HAS_Y_AXIS + case STEPS_Y: + if (draw) { + drawMenuItem(row, ICON_StepY, F("Y Axis")); + drawFloat(planner.settings.axis_steps_per_mm[Y_AXIS], row, false, STEPS_UNIT); + } + else + modifyValue(planner.settings.axis_steps_per_mm[Y_AXIS], min_steps_edit_values.y, max_steps_edit_values.y, STEPS_UNIT); + break; + #endif + #if HAS_Z_AXIS + case STEPS_Z: + if (draw) { + drawMenuItem(row, ICON_StepZ, F("Z Axis")); + drawFloat(planner.settings.axis_steps_per_mm[Z_AXIS], row, false, STEPS_UNIT); + } + else + modifyValue(planner.settings.axis_steps_per_mm[Z_AXIS], min_steps_edit_values.z, max_steps_edit_values.z, STEPS_UNIT); + break; + #endif #if HAS_HOTEND case STEPS_E: if (draw) { - Draw_Menu_Item(row, ICON_StepE, F("Extruder")); - Draw_Float(planner.settings.axis_steps_per_mm[E_AXIS], row, false, 10); + drawMenuItem(row, ICON_StepE, F("Extruder")); + drawFloat(planner.settings.axis_steps_per_mm[E_AXIS], row, false, STEPS_UNIT); } else - Modify_Value(planner.settings.axis_steps_per_mm[E_AXIS], 0, 1000, 10); + modifyValue(planner.settings.axis_steps_per_mm[E_AXIS], min_steps_edit_values.e, max_steps_edit_values.e, STEPS_UNIT); break; #endif } @@ -2570,39 +2580,39 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case VISUAL_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Control, CONTROL_VISUAL); + drawMenu(Control, CONTROL_VISUAL); break; case VISUAL_BACKLIGHT: if (draw) - Draw_Menu_Item(row, ICON_Brightness, F("Display Off")); + drawMenuItem(row, ICON_Brightness, F("Display Off")); else ui.set_brightness(0); break; case VISUAL_BRIGHTNESS: if (draw) { - Draw_Menu_Item(row, ICON_Brightness, F("LCD Brightness")); - Draw_Float(ui.brightness, row, false, 1); + drawMenuItem(row, ICON_Brightness, F("LCD Brightness")); + drawFloat(ui.brightness, row, false, 1); } else - Modify_Value(ui.brightness, LCD_BRIGHTNESS_MIN, LCD_BRIGHTNESS_MAX, 1, ui.refresh_brightness); + modifyValue(ui.brightness, LCD_BRIGHTNESS_MIN, LCD_BRIGHTNESS_MAX, 1, ui.refresh_brightness); break; case VISUAL_TIME_FORMAT: if (draw) { - Draw_Menu_Item(row, ICON_PrintTime, F("Progress as __h__m")); - Draw_Checkbox(row, eeprom_settings.time_format_textual); + drawMenuItem(row, ICON_PrintTime, F("Progress as __h__m")); + drawCheckbox(row, eeprom_settings.time_format_textual); } else { eeprom_settings.time_format_textual = !eeprom_settings.time_format_textual; - Draw_Checkbox(row, eeprom_settings.time_format_textual); + drawCheckbox(row, eeprom_settings.time_format_textual); } break; case VISUAL_COLOR_THEMES: if (draw) - Draw_Menu_Item(row, ICON_MaxSpeed, F("UI Color Settings"), nullptr, true); + drawMenuItem(row, ICON_MaxSpeed, F("UI Color Settings"), nullptr, true); else - Draw_Menu(ColorSettings); + drawMenu(ColorSettings); break; } break; @@ -2626,97 +2636,97 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case COLORSETTINGS_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Visual, VISUAL_COLOR_THEMES); + drawMenu(Visual, VISUAL_COLOR_THEMES); break; case COLORSETTINGS_CURSOR: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Cursor")); - Draw_Option(eeprom_settings.cursor_color, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Cursor")); + drawOption(eeprom_settings.cursor_color, color_names, row, false, true); } else - Modify_Option(eeprom_settings.cursor_color, color_names, Custom_Colors); + modifyOption(eeprom_settings.cursor_color, color_names, Custom_Colors); break; case COLORSETTINGS_SPLIT_LINE: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Menu Split Line")); - Draw_Option(eeprom_settings.menu_split_line, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Menu Split Line")); + drawOption(eeprom_settings.menu_split_line, color_names, row, false, true); } else - Modify_Option(eeprom_settings.menu_split_line, color_names, Custom_Colors); + modifyOption(eeprom_settings.menu_split_line, color_names, Custom_Colors); break; case COLORSETTINGS_MENU_TOP_TXT: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Menu Header Text")); - Draw_Option(eeprom_settings.menu_top_txt, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Menu Header Text")); + drawOption(eeprom_settings.menu_top_txt, color_names, row, false, true); } else - Modify_Option(eeprom_settings.menu_top_txt, color_names, Custom_Colors); + modifyOption(eeprom_settings.menu_top_txt, color_names, Custom_Colors); break; case COLORSETTINGS_MENU_TOP_BG: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Menu Header Bg")); - Draw_Option(eeprom_settings.menu_top_bg, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Menu Header Bg")); + drawOption(eeprom_settings.menu_top_bg, color_names, row, false, true); } else - Modify_Option(eeprom_settings.menu_top_bg, color_names, Custom_Colors); + modifyOption(eeprom_settings.menu_top_bg, color_names, Custom_Colors); break; case COLORSETTINGS_HIGHLIGHT_BORDER: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Highlight Box")); - Draw_Option(eeprom_settings.highlight_box, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Highlight Box")); + drawOption(eeprom_settings.highlight_box, color_names, row, false, true); } else - Modify_Option(eeprom_settings.highlight_box, color_names, Custom_Colors); + modifyOption(eeprom_settings.highlight_box, color_names, Custom_Colors); break; case COLORSETTINGS_PROGRESS_PERCENT: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Progress Percent")); - Draw_Option(eeprom_settings.progress_percent, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Progress Percent")); + drawOption(eeprom_settings.progress_percent, color_names, row, false, true); } else - Modify_Option(eeprom_settings.progress_percent, color_names, Custom_Colors); + modifyOption(eeprom_settings.progress_percent, color_names, Custom_Colors); break; case COLORSETTINGS_PROGRESS_TIME: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Progress Time")); - Draw_Option(eeprom_settings.progress_time, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Progress Time")); + drawOption(eeprom_settings.progress_time, color_names, row, false, true); } else - Modify_Option(eeprom_settings.progress_time, color_names, Custom_Colors); + modifyOption(eeprom_settings.progress_time, color_names, Custom_Colors); break; case COLORSETTINGS_PROGRESS_STATUS_BAR: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Status Bar Text")); - Draw_Option(eeprom_settings.status_bar_text, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Status Bar Text")); + drawOption(eeprom_settings.status_bar_text, color_names, row, false, true); } else - Modify_Option(eeprom_settings.status_bar_text, color_names, Custom_Colors); + modifyOption(eeprom_settings.status_bar_text, color_names, Custom_Colors); break; case COLORSETTINGS_PROGRESS_STATUS_AREA: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Status Area Text")); - Draw_Option(eeprom_settings.status_area_text, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Status Area Text")); + drawOption(eeprom_settings.status_area_text, color_names, row, false, true); } else - Modify_Option(eeprom_settings.status_area_text, color_names, Custom_Colors); + modifyOption(eeprom_settings.status_area_text, color_names, Custom_Colors); break; case COLORSETTINGS_PROGRESS_COORDINATES: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Coordinates Text")); - Draw_Option(eeprom_settings.coordinates_text, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Coordinates Text")); + drawOption(eeprom_settings.coordinates_text, color_names, row, false, true); } else - Modify_Option(eeprom_settings.coordinates_text, color_names, Custom_Colors); + modifyOption(eeprom_settings.coordinates_text, color_names, Custom_Colors); break; case COLORSETTINGS_PROGRESS_COORDINATES_LINE: if (draw) { - Draw_Menu_Item(row, ICON_MaxSpeed, F("Coordinates Line")); - Draw_Option(eeprom_settings.coordinates_split_line, color_names, row, false, true); + drawMenuItem(row, ICON_MaxSpeed, F("Coordinates Line")); + drawOption(eeprom_settings.coordinates_split_line, color_names, row, false, true); } else - Modify_Option(eeprom_settings.coordinates_split_line, color_names, Custom_Colors); + modifyOption(eeprom_settings.coordinates_split_line, color_names, Custom_Colors); break; } // switch (item) break; @@ -2740,20 +2750,20 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case ADVANCED_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Control, CONTROL_ADVANCED); + drawMenu(Control, CONTROL_ADVANCED); break; #if ENABLED(SOUND_MENU_ITEM) case ADVANCED_BEEPER: if (draw) { - Draw_Menu_Item(row, ICON_Version, F("LCD Beeper")); - Draw_Checkbox(row, ui.sound_on); + drawMenuItem(row, ICON_Version, F("LCD Beeper")); + drawCheckbox(row, ui.sound_on); } else { ui.sound_on = !ui.sound_on; - Draw_Checkbox(row, ui.sound_on); + drawCheckbox(row, ui.sound_on); } break; #endif @@ -2761,68 +2771,68 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if HAS_BED_PROBE case ADVANCED_PROBE: if (draw) - Draw_Menu_Item(row, ICON_StepX, F("Probe"), nullptr, true); + drawMenuItem(row, ICON_StepX, F("Probe"), nullptr, true); else - Draw_Menu(ProbeMenu); + drawMenu(ProbeMenu); break; #endif #if HAS_TRINAMIC_CONFIG case ADVANCED_TMC: if (draw) - Draw_Menu_Item(row, ICON_Motion, F("TMC Drivers"), nullptr, true); + drawMenuItem(row, ICON_Motion, F("TMC Drivers"), nullptr, true); else - Draw_Menu(TMCMenu); + drawMenu(TMCMenu); break; #endif case ADVANCED_CORNER: if (draw) { - Draw_Menu_Item(row, ICON_MaxAccelerated, F("Bed Screw Inset")); - Draw_Float(corner_pos, row, false, 10); + drawMenuItem(row, ICON_MaxAccelerated, F("Bed Screw Inset")); + drawFloat(corner_pos, row, false, 10); } else - Modify_Value(corner_pos, 1, 100, 10); + modifyValue(corner_pos, 1, 100, 10); break; #if ENABLED(LIN_ADVANCE) case ADVANCED_LA: if (draw) { - Draw_Menu_Item(row, ICON_MaxAccelerated, F("Lin Advance K")); - Draw_Float(planner.extruder_advance_K[0], row, false, 100); + drawMenuItem(row, ICON_MaxAccelerated, F("Lin Advance K")); + drawFloat(planner.extruder_advance_K[0], row, false, 100); } else - Modify_Value(planner.extruder_advance_K[0], 0, 10, 100); + modifyValue(planner.extruder_advance_K[0], 0, 10, 100); break; #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) case ADVANCED_LOAD: if (draw) { - Draw_Menu_Item(row, ICON_WriteEEPROM, F("Load Length")); - Draw_Float(fc_settings[0].load_length, row, false, 1); + drawMenuItem(row, ICON_WriteEEPROM, F("Load Length")); + drawFloat(fc_settings[0].load_length, row, false, 1); } else - Modify_Value(fc_settings[0].load_length, 0, EXTRUDE_MAXLENGTH, 1); + modifyValue(fc_settings[0].load_length, 0, EXTRUDE_MAXLENGTH, 1); break; case ADVANCED_UNLOAD: if (draw) { - Draw_Menu_Item(row, ICON_ReadEEPROM, F("Unload Length")); - Draw_Float(fc_settings[0].unload_length, row, false, 1); + drawMenuItem(row, ICON_ReadEEPROM, F("Unload Length")); + drawFloat(fc_settings[0].unload_length, row, false, 1); } else - Modify_Value(fc_settings[0].unload_length, 0, EXTRUDE_MAXLENGTH, 1); + modifyValue(fc_settings[0].unload_length, 0, EXTRUDE_MAXLENGTH, 1); break; #endif // ADVANCED_PAUSE_FEATURE #if ENABLED(PREVENT_COLD_EXTRUSION) case ADVANCED_COLD_EXTRUDE: if (draw) { - Draw_Menu_Item(row, ICON_Cool, F("Min Extrusion T")); - Draw_Float(thermalManager.extrude_min_temp, row, false, 1); + drawMenuItem(row, ICON_Cool, F("Min Extrusion T")); + drawFloat(thermalManager.extrude_min_temp, row, false, 1); } else { - Modify_Value(thermalManager.extrude_min_temp, 0, MAX_E_TEMP, 1); + modifyValue(thermalManager.extrude_min_temp, 0, MAX_E_TEMP, 1); thermalManager.allow_cold_extrude = (thermalManager.extrude_min_temp == 0); } break; @@ -2831,23 +2841,23 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if ENABLED(FILAMENT_RUNOUT_SENSOR) case ADVANCED_FILSENSORENABLED: if (draw) { - Draw_Menu_Item(row, ICON_Extruder, F("Filament Sensor")); - Draw_Checkbox(row, runout.enabled); + drawMenuItem(row, ICON_Extruder, F("Filament Sensor")); + drawCheckbox(row, runout.enabled); } else { runout.enabled = !runout.enabled; - Draw_Checkbox(row, runout.enabled); + drawCheckbox(row, runout.enabled); } break; #if ENABLED(HAS_FILAMENT_RUNOUT_DISTANCE) case ADVANCED_FILSENSORDISTANCE: if (draw) { - Draw_Menu_Item(row, ICON_MaxAccE, F("Runout Distance")); - Draw_Float(runout.runout_distance(), row, false, 10); + drawMenuItem(row, ICON_MaxAccE, F("Runout Distance")); + drawFloat(runout.runout_distance(), row, false, 10); } else - Modify_Value(runout.runout_distance(), 0, 999, 10); + modifyValue(runout.runout_distance(), 0, 999, 10); break; #endif #endif // FILAMENT_RUNOUT_SENSOR @@ -2855,12 +2865,12 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if ENABLED(POWER_LOSS_RECOVERY) case ADVANCED_POWER_LOSS: if (draw) { - Draw_Menu_Item(row, ICON_Motion, F("Power-loss recovery")); - Draw_Checkbox(row, recovery.enabled); + drawMenuItem(row, ICON_Motion, F("Power-loss recovery")); + drawCheckbox(row, recovery.enabled); } else { recovery.enable(!recovery.enabled); - Draw_Checkbox(row, recovery.enabled); + drawCheckbox(row, recovery.enabled); } break; #endif @@ -2882,30 +2892,30 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case PROBE_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Advanced, ADVANCED_PROBE); + drawMenu(Advanced, ADVANCED_PROBE); break; case PROBE_XOFFSET: if (draw) { - Draw_Menu_Item(row, ICON_StepX, F("Probe X Offset")); - Draw_Float(probe.offset.x, row, false, 10); + drawMenuItem(row, ICON_StepX, F("Probe X Offset")); + drawFloat(probe.offset.x, row, false, 10); } else - Modify_Value(probe.offset.x, -MAX_XY_OFFSET, MAX_XY_OFFSET, 10); + modifyValue(probe.offset.x, -MAX_XY_OFFSET, MAX_XY_OFFSET, 10); break; case PROBE_YOFFSET: if (draw) { - Draw_Menu_Item(row, ICON_StepY, F("Probe Y Offset")); - Draw_Float(probe.offset.y, row, false, 10); + drawMenuItem(row, ICON_StepY, F("Probe Y Offset")); + drawFloat(probe.offset.y, row, false, 10); } else - Modify_Value(probe.offset.y, -MAX_XY_OFFSET, MAX_XY_OFFSET, 10); + modifyValue(probe.offset.y, -MAX_XY_OFFSET, MAX_XY_OFFSET, 10); break; case PROBE_TEST: if (draw) - Draw_Menu_Item(row, ICON_StepY, F("M48 Probe Test")); + drawMenuItem(row, ICON_StepY, F("M48 Probe Test")); else { sprintf_P(cmd, PSTR("G28O\nM48 X%s Y%s P%i"), dtostrf((X_BED_SIZE + X_MIN_POS) / 2.0f, 1, 3, str_1), dtostrf((Y_BED_SIZE + Y_MIN_POS) / 2.0f, 1, 3, str_2), testcount); gcode.process_subcommands_now(cmd); @@ -2913,11 +2923,11 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item break; case PROBE_TEST_COUNT: if (draw) { - Draw_Menu_Item(row, ICON_StepY, F("Probe Test Count")); - Draw_Float(testcount, row, false, 1); + drawMenuItem(row, ICON_StepY, F("Probe Test Count")); + drawFloat(testcount, row, false, 1); } else - Modify_Value(testcount, 4, 50, 1); + modifyValue(testcount, 4, 50, 1); break; } break; @@ -2937,9 +2947,9 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item case TMC_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Advanced, ADVANCED_TMC); + drawMenu(Advanced, ADVANCED_TMC); break; #if AXIS_IS_TMC(X) @@ -2948,12 +2958,12 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item static float stepper_current_x; if (draw) { - Draw_Menu_Item(row, ICON_StepX, F("Stepper X current")); + drawMenuItem(row, ICON_StepX, F("Stepper X current")); stepper_current_x = stepperX.getMilliamps(); - Draw_Float(stepper_current_x, row, false, 1); + drawFloat(stepper_current_x, row, false, 1); } else { - Modify_Value(stepper_current_x, TMC_MIN_CURRENT, TMC_MAX_CURRENT, 1, []{ stepperX.rms_current(stepper_current_x); }); + modifyValue(stepper_current_x, TMC_MIN_CURRENT, TMC_MAX_CURRENT, 1, []{ stepperX.rms_current(stepper_current_x); }); } break; #endif @@ -2964,12 +2974,12 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item static float stepper_current_y; if (draw) { - Draw_Menu_Item(row, ICON_StepY, F("Stepper Y current")); + drawMenuItem(row, ICON_StepY, F("Stepper Y current")); stepper_current_y = stepperY.getMilliamps(); - Draw_Float(stepper_current_y, row, false, 1); + drawFloat(stepper_current_y, row, false, 1); } else { - Modify_Value(stepper_current_y, TMC_MIN_CURRENT, TMC_MAX_CURRENT, 1, []{ stepperY.rms_current(stepper_current_y); }); + modifyValue(stepper_current_y, TMC_MIN_CURRENT, TMC_MAX_CURRENT, 1, []{ stepperY.rms_current(stepper_current_y); }); } break; #endif @@ -2980,12 +2990,12 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item static float stepper_current_z; if (draw) { - Draw_Menu_Item(row, ICON_StepZ, F("Stepper Z current")); + drawMenuItem(row, ICON_StepZ, F("Stepper Z current")); stepper_current_z = stepperZ.getMilliamps(); - Draw_Float(stepper_current_z, row, false, 1); + drawFloat(stepper_current_z, row, false, 1); } else { - Modify_Value(stepper_current_z, TMC_MIN_CURRENT, TMC_MAX_CURRENT, 1, []{ stepperZ.rms_current(stepper_current_z); }); + modifyValue(stepper_current_z, TMC_MIN_CURRENT, TMC_MAX_CURRENT, 1, []{ stepperZ.rms_current(stepper_current_z); }); } break; #endif @@ -2996,12 +3006,12 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item static float stepper_current_e; if (draw) { - Draw_Menu_Item(row, ICON_StepE, F("Stepper E current")); + drawMenuItem(row, ICON_StepE, F("Stepper E current")); stepper_current_e = stepperE0.getMilliamps(); - Draw_Float(stepper_current_e, row, false, 1); + drawFloat(stepper_current_e, row, false, 1); } else { - Modify_Value(stepper_current_e, TMC_MIN_CURRENT, TMC_MAX_CURRENT, 1, []{ stepperE0.rms_current(stepper_current_e); }); + modifyValue(stepper_current_e, TMC_MIN_CURRENT, TMC_MAX_CURRENT, 1, []{ stepperE0.rms_current(stepper_current_e); }); } break; #endif @@ -3023,7 +3033,7 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case INFO_BACK: if (draw) { - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); #if ENABLED(PRINTCOUNTER) char row1[50], row2[50], buf[32]; @@ -3031,24 +3041,24 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item sprintf_P(row1, PSTR("%i prints, %i finished"), ps.totalPrints, ps.finishedPrints); sprintf_P(row2, PSTR("%s m filament used"), dtostrf(ps.filamentUsed / 1000, 1, 2, str_1)); - Draw_Menu_Item(INFO_PRINTCOUNT, ICON_HotendTemp, row1, row2, false, true); + drawMenuItem(INFO_PRINTCOUNT, ICON_HotendTemp, row1, row2, false, true); duration_t(print_job_timer.getStats().printTime).toString(buf); sprintf_P(row1, PSTR("Printed: %s"), buf); duration_t(print_job_timer.getStats().longestPrint).toString(buf); sprintf_P(row2, PSTR("Longest: %s"), buf); - Draw_Menu_Item(INFO_PRINTTIME, ICON_PrintTime, row1, row2, false, true); + drawMenuItem(INFO_PRINTTIME, ICON_PrintTime, row1, row2, false, true); #endif - Draw_Menu_Item(INFO_SIZE, ICON_PrintSize, F(MACHINE_SIZE), nullptr, false, true); - Draw_Menu_Item(INFO_VERSION, ICON_Version, F(SHORT_BUILD_VERSION), nullptr, false, true); - Draw_Menu_Item(INFO_CONTACT, ICON_Contact, F(CORP_WEBSITE), nullptr, false, true); + drawMenuItem(INFO_SIZE, ICON_PrintSize, F(MACHINE_SIZE), nullptr, false, true); + drawMenuItem(INFO_VERSION, ICON_Version, F(SHORT_BUILD_VERSION), nullptr, false, true); + drawMenuItem(INFO_CONTACT, ICON_Contact, F(CORP_WEBSITE), nullptr, false, true); } else { if (menu == Info) - Draw_Menu(Control, CONTROL_INFO); + drawMenu(Control, CONTROL_INFO); else - Draw_Main_Menu(3); + drawMainMenu(3); } break; } @@ -3059,7 +3069,7 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #define LEVELING_BACK 0 #define LEVELING_ACTIVE (LEVELING_BACK + 1) - #define LEVELING_GET_TILT (LEVELING_ACTIVE + BOTH(HAS_BED_PROBE, AUTO_BED_LEVELING_UBL)) + #define LEVELING_GET_TILT (LEVELING_ACTIVE + ALL(HAS_BED_PROBE, AUTO_BED_LEVELING_UBL)) #define LEVELING_GET_MESH (LEVELING_GET_TILT + 1) #define LEVELING_MANUAL (LEVELING_GET_MESH + 1) #define LEVELING_VIEW (LEVELING_MANUAL + 1) @@ -3072,40 +3082,40 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case LEVELING_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Main_Menu(3); + drawMainMenu(3); break; case LEVELING_ACTIVE: if (draw) { - Draw_Menu_Item(row, ICON_StockConfiguration, F("Leveling Active")); - Draw_Checkbox(row, planner.leveling_active); + drawMenuItem(row, ICON_StockConfiguration, F("Leveling Active")); + drawCheckbox(row, planner.leveling_active); } else { if (!planner.leveling_active) { set_bed_leveling_enabled(!planner.leveling_active); if (!planner.leveling_active) { - Confirm_Handler(LevelError); + confirmHandler(LevelError); break; } } else set_bed_leveling_enabled(!planner.leveling_active); - Draw_Checkbox(row, planner.leveling_active); + drawCheckbox(row, planner.leveling_active); } break; - #if BOTH(HAS_BED_PROBE, AUTO_BED_LEVELING_UBL) + #if ALL(HAS_BED_PROBE, AUTO_BED_LEVELING_UBL) case LEVELING_GET_TILT: if (draw) - Draw_Menu_Item(row, ICON_Tilt, F("Autotilt Current Mesh")); + drawMenuItem(row, ICON_Tilt, F("Autotilt Current Mesh")); else { if (bedlevel.storage_slot < 0) { - Popup_Handler(MeshSlot); + popupHandler(MeshSlot); break; } - Popup_Handler(Home); + popupHandler(Home); gcode.home_all_axes(true); - Popup_Handler(Level); + popupHandler(Level); if (mesh_conf.tilt_grid > 1) { sprintf_P(cmd, PSTR("G29 J%i"), mesh_conf.tilt_grid); gcode.process_subcommands_now(cmd); @@ -3113,78 +3123,78 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item else gcode.process_subcommands_now(F("G29 J")); planner.synchronize(); - Redraw_Menu(); + redrawMenu(); } break; #endif case LEVELING_GET_MESH: if (draw) - Draw_Menu_Item(row, ICON_Mesh, F("Create New Mesh")); + drawMenuItem(row, ICON_Mesh, F("Create New Mesh")); else { - Popup_Handler(Home); + popupHandler(Home); gcode.home_all_axes(true); #if ENABLED(AUTO_BED_LEVELING_UBL) #if ENABLED(PREHEAT_BEFORE_LEVELING) - Popup_Handler(Heating); + popupHandler(Heating); probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, LEVELING_BED_TEMP); #endif #if HAS_BED_PROBE - Popup_Handler(Level); + popupHandler(Level); gcode.process_subcommands_now(F("G29 P0\nG29 P1")); gcode.process_subcommands_now(F("G29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nG29 P3\nM420 S1")); planner.synchronize(); - Update_Status("Probed all reachable points"); - Popup_Handler(SaveLevel); + updateStatus("Probed all reachable points"); + popupHandler(SaveLevel); #else level_state = planner.leveling_active; set_bed_leveling_enabled(false); mesh_conf.goto_mesh_value = true; mesh_conf.mesh_x = mesh_conf.mesh_y = 0; - Popup_Handler(MoveWait); + popupHandler(MoveWait); mesh_conf.manual_mesh_move(); - Draw_Menu(UBLMesh); + drawMenu(UBLMesh); #endif #elif HAS_BED_PROBE - Popup_Handler(Level); + popupHandler(Level); gcode.process_subcommands_now(F("G29")); planner.synchronize(); - Popup_Handler(SaveLevel); + popupHandler(SaveLevel); #else level_state = planner.leveling_active; set_bed_leveling_enabled(false); gridpoint = 1; - Popup_Handler(MoveWait); + popupHandler(MoveWait); gcode.process_subcommands_now(F("G29")); planner.synchronize(); - Draw_Menu(ManualMesh); + drawMenu(ManualMesh); #endif } break; case LEVELING_MANUAL: if (draw) - Draw_Menu_Item(row, ICON_Mesh, F("Manual Tuning"), nullptr, true); + drawMenuItem(row, ICON_Mesh, F("Manual Tuning"), nullptr, true); else { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) if (!leveling_is_valid()) { - Confirm_Handler(InvalidMesh); + confirmHandler(InvalidMesh); break; } #endif #if ENABLED(AUTO_BED_LEVELING_UBL) if (bedlevel.storage_slot < 0) { - Popup_Handler(MeshSlot); + popupHandler(MeshSlot); break; } #endif if (axes_should_home()) { - Popup_Handler(Home); + popupHandler(Home); gcode.home_all_axes(true); } level_state = planner.leveling_active; set_bed_leveling_enabled(false); mesh_conf.goto_mesh_value = false; #if ENABLED(PREHEAT_BEFORE_LEVELING) - Popup_Handler(Heating); + popupHandler(Heating); #if HAS_HOTEND if (thermalManager.degTargetHotend(0) < LEVELING_NOZZLE_TEMP) thermalManager.setTargetHotend(LEVELING_NOZZLE_TEMP, 0); @@ -3196,63 +3206,63 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item TERN_(HAS_HOTEND, thermalManager.wait_for_hotend(0)); TERN_(HAS_HEATED_BED, thermalManager.wait_for_bed_heating()); #endif - Popup_Handler(MoveWait); + popupHandler(MoveWait); mesh_conf.manual_mesh_move(); - Draw_Menu(LevelManual); + drawMenu(LevelManual); } break; case LEVELING_VIEW: if (draw) - Draw_Menu_Item(row, ICON_Mesh, GET_TEXT_F(MSG_MESH_VIEW), nullptr, true); + drawMenuItem(row, ICON_Mesh, GET_TEXT_F(MSG_MESH_VIEW), nullptr, true); else { #if ENABLED(AUTO_BED_LEVELING_UBL) if (bedlevel.storage_slot < 0) { - Popup_Handler(MeshSlot); + popupHandler(MeshSlot); break; } #endif - Draw_Menu(LevelView); + drawMenu(LevelView); } break; case LEVELING_SETTINGS: if (draw) - Draw_Menu_Item(row, ICON_Step, F("Leveling Settings"), nullptr, true); + drawMenuItem(row, ICON_Step, F("Leveling Settings"), nullptr, true); else - Draw_Menu(LevelSettings); + drawMenu(LevelSettings); break; #if ENABLED(AUTO_BED_LEVELING_UBL) case LEVELING_SLOT: if (draw) { - Draw_Menu_Item(row, ICON_PrintSize, F("Mesh Slot")); - Draw_Float(bedlevel.storage_slot, row, false, 1); + drawMenuItem(row, ICON_PrintSize, F("Mesh Slot")); + drawFloat(bedlevel.storage_slot, row, false, 1); } else - Modify_Value(bedlevel.storage_slot, 0, settings.calc_num_meshes() - 1, 1); + modifyValue(bedlevel.storage_slot, 0, settings.calc_num_meshes() - 1, 1); break; case LEVELING_LOAD: if (draw) - Draw_Menu_Item(row, ICON_ReadEEPROM, F("Load Mesh")); + drawMenuItem(row, ICON_ReadEEPROM, F("Load Mesh")); else { if (bedlevel.storage_slot < 0) { - Popup_Handler(MeshSlot); + popupHandler(MeshSlot); break; } gcode.process_subcommands_now(F("G29 L")); planner.synchronize(); - AudioFeedback(true); + audioFeedback(true); } break; case LEVELING_SAVE: if (draw) - Draw_Menu_Item(row, ICON_WriteEEPROM, F("Save Mesh")); + drawMenuItem(row, ICON_WriteEEPROM, F("Save Mesh")); else { if (bedlevel.storage_slot < 0) { - Popup_Handler(MeshSlot); + popupHandler(MeshSlot); break; } gcode.process_subcommands_now(F("G29 S")); planner.synchronize(); - AudioFeedback(true); + audioFeedback(true); } break; #endif @@ -3270,34 +3280,34 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case LEVELING_VIEW_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Leveling, LEVELING_VIEW); + drawMenu(Leveling, LEVELING_VIEW); break; case LEVELING_VIEW_MESH: if (draw) - Draw_Menu_Item(row, ICON_PrintSize, GET_TEXT_F(MSG_MESH_VIEW), nullptr, true); + drawMenuItem(row, ICON_PrintSize, GET_TEXT_F(MSG_MESH_VIEW), nullptr, true); else - Draw_Menu(MeshViewer); + drawMenu(MeshViewer); break; case LEVELING_VIEW_TEXT: if (draw) { - Draw_Menu_Item(row, ICON_Contact, F("Viewer Show Values")); - Draw_Checkbox(row, mesh_conf.viewer_print_value); + drawMenuItem(row, ICON_Contact, F("Viewer Show Values")); + drawCheckbox(row, mesh_conf.viewer_print_value); } else { mesh_conf.viewer_print_value = !mesh_conf.viewer_print_value; - Draw_Checkbox(row, mesh_conf.viewer_print_value); + drawCheckbox(row, mesh_conf.viewer_print_value); } break; case LEVELING_VIEW_ASYMMETRIC: if (draw) { - Draw_Menu_Item(row, ICON_Axis, F("Viewer Asymmetric")); - Draw_Checkbox(row, mesh_conf.viewer_asymmetric_range); + drawMenuItem(row, ICON_Axis, F("Viewer Asymmetric")); + drawCheckbox(row, mesh_conf.viewer_asymmetric_range); } else { mesh_conf.viewer_asymmetric_range = !mesh_conf.viewer_asymmetric_range; - Draw_Checkbox(row, mesh_conf.viewer_asymmetric_range); + drawCheckbox(row, mesh_conf.viewer_asymmetric_range); } break; } @@ -3316,17 +3326,17 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case LEVELING_SETTINGS_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Menu(Leveling, LEVELING_SETTINGS); + drawMenu(Leveling, LEVELING_SETTINGS); break; case LEVELING_SETTINGS_FADE: if (draw) { - Draw_Menu_Item(row, ICON_Fade, F("Fade Mesh within")); - Draw_Float(planner.z_fade_height, row, false, 1); + drawMenuItem(row, ICON_Fade, F("Fade Mesh within")); + drawFloat(planner.z_fade_height, row, false, 1); } else { - Modify_Value(planner.z_fade_height, 0, Z_MAX_POS, 1); + modifyValue(planner.z_fade_height, 0, Z_MAX_POS, 1); planner.z_fade_height = -1; set_z_fade_height(planner.z_fade_height); } @@ -3335,31 +3345,31 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if ENABLED(AUTO_BED_LEVELING_UBL) case LEVELING_SETTINGS_TILT: if (draw) { - Draw_Menu_Item(row, ICON_Tilt, F("Tilting Grid Size")); - Draw_Float(mesh_conf.tilt_grid, row, false, 1); + drawMenuItem(row, ICON_Tilt, F("Tilting Grid Size")); + drawFloat(mesh_conf.tilt_grid, row, false, 1); } else - Modify_Value(mesh_conf.tilt_grid, 1, 8, 1); + modifyValue(mesh_conf.tilt_grid, 1, 8, 1); break; case LEVELING_SETTINGS_PLANE: if (draw) - Draw_Menu_Item(row, ICON_ResumeEEPROM, F("Convert Mesh to Plane")); + drawMenuItem(row, ICON_ResumeEEPROM, F("Convert Mesh to Plane")); else { if (mesh_conf.create_plane_from_mesh()) break; gcode.process_subcommands_now(F("M420 S1")); planner.synchronize(); - AudioFeedback(true); + audioFeedback(true); } break; case LEVELING_SETTINGS_ZERO: if (draw) - Draw_Menu_Item(row, ICON_Mesh, F("Zero Current Mesh")); + drawMenuItem(row, ICON_Mesh, F("Zero Current Mesh")); else ZERO(bedlevel.z_values); break; case LEVELING_SETTINGS_UNDEF: if (draw) - Draw_Menu_Item(row, ICON_Mesh, F("Clear Current Mesh")); + drawMenuItem(row, ICON_Mesh, F("Clear Current Mesh")); else bedlevel.invalidate(); break; @@ -3373,13 +3383,13 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item if (item == MESHVIEW_BACK) { if (draw) { - Draw_Menu_Item(0, ICON_Back, F("Back")); - mesh_conf.Draw_Bed_Mesh(); - mesh_conf.Set_Mesh_Viewer_Status(); + drawMenuItem(0, ICON_Back, F("Back")); + mesh_conf.drawBedMesh(); + mesh_conf.setMeshViewerStatus(); } else if (!mesh_conf.drawing_mesh) { - Draw_Menu(LevelView, LEVELING_VIEW_MESH); - Update_Status(""); + drawMenu(LevelView, LEVELING_VIEW_MESH); + updateStatus(""); } } break; @@ -3400,32 +3410,32 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case LEVELING_M_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else { set_bed_leveling_enabled(level_state); TERN_(AUTO_BED_LEVELING_BILINEAR, bedlevel.refresh_bed_level()); - Draw_Menu(Leveling, LEVELING_MANUAL); + drawMenu(Leveling, LEVELING_MANUAL); } break; case LEVELING_M_X: if (draw) { - Draw_Menu_Item(row, ICON_MoveX, F("Mesh Point X")); - Draw_Float(mesh_conf.mesh_x, row, 0, 1); + drawMenuItem(row, ICON_MoveX, F("Mesh Point X")); + drawFloat(mesh_conf.mesh_x, row, 0, 1); } else - Modify_Value(mesh_conf.mesh_x, 0, GRID_MAX_POINTS_X - 1, 1); + modifyValue(mesh_conf.mesh_x, 0, GRID_MAX_POINTS_X - 1, 1); break; case LEVELING_M_Y: if (draw) { - Draw_Menu_Item(row, ICON_MoveY, F("Mesh Point Y")); - Draw_Float(mesh_conf.mesh_y, row, 0, 1); + drawMenuItem(row, ICON_MoveY, F("Mesh Point Y")); + drawFloat(mesh_conf.mesh_y, row, 0, 1); } else - Modify_Value(mesh_conf.mesh_y, 0, GRID_MAX_POINTS_Y - 1, 1); + modifyValue(mesh_conf.mesh_y, 0, GRID_MAX_POINTS_Y - 1, 1); break; case LEVELING_M_NEXT: if (draw) - Draw_Menu_Item(row, ICON_More, F("Next Point")); + drawMenuItem(row, ICON_More, F("Next Point")); else { if (mesh_conf.mesh_x != (GRID_MAX_POINTS_X - 1) || mesh_conf.mesh_y != (GRID_MAX_POINTS_Y - 1)) { if ((mesh_conf.mesh_x == (GRID_MAX_POINTS_X - 1) && mesh_conf.mesh_y % 2 == 0) || (mesh_conf.mesh_x == 0 && mesh_conf.mesh_y % 2 == 1)) @@ -3440,58 +3450,58 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item break; case LEVELING_M_OFFSET: if (draw) { - Draw_Menu_Item(row, ICON_SetZOffset, F("Point Z Offset")); - Draw_Float(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row, false, 100); + drawMenuItem(row, ICON_SetZOffset, F("Point Z Offset")); + drawFloat(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row, false, 100); } else { if (isnan(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y])) bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] = 0; - Modify_Value(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], MIN_Z_OFFSET, MAX_Z_OFFSET, 100); + modifyValue(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], MIN_Z_OFFSET, MAX_Z_OFFSET, 100); } break; case LEVELING_M_UP: if (draw) - Draw_Menu_Item(row, ICON_Axis, F("Microstep Up")); + drawMenuItem(row, ICON_Axis, F("Microstep Up")); else if (bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] < MAX_Z_OFFSET) { bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] += 0.01; gcode.process_subcommands_now(F("M290 Z0.01")); planner.synchronize(); current_position.z += 0.01f; sync_plan_position(); - Draw_Float(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row - 1, false, 100); + drawFloat(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row - 1, false, 100); } break; case LEVELING_M_DOWN: if (draw) - Draw_Menu_Item(row, ICON_AxisD, F("Microstep Down")); + drawMenuItem(row, ICON_AxisD, F("Microstep Down")); else if (bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] > MIN_Z_OFFSET) { bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] -= 0.01; gcode.process_subcommands_now(F("M290 Z-0.01")); planner.synchronize(); current_position.z -= 0.01f; sync_plan_position(); - Draw_Float(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row - 2, false, 100); + drawFloat(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row - 2, false, 100); } break; case LEVELING_M_GOTO_VALUE: if (draw) { - Draw_Menu_Item(row, ICON_StockConfiguration, F("Go to Mesh Z Value")); - Draw_Checkbox(row, mesh_conf.goto_mesh_value); + drawMenuItem(row, ICON_StockConfiguration, F("Go to Mesh Z Value")); + drawCheckbox(row, mesh_conf.goto_mesh_value); } else { mesh_conf.goto_mesh_value = !mesh_conf.goto_mesh_value; current_position.z = 0; mesh_conf.manual_mesh_move(true); - Draw_Checkbox(row, mesh_conf.goto_mesh_value); + drawCheckbox(row, mesh_conf.goto_mesh_value); } break; #if ENABLED(AUTO_BED_LEVELING_UBL) case LEVELING_M_UNDEF: if (draw) - Draw_Menu_Item(row, ICON_ResumeEEPROM, F("Clear Point Value")); + drawMenuItem(row, ICON_ResumeEEPROM, F("Clear Point Value")); else { mesh_conf.manual_value_update(true); - Redraw_Menu(false); + redrawMenu(false); } break; #endif @@ -3513,18 +3523,18 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case UBL_M_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else { set_bed_leveling_enabled(level_state); - Draw_Menu(Leveling, LEVELING_GET_MESH); + drawMenu(Leveling, LEVELING_GET_MESH); } break; case UBL_M_NEXT: if (draw) { if (mesh_conf.mesh_x != (GRID_MAX_POINTS_X - 1) || mesh_conf.mesh_y != (GRID_MAX_POINTS_Y - 1)) - Draw_Menu_Item(row, ICON_More, F("Next Point")); + drawMenuItem(row, ICON_More, F("Next Point")); else - Draw_Menu_Item(row, ICON_More, F("Save Mesh")); + drawMenuItem(row, ICON_More, F("Save Mesh")); } else { if (mesh_conf.mesh_x != (GRID_MAX_POINTS_X - 1) || mesh_conf.mesh_y != (GRID_MAX_POINTS_Y - 1)) { @@ -3539,14 +3549,14 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item else { gcode.process_subcommands_now(F("G29 S")); planner.synchronize(); - AudioFeedback(true); - Draw_Menu(Leveling, LEVELING_GET_MESH); + audioFeedback(true); + drawMenu(Leveling, LEVELING_GET_MESH); } } break; case UBL_M_PREV: if (draw) - Draw_Menu_Item(row, ICON_More, F("Previous Point")); + drawMenuItem(row, ICON_More, F("Previous Point")); else { if (mesh_conf.mesh_x != 0 || mesh_conf.mesh_y != 0) { if ((mesh_conf.mesh_x == (GRID_MAX_POINTS_X - 1) && mesh_conf.mesh_y % 2 == 1) || (mesh_conf.mesh_x == 0 && mesh_conf.mesh_y % 2 == 0)) @@ -3561,37 +3571,37 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item break; case UBL_M_OFFSET: if (draw) { - Draw_Menu_Item(row, ICON_SetZOffset, F("Point Z Offset")); - Draw_Float(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row, false, 100); + drawMenuItem(row, ICON_SetZOffset, F("Point Z Offset")); + drawFloat(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row, false, 100); } else { if (isnan(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y])) bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] = 0; - Modify_Value(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], MIN_Z_OFFSET, MAX_Z_OFFSET, 100); + modifyValue(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], MIN_Z_OFFSET, MAX_Z_OFFSET, 100); } break; case UBL_M_UP: if (draw) - Draw_Menu_Item(row, ICON_Axis, F("Microstep Up")); + drawMenuItem(row, ICON_Axis, F("Microstep Up")); else if (bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] < MAX_Z_OFFSET) { bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] += 0.01; gcode.process_subcommands_now(F("M290 Z0.01")); planner.synchronize(); current_position.z += 0.01f; sync_plan_position(); - Draw_Float(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row - 1, false, 100); + drawFloat(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row - 1, false, 100); } break; case UBL_M_DOWN: if (draw) - Draw_Menu_Item(row, ICON_Axis, F("Microstep Down")); + drawMenuItem(row, ICON_Axis, F("Microstep Down")); else if (bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] > MIN_Z_OFFSET) { bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y] -= 0.01; gcode.process_subcommands_now(F("M290 Z-0.01")); planner.synchronize(); current_position.z -= 0.01f; sync_plan_position(); - Draw_Float(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row - 2, false, 100); + drawFloat(bedlevel.z_values[mesh_conf.mesh_x][mesh_conf.mesh_y], row - 2, false, 100); } break; } @@ -3612,64 +3622,64 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case MMESH_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Cancel")); + drawMenuItem(row, ICON_Back, F("Cancel")); else { gcode.process_subcommands_now(F("G29 A")); planner.synchronize(); set_bed_leveling_enabled(level_state); - Draw_Menu(Leveling, LEVELING_GET_MESH); + drawMenu(Leveling, LEVELING_GET_MESH); } break; case MMESH_NEXT: if (draw) { if (gridpoint < GRID_MAX_POINTS) - Draw_Menu_Item(row, ICON_More, F("Next Point")); + drawMenuItem(row, ICON_More, F("Next Point")); else - Draw_Menu_Item(row, ICON_More, F("Save Mesh")); + drawMenuItem(row, ICON_More, F("Save Mesh")); } else if (gridpoint < GRID_MAX_POINTS) { - Popup_Handler(MoveWait); + popupHandler(MoveWait); gcode.process_subcommands_now(F("G29")); planner.synchronize(); gridpoint++; - Redraw_Menu(); + redrawMenu(); } else { gcode.process_subcommands_now(F("G29")); planner.synchronize(); - AudioFeedback(settings.save()); - Draw_Menu(Leveling, LEVELING_GET_MESH); + audioFeedback(settings.save()); + drawMenu(Leveling, LEVELING_GET_MESH); } break; case MMESH_OFFSET: if (draw) { - Draw_Menu_Item(row, ICON_SetZOffset, F("Z Position")); + drawMenuItem(row, ICON_SetZOffset, F("Z Position")); current_position.z = MANUAL_PROBE_START_Z; - Draw_Float(current_position.z, row, false, 100); + drawFloat(current_position.z, row, false, 100); } else - Modify_Value(current_position.z, MIN_Z_OFFSET, MAX_Z_OFFSET, 100); + modifyValue(current_position.z, MIN_Z_OFFSET, MAX_Z_OFFSET, 100); break; case MMESH_UP: if (draw) - Draw_Menu_Item(row, ICON_Axis, F("Microstep Up")); + drawMenuItem(row, ICON_Axis, F("Microstep Up")); else if (current_position.z < MAX_Z_OFFSET) { gcode.process_subcommands_now(F("M290 Z0.01")); planner.synchronize(); current_position.z += 0.01f; sync_plan_position(); - Draw_Float(current_position.z, row - 1, false, 100); + drawFloat(current_position.z, row - 1, false, 100); } break; case MMESH_DOWN: if (draw) - Draw_Menu_Item(row, ICON_AxisD, F("Microstep Down")); + drawMenuItem(row, ICON_AxisD, F("Microstep Down")); else if (current_position.z > MIN_Z_OFFSET) { gcode.process_subcommands_now(F("M290 Z-0.01")); planner.synchronize(); current_position.z -= 0.01f; sync_plan_position(); - Draw_Float(current_position.z, row - 2, false, 100); + drawFloat(current_position.z, row - 2, false, 100); } break; case MMESH_OLD: @@ -3684,15 +3694,15 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item const float currval = bedlevel.z_values[mesh_x][mesh_y]; if (draw) { - Draw_Menu_Item(row, ICON_Zoffset, F("Goto Mesh Value")); - Draw_Float(currval, row, false, 100); + drawMenuItem(row, ICON_Zoffset, F("Goto Mesh Value")); + drawFloat(currval, row, false, 100); } else if (!isnan(currval)) { current_position.z = currval; planner.synchronize(); planner.buffer_line(current_position, homing_feedrate(Z_AXIS), active_extruder); planner.synchronize(); - Draw_Float(current_position.z, row - 3, false, 100); + drawFloat(current_position.z, row - 3, false, 100); } break; } @@ -3719,85 +3729,85 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case TUNE_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Back")); + drawMenuItem(row, ICON_Back, F("Back")); else - Draw_Print_Screen(); + drawPrintScreen(); break; case TUNE_SPEED: if (draw) { - Draw_Menu_Item(row, ICON_Speed, F("Print Speed")); - Draw_Float(feedrate_percentage, row, false, 1); + drawMenuItem(row, ICON_Speed, F("Print Speed")); + drawFloat(feedrate_percentage, row, false, 1); } else - Modify_Value(feedrate_percentage, MIN_PRINT_SPEED, MAX_PRINT_SPEED, 1); + modifyValue(feedrate_percentage, MIN_PRINT_SPEED, MAX_PRINT_SPEED, 1); break; #if HAS_HOTEND case TUNE_FLOW: if (draw) { - Draw_Menu_Item(row, ICON_Speed, F("Flow Rate")); - Draw_Float(planner.flow_percentage[0], row, false, 1); + drawMenuItem(row, ICON_Speed, F("Flow Rate")); + drawFloat(planner.flow_percentage[0], row, false, 1); } else - Modify_Value(planner.flow_percentage[0], MIN_FLOW_RATE, MAX_FLOW_RATE, 1, []{ planner.refresh_e_factor(0); }); + modifyValue(planner.flow_percentage[0], MIN_FLOW_RATE, MAX_FLOW_RATE, 1, []{ planner.refresh_e_factor(0); }); break; case TUNE_HOTEND: if (draw) { - Draw_Menu_Item(row, ICON_SetEndTemp, F("Hotend")); - Draw_Float(thermalManager.temp_hotend[0].target, row, false, 1); + drawMenuItem(row, ICON_SetEndTemp, F("Hotend")); + drawFloat(thermalManager.temp_hotend[0].target, row, false, 1); } else - Modify_Value(thermalManager.temp_hotend[0].target, MIN_E_TEMP, MAX_E_TEMP, 1); + modifyValue(thermalManager.temp_hotend[0].target, MIN_E_TEMP, MAX_E_TEMP, 1); break; #endif #if HAS_HEATED_BED case TUNE_BED: if (draw) { - Draw_Menu_Item(row, ICON_SetBedTemp, F("Bed")); - Draw_Float(thermalManager.temp_bed.target, row, false, 1); + drawMenuItem(row, ICON_SetBedTemp, F("Bed")); + drawFloat(thermalManager.temp_bed.target, row, false, 1); } else - Modify_Value(thermalManager.temp_bed.target, MIN_BED_TEMP, MAX_BED_TEMP, 1); + modifyValue(thermalManager.temp_bed.target, MIN_BED_TEMP, MAX_BED_TEMP, 1); break; #endif #if HAS_FAN case TUNE_FAN: if (draw) { - Draw_Menu_Item(row, ICON_FanSpeed, F("Fan")); - Draw_Float(thermalManager.fan_speed[0], row, false, 1); + drawMenuItem(row, ICON_FanSpeed, F("Fan")); + drawFloat(thermalManager.fan_speed[0], row, false, 1); } else - Modify_Value(thermalManager.fan_speed[0], MIN_FAN_SPEED, MAX_FAN_SPEED, 1); + modifyValue(thermalManager.fan_speed[0], MIN_FAN_SPEED, MAX_FAN_SPEED, 1); break; #endif #if HAS_ZOFFSET_ITEM case TUNE_ZOFFSET: if (draw) { - Draw_Menu_Item(row, ICON_FanSpeed, F("Z-Offset")); - Draw_Float(zoffsetvalue, row, false, 100); + drawMenuItem(row, ICON_FanSpeed, F("Z-Offset")); + drawFloat(zoffsetvalue, row, false, 100); } else - Modify_Value(zoffsetvalue, MIN_Z_OFFSET, MAX_Z_OFFSET, 100); + modifyValue(zoffsetvalue, MIN_Z_OFFSET, MAX_Z_OFFSET, 100); break; case TUNE_ZUP: if (draw) - Draw_Menu_Item(row, ICON_Axis, F("Z-Offset Up")); + drawMenuItem(row, ICON_Axis, F("Z-Offset Up")); else if (zoffsetvalue < MAX_Z_OFFSET) { gcode.process_subcommands_now(F("M290 Z0.01")); zoffsetvalue += 0.01; - Draw_Float(zoffsetvalue, row - 1, false, 100); + drawFloat(zoffsetvalue, row - 1, false, 100); } break; case TUNE_ZDOWN: if (draw) - Draw_Menu_Item(row, ICON_AxisD, F("Z-Offset Down")); + drawMenuItem(row, ICON_AxisD, F("Z-Offset Down")); else if (zoffsetvalue > MIN_Z_OFFSET) { gcode.process_subcommands_now(F("M290 Z-0.01")); zoffsetvalue -= 0.01; - Draw_Float(zoffsetvalue, row - 2, false, 100); + drawFloat(zoffsetvalue, row - 2, false, 100); } break; #endif @@ -3805,38 +3815,38 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) case TUNE_CHANGEFIL: if (draw) - Draw_Menu_Item(row, ICON_ResumeEEPROM, GET_TEXT_F(MSG_FILAMENTCHANGE)); + drawMenuItem(row, ICON_ResumeEEPROM, GET_TEXT_F(MSG_FILAMENTCHANGE)); else - Popup_Handler(ConfFilChange); + popupHandler(ConfFilChange); break; #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) case TUNE_FILSENSORENABLED: if (draw) { - Draw_Menu_Item(row, ICON_Extruder, F("Filament Sensor")); - Draw_Checkbox(row, runout.enabled); + drawMenuItem(row, ICON_Extruder, F("Filament Sensor")); + drawCheckbox(row, runout.enabled); } else { runout.enabled = !runout.enabled; - Draw_Checkbox(row, runout.enabled); + drawCheckbox(row, runout.enabled); } break; #endif case TUNE_BACKLIGHT_OFF: if (draw) - Draw_Menu_Item(row, ICON_Brightness, F("Display Off")); + drawMenuItem(row, ICON_Brightness, F("Display Off")); else ui.set_brightness(0); break; case TUNE_BACKLIGHT: if (draw) { - Draw_Menu_Item(row, ICON_Brightness, F("LCD Brightness")); - Draw_Float(ui.brightness, row, false, 1); + drawMenuItem(row, ICON_Brightness, F("LCD Brightness")); + drawFloat(ui.brightness, row, false, 1); } else - Modify_Value(ui.brightness, LCD_BRIGHTNESS_MIN, LCD_BRIGHTNESS_MAX, 1, ui.refresh_brightness); + modifyValue(ui.brightness, LCD_BRIGHTNESS_MIN, LCD_BRIGHTNESS_MAX, 1, ui.refresh_brightness); break; } break; @@ -3858,22 +3868,22 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item switch (item) { case PREHEATHOTEND_BACK: if (draw) - Draw_Menu_Item(row, ICON_Back, F("Cancel")); + drawMenuItem(row, ICON_Back, F("Cancel")); else { thermalManager.setTargetHotend(0, 0); TERN_(HAS_FAN, thermalManager.set_fan_speed(0, 0)); - Redraw_Menu(false, true, true); + redrawMenu(false, true, true); } break; case PREHEATHOTEND_CONTINUE: if (draw) - Draw_Menu_Item(row, ICON_SetEndTemp, F("Continue")); + drawMenuItem(row, ICON_SetEndTemp, F("Continue")); else { - Popup_Handler(Heating); + popupHandler(Heating); thermalManager.wait_for_hotend(0); switch (last_menu) { case Prepare: - Popup_Handler(FilChange); + popupHandler(FilChange); sprintf_P(cmd, PSTR("M600 B1 R%i"), thermalManager.temp_hotend[0].target); gcode.process_subcommands_now(cmd); break; @@ -3881,19 +3891,19 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item case ChangeFilament: switch (last_selection) { case CHANGEFIL_LOAD: - Popup_Handler(FilLoad); + popupHandler(FilLoad); gcode.process_subcommands_now(F("M701")); planner.synchronize(); - Redraw_Menu(true, true, true); + redrawMenu(true, true, true); break; case CHANGEFIL_UNLOAD: - Popup_Handler(FilLoad, true); + popupHandler(FilLoad, true); gcode.process_subcommands_now(F("M702")); planner.synchronize(); - Redraw_Menu(true, true, true); + redrawMenu(true, true, true); break; case CHANGEFIL_CHANGE: - Popup_Handler(FilChange); + popupHandler(FilChange); sprintf_P(cmd, PSTR("M600 B1 R%i"), thermalManager.temp_hotend[0].target); gcode.process_subcommands_now(cmd); break; @@ -3901,7 +3911,7 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item break; #endif default: - Redraw_Menu(true, true, true); + redrawMenu(true, true, true); break; } } @@ -3910,7 +3920,7 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item #define _PREHEAT_HOTEND_CASE(N) \ case PREHEATHOTEND_##N: \ - if (draw) Draw_Menu_Item(row, ICON_Temperature, F(PREHEAT_## N ##_LABEL)); \ + if (draw) drawMenuItem(row, ICON_Temperature, F(PREHEAT_## N ##_LABEL)); \ else ui.preheat_hotend_and_fan((N) - 1); \ break; @@ -3918,11 +3928,11 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item case PREHEATHOTEND_CUSTOM: if (draw) { - Draw_Menu_Item(row, ICON_Temperature, F("Custom")); - Draw_Float(thermalManager.temp_hotend[0].target, row, false, 1); + drawMenuItem(row, ICON_Temperature, F("Custom")); + drawFloat(thermalManager.temp_hotend[0].target, row, false, 1); } else - Modify_Value(thermalManager.temp_hotend[0].target, EXTRUDE_MINTEMP, MAX_E_TEMP, 1); + modifyValue(thermalManager.temp_hotend[0].target, EXTRUDE_MINTEMP, MAX_E_TEMP, 1); break; } break; @@ -3931,7 +3941,7 @@ void CrealityDWINClass::Menu_Item_Handler(const uint8_t menu, const uint8_t item } } -FSTR_P CrealityDWINClass::Get_Menu_Title(const uint8_t menu) { +FSTR_P CrealityDWIN::getMenuTitle(const uint8_t menu) { switch (menu) { case MainMenu: return GET_TEXT_F(MSG_MAIN_MENU); case Prepare: return GET_TEXT_F(MSG_PREPARE); @@ -4008,7 +4018,7 @@ FSTR_P CrealityDWINClass::Get_Menu_Title(const uint8_t menu) { return F(""); } -uint8_t CrealityDWINClass::Get_Menu_Size(const uint8_t menu) { +uint8_t CrealityDWIN::getMenuSize(const uint8_t menu) { switch (menu) { case Prepare: return PREPARE_TOTAL; case HomeMenu: return HOME_TOTAL; @@ -4085,108 +4095,108 @@ uint8_t CrealityDWINClass::Get_Menu_Size(const uint8_t menu) { /* Popup Config */ -void CrealityDWINClass::Popup_Handler(const PopupID popupid, const bool option/*=false*/) { +void CrealityDWIN::popupHandler(const PopupID popupid, const bool option/*=false*/) { popup = last_popup = popupid; switch (popupid) { - case Pause: Draw_Popup(F("Pause Print"), F(""), F(""), Popup); break; - case Stop: Draw_Popup(F("Stop Print"), F(""), F(""), Popup); break; - case Resume: Draw_Popup(F("Resume Print?"), F("Looks Like the last"), F("print was interrupted."), Popup); break; - case ConfFilChange: Draw_Popup(F("Confirm Filament Change"), F(""), F(""), Popup); break; - case PurgeMore: Draw_Popup(F("Purge more filament?"), F("(Cancel to finish process)"), F(""), Popup); break; - case SaveLevel: Draw_Popup(F("Leveling Complete"), F("Save to EEPROM?"), F(""), Popup); break; - case MeshSlot: Draw_Popup(F("Mesh slot not selected"), F("(Confirm to select slot 0)"), F(""), Popup); break; - case ETemp: Draw_Popup(F("Nozzle is too cold"), F("Open Preheat Menu?"), F(""), Popup); break; - case ManualProbing: Draw_Popup(F("Manual Probing"), F("(Confirm to probe)"), F("(cancel to exit)"), Popup); break; - case Level: Draw_Popup(F("Auto Bed Leveling"), F("Please wait until done."), F(""), Wait, ICON_AutoLeveling); break; - case Home: Draw_Popup(option ? F("Parking") : F("Homing"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; - case MoveWait: Draw_Popup(F("Moving to Point"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; - case Heating: Draw_Popup(F("Heating"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; - case FilLoad: Draw_Popup(option ? F("Unloading Filament") : F("Loading Filament"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; - case FilChange: Draw_Popup(F("Filament Change"), F("Please wait for prompt."), F(""), Wait, ICON_BLTouch); break; - case TempWarn: Draw_Popup(option ? F("Nozzle temp too low!") : F("Nozzle temp too high!"), F(""), F(""), Wait, option ? ICON_TempTooLow : ICON_TempTooHigh); break; - case Runout: Draw_Popup(F("Filament Runout"), F(""), F(""), Wait, ICON_BLTouch); break; - case PIDWait: Draw_Popup(F("PID Autotune"), F("in process"), F("Please wait until done."), Wait, ICON_BLTouch); break; - case Resuming: Draw_Popup(F("Resuming Print"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; - case Custom: Draw_Popup(F("Running Custom GCode"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; + case Pause: drawPopup(F("Pause Print"), F(""), F(""), Popup); break; + case Stop: drawPopup(F("Stop Print"), F(""), F(""), Popup); break; + case Resume: drawPopup(F("Resume Print?"), F("Looks Like the last"), F("print was interrupted."), Popup); break; + case ConfFilChange: drawPopup(F("Confirm Filament Change"), F(""), F(""), Popup); break; + case PurgeMore: drawPopup(F("Purge more filament?"), F("(Cancel to finish process)"), F(""), Popup); break; + case SaveLevel: drawPopup(F("Leveling Complete"), F("Save to EEPROM?"), F(""), Popup); break; + case MeshSlot: drawPopup(F("Mesh slot not selected"), F("(Confirm to select slot 0)"), F(""), Popup); break; + case ETemp: drawPopup(F("Nozzle is too cold"), F("Open Preheat Menu?"), F(""), Popup); break; + case ManualProbing: drawPopup(F("Manual Probing"), F("(Confirm to probe)"), F("(cancel to exit)"), Popup); break; + case Level: drawPopup(F("Auto Bed Leveling"), F("Please wait until done."), F(""), Wait, ICON_AutoLeveling); break; + case Home: drawPopup(option ? F("Parking") : F("Homing"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; + case MoveWait: drawPopup(F("Moving to Point"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; + case Heating: drawPopup(F("Heating"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; + case FilLoad: drawPopup(option ? F("Unloading Filament") : F("Loading Filament"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; + case FilChange: drawPopup(F("Filament Change"), F("Please wait for prompt."), F(""), Wait, ICON_BLTouch); break; + case TempWarn: drawPopup(option ? F("Nozzle temp too low!") : F("Nozzle temp too high!"), F(""), F(""), Wait, option ? ICON_TempTooLow : ICON_TempTooHigh); break; + case Runout: drawPopup(F("Filament Runout"), F(""), F(""), Wait, ICON_BLTouch); break; + case PIDWait: drawPopup(F("PID Autotune"), F("in process"), F("Please wait until done."), Wait, ICON_BLTouch); break; + case Resuming: drawPopup(F("Resuming Print"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; + case Custom: drawPopup(F("Running Custom GCode"), F("Please wait until done."), F(""), Wait, ICON_BLTouch); break; default: break; } } -void CrealityDWINClass::Confirm_Handler(PopupID popupid) { +void CrealityDWIN::confirmHandler(PopupID popupid) { popup = popupid; switch (popupid) { - case FilInsert: Draw_Popup(F("Insert Filament"), F("Press to Continue"), F(""), Confirm); break; - case HeaterTime: Draw_Popup(F("Heater Timed Out"), F("Press to Reheat"), F(""), Confirm); break; - case UserInput: Draw_Popup(F("Waiting for Input"), F("Press to Continue"), F(""), Confirm); break; - case LevelError: Draw_Popup(F("Couldn't enable Leveling"), F("(Valid mesh must exist)"), F(""), Confirm); break; - case InvalidMesh: Draw_Popup(F("Valid mesh must exist"), F("before tuning can be"), F("performed"), Confirm); break; + case FilInsert: drawPopup(F("Insert Filament"), F("Press to Continue"), F(""), Confirm); break; + case HeaterTime: drawPopup(F("Heater Timed Out"), F("Press to Reheat"), F(""), Confirm); break; + case UserInput: drawPopup(F("Waiting for Input"), F("Press to Continue"), F(""), Confirm); break; + case LevelError: drawPopup(F("Couldn't enable Leveling"), F("(Valid mesh must exist)"), F(""), Confirm); break; + case InvalidMesh: drawPopup(F("Valid mesh must exist"), F("before tuning can be"), F("performed"), Confirm); break; default: break; } } /* Navigation and Control */ -void CrealityDWINClass::Main_Menu_Control() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void CrealityDWIN::mainMenuControl() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_CW && selection < PAGE_COUNT - 1) { selection++; // Select Down - Main_Menu_Icons(); + mainMenuIcons(); } else if (encoder_diffState == ENCODER_DIFF_CCW && selection > 0) { selection--; // Select Up - Main_Menu_Icons(); + mainMenuIcons(); } else if (encoder_diffState == ENCODER_DIFF_ENTER) switch (selection) { - case PAGE_PRINT: card.mount(); Draw_SD_List(); break; - case PAGE_PREPARE: Draw_Menu(Prepare); break; - case PAGE_CONTROL: Draw_Menu(Control); break; - case PAGE_INFO_LEVELING: Draw_Menu(TERN(HAS_MESH, Leveling, InfoMain)); break; + case PAGE_PRINT: card.mount(); drawSDList(); break; + case PAGE_PREPARE: drawMenu(Prepare); break; + case PAGE_CONTROL: drawMenu(Control); break; + case PAGE_INFO_LEVELING: drawMenu(TERN(HAS_MESH, Leveling, InfoMain)); break; } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void CrealityDWINClass::Menu_Control() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void CrealityDWIN::menuControl() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; - if (encoder_diffState == ENCODER_DIFF_CW && selection < Get_Menu_Size(active_menu)) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + if (encoder_diffState == ENCODER_DIFF_CW && selection < getMenuSize(active_menu)) { + dwinDrawRectangle(1, Color_Bg_Black, 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); selection++; // Select Down if (selection > scrollpos+MROWS) { scrollpos++; - DWIN_Frame_AreaMove(1, 2, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); - Menu_Item_Handler(active_menu, selection); + dwinFrameAreaMove(1, 2, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); + menuItemHandler(active_menu, selection); } - DWIN_Draw_Rectangle(1, GetColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + dwinDrawRectangle(1, getColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); } else if (encoder_diffState == ENCODER_DIFF_CCW && selection > 0) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + dwinDrawRectangle(1, Color_Bg_Black, 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); selection--; // Select Up if (selection < scrollpos) { scrollpos--; - DWIN_Frame_AreaMove(1, 3, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); - Menu_Item_Handler(active_menu, selection); + dwinFrameAreaMove(1, 3, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); + menuItemHandler(active_menu, selection); } - DWIN_Draw_Rectangle(1, GetColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + dwinDrawRectangle(1, getColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); } else if (encoder_diffState == ENCODER_DIFF_ENTER) - Menu_Item_Handler(active_menu, selection, false); - DWIN_UpdateLCD(); + menuItemHandler(active_menu, selection, false); + dwinUpdateLCD(); } -void CrealityDWINClass::Value_Control() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void CrealityDWIN::valueControl() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_CW) - tempvalue += EncoderRate.encoderMoveValue; + tempvalue += encoderRate.encoderMoveValue; else if (encoder_diffState == ENCODER_DIFF_CCW) - tempvalue -= EncoderRate.encoderMoveValue; + tempvalue -= encoderRate.encoderMoveValue; else if (encoder_diffState == ENCODER_DIFF_ENTER) { process = Menu; - EncoderRate.enabled = false; - Draw_Float(tempvalue / valueunit, selection - scrollpos, false, valueunit); - DWIN_UpdateLCD(); + encoderRate.enabled = false; + drawFloat(tempvalue / valueunit, selection - scrollpos, false, valueunit); + dwinUpdateLCD(); if (active_menu == ZOffset && liveadjust) { planner.synchronize(); current_position.z += (tempvalue / valueunit - zoffsetvalue); @@ -4229,24 +4239,24 @@ void CrealityDWINClass::Value_Control() { return; } LIMIT(tempvalue, valuemin * valueunit, valuemax * valueunit); - Draw_Float(tempvalue / valueunit, selection - scrollpos, true, valueunit); - DWIN_UpdateLCD(); + drawFloat(tempvalue / valueunit, selection - scrollpos, true, valueunit); + dwinUpdateLCD(); if (active_menu == Move && livemove) { *(float*)valuepointer = tempvalue / valueunit; planner.buffer_line(current_position, manual_feedrate_mm_s[selection - 1], active_extruder); } } -void CrealityDWINClass::Option_Control() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void CrealityDWIN::optionControl() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_CW) - tempvalue += EncoderRate.encoderMoveValue; + tempvalue += encoderRate.encoderMoveValue; else if (encoder_diffState == ENCODER_DIFF_CCW) - tempvalue -= EncoderRate.encoderMoveValue; + tempvalue -= encoderRate.encoderMoveValue; else if (encoder_diffState == ENCODER_DIFF_ENTER) { process = Menu; - EncoderRate.enabled = false; + encoderRate.enabled = false; if (valuepointer == &color_names) { switch (selection) { case COLORSETTINGS_CURSOR: eeprom_settings.cursor_color = tempvalue; break; @@ -4261,24 +4271,24 @@ void CrealityDWINClass::Option_Control() { case COLORSETTINGS_PROGRESS_COORDINATES: eeprom_settings.coordinates_text = tempvalue; break; case COLORSETTINGS_PROGRESS_COORDINATES_LINE: eeprom_settings.coordinates_split_line = tempvalue; break; } - Redraw_Screen(); + redrawScreen(); } else if (valuepointer == &preheat_modes) preheatmode = tempvalue; - Draw_Option(tempvalue, static_cast(valuepointer), selection - scrollpos, false, (valuepointer == &color_names)); - DWIN_UpdateLCD(); + drawOption(tempvalue, static_cast(valuepointer), selection - scrollpos, false, (valuepointer == &color_names)); + dwinUpdateLCD(); return; } LIMIT(tempvalue, valuemin, valuemax); - Draw_Option(tempvalue, static_cast(valuepointer), selection - scrollpos, true); - DWIN_UpdateLCD(); + drawOption(tempvalue, static_cast(valuepointer), selection - scrollpos, true); + dwinUpdateLCD(); } -void CrealityDWINClass::File_Control() { +void CrealityDWIN::fileControl() { typedef TextScroller Scroller; static Scroller scroller; - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) { if (selection > 0) { card.selectFileByIndexSorted(selection - 1); @@ -4293,82 +4303,82 @@ void CrealityDWINClass::File_Control() { time = millis() + 200; Scroller::Buffer buf; const char* const name = scroller.scroll(pos, buf, filename); - DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(selection - scrollpos) - 14, 271, MBASE(selection - scrollpos) + 28); - Draw_Menu_Item(selection - scrollpos, card.flag.filenameIsDir ? ICON_More : ICON_File, name); - DWIN_UpdateLCD(); + dwinDrawRectangle(1, Color_Bg_Black, LBLX, MBASE(selection - scrollpos) - 14, 271, MBASE(selection - scrollpos) + 28); + drawMenuItem(selection - scrollpos, card.flag.filenameIsDir ? ICON_More : ICON_File, name); + dwinUpdateLCD(); } } return; } if (encoder_diffState == ENCODER_DIFF_CW && selection < card.get_num_items()) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + dwinDrawRectangle(1, Color_Bg_Black, 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); if (selection > 0) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(selection - scrollpos) - 14, 271, MBASE(selection - scrollpos) + 28); - Draw_SD_Item(selection, selection - scrollpos); + dwinDrawRectangle(1, Color_Bg_Black, LBLX, MBASE(selection - scrollpos) - 14, 271, MBASE(selection - scrollpos) + 28); + drawSDItem(selection, selection - scrollpos); } scroller.reset(); selection++; // Select Down if (selection > scrollpos + MROWS) { scrollpos++; - DWIN_Frame_AreaMove(1, 2, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); - Draw_SD_Item(selection, selection - scrollpos); + dwinFrameAreaMove(1, 2, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); + drawSDItem(selection, selection - scrollpos); } - DWIN_Draw_Rectangle(1, GetColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + dwinDrawRectangle(1, getColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); } else if (encoder_diffState == ENCODER_DIFF_CCW && selection > 0) { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); - DWIN_Draw_Rectangle(1, Color_Bg_Black, LBLX, MBASE(selection - scrollpos) - 14, 271, MBASE(selection - scrollpos) + 28); - Draw_SD_Item(selection, selection - scrollpos); + dwinDrawRectangle(1, Color_Bg_Black, 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + dwinDrawRectangle(1, Color_Bg_Black, LBLX, MBASE(selection - scrollpos) - 14, 271, MBASE(selection - scrollpos) + 28); + drawSDItem(selection, selection - scrollpos); scroller.reset(); selection--; // Select Up if (selection < scrollpos) { scrollpos--; - DWIN_Frame_AreaMove(1, 3, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); - Draw_SD_Item(selection, selection - scrollpos); + dwinFrameAreaMove(1, 3, MLINE, Color_Bg_Black, 0, 31, DWIN_WIDTH, 349); + drawSDItem(selection, selection - scrollpos); } - DWIN_Draw_Rectangle(1, GetColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); + dwinDrawRectangle(1, getColor(eeprom_settings.cursor_color, Rectangle_Color), 0, MBASE(selection - scrollpos) - 18, 14, MBASE(selection - scrollpos) + 33); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { if (selection == 0) { if (card.flag.workDirIsRoot) { process = Main; - Draw_Main_Menu(); + drawMainMenu(); } else { card.cdup(); - Draw_SD_List(); + drawSDList(); } } else { card.selectFileByIndexSorted(selection - 1); if (card.flag.filenameIsDir) { card.cd(card.filename); - Draw_SD_List(); + drawSDList(); } else { card.openAndPrintFile(card.filename); } } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void CrealityDWINClass::Print_Screen_Control() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void CrealityDWIN::printScreenControl() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_CW && selection < PRINT_COUNT - 1) { selection++; // Select Down - Print_Screen_Icons(); + printScreenIcons(); } else if (encoder_diffState == ENCODER_DIFF_CCW && selection > 0) { selection--; // Select Up - Print_Screen_Icons(); + printScreenIcons(); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (selection) { case PRINT_SETUP: - Draw_Menu(Tune); - Update_Status_Bar(true); + drawMenu(Tune); + updateStatusBar(true); break; case PRINT_PAUSE_RESUME: if (paused) { @@ -4395,27 +4405,27 @@ void CrealityDWINClass::Print_Screen_Control() { else { TERN_(HOST_ACTION_COMMANDS, hostui.resume()); } - Draw_Print_Screen(); + drawPrintScreen(); } else - Popup_Handler(Pause); + popupHandler(Pause); break; - case PRINT_STOP: Popup_Handler(Stop); break; + case PRINT_STOP: popupHandler(Stop); break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void CrealityDWINClass::Popup_Control() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void CrealityDWIN::popupControl() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_CW && selection < 1) { selection++; - Popup_Select(); + popupSelect(); } else if (encoder_diffState == ENCODER_DIFF_CCW && selection > 0) { selection--; - Popup_Select(); + popupSelect(); } else if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (popup) { @@ -4426,7 +4436,7 @@ void CrealityDWINClass::Popup_Control() { if (recovery.enabled) recovery.save(true); #endif #if ENABLED(PARK_HEAD_ON_PAUSE) - Popup_Handler(Home, true); + popupHandler(Home, true); #if HAS_MEDIA if (IS_SD_PRINTING()) card.pauseSDPrint(); #endif @@ -4445,7 +4455,7 @@ void CrealityDWINClass::Popup_Control() { TERN_(HOST_ACTION_COMMANDS, hostui.pause()); } } - Draw_Print_Screen(); + drawPrintScreen(); break; case Stop: if (selection == 0) { @@ -4458,14 +4468,14 @@ void CrealityDWINClass::Popup_Control() { } } else - Draw_Print_Screen(); + drawPrintScreen(); break; case Resume: if (selection == 0) queue.inject(F("M1000")); else { queue.inject(F("M1000 C")); - Draw_Main_Menu(); + drawMainMenu(); } break; @@ -4474,10 +4484,10 @@ void CrealityDWINClass::Popup_Control() { if (selection == 0) { thermalManager.setTargetHotend(EXTRUDE_MINTEMP, 0); TERN_(HAS_FAN, thermalManager.set_fan_speed(0, MAX_FAN_SPEED)); - Draw_Menu(PreheatHotend); + drawMenu(PreheatHotend); } else - Redraw_Menu(true, true, false); + redrawMenu(true, true, false); break; #endif @@ -4487,11 +4497,11 @@ void CrealityDWINClass::Popup_Control() { char buf[80]; const float dif = probe.probe_at_point(current_position.x, current_position.y, PROBE_PT_STOW, 0, false) - corner_avg; sprintf_P(buf, dif > 0 ? PSTR("Corner is %smm high") : PSTR("Corner is %smm low"), dtostrf(abs(dif), 1, 3, str_1)); - Update_Status(buf); + updateStatus(buf); } else { - Redraw_Menu(true, true, false); - Update_Status(""); + redrawMenu(true, true, false); + updateStatus(""); } break; #endif @@ -4500,29 +4510,29 @@ void CrealityDWINClass::Popup_Control() { case ConfFilChange: if (selection == 0) { if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) - Popup_Handler(ETemp); + popupHandler(ETemp); else { if (thermalManager.temp_hotend[0].is_below_target(2)) { - Popup_Handler(Heating); + popupHandler(Heating); thermalManager.wait_for_hotend(0); } - Popup_Handler(FilChange); + popupHandler(FilChange); sprintf_P(cmd, PSTR("M600 B1 R%i"), thermalManager.temp_hotend[0].target); gcode.process_subcommands_now(cmd); } } else - Redraw_Menu(true, true, false); + redrawMenu(true, true, false); break; case PurgeMore: if (selection == 0) { pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; - Popup_Handler(FilChange); + popupHandler(FilChange); } else { pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT; - if (printing) Popup_Handler(Resuming); - else Redraw_Menu(true, true, active_menu == PreheatHotend); + if (printing) popupHandler(Resuming); + else redrawMenu(true, true, active_menu == PreheatHotend); } break; #endif // ADVANCED_PAUSE_FEATURE @@ -4533,55 +4543,55 @@ void CrealityDWINClass::Popup_Control() { #if ENABLED(AUTO_BED_LEVELING_UBL) gcode.process_subcommands_now(F("G29 S")); planner.synchronize(); - AudioFeedback(true); + audioFeedback(true); #else - AudioFeedback(settings.save()); + audioFeedback(settings.save()); #endif } - Draw_Menu(Leveling, LEVELING_GET_MESH); + drawMenu(Leveling, LEVELING_GET_MESH); break; #endif #if ENABLED(AUTO_BED_LEVELING_UBL) case MeshSlot: if (selection == 0) bedlevel.storage_slot = 0; - Redraw_Menu(true, true); + redrawMenu(true, true); break; #endif default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } -void CrealityDWINClass::Confirm_Control() { - EncoderState encoder_diffState = Encoder_ReceiveAnalyze(); +void CrealityDWIN::confirmControl() { + EncoderState encoder_diffState = encoderReceiveAnalyze(); if (encoder_diffState == ENCODER_DIFF_NO) return; if (encoder_diffState == ENCODER_DIFF_ENTER) { switch (popup) { case Complete: - Draw_Main_Menu(); + drawMainMenu(); break; case FilInsert: - Popup_Handler(FilChange); + popupHandler(FilChange); wait_for_user = false; break; case HeaterTime: - Popup_Handler(Heating); + popupHandler(Heating); wait_for_user = false; break; default: - Redraw_Menu(true, true, false); + redrawMenu(true, true, false); wait_for_user = false; break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } /* In-Menu Value Modification */ -void CrealityDWINClass::Setup_Value(const_float_t value, const_float_t min, const_float_t max, const_float_t unit, const uint8_t type) { +void CrealityDWIN::setupValue(const_float_t value, const_float_t min, const_float_t max, const_float_t unit, const uint8_t type) { if (TERN0(HAS_HOTEND, valuepointer == &thermalManager.temp_hotend[0].pid.Ki) || TERN0(HAS_HEATED_BED, valuepointer == &thermalManager.temp_bed.pid.Ki)) tempvalue = unscalePID_i(value) * unit; else if (TERN0(HAS_HOTEND, valuepointer == &thermalManager.temp_hotend[0].pid.Kd) || TERN0(HAS_HEATED_BED, valuepointer == &thermalManager.temp_bed.pid.Kd)) @@ -4593,66 +4603,66 @@ void CrealityDWINClass::Setup_Value(const_float_t value, const_float_t min, cons valueunit = unit; valuetype = type; process = Value; - EncoderRate.enabled = true; - Draw_Float(tempvalue / unit, selection - scrollpos, true, valueunit); + encoderRate.enabled = true; + drawFloat(tempvalue / unit, selection - scrollpos, true, valueunit); } -void CrealityDWINClass::Modify_Value(float &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { +void CrealityDWIN::modifyValue(float &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { valuepointer = &value; funcpointer = f; - Setup_Value((float)value, min, max, unit, 0); + setupValue((float)value, min, max, unit, 0); } -void CrealityDWINClass::Modify_Value(uint8_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { +void CrealityDWIN::modifyValue(uint8_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { valuepointer = &value; funcpointer = f; - Setup_Value((float)value, min, max, unit, 1); + setupValue((float)value, min, max, unit, 1); } -void CrealityDWINClass::Modify_Value(uint16_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { +void CrealityDWIN::modifyValue(uint16_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { valuepointer = &value; funcpointer = f; - Setup_Value((float)value, min, max, unit, 2); + setupValue((float)value, min, max, unit, 2); } -void CrealityDWINClass::Modify_Value(int16_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { +void CrealityDWIN::modifyValue(int16_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { valuepointer = &value; funcpointer = f; - Setup_Value((float)value, min, max, unit, 3); + setupValue((float)value, min, max, unit, 3); } -void CrealityDWINClass::Modify_Value(uint32_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { +void CrealityDWIN::modifyValue(uint32_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { valuepointer = &value; funcpointer = f; - Setup_Value((float)value, min, max, unit, 4); + setupValue((float)value, min, max, unit, 4); } -void CrealityDWINClass::Modify_Value(int8_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { +void CrealityDWIN::modifyValue(int8_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()/*=nullptr*/) { valuepointer = &value; funcpointer = f; - Setup_Value((float)value, min, max, unit, 5); + setupValue((float)value, min, max, unit, 5); } -void CrealityDWINClass::Modify_Option(const uint8_t value, const char * const * options, const uint8_t max) { +void CrealityDWIN::modifyOption(const uint8_t value, const char * const * options, const uint8_t max) { tempvalue = value; valuepointer = const_cast(options); valuemin = 0; valuemax = max; process = Option; - EncoderRate.enabled = true; - Draw_Option(value, options, selection - scrollpos, true); + encoderRate.enabled = true; + drawOption(value, options, selection - scrollpos, true); } /* Main Functions */ -void CrealityDWINClass::Update_Status(const char * const text) { +void CrealityDWIN::updateStatus(const char * const text) { if (strncmp_P(text, PSTR(""), 3) == 0) { - LOOP_L_N(i, _MIN((size_t)LONG_FILENAME_LENGTH, strlen(text))) filename[i] = text[i + 3]; + for (uint8_t i = 0; i < _MIN((size_t)LONG_FILENAME_LENGTH, strlen(text)); ++i) filename[i] = text[i + 3]; filename[_MIN((size_t)LONG_FILENAME_LENGTH - 1, strlen(text))] = '\0'; - Draw_Print_Filename(true); + drawPrintFilename(true); } else { - LOOP_L_N(i, _MIN((size_t)64, strlen(text))) statusmsg[i] = text[i]; + for (uint8_t i = 0; i < _MIN((size_t)64, strlen(text)); ++i) statusmsg[i] = text[i]; statusmsg[_MIN((size_t)64, strlen(text))] = '\0'; } } -void CrealityDWINClass::Start_Print(const bool sd) { +void CrealityDWIN::startPrint(const bool sd) { sdprint = sd; if (!printing) { printing = true; @@ -4671,59 +4681,59 @@ void CrealityDWINClass::Start_Print(const bool sd) { strcpy_P(filename, PSTR("Host Print")); TERN_(SET_PROGRESS_PERCENT, ui.set_progress(0)); TERN_(SET_REMAINING_TIME, ui.set_remaining_time(0)); - Draw_Print_Screen(); + drawPrintScreen(); } } -void CrealityDWINClass::Stop_Print() { +void CrealityDWIN::stopPrint() { printing = false; sdprint = false; thermalManager.cooldown(); TERN_(SET_PROGRESS_PERCENT, ui.set_progress(100 * (PROGRESS_SCALE))); TERN_(SET_REMAINING_TIME, ui.set_remaining_time(0)); - Draw_Print_confirm(); + drawPrintConfirm(); } -void CrealityDWINClass::Update() { - State_Update(); - Screen_Update(); +void CrealityDWIN::update() { + stateUpdate(); + screenUpdate(); switch (process) { - case Main: Main_Menu_Control(); break; - case Menu: Menu_Control(); break; - case Value: Value_Control(); break; - case Option: Option_Control(); break; - case File: File_Control(); break; - case Print: Print_Screen_Control(); break; - case Popup: Popup_Control(); break; - case Confirm: Confirm_Control(); break; + case Main: mainMenuControl(); break; + case Menu: menuControl(); break; + case Value: valueControl(); break; + case Option: optionControl(); break; + case File: fileControl(); break; + case Print: printScreenControl(); break; + case Popup: popupControl(); break; + case Confirm: confirmControl(); break; } } -void MarlinUI::update() { CrealityDWIN.Update(); } +void MarlinUI::update() { crealityDWIN.update(); } #if HAS_LCD_BRIGHTNESS - void MarlinUI::_set_brightness() { DWIN_LCD_Brightness(backlight ? brightness : 0); } + void MarlinUI::_set_brightness() { dwinLCDBrightness(backlight ? brightness : 0); } #endif -void CrealityDWINClass::State_Update() { +void CrealityDWIN::stateUpdate() { if ((print_job_timer.isRunning() || print_job_timer.isPaused()) != printing) { - if (!printing) Start_Print(card.isFileOpen() || TERN0(POWER_LOSS_RECOVERY, recovery.valid())); - else Stop_Print(); + if (!printing) startPrint(card.isFileOpen() || TERN0(POWER_LOSS_RECOVERY, recovery.valid())); + else stopPrint(); } if (print_job_timer.isPaused() != paused) { paused = print_job_timer.isPaused(); - if (process == Print) Print_Screen_Icons(); - if (process == Wait && !paused) Redraw_Menu(true, true); + if (process == Print) printScreenIcons(); + if (process == Wait && !paused) redrawMenu(true, true); } if (wait_for_user && !(process == Confirm) && !print_job_timer.isPaused()) - Confirm_Handler(UserInput); + confirmHandler(UserInput); #if ENABLED(ADVANCED_PAUSE_FEATURE) if (process == Popup && popup == PurgeMore) { if (pause_menu_response == PAUSE_RESPONSE_EXTRUDE_MORE) - Popup_Handler(FilChange); + popupHandler(FilChange); else if (pause_menu_response == PAUSE_RESPONSE_RESUME_PRINT) { - if (printing) Popup_Handler(Resuming); - else Redraw_Menu(true, true, active_menu == PreheatHotend); + if (printing) popupHandler(Resuming); + else redrawMenu(true, true, active_menu == PreheatHotend); } } #endif @@ -4731,33 +4741,33 @@ void CrealityDWINClass::State_Update() { static bool ranout = false; if (runout.filament_ran_out != ranout) { ranout = runout.filament_ran_out; - if (ranout) Popup_Handler(Runout); + if (ranout) popupHandler(Runout); } #endif } -void CrealityDWINClass::Screen_Update() { +void CrealityDWIN::screenUpdate() { const millis_t ms = millis(); static millis_t scrltime = 0; if (ELAPSED(ms, scrltime)) { scrltime = ms + 200; - Update_Status_Bar(); - if (process == Print) Draw_Print_Filename(); + updateStatusBar(); + if (process == Print) drawPrintFilename(); } static millis_t statustime = 0; if (ELAPSED(ms, statustime)) { statustime = ms + 500; - Draw_Status_Area(); + drawStatusArea(); } static millis_t printtime = 0; if (ELAPSED(ms, printtime)) { printtime = ms + 1000; if (process == Print) { - Draw_Print_ProgressBar(); - Draw_Print_ProgressElapsed(); - TERN_(SET_REMAINING_TIME, Draw_Print_ProgressRemain()); + drawPrintProgressBar(); + drawPrintProgressElapsed(); + TERN_(SET_REMAINING_TIME, drawPrintProgressRemain()); } } @@ -4765,7 +4775,7 @@ void CrealityDWINClass::Screen_Update() { if (mounted != card.isMounted()) { mounted = card.isMounted(); if (process == File) - Draw_SD_List(); + drawSDList(); } #if HAS_HOTEND @@ -4806,7 +4816,7 @@ void CrealityDWINClass::Screen_Update() { hotendtarget = thermalManager.temp_hotend[0].target; if (scrollpos <= TEMP_HOTEND && TEMP_HOTEND <= scrollpos + MROWS) { if (process != Value || selection != TEMP_HOTEND - scrollpos) - Draw_Float(thermalManager.temp_hotend[0].target, TEMP_HOTEND - scrollpos, false, 1); + drawFloat(thermalManager.temp_hotend[0].target, TEMP_HOTEND - scrollpos, false, 1); } } #endif @@ -4815,7 +4825,7 @@ void CrealityDWINClass::Screen_Update() { bedtarget = thermalManager.temp_bed.target; if (scrollpos <= TEMP_BED && TEMP_BED <= scrollpos + MROWS) { if (process != Value || selection != TEMP_HOTEND - scrollpos) - Draw_Float(thermalManager.temp_bed.target, TEMP_BED - scrollpos, false, 1); + drawFloat(thermalManager.temp_bed.target, TEMP_BED - scrollpos, false, 1); } } #endif @@ -4824,7 +4834,7 @@ void CrealityDWINClass::Screen_Update() { fanspeed = thermalManager.fan_speed[0]; if (scrollpos <= TEMP_FAN && TEMP_FAN <= scrollpos + MROWS) { if (process != Value || selection != TEMP_HOTEND - scrollpos) - Draw_Float(thermalManager.fan_speed[0], TEMP_FAN - scrollpos, false, 1); + drawFloat(thermalManager.fan_speed[0], TEMP_FAN - scrollpos, false, 1); } } #endif @@ -4835,7 +4845,7 @@ void CrealityDWINClass::Screen_Update() { hotendtarget = thermalManager.temp_hotend[0].target; if (scrollpos <= TUNE_HOTEND && TUNE_HOTEND <= scrollpos + MROWS) { if (process != Value || selection != TEMP_HOTEND - scrollpos) - Draw_Float(thermalManager.temp_hotend[0].target, TUNE_HOTEND - scrollpos, false, 1); + drawFloat(thermalManager.temp_hotend[0].target, TUNE_HOTEND - scrollpos, false, 1); } } #endif @@ -4844,7 +4854,7 @@ void CrealityDWINClass::Screen_Update() { bedtarget = thermalManager.temp_bed.target; if (scrollpos <= TUNE_BED && TUNE_BED <= scrollpos + MROWS) { if (process != Value || selection != TEMP_HOTEND - scrollpos) - Draw_Float(thermalManager.temp_bed.target, TUNE_BED - scrollpos, false, 1); + drawFloat(thermalManager.temp_bed.target, TUNE_BED - scrollpos, false, 1); } } #endif @@ -4853,7 +4863,7 @@ void CrealityDWINClass::Screen_Update() { fanspeed = thermalManager.fan_speed[0]; if (scrollpos <= TUNE_FAN && TUNE_FAN <= scrollpos + MROWS) { if (process != Value || selection != TEMP_HOTEND - scrollpos) - Draw_Float(thermalManager.fan_speed[0], TUNE_FAN - scrollpos, false, 1); + drawFloat(thermalManager.fan_speed[0], TUNE_FAN - scrollpos, false, 1); } } #endif @@ -4862,25 +4872,25 @@ void CrealityDWINClass::Screen_Update() { } } -void CrealityDWINClass::AudioFeedback(const bool success/*=true*/) { +void CrealityDWIN::audioFeedback(const bool success/*=true*/) { if (ui.sound_on) DONE_BUZZ(success); else - Update_Status(success ? "Success" : "Failed"); + updateStatus(success ? "Success" : "Failed"); } -void CrealityDWINClass::Save_Settings(char * const buff) { +void CrealityDWIN::saveSettings(char * const buff) { TERN_(AUTO_BED_LEVELING_UBL, eeprom_settings.tilt_grid_size = mesh_conf.tilt_grid - 1); eeprom_settings.corner_pos = corner_pos * 10; memcpy(buff, &eeprom_settings, _MIN(sizeof(eeprom_settings), eeprom_data_size)); } -void CrealityDWINClass::Load_Settings(const char * const buff) { +void CrealityDWIN::loadSettings(const char * const buff) { memcpy(&eeprom_settings, buff, _MIN(sizeof(eeprom_settings), eeprom_data_size)); TERN_(AUTO_BED_LEVELING_UBL, mesh_conf.tilt_grid = eeprom_settings.tilt_grid_size + 1); if (eeprom_settings.corner_pos == 0) eeprom_settings.corner_pos = 325; corner_pos = eeprom_settings.corner_pos / 10.0f; - Redraw_Screen(); + redrawScreen(); #if ENABLED(POWER_LOSS_RECOVERY) static bool init = true; if (init) { @@ -4890,7 +4900,7 @@ void CrealityDWINClass::Load_Settings(const char * const buff) { #endif } -void CrealityDWINClass::Reset_Settings() { +void CrealityDWIN::resetSettings() { eeprom_settings.time_format_textual = false; TERN_(AUTO_BED_LEVELING_UBL, eeprom_settings.tilt_grid_size = 0); eeprom_settings.corner_pos = 325; @@ -4908,36 +4918,36 @@ void CrealityDWINClass::Reset_Settings() { TERN_(AUTO_BED_LEVELING_UBL, mesh_conf.tilt_grid = eeprom_settings.tilt_grid_size + 1); corner_pos = eeprom_settings.corner_pos / 10.0f; TERN_(SOUND_MENU_ITEM, ui.sound_on = ENABLED(SOUND_ON_DEFAULT)); - Redraw_Screen(); + redrawScreen(); } void MarlinUI::init_lcd() { delay(800); SERIAL_ECHOPGM("\nDWIN handshake "); - if (DWIN_Handshake()) SERIAL_ECHOLNPGM("ok."); else SERIAL_ECHOLNPGM("error."); - DWIN_Frame_SetDir(1); // Orientation 90° - DWIN_UpdateLCD(); // Show bootscreen (first image) - Encoder_Configuration(); + if (dwinHandshake()) SERIAL_ECHOLNPGM("ok."); else SERIAL_ECHOLNPGM("error."); + dwinFrameSetDir(1); // Orientation 90° + dwinUpdateLCD(); // Show bootscreen (first image) + encoderConfiguration(); for (uint16_t t = 0; t <= 100; t += 2) { - DWIN_ICON_Show(ICON, ICON_Bar, 15, 260); - DWIN_Draw_Rectangle(1, Color_Bg_Black, 15 + t * 242 / 100, 260, 257, 280); - DWIN_UpdateLCD(); + dwinIconShow(ICON, ICON_Bar, 15, 260); + dwinDrawRectangle(1, Color_Bg_Black, 15 + t * 242 / 100, 260, 257, 280); + dwinUpdateLCD(); delay(20); } - DWIN_JPG_ShowAndCache(3); - DWIN_JPG_CacheTo1(Language_English); - CrealityDWIN.Redraw_Screen(); + dwinJPGShowAndCache(3); + dwinJPGCacheTo1(Language_English); + crealityDWIN.redrawScreen(); } #if ENABLED(ADVANCED_PAUSE_FEATURE) void MarlinUI::pause_show_message(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) { switch (message) { - case PAUSE_MESSAGE_INSERT: CrealityDWIN.Confirm_Handler(FilInsert); break; + case PAUSE_MESSAGE_INSERT: crealityDWIN.confirmHandler(FilInsert); break; case PAUSE_MESSAGE_PURGE: - case PAUSE_MESSAGE_OPTION: CrealityDWIN.Popup_Handler(PurgeMore); break; - case PAUSE_MESSAGE_HEAT: CrealityDWIN.Confirm_Handler(HeaterTime); break; - case PAUSE_MESSAGE_WAITING: CrealityDWIN.Draw_Print_Screen(); break; + case PAUSE_MESSAGE_OPTION: crealityDWIN.popupHandler(PurgeMore); break; + case PAUSE_MESSAGE_HEAT: crealityDWIN.confirmHandler(HeaterTime); break; + case PAUSE_MESSAGE_WAITING: crealityDWIN.drawPrintScreen(); break; default: break; } } diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.h b/Marlin/src/lcd/e3v2/jyersui/dwin.h index 71db445aa8..450345d1a2 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.h +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.h @@ -30,6 +30,7 @@ #include "../common/dwin_font.h" #include "../common/dwin_color.h" #include "../common/encoder.h" +#include "../common/limits.h" #include "../../../libs/BL24CXX.h" #include "../../../inc/MarlinConfigPre.h" @@ -147,7 +148,7 @@ enum colorID : uint8_t { #define Confirm_Color 0x34B9 #define Cancel_Color 0x3186 -class CrealityDWINClass { +class CrealityDWIN { public: static constexpr size_t eeprom_data_size = 48; static struct EEPROM_Settings { // use bit fields to save space, max 48 bytes @@ -172,76 +173,76 @@ public: static constexpr const char * const color_names[11] = { "Default", "White", "Green", "Cyan", "Blue", "Magenta", "Red", "Orange", "Yellow", "Brown", "Black" }; static constexpr const char * const preheat_modes[3] = { "Both", "Hotend", "Bed" }; - static void Clear_Screen(const uint8_t e=3); - static void Draw_Float(const_float_t value, const uint8_t row, const bool selected=false, const uint8_t minunit=10); - static void Draw_Option(const uint8_t value, const char * const * options, const uint8_t row, const bool selected=false, const bool color=false); - static uint16_t GetColor(const uint8_t color, const uint16_t original, const bool light=false); - static void Draw_Checkbox(const uint8_t row, const bool value); - static void Draw_Title(const char * const title); - static void Draw_Title(FSTR_P const title); - static void Draw_Menu_Item(const uint8_t row, uint8_t icon=0, const char * const label1=nullptr, const char * const label2=nullptr, const bool more=false, const bool centered=false); - static void Draw_Menu_Item(const uint8_t row, uint8_t icon=0, FSTR_P const flabel1=nullptr, FSTR_P const flabel2=nullptr, const bool more=false, const bool centered=false); - static void Draw_Menu(const uint8_t menu, const uint8_t select=0, const uint8_t scroll=0); - static void Redraw_Menu(const bool lastproc=true, const bool lastsel=false, const bool lastmenu=false); - static void Redraw_Screen(); + static void clearScreen(const uint8_t e=3); + static void drawFloat(const_float_t value, const uint8_t row, const bool selected=false, const uint8_t minunit=10); + static void drawOption(const uint8_t value, const char * const * options, const uint8_t row, const bool selected=false, const bool color=false); + static uint16_t getColor(const uint8_t color, const uint16_t original, const bool light=false); + static void drawCheckbox(const uint8_t row, const bool value); + static void drawTitle(const char * const title); + static void drawTitle(FSTR_P const title); + static void drawMenuItem(const uint8_t row, uint8_t icon=0, const char * const label1=nullptr, const char * const label2=nullptr, const bool more=false, const bool centered=false); + static void drawMenuItem(const uint8_t row, uint8_t icon=0, FSTR_P const flabel1=nullptr, FSTR_P const flabel2=nullptr, const bool more=false, const bool centered=false); + static void drawMenu(const uint8_t menu, const uint8_t select=0, const uint8_t scroll=0); + static void redrawMenu(const bool lastproc=true, const bool lastsel=false, const bool lastmenu=false); + static void redrawScreen(); - static void Main_Menu_Icons(); - static void Draw_Main_Menu(uint8_t select=0); - static void Print_Screen_Icons(); - static void Draw_Print_Screen(); - static void Draw_Print_Filename(const bool reset=false); - static void Draw_Print_ProgressBar(); + static void mainMenuIcons(); + static void drawMainMenu(uint8_t select=0); + static void printScreenIcons(); + static void drawPrintScreen(); + static void drawPrintFilename(const bool reset=false); + static void drawPrintProgressBar(); #if ENABLED(SET_REMAINING_TIME) - static void Draw_Print_ProgressRemain(); + static void drawPrintProgressRemain(); #endif - static void Draw_Print_ProgressElapsed(); - static void Draw_Print_confirm(); - static void Draw_SD_Item(const uint8_t item, const uint8_t row); - static void Draw_SD_List(const bool removed=false); - static void Draw_Status_Area(const bool icons=false); - static void Draw_Popup(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, uint8_t mode, uint8_t icon=0); - static void Popup_Select(); - static void Update_Status_Bar(const bool refresh=false); + static void drawPrintProgressElapsed(); + static void drawPrintConfirm(); + static void drawSDItem(const uint8_t item, const uint8_t row); + static void drawSDList(const bool removed=false); + static void drawStatusArea(const bool icons=false); + static void drawPopup(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, uint8_t mode, uint8_t icon=0); + static void popupSelect(); + static void updateStatusBar(const bool refresh=false); #if HAS_MESH - static void Set_Mesh_Viewer_Status(); + static void setMeshViewerStatus(); #endif - static FSTR_P Get_Menu_Title(const uint8_t menu); - static uint8_t Get_Menu_Size(const uint8_t menu); - static void Menu_Item_Handler(const uint8_t menu, const uint8_t item, bool draw=true); + static FSTR_P getMenuTitle(const uint8_t menu); + static uint8_t getMenuSize(const uint8_t menu); + static void menuItemHandler(const uint8_t menu, const uint8_t item, bool draw=true); - static void Popup_Handler(const PopupID popupid, bool option=false); - static void Confirm_Handler(const PopupID popupid); + static void popupHandler(const PopupID popupid, bool option=false); + static void confirmHandler(const PopupID popupid); - static void Main_Menu_Control(); - static void Menu_Control(); - static void Value_Control(); - static void Option_Control(); - static void File_Control(); - static void Print_Screen_Control(); - static void Popup_Control(); - static void Confirm_Control(); + static void mainMenuControl(); + static void menuControl(); + static void valueControl(); + static void optionControl(); + static void fileControl(); + static void printScreenControl(); + static void popupControl(); + static void confirmControl(); - static void Setup_Value(const_float_t value, const_float_t min, const_float_t max, const_float_t unit, const uint8_t type); - static void Modify_Value(float &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); - static void Modify_Value(uint8_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); - static void Modify_Value(uint16_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); - static void Modify_Value(int16_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); - static void Modify_Value(uint32_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); - static void Modify_Value(int8_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); - static void Modify_Option(const uint8_t value, const char * const * options, const uint8_t max); + static void setupValue(const_float_t value, const_float_t min, const_float_t max, const_float_t unit, const uint8_t type); + static void modifyValue(float &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); + static void modifyValue(uint8_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); + static void modifyValue(uint16_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); + static void modifyValue(int16_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); + static void modifyValue(uint32_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); + static void modifyValue(int8_t &value, const_float_t min, const_float_t max, const_float_t unit, void (*f)()=nullptr); + static void modifyOption(const uint8_t value, const char * const * options, const uint8_t max); - static void Update_Status(const char * const text); - static void Start_Print(const bool sd); - static void Stop_Print(); - static void Update(); - static void State_Update(); - static void Screen_Update(); - static void AudioFeedback(const bool success=true); - static void Save_Settings(char * const buff); - static void Load_Settings(const char * const buff); - static void Reset_Settings(); + static void updateStatus(const char * const text); + static void startPrint(const bool sd); + static void stopPrint(); + static void update(); + static void stateUpdate(); + static void screenUpdate(); + static void audioFeedback(const bool success=true); + static void saveSettings(char * const buff); + static void loadSettings(const char * const buff); + static void resetSettings(); }; -extern CrealityDWINClass CrealityDWIN; +extern CrealityDWIN crealityDWIN; diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.cpp index 04889e92b0..96518b8c21 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.cpp @@ -33,22 +33,22 @@ /*-------------------------------------- System variable function --------------------------------------*/ -void DWIN_Startup() {} +void dwinStartup() {} /*---------------------------------------- Drawing functions ----------------------------------------*/ // Draw the degree (°) symbol -// Color: color +// color: color // x/y: Upper-left coordinate of the first pixel -void DWIN_Draw_DegreeSymbol(uint16_t Color, uint16_t x, uint16_t y) { - DWIN_Draw_Point(Color, 1, 1, x + 1, y); - DWIN_Draw_Point(Color, 1, 1, x + 2, y); - DWIN_Draw_Point(Color, 1, 1, x, y + 1); - DWIN_Draw_Point(Color, 1, 1, x + 3, y + 1); - DWIN_Draw_Point(Color, 1, 1, x, y + 2); - DWIN_Draw_Point(Color, 1, 1, x + 3, y + 2); - DWIN_Draw_Point(Color, 1, 1, x + 1, y + 3); - DWIN_Draw_Point(Color, 1, 1, x + 2, y + 3); +void dwinDrawDegreeSymbol(uint16_t color, uint16_t x, uint16_t y) { + dwinDrawPoint(color, 1, 1, x + 1, y); + dwinDrawPoint(color, 1, 1, x + 2, y); + dwinDrawPoint(color, 1, 1, x, y + 1); + dwinDrawPoint(color, 1, 1, x + 3, y + 1); + dwinDrawPoint(color, 1, 1, x, y + 2); + dwinDrawPoint(color, 1, 1, x + 3, y + 2); + dwinDrawPoint(color, 1, 1, x + 1, y + 3); + dwinDrawPoint(color, 1, 1, x + 2, y + 3); } /*---------------------------------------- Picture related functions ----------------------------------------*/ @@ -57,8 +57,8 @@ void DWIN_Draw_DegreeSymbol(uint16_t Color, uint16_t x, uint16_t y) { // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { - DWIN_ICON_Show(true, false, false, libID, picID, x, y); +void dwinIconShow(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { + dwinIconShow(true, false, false, libID, picID, x, y); } #endif // DWIN_CREALITY_LCD_JYERSUI diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.h b/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.h index f76cfb5d3e..a9335a4f23 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.h +++ b/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.h @@ -29,6 +29,6 @@ #include "../common/dwin_api.h" // Draw the degree (°) symbol -// Color: color +// color: color // x/y: Upper-left coordinate of the first pixel -void DWIN_Draw_DegreeSymbol(uint16_t Color, uint16_t x, uint16_t y); +void dwinDrawDegreeSymbol(uint16_t color, uint16_t x, uint16_t y); diff --git a/Marlin/src/lcd/e3v2/marlinui/dwin_lcd.cpp b/Marlin/src/lcd/e3v2/marlinui/dwin_lcd.cpp index 7154270bff..b6c26d4fe1 100644 --- a/Marlin/src/lcd/e3v2/marlinui/dwin_lcd.cpp +++ b/Marlin/src/lcd/e3v2/marlinui/dwin_lcd.cpp @@ -39,15 +39,15 @@ /*-------------------------------------- System variable function --------------------------------------*/ -void DWIN_Startup() { +void dwinStartup() { DEBUG_ECHOPGM("\r\nDWIN handshake "); delay(750); // Delay here or init later in the boot process - const bool success = DWIN_Handshake(); + const bool success = dwinHandshake(); if (success) DEBUG_ECHOLNPGM("ok."); else DEBUG_ECHOLNPGM("error."); - DWIN_Frame_SetDir(TERN(DWIN_MARLINUI_LANDSCAPE, 0, 1)); - DWIN_Frame_Clear(Color_Bg_Black); // MarlinUI handles the bootscreen so just clear here - DWIN_JPG_ShowAndCache(3); - DWIN_UpdateLCD(); + dwinFrameSetDir(TERN(DWIN_MARLINUI_LANDSCAPE, 0, 1)); + dwinFrameClear(Color_Bg_Black); // MarlinUI handles the bootscreen so just clear here + dwinJPGShowAndCache(3); + dwinUpdateLCD(); } /*---------------------------------------- Picture related functions ----------------------------------------*/ @@ -56,8 +56,8 @@ void DWIN_Startup() { // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { - DWIN_ICON_Show(true, false, false, libID, picID, x, y); +void dwinIconShow(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { + dwinIconShow(true, false, false, libID, picID, x, y); } #endif // IS_DWIN_MARLINUI diff --git a/Marlin/src/lcd/e3v2/marlinui/dwin_string.cpp b/Marlin/src/lcd/e3v2/marlinui/dwin_string.cpp index 6d60608426..7830d5a37c 100644 --- a/Marlin/src/lcd/e3v2/marlinui/dwin_string.cpp +++ b/Marlin/src/lcd/e3v2/marlinui/dwin_string.cpp @@ -25,7 +25,7 @@ #if IS_DWIN_MARLINUI #include "dwin_string.h" -//#include "../../fontutils.h" +//#include "../../utf8.h" char DWIN_String::data[]; uint16_t DWIN_String::span; @@ -133,7 +133,7 @@ void DWIN_String::add_character(const char character) { if (length < MAX_STRING_LENGTH) { data[length] = character; length++; - //span += glyph(character)->DWidth; + //span += glyph(character)->dWidth; } } @@ -141,7 +141,7 @@ void DWIN_String::rtrim(const char character) { while (length) { if (data[length - 1] == 0x20 || data[length - 1] == character) { length--; - //span -= glyph(data[length])->DWidth; + //span -= glyph(data[length])->dWidth; eol(); } else @@ -152,7 +152,7 @@ void DWIN_String::rtrim(const char character) { void DWIN_String::ltrim(const char character) { uint16_t i, j; for (i = 0; (i < length) && (data[i] == 0x20 || data[i] == character); i++) { - //span -= glyph(data[i])->DWidth; + //span -= glyph(data[i])->dWidth; } if (i == 0) return; for (j = 0; i < length; data[j++] = data[i++]); diff --git a/Marlin/src/lcd/e3v2/marlinui/dwin_string.h b/Marlin/src/lcd/e3v2/marlinui/dwin_string.h index 686b1aa2b1..5d38131014 100644 --- a/Marlin/src/lcd/e3v2/marlinui/dwin_string.h +++ b/Marlin/src/lcd/e3v2/marlinui/dwin_string.h @@ -23,7 +23,7 @@ // TODO: Make AVR-compatible with separate ROM / RAM string methods -#include "../../fontutils.h" +#include "../../utf8.h" #include "../../marlinui.h" #include @@ -55,7 +55,7 @@ class DWIN_String { //static void add_glyphs(const uint8_t *font); //static font_t *font() { return font_header; }; - //static uint16_t font_height() { return font_header->FontAscent - font_header->FontDescent; } + //static uint16_t font_height() { return font_header->fontAscent - font_header->fontDescent; } //static glyph_t *glyph(uint8_t character) { return glyphs[character] ?: glyphs[0x3F]; } /* Use '?' for unknown glyphs */ //static glyph_t *glyph(uint8_t *character) { return glyph(*character); } diff --git a/Marlin/src/lcd/e3v2/marlinui/lcdprint_dwin.cpp b/Marlin/src/lcd/e3v2/marlinui/lcdprint_dwin.cpp index e603882e0c..f689a6ff69 100644 --- a/Marlin/src/lcd/e3v2/marlinui/lcdprint_dwin.cpp +++ b/Marlin/src/lcd/e3v2/marlinui/lcdprint_dwin.cpp @@ -56,7 +56,7 @@ void lcd_put_int(const int i) { } int lcd_put_dwin_string() { - DWIN_Draw_String(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); + dwinDrawString(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); lcd_advance_cursor(dwin_string.length); return dwin_string.length; } @@ -67,7 +67,7 @@ int lcd_put_lchar_max(const lchar_t &c, const pixel_len_t max_length) { dwin_string.set(c); dwin_string.truncate(max_length); // Draw the char(s) at the cursor and advance the cursor - DWIN_Draw_String(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); + dwinDrawString(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); lcd_advance_cursor(dwin_string.length); return dwin_string.length; } @@ -92,7 +92,7 @@ static int lcd_put_u8str_max_cb(const char * utf8_str, read_byte_cb_t cb_read_by if (!wc) break; dwin_string.add(wc); } - DWIN_Draw_String(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); + dwinDrawString(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); lcd_advance_cursor(dwin_string.length); return dwin_string.length; } @@ -108,7 +108,7 @@ int lcd_put_u8str_max_P(PGM_P utf8_pstr, const pixel_len_t max_length) { lcd_uint_t lcd_put_u8str_P(PGM_P const ptpl, const int8_t ind, const char * const cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { dwin_string.set(ptpl, ind, cstr, fstr); dwin_string.truncate(maxlen); - DWIN_Draw_String(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); + dwinDrawString(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); lcd_advance_cursor(dwin_string.length); return dwin_string.length; } diff --git a/Marlin/src/lcd/e3v2/marlinui/ui_common.cpp b/Marlin/src/lcd/e3v2/marlinui/ui_common.cpp index 4b34d65100..817699fd8a 100644 --- a/Marlin/src/lcd/e3v2/marlinui/ui_common.cpp +++ b/Marlin/src/lcd/e3v2/marlinui/ui_common.cpp @@ -28,9 +28,8 @@ #include "dwin_lcd.h" #include "dwin_string.h" -//#include "../../lcdprint.h" #include "lcdprint_dwin.h" -#include "../../fontutils.h" +#include "../../utf8.h" #include "../../../libs/numtostr.h" #include "../../marlinui.h" @@ -79,14 +78,14 @@ void MarlinUI::set_font(const uint8_t font_nr) { bool MarlinUI::detected() { return true; } // Initialize or re-initialize the LCD -void MarlinUI::init_lcd() { DWIN_Startup(); } +void MarlinUI::init_lcd() { dwinStartup(); } // This LCD should clear where it will draw anew void MarlinUI::clear_lcd() { - DWIN_ICON_AnimationControl(0x0000); // disable all icon animations - DWIN_JPG_ShowAndCache(3); - DWIN_Frame_Clear(Color_Bg_Black); - DWIN_UpdateLCD(); + dwinIconAnimationControl(0x0000); // disable all icon animations + dwinJPGShowAndCache(3); + dwinFrameClear(Color_Bg_Black); + dwinUpdateLCD(); did_first_redraw = false; } @@ -110,25 +109,25 @@ void MarlinUI::clear_lcd() { #define VERSION_Y 84 #endif - DWIN_Draw_String(false, font10x20, Color_Yellow, Color_Bg_Black, INFO_CENTER - (dwin_string.length * 10) / 2, VERSION_Y, S(dwin_string.string())); + dwinDrawString(false, font10x20, Color_Yellow, Color_Bg_Black, INFO_CENTER - (dwin_string.length * 10) / 2, VERSION_Y, S(dwin_string.string())); TERN_(SHOW_CUSTOM_BOOTSCREEN, safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT)); clear_lcd(); - DWIN_ICON_Show(BOOT_ICON, ICON_MarlinBoot, LOGO_CENTER - 266 / 2, 15); + dwinIconShow(BOOT_ICON, ICON_MarlinBoot, LOGO_CENTER - 266 / 2, 15); #if ENABLED(DWIN_MARLINUI_PORTRAIT) - DWIN_ICON_Show(BOOT_ICON, ICON_OpenSource, LOGO_CENTER - 174 / 2, 280); - DWIN_ICON_Show(BOOT_ICON, ICON_GitHubURL, LOGO_CENTER - 180 / 2, 420); - DWIN_ICON_Show(BOOT_ICON, ICON_MarlinURL, LOGO_CENTER - 100 / 2, 440); - DWIN_ICON_Show(BOOT_ICON, ICON_Copyright, LOGO_CENTER - 126 / 2, 460); + dwinIconShow(BOOT_ICON, ICON_OpenSource, LOGO_CENTER - 174 / 2, 280); + dwinIconShow(BOOT_ICON, ICON_GitHubURL, LOGO_CENTER - 180 / 2, 420); + dwinIconShow(BOOT_ICON, ICON_MarlinURL, LOGO_CENTER - 100 / 2, 440); + dwinIconShow(BOOT_ICON, ICON_Copyright, LOGO_CENTER - 126 / 2, 460); #else - DWIN_ICON_Show(BOOT_ICON, ICON_MarlinBoot, LOGO_CENTER - 266 / 2, 15); - DWIN_ICON_Show(BOOT_ICON, ICON_OpenSource, INFO_CENTER - 174 / 2, 60); - DWIN_ICON_Show(BOOT_ICON, ICON_GitHubURL, INFO_CENTER - 180 / 2, 130); - DWIN_ICON_Show(BOOT_ICON, ICON_MarlinURL, INFO_CENTER - 100 / 2, 152); - DWIN_ICON_Show(BOOT_ICON, ICON_Copyright, INFO_CENTER - 126 / 2, 200); + dwinIconShow(BOOT_ICON, ICON_MarlinBoot, LOGO_CENTER - 266 / 2, 15); + dwinIconShow(BOOT_ICON, ICON_OpenSource, INFO_CENTER - 174 / 2, 60); + dwinIconShow(BOOT_ICON, ICON_GitHubURL, INFO_CENTER - 180 / 2, 130); + dwinIconShow(BOOT_ICON, ICON_MarlinURL, INFO_CENTER - 100 / 2, 152); + dwinIconShow(BOOT_ICON, ICON_Copyright, INFO_CENTER - 126 / 2, 200); #endif - DWIN_Draw_String(false, font10x20, Color_Yellow, Color_Bg_Black, INFO_CENTER - (dwin_string.length * 10) / 2, VERSION_Y, S(dwin_string.string())); - DWIN_UpdateLCD(); + dwinDrawString(false, font10x20, Color_Yellow, Color_Bg_Black, INFO_CENTER - (dwin_string.length * 10) / 2, VERSION_Y, S(dwin_string.string())); + dwinUpdateLCD(); } void MarlinUI::bootscreen_completion(const millis_t sofar) { @@ -141,23 +140,23 @@ void MarlinUI::clear_lcd() { // The kill screen is displayed for unrecoverable conditions void MarlinUI::draw_kill_screen() { set_font(DWIN_FONT_ALERT); - DWIN_Frame_Clear(Color_Bg_Black); + dwinFrameClear(Color_Bg_Black); dwin_font.fg = Color_Error_Red; dwin_font.solid = false; - DWIN_Draw_Rectangle(1, Color_Bg_Window, 20, 20, LCD_PIXEL_WIDTH - 20, LCD_PIXEL_HEIGHT - 20); + dwinDrawRectangle(1, Color_Bg_Window, 20, 20, LCD_PIXEL_WIDTH - 20, LCD_PIXEL_HEIGHT - 20); // make the frame a few pixels thick - DWIN_Draw_Rectangle(0, Color_Yellow, 20, 20, LCD_PIXEL_WIDTH - 20, LCD_PIXEL_HEIGHT - 20); - DWIN_Draw_Rectangle(0, Color_Yellow, 21, 21, LCD_PIXEL_WIDTH - 21, LCD_PIXEL_HEIGHT - 21); - DWIN_Draw_Rectangle(0, Color_Yellow, 22, 22, LCD_PIXEL_WIDTH - 22, LCD_PIXEL_HEIGHT - 22); + dwinDrawRectangle(0, Color_Yellow, 20, 20, LCD_PIXEL_WIDTH - 20, LCD_PIXEL_HEIGHT - 20); + dwinDrawRectangle(0, Color_Yellow, 21, 21, LCD_PIXEL_WIDTH - 21, LCD_PIXEL_HEIGHT - 21); + dwinDrawRectangle(0, Color_Yellow, 22, 22, LCD_PIXEL_WIDTH - 22, LCD_PIXEL_HEIGHT - 22); uint8_t cx = (LCD_PIXEL_WIDTH / dwin_font.width / 2), cy = (LCD_PIXEL_HEIGHT / dwin_font.height / 2); #if ENABLED(DWIN_MARLINUI_LANDSCAPE) cx += (96 / 2 / dwin_font.width); - DWIN_ICON_Show(ICON, ICON_Halted, 40, (LCD_PIXEL_HEIGHT - 96) / 2); + dwinIconShow(ICON, ICON_Halted, 40, (LCD_PIXEL_HEIGHT - 96) / 2); #else - DWIN_ICON_Show(ICON, ICON_Halted, (LCD_PIXEL_WIDTH - 96) / 2, 40); + dwinIconShow(ICON, ICON_Halted, (LCD_PIXEL_WIDTH - 96) / 2, 40); #endif uint8_t slen = utf8_strlen(status_message); @@ -261,7 +260,7 @@ void MarlinUI::draw_status_message(const bool blink) { } #if HAS_LCD_BRIGHTNESS - void MarlinUI::_set_brightness() { DWIN_LCD_Brightness(backlight ? brightness : 0); } + void MarlinUI::_set_brightness() { dwinLCDBrightness(backlight ? brightness : 0); } #endif #if HAS_MARLINUI_MENU @@ -296,13 +295,13 @@ void MarlinUI::draw_status_message(const bool blink) { if (y >= LCD_PIXEL_HEIGHT) return false; if (is_static && sel) - DWIN_Draw_Box(1, Color_Bg_Heading, 0, y, LCD_PIXEL_WIDTH, MENU_LINE_HEIGHT - 1); + dwinDrawBox(1, Color_Bg_Heading, 0, y, LCD_PIXEL_WIDTH, MENU_LINE_HEIGHT - 1); else { #if ENABLED(MENU_HOLLOW_FRAME) - DWIN_Draw_Box(1, Color_Bg_Black, 0, y, LCD_PIXEL_WIDTH, MENU_LINE_HEIGHT - 1); - if (sel) DWIN_Draw_Box(0, Select_Color, 0, y, LCD_PIXEL_WIDTH, MENU_LINE_HEIGHT - 1); + dwinDrawBox(1, Color_Bg_Black, 0, y, LCD_PIXEL_WIDTH, MENU_LINE_HEIGHT - 1); + if (sel) dwinDrawBox(0, Select_Color, 0, y, LCD_PIXEL_WIDTH, MENU_LINE_HEIGHT - 1); #else - DWIN_Draw_Box(1, sel ? Select_Color : Color_Bg_Black, 0, y, LCD_PIXEL_WIDTH, MENU_LINE_HEIGHT - 1); + dwinDrawBox(1, sel ? Select_Color : Color_Bg_Black, 0, y, LCD_PIXEL_WIDTH, MENU_LINE_HEIGHT - 1); #endif } @@ -426,7 +425,7 @@ void MarlinUI::draw_status_message(const bool blink) { dwin_string.set(value); const dwin_coord_t by = (row * MENU_LINE_HEIGHT) + MENU_FONT_HEIGHT + EXTRA_ROW_HEIGHT / 2; - DWIN_Draw_String(true, font16x32, Color_Yellow, Color_Bg_Black, (LCD_PIXEL_WIDTH - vallen * 16) / 2, by, S(dwin_string.string())); + dwinDrawString(true, font16x32, Color_Yellow, Color_Bg_Black, (LCD_PIXEL_WIDTH - vallen * 16) / 2, by, S(dwin_string.string())); if (ui.can_show_slider()) { @@ -436,11 +435,11 @@ void MarlinUI::draw_status_message(const bool blink) { slider_y = by + 32 + 4, amount = ui.encoderPosition * slider_length / maxEditValue; - DWIN_Draw_Rectangle(1, Color_Bg_Window, slider_x - 1, slider_y - 1, slider_x - 1 + slider_length + 2 - 1, slider_y - 1 + slider_height + 2 - 1); + dwinDrawRectangle(1, Color_Bg_Window, slider_x - 1, slider_y - 1, slider_x - 1 + slider_length + 2 - 1, slider_y - 1 + slider_height + 2 - 1); if (amount > 0) - DWIN_Draw_Box(1, BarFill_Color, slider_x, slider_y, amount, slider_height); + dwinDrawBox(1, BarFill_Color, slider_x, slider_y, amount, slider_height); if (amount < slider_length) - DWIN_Draw_Box(1, Color_Bg_Black, slider_x + amount, slider_y, slider_length - amount, slider_height); + dwinDrawBox(1, Color_Bg_Black, slider_x + amount, slider_y, slider_length - amount, slider_height); } } } @@ -451,7 +450,7 @@ void MarlinUI::draw_status_message(const bool blink) { col = yesopt ? LCD_WIDTH - mar - len : mar, row = (LCD_HEIGHT >= 8 ? LCD_HEIGHT / 2 + 3 : LCD_HEIGHT - 1); lcd_moveto(col, row); - DWIN_Draw_Box(1, inv ? Select_Color : Color_Bg_Black, cursor.x - dwin_font.width, cursor.y + 1, dwin_font.width * (len + 2), dwin_font.height + 2); + dwinDrawBox(1, inv ? Select_Color : Color_Bg_Black, cursor.x - dwin_font.width, cursor.y + 1, dwin_font.width * (len + 2), dwin_font.height + 2); lcd_put_u8str(col, row, fstr); } @@ -513,9 +512,9 @@ void MarlinUI::draw_status_message(const bool blink) { // Clear the Mesh Map // First draw the bigger box in White so we have a border around the mesh map box - DWIN_Draw_Rectangle(1, Color_White, x_offset - 2, y_offset - 2, x_offset + 2 + x_map_pixels, y_offset + 2 + y_map_pixels); + dwinDrawRectangle(1, Color_White, x_offset - 2, y_offset - 2, x_offset + 2 + x_map_pixels, y_offset + 2 + y_map_pixels); // Now actually clear the mesh map box - DWIN_Draw_Rectangle(1, Color_Bg_Black, x_offset, y_offset, x_offset + x_map_pixels, y_offset + y_map_pixels); + dwinDrawRectangle(1, Color_Bg_Black, x_offset, y_offset, x_offset + x_map_pixels, y_offset + y_map_pixels); // Fill in the Specified Mesh Point @@ -523,7 +522,7 @@ void MarlinUI::draw_status_message(const bool blink) { // invert the Y to get it to plot in the right location. const dwin_coord_t by = y_offset + y_plot_inv * pixels_per_y_mesh_pnt; - DWIN_Draw_Rectangle(1, Select_Color, + dwinDrawRectangle(1, Select_Color, x_offset + (x_plot * pixels_per_x_mesh_pnt), by, x_offset + (x_plot * pixels_per_x_mesh_pnt) + pixels_per_x_mesh_pnt, by + pixels_per_y_mesh_pnt ); @@ -533,7 +532,7 @@ void MarlinUI::draw_status_message(const bool blink) { dwin_coord_t y = y_offset + pixels_per_y_mesh_pnt / 2; for (uint8_t j = 0; j < (GRID_MAX_POINTS_Y); j++, y += pixels_per_y_mesh_pnt) for (uint8_t i = 0, x = sx; i < (GRID_MAX_POINTS_X); i++, x += pixels_per_x_mesh_pnt) - DWIN_Draw_Point(Color_White, 1, 1, x, y); + dwinDrawPoint(Color_White, 1, 1, x, y); // Put Relevant Text on Display @@ -583,7 +582,7 @@ void MarlinUI::draw_status_message(const bool blink) { #endif // AUTO_BED_LEVELING_UBL - #if EITHER(BABYSTEP_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + #if ANY(BABYSTEP_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) void MarlinUI::zoffset_overlay(const int8_t dir) { const int rot_up = TERN(OVERLAY_GFX_REVERSE, ICON_RotateCCW, ICON_RotateCW), @@ -592,17 +591,17 @@ void MarlinUI::draw_status_message(const bool blink) { const int nozzle = (LCD_PIXEL_WIDTH / 2) - 20; // Draw a representation of the nozzle - DWIN_Draw_Box(1, Color_Bg_Black, nozzle + 3, 8, 48, 52); // 'clear' the area where the nozzle is drawn in case it was moved up/down - DWIN_ICON_Show(ICON, ICON_HotendOff, nozzle + 3, 10 - dir); - DWIN_ICON_Show(ICON, ICON_BedLine, nozzle, 10 + 36); + dwinDrawBox(1, Color_Bg_Black, nozzle + 3, 8, 48, 52); // 'clear' the area where the nozzle is drawn in case it was moved up/down + dwinIconShow(ICON, ICON_HotendOff, nozzle + 3, 10 - dir); + dwinIconShow(ICON, ICON_BedLine, nozzle, 10 + 36); // Draw cw/ccw indicator and up/down arrows const int arrow_y = LCD_PIXEL_HEIGHT / 2 - 24; - DWIN_ICON_Show(ICON, ICON_DownArrow, 0, arrow_y - dir); - DWIN_ICON_Show(ICON, rot_down, 48, arrow_y); + dwinIconShow(ICON, ICON_DownArrow, 0, arrow_y - dir); + dwinIconShow(ICON, rot_down, 48, arrow_y); - DWIN_ICON_Show(ICON, ICON_UpArrow, LCD_PIXEL_WIDTH - 10 - (48*2), arrow_y - dir); - DWIN_ICON_Show(ICON, rot_up, LCD_PIXEL_WIDTH - 10 - 48, arrow_y); + dwinIconShow(ICON, ICON_UpArrow, LCD_PIXEL_WIDTH - 10 - (48*2), arrow_y - dir); + dwinIconShow(ICON, rot_up, LCD_PIXEL_WIDTH - 10 - 48, arrow_y); } #endif // BABYSTEP_GFX_OVERLAY || MESH_EDIT_GFX_OVERLAY diff --git a/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp b/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp index cfa326667a..381aea6b17 100644 --- a/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp +++ b/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp @@ -29,7 +29,7 @@ #include "dwin_string.h" #include "lcdprint_dwin.h" -#include "../../fontutils.h" +#include "../../utf8.h" #include "../../../libs/numtostr.h" #include "../../marlinui.h" @@ -72,7 +72,7 @@ void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink, const bool x_redraw = !ui.did_first_redraw || old_is_printing != print_job_timer.isRunning(); if (x_redraw) { dwin_string.set('X' + axis); - DWIN_Draw_String(true, font16x32, Color_IconBlue, Color_Bg_Black, + dwinDrawString(true, font16x32, Color_IconBlue, Color_Bg_Black, #if ENABLED(DWIN_MARLINUI_PORTRAIT) x + (utf8_strlen(value) * 14 - 14) / 2, y + 2 #else @@ -96,7 +96,7 @@ void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink, if (TERN0(LCD_SHOW_E_TOTAL, x_redraw && axis == X_AXIS)) dwin_string.add(F(" ")); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, #if ENABLED(DWIN_MARLINUI_PORTRAIT) x, y + 32 #else @@ -117,26 +117,26 @@ void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink, if (e_redraw) { // Extra spaces to erase previous value dwin_string.set(F("E ")); - DWIN_Draw_String(true, font16x32, Color_IconBlue, Color_Bg_Black, x + (4 * 14 / 2) - 7, y + 2, S(dwin_string.string())); + dwinDrawString(true, font16x32, Color_IconBlue, Color_Bg_Black, x + (4 * 14 / 2) - 7, y + 2, S(dwin_string.string())); } dwin_string.set(ui16tostr5rj(value / scale)); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y + 32, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, x, y + 32, S(dwin_string.string())); // Extra spaces to erase previous value - DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, x + (5 * 14), y + 32, S(scale == 1 ? "mm " : "cm ")); + dwinDrawString(true, font14x28, Color_IconBlue, Color_Bg_Black, x + (5 * 14), y + 32, S(scale == 1 ? "mm " : "cm ")); #else // !DWIN_MARLINUI_PORTRAIT if (e_redraw) { dwin_string.set(F("E ")); - DWIN_Draw_String(true, font16x32, Color_IconBlue, Color_Bg_Black, x, y, S(dwin_string.string())); + dwinDrawString(true, font16x32, Color_IconBlue, Color_Bg_Black, x, y, S(dwin_string.string())); } dwin_string.set(ui16tostr5rj(value / scale)); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x + 32, y + 4, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, x + 32, y + 4, S(dwin_string.string())); - DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, x + (32 + 70), y + 4, S(scale == 1 ? "mm " : "cm ")); + dwinDrawString(true, font14x28, Color_IconBlue, Color_Bg_Black, x + (32 + 70), y + 4, S(scale == 1 ? "mm " : "cm ")); #endif // !DWIN_MARLINUI_PORTRAIT } @@ -151,16 +151,16 @@ void _draw_axis_value(const AxisEnum axis, const char *value, const bool blink, const uint16_t fanx = (4 * STATUS_CHR_WIDTH - STATUS_FAN_WIDTH) / 2; const bool fan_on = !!thermalManager.scaledFanSpeed(0); if (fan_on) { - DWIN_ICON_Animation(0, fan_on, ICON, ICON_Fan0, ICON_Fan3, x + fanx, y, 25); + dwinIconAnimation(0, fan_on, ICON, ICON_Fan0, ICON_Fan3, x + fanx, y, 25); dwin_string.set(i8tostr3rj(thermalManager.scaledFanSpeedPercent(0))); dwin_string.add('%'); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y + STATUS_FAN_HEIGHT, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, x, y + STATUS_FAN_HEIGHT, S(dwin_string.string())); } else { - DWIN_ICON_AnimationControl(0x0000); // disable all icon animations (this is the only one) - DWIN_ICON_Show(ICON, ICON_Fan0, x + fanx, y); + dwinIconAnimationControl(0x0000); // disable all icon animations (this is the only one) + dwinIconShow(ICON, ICON_Fan0, x + fanx, y); dwin_string.set(F(" ")); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y + STATUS_FAN_HEIGHT, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, x, y + STATUS_FAN_HEIGHT, S(dwin_string.string())); } } #endif @@ -192,7 +192,7 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater, const uint16_t x #endif celsius_float_t tc = 0, tt = 0; - bool isBed = (DISABLED(HAS_HOTEND) && ENABLED(HAS_HEATED_BED)) || (BOTH(HAS_HOTEND, HAS_HEATED_BED) && heater < 0), + bool isBed = (DISABLED(HAS_HOTEND) && ENABLED(HAS_HEATED_BED)) || (ALL(HAS_HOTEND, HAS_HEATED_BED) && heater < 0), ta = false, c_draw, t_draw, i_draw; c_draw = t_draw = i_draw = !ui.did_first_redraw; if (isBed) { @@ -230,20 +230,20 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater, const uint16_t x if (t_draw) { dwin_string.set(i16tostr3rj(tt + 0.5)); dwin_string.add(LCD_STR_DEGREE); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, x, y, S(dwin_string.string())); } // Draw heater icon with on / off / leveled states if (i_draw) { const uint8_t ico = isBed ? (TERN0(HAS_LEVELING, planner.leveling_active) ? ICON_BedLevelOff : ICON_BedOff) : ICON_HotendOff; - DWIN_ICON_Show(ICON, ico + ta, x, y + STATUS_CHR_HEIGHT + 2); + dwinIconShow(ICON, ico + ta, x, y + STATUS_CHR_HEIGHT + 2); } // Draw current temperature, if needed if (c_draw) { dwin_string.set(i16tostr3rj(tc + 0.5)); dwin_string.add(LCD_STR_DEGREE); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x, y + 70, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, x, y + 70, S(dwin_string.string())); } } @@ -253,12 +253,12 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater, const uint16_t x FORCE_INLINE void _draw_feedrate_status(const char *value, uint16_t x, uint16_t y) { if (!ui.did_first_redraw) { dwin_string.set(LCD_STR_FEEDRATE); - DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, x, y, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_IconBlue, Color_Bg_Black, x, y, S(dwin_string.string())); } dwin_string.set(value); dwin_string.add('%'); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, x + 14, y, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, x + 14, y, S(dwin_string.string())); } /** @@ -272,7 +272,7 @@ void MarlinUI::draw_status_screen() { // Logo/Status Icon #define STATUS_LOGO_WIDTH 128 #define STATUS_LOGO_HEIGHT 40 - DWIN_ICON_Show(ICON, ICON_LOGO_Marlin, + dwinIconShow(ICON, ICON_LOGO_Marlin, #if ENABLED(DWIN_MARLINUI_PORTRAIT) (LCD_PIXEL_WIDTH - (STATUS_LOGO_WIDTH)) / 2, ((STATUS_HEATERS_Y - 4) - (STATUS_LOGO_HEIGHT)) / 2 #else @@ -281,7 +281,7 @@ void MarlinUI::draw_status_screen() { ); // Draw a frame around the x/y/z values - DWIN_Draw_Rectangle(0, Select_Color, + dwinDrawRectangle(0, Select_Color, #if ENABLED(DWIN_MARLINUI_PORTRAIT) 0, 193, LCD_PIXEL_WIDTH - 1, 260 #else @@ -308,14 +308,14 @@ void MarlinUI::draw_status_screen() { // Axis values const xyz_pos_t lpos = current_position.asLogical(); - const bool show_e_total = TERN0(LCD_SHOW_E_TOTAL, printingIsActive()); UNUSED(show_e_total); + const bool show_e_total = TERN1(HAS_X_AXIS, TERN0(LCD_SHOW_E_TOTAL, printingIsActive())); constexpr int16_t cpy = TERN(DWIN_MARLINUI_PORTRAIT, 195, 117); if (show_e_total) { TERN_(LCD_SHOW_E_TOTAL, _draw_e_value(e_move_accumulator, TERN(DWIN_MARLINUI_PORTRAIT, 6, 75), cpy)); } else { - _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink, TERN(DWIN_MARLINUI_PORTRAIT, 6, 75), cpy); + TERN_(HAS_X_AXIS, _draw_axis_value(X_AXIS, ftostr4sign(lpos.x), blink, TERN(DWIN_MARLINUI_PORTRAIT, 6, 75), cpy)); TERN_(HAS_Y_AXIS, _draw_axis_value(Y_AXIS, ftostr4sign(lpos.y), blink, TERN(DWIN_MARLINUI_PORTRAIT, 95, 184), cpy)); } TERN_(HAS_Z_AXIS, _draw_axis_value(Z_AXIS, ftostr52sp(lpos.z), blink, TERN(DWIN_MARLINUI_PORTRAIT, 165, 300), cpy)); @@ -358,7 +358,7 @@ void MarlinUI::draw_status_screen() { time.toDigital(buffer); dwin_string.add(prefix); dwin_string.add(buffer); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, (LCD_PIXEL_WIDTH - ((dwin_string.length + 1) * 14)), 290, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, (LCD_PIXEL_WIDTH - ((dwin_string.length + 1) * 14)), 290, S(dwin_string.string())); #else @@ -367,23 +367,23 @@ void MarlinUI::draw_status_screen() { time.toDigital(buffer); dwin_string.set(' '); dwin_string.add(buffer); - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, 230, 170, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, 230, 170, S(dwin_string.string())); #if ENABLED(SHOW_REMAINING_TIME) if (print_job_timer.isRunning()) { time = get_remaining_time(); - DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, 336, 170, S(" R ")); + dwinDrawString(true, font14x28, Color_IconBlue, Color_Bg_Black, 336, 170, S(" R ")); if (print_job_timer.isPaused() && blink) dwin_string.set(F(" ")); else { time.toDigital(buffer); dwin_string.set(buffer); } - DWIN_Draw_String(true, font14x28, Color_White, Color_Bg_Black, 378, 170, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_White, Color_Bg_Black, 378, 170, S(dwin_string.string())); } else if (!ui.did_first_redraw || old_is_printing != print_job_timer.isRunning()) { dwin_string.set(F(" ")); - DWIN_Draw_String(true, font14x28, Color_IconBlue, Color_Bg_Black, 336, 170, S(dwin_string.string())); + dwinDrawString(true, font14x28, Color_IconBlue, Color_Bg_Black, 336, 170, S(dwin_string.string())); } #endif #endif @@ -403,7 +403,7 @@ void MarlinUI::draw_status_screen() { const progress_t progress = TERN(HAS_PRINT_PROGRESS_PERMYRIAD, get_progress_permyriad, get_progress_percent)(); if (!ui.did_first_redraw) - DWIN_Draw_Rectangle(0, Select_Color, pb_left, pb_top, pb_right, pb_bottom); // Outline + dwinDrawRectangle(0, Select_Color, pb_left, pb_top, pb_right, pb_bottom); // Outline static uint16_t old_solid = 50; const uint16_t pb_solid = (pb_width - 2) * (progress / (PROGRESS_SCALE)) * 0.01f; @@ -411,15 +411,15 @@ void MarlinUI::draw_status_screen() { if (p_draw) { //if (pb_solid) - DWIN_Draw_Rectangle(1, Select_Color, pb_left + 1, pb_top + 1, pb_left + pb_solid, pb_bottom - 1); // Fill the solid part + dwinDrawRectangle(1, Select_Color, pb_left + 1, pb_top + 1, pb_left + pb_solid, pb_bottom - 1); // Fill the solid part //if (pb_solid < old_solid) - DWIN_Draw_Rectangle(1, Color_Bg_Black, pb_left + 1 + pb_solid, pb_top + 1, pb_right - 1, pb_bottom - 1); // Erase the rest + dwinDrawRectangle(1, Color_Bg_Black, pb_left + 1 + pb_solid, pb_top + 1, pb_right - 1, pb_bottom - 1); // Erase the rest #if ENABLED(SHOW_PROGRESS_PERCENT) dwin_string.set(TERN(PRINT_PROGRESS_SHOW_DECIMALS, permyriadtostr4(progress), ui8tostr3rj(progress / (PROGRESS_SCALE)))); dwin_string.add('%'); - DWIN_Draw_String( + dwinDrawString( false, font16x32, Percent_Color, Color_Bg_Black, pb_left + (pb_width - dwin_string.length * 16) / 2, pb_top + (pb_height - 32) / 2 - 1, diff --git a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp index 760582c76a..435da10a2a 100644 --- a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp +++ b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp @@ -23,8 +23,8 @@ /** * Bed Level Tools for Pro UI * Extended by: Miguel A. Risco-Castillo (MRISCOC) - * Version: 2.1.0 - * Date: 2022/08/27 + * Version: 3.2.0 + * Date: 2023/05/03 * * Based on the original work of: Henri-J-Norden * https://github.com/Jyers/Marlin/pull/126 @@ -46,7 +46,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(DWIN_LCD_PROUI, HAS_LEVELING) +#if ALL(DWIN_LCD_PROUI, HAS_LEVELING) #include "../../marlinui.h" #include "../../../core/types.h" @@ -65,7 +65,7 @@ BedLevelToolsClass bedLevelTools; -#if ENABLED(USE_UBL_VIEWER) +#if ENABLED(USE_GRID_MESHVIEWER) bool BedLevelToolsClass::viewer_asymmetric_range = false; bool BedLevelToolsClass::viewer_print_value = false; #endif @@ -104,29 +104,17 @@ char cmd[MAX_CMD_SIZE+16], str_1[16], str_2[16], str_3[16]; matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); GRID_LOOP(i, j) { - float mx = bedlevel.get_mesh_x(i), - my = bedlevel.get_mesh_y(j), - mz = bedlevel.z_values[i][j]; + float mx = bedlevel.get_mesh_x(i), my = bedlevel.get_mesh_y(j), mz = bedlevel.z_values[i][j]; 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_ECHOLN(F("before rotation = ["), p_float_t(mx, 7), AS_CHAR(','), p_float_t(my, 7), AS_CHAR(','), p_float_t(mz, 7), F("] ---> ")); DEBUG_DELAY(20); } rotation.apply_rotation_xyz(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_ECHOLN(F("after rotation = ["), p_float_t(mx, 7), AS_CHAR(','), p_float_t(my, 7), AS_CHAR(','), p_float_t(mz, 7), F("] ---> ")); DEBUG_DELAY(20); } @@ -182,15 +170,20 @@ void BedLevelToolsClass::MoveToZ() { bedLevelTools.manual_move(bedLevelTools.mesh_x, bedLevelTools.mesh_y, true); } void BedLevelToolsClass::ProbeXY() { - const uint16_t Clear = Z_CLEARANCE_DEPLOY_PROBE; + const uint16_t zclear = Z_CLEARANCE_DEPLOY_PROBE; sprintf_P(cmd, PSTR("G0Z%i\nG30X%sY%s"), - Clear, + zclear, dtostrf(bedlevel.get_mesh_x(bedLevelTools.mesh_x), 1, 2, str_1), dtostrf(bedlevel.get_mesh_y(bedLevelTools.mesh_y), 1, 2, str_2) ); gcode.process_subcommands_now(cmd); } +void BedLevelToolsClass::mesh_reset() { + ZERO(bedlevel.z_values); + TERN_(AUTO_BED_LEVELING_BILINEAR, bedlevel.refresh_bed_level()); +} + // Accessors float BedLevelToolsClass::get_max_value() { float max = __FLT_MAX__ * -1; @@ -219,9 +212,11 @@ bool BedLevelToolsClass::meshvalidate() { return true; } -#if ENABLED(USE_UBL_VIEWER) +#if ENABLED(USE_GRID_MESHVIEWER) - void BedLevelToolsClass::Draw_Bed_Mesh(int16_t selected /*= -1*/, uint8_t gridline_width /*= 1*/, uint16_t padding_x /*= 8*/, uint16_t padding_y_top /*= 40 + 53 - 7*/) { + constexpr uint8_t meshfont = TERN(TJC_DISPLAY, font8x16, font6x12); + + void BedLevelToolsClass::Draw_Bed_Mesh(int16_t selected/*=-1*/, uint8_t gridline_width/*=1*/, uint16_t padding_x/*=8*/, uint16_t padding_y_top/*=(40 + 53 - 7)*/) { drawing_mesh = true; const uint16_t total_width_px = DWIN_WIDTH - padding_x - padding_x; const uint16_t cell_width_px = total_width_px / (GRID_MAX_POINTS_X); @@ -229,23 +224,22 @@ bool BedLevelToolsClass::meshvalidate() { const float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = _MAX(v_min, v_max); // Clear background from previous selection and select new square - DWIN_Draw_Rectangle(1, Color_Bg_Black, _MAX(0, padding_x - gridline_width), _MAX(0, padding_y_top - gridline_width), padding_x + total_width_px, padding_y_top + total_width_px); + dwinDrawRectangle(1, Color_Bg_Black, _MAX(0, padding_x - gridline_width), _MAX(0, padding_y_top - gridline_width), padding_x + total_width_px, padding_y_top + total_width_px); if (selected >= 0) { const auto selected_y = selected / (GRID_MAX_POINTS_X); const auto selected_x = selected - (GRID_MAX_POINTS_X) * selected_y; const auto start_y_px = padding_y_top + selected_y * cell_height_px; const auto start_x_px = padding_x + selected_x * cell_width_px; - DWIN_Draw_Rectangle(1, Color_White, _MAX(0, start_x_px - gridline_width), _MAX(0, start_y_px - gridline_width), start_x_px + cell_width_px, start_y_px + cell_height_px); + dwinDrawRectangle(1, Color_White, _MAX(0, start_x_px - gridline_width), _MAX(0, start_y_px - gridline_width), start_x_px + cell_width_px, start_y_px + cell_height_px); } // Draw value square grid - char buf[8]; GRID_LOOP(x, y) { const auto start_x_px = padding_x + x * cell_width_px; const auto end_x_px = start_x_px + cell_width_px - 1 - gridline_width; const auto start_y_px = padding_y_top + ((GRID_MAX_POINTS_Y) - y - 1) * cell_height_px; const auto end_y_px = start_y_px + cell_height_px - 1 - gridline_width; - DWIN_Draw_Rectangle(1, // RGB565 colors: http://www.barth-dev.de/online/rgb565-color-picker/ + dwinDrawRectangle(1, // RGB565 colors: http://www.barth-dev.de/online/rgb565-color-picker/ isnan(bedlevel.z_values[x][y]) ? Color_Grey : ( // gray if undefined (bedlevel.z_values[x][y] < 0 ? (uint16_t)round(0x1F * -bedlevel.z_values[x][y] / (!viewer_asymmetric_range ? range : v_min)) << 11 : // red if mesh point value is negative @@ -258,20 +252,22 @@ bool BedLevelToolsClass::meshvalidate() { LCD_SERIAL.flushTX(); // Draw value text on + char buf[8]; + const uint8_t fs = DWINUI::fontWidth(meshfont); if (viewer_print_value) { - int8_t offset_x, offset_y = cell_height_px / 2 - 6; + int8_t offset_x, offset_y = cell_height_px / 2 - fs; if (isnan(bedlevel.z_values[x][y])) { // undefined - DWIN_Draw_String(false, font6x12, Color_White, Color_Bg_Blue, start_x_px + cell_width_px / 2 - 5, start_y_px + offset_y, F("X")); + dwinDrawString(false, meshfont, Color_White, Color_Bg_Blue, start_x_px + cell_width_px / 2 - 5, start_y_px + offset_y, F("X")); } else { // has value - if (GRID_MAX_POINTS_X < 10) + if (GRID_MAX_POINTS_X < (ENABLED(TJC_DISPLAY) ? 8 : 10)) sprintf_P(buf, PSTR("%s"), dtostrf(abs(bedlevel.z_values[x][y]), 1, 2, str_1)); else sprintf_P(buf, PSTR("%02i"), (uint16_t)(abs(bedlevel.z_values[x][y] - (int16_t)bedlevel.z_values[x][y]) * 100)); - offset_x = cell_width_px / 2 - 3 * (strlen(buf)) - 2; - if (!(GRID_MAX_POINTS_X < 10)) - DWIN_Draw_String(false, font6x12, Color_White, Color_Bg_Blue, start_x_px - 2 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, F(".")); - DWIN_Draw_String(false, font6x12, Color_White, Color_Bg_Blue, start_x_px + 1 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, buf); + offset_x = cell_width_px / 2 - (fs/2) * (strlen(buf)) - 2; + if (!(GRID_MAX_POINTS_X < (ENABLED(TJC_DISPLAY) ? 8 : 10))) + dwinDrawString(false, meshfont, Color_White, Color_Bg_Blue, start_x_px - 2 + offset_x, start_y_px + offset_y, F(".")); + dwinDrawString(false, meshfont, Color_White, Color_Bg_Blue, start_x_px + 1 + offset_x, start_y_px + offset_y, buf); } safe_delay(10); LCD_SERIAL.flushTX(); @@ -298,6 +294,6 @@ bool BedLevelToolsClass::meshvalidate() { drawing_mesh = false; } -#endif // USE_UBL_VIEWER +#endif // USE_GRID_MESHVIEWER #endif // DWIN_LCD_PROUI && HAS_LEVELING diff --git a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h index 6e642f030c..67beddec61 100644 --- a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h +++ b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h @@ -23,8 +23,8 @@ /** * Bed Level Tools for Pro UI * Extended by: Miguel A. Risco-Castillo (MRISCOC) - * Version: 2.1.0 - * Date: 2022/08/27 + * Version: 3.2.0 + * Date: 2023/05/03 * * Based on the original work of: Henri-J-Norden * https://github.com/Jyers/Marlin/pull/126 @@ -47,14 +47,12 @@ #include "../../../inc/MarlinConfigPre.h" -//#define USE_UBL_VIEWER 1 - #define UBL_Z_OFFSET_MIN -3.0 #define UBL_Z_OFFSET_MAX 3.0 class BedLevelToolsClass { public: - #if ENABLED(USE_UBL_VIEWER) + #if ENABLED(USE_GRID_MESHVIEWER) static bool viewer_asymmetric_range; static bool viewer_print_value; #endif @@ -74,11 +72,12 @@ public: static void MoveToXY(); static void MoveToZ(); static void ProbeXY(); + static void mesh_reset(); static float get_max_value(); static float get_min_value(); static bool meshvalidate(); - #if ENABLED(USE_UBL_VIEWER) - static void Draw_Bed_Mesh(int16_t selected = -1, uint8_t gridline_width = 1, uint16_t padding_x = 8, uint16_t padding_y_top = 40 + 53 - 7); + #if ENABLED(USE_GRID_MESHVIEWER) + static void Draw_Bed_Mesh(int16_t selected=-1, uint8_t gridline_width=1, uint16_t padding_x=8, uint16_t padding_y_top=(40 + 53 - 7)); static void Set_Mesh_Viewer_Status(); #endif }; diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index af157921d5..624ea23385 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -23,32 +23,35 @@ /** * DWIN Enhanced implementation for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 3.21.2 - * Date: 2022/12/02 + * Version: 3.25.3 + * Date: 2023/05/18 */ #include "../../../inc/MarlinConfig.h" #if ENABLED(DWIN_LCD_PROUI) -#include "../../fontutils.h" +#include "../../utf8.h" #include "../../marlinui.h" - -#include "../../../sd/cardreader.h" - #include "../../../MarlinCore.h" #include "../../../core/serial.h" #include "../../../core/macros.h" - #include "../../../module/temperature.h" #include "../../../module/printcounter.h" #include "../../../module/motion.h" -#include "../../../module/stepper.h" #include "../../../module/planner.h" - +#include "../../../module/stepper.h" #include "../../../gcode/gcode.h" #include "../../../gcode/queue.h" +#if HAS_MEDIA + #include "../../../sd/cardreader.h" +#endif + +#if NEED_HEX_PRINT + #include "../../../libs/hex_print.h" +#endif + #if HAS_FILAMENT_SENSOR #include "../../../feature/runout.h" #endif @@ -98,8 +101,11 @@ #include "../../../feature/leds/leds.h" #endif +#if HAS_TRINAMIC_CONFIG + #include "../../../feature/tmc_util.h" +#endif + #include "dwin.h" -#include "dwinui.h" #include "menus.h" #include "dwin_popup.h" @@ -143,12 +149,14 @@ // Load and Unload limits #define MAX_LOAD_UNLOAD 500 -// Feedspeed limit (max feedspeed = MAX_FEEDRATE_EDIT_VALUES) -#define MIN_MAXFEEDSPEED 1 -#define MIN_MAXACCELERATION 1 -#define MIN_MAXJERK 0.1 -#define MIN_STEP 1 -#define MAX_STEP 999.9 +// Juntion deviation limits +#define MIN_JD_MM 0.001 +#define MAX_JD_MM TERN(LIN_ADVANCE, 0.3f, 0.5f) + +#if HAS_TRINAMIC_CONFIG + #define MIN_TMC_CURRENT 100 + #define MAX_TMC_CURRENT 3000 +#endif // Editable temperature limits #define MIN_ETEMP 0 @@ -158,7 +166,6 @@ #define DWIN_VAR_UPDATE_INTERVAL 1024 #define DWIN_UPDATE_INTERVAL 1024 -#define DWIN_REMAIN_TIME_UPDATE_INTERVAL SEC_TO_MS(20) #if HAS_MESH && HAS_BED_PROBE #define BABY_Z_VAR probe.offset.z @@ -169,7 +176,7 @@ // Structs HMI_value_t HMI_value; -HMI_flag_t HMI_flag{0}; +HMI_flag_t hmiFlag{0}; HMI_data_t HMI_data; enum SelectItem : uint8_t { @@ -195,49 +202,20 @@ typedef struct { } select_t; select_t select_page{0}, select_print{0}; -constexpr float max_feedrate_edit_values[] = - #ifdef MAX_FEEDRATE_EDIT_VALUES - MAX_FEEDRATE_EDIT_VALUES - #else - { 1000, 1000, 10, 50 } - #endif -; - -constexpr float max_acceleration_edit_values[] = - #ifdef MAX_ACCEL_EDIT_VALUES - MAX_ACCEL_EDIT_VALUES - #else - { 1000, 1000, 200, 2000 } - #endif -; - -#if HAS_CLASSIC_JERK - constexpr float max_jerk_edit_values[] = - #ifdef MAX_JERK_EDIT_VALUES - MAX_JERK_EDIT_VALUES - #else - { DEFAULT_XJERK * 2, DEFAULT_YJERK * 2, DEFAULT_ZJERK * 2, DEFAULT_EJERK * 2 } - #endif - ; -#endif - -#if HAS_HOTEND - float last_E = 0; - #define E_MIN_POS (last_E - (EXTRUDE_MAXLENGTH)) - #define E_MAX_POS (last_E + (EXTRUDE_MAXLENGTH)) +#if ENABLED(LCD_BED_TRAMMING) + constexpr float bed_tramming_inset_lfbr[] = BED_TRAMMING_INSET_LFRB; #endif bool hash_changed = true; // Flag to know if message status was changed -uint8_t _percent_done = 0; -uint32_t _remain_time = 0; bool blink = false; -millis_t dwin_heat_time = 0; uint8_t checkkey = 255, last_checkkey = MainMenu; // New menu system pointers MenuClass *FileMenu = nullptr; MenuClass *PrepareMenu = nullptr; -MenuClass *TrammingMenu = nullptr; +#if ENABLED(LCD_BED_TRAMMING) + MenuClass *TrammingMenu = nullptr; +#endif MenuClass *MoveMenu = nullptr; MenuClass *ControlMenu = nullptr; MenuClass *AdvancedSettings = nullptr; @@ -256,8 +234,9 @@ MenuClass *FilamentMenu = nullptr; #if ENABLED(MESH_BED_LEVELING) MenuClass *ManualMesh = nullptr; #endif -#if HAS_HOTEND +#if HAS_PREHEAT MenuClass *PreheatMenu = nullptr; + MenuClass *PreheatHotendMenu = nullptr; #endif MenuClass *TemperatureMenu = nullptr; MenuClass *MaxSpeedMenu = nullptr; @@ -266,13 +245,13 @@ MenuClass *MaxAccelMenu = nullptr; MenuClass *MaxJerkMenu = nullptr; #endif MenuClass *StepsMenu = nullptr; -#if EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) +#if ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) MenuClass *HotendMPCMenu = nullptr; #endif -#if ENABLED(PIDTEMP) +#if ENABLED(PIDTEMP) && ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) MenuClass *HotendPIDMenu = nullptr; #endif -#if ENABLED(PIDTEMPBED) +#if ENABLED(PIDTEMPBED) && ANY(PID_EDIT_MENU, PID_AUTOTUNE_MENU) MenuClass *BedPIDMenu = nullptr; #endif #if ENABLED(CASELIGHT_USES_BRIGHTNESS) @@ -296,6 +275,12 @@ MenuClass *StepsMenu = nullptr; MenuClass *EditMeshMenu = nullptr; #endif #endif +#if ENABLED(SHAPING_MENU) + MenuClass *InputShapingMenu = nullptr; +#endif +#if HAS_TRINAMIC_CONFIG + MenuClass *TrinamicConfigMenu = nullptr; +#endif // Updatable menuitems pointers MenuItemClass *HotendTargetItem = nullptr; @@ -311,24 +296,24 @@ bool Host_Printing() { return Printing() && !IS_SD_FILE_OPEN(); } #define DWIN_LANGUAGE_EEPROM_ADDRESS 0x01 // Between 0x01 and 0x63 (EEPROM_OFFSET-1) // BL24CXX::check() uses 0x00 -inline bool HMI_IsChinese() { return HMI_flag.language == DWIN_CHINESE; } +inline bool HMI_IsChinese() { return hmiFlag.language == DWIN_CHINESE; } void HMI_SetLanguageCache() { - DWIN_JPG_CacheTo1(HMI_IsChinese() ? Language_Chinese : Language_English); + dwinJPGCacheTo1(HMI_IsChinese() ? Language_Chinese : Language_English); } void HMI_SetLanguage() { - #if BOTH(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) - BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); + #if ALL(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) + BL24CXX::read(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&hmiFlag.language, sizeof(hmiFlag.language)); #endif HMI_SetLanguageCache(); } void HMI_ToggleLanguage() { - HMI_flag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE; + hmiFlag.language = HMI_IsChinese() ? DWIN_ENGLISH : DWIN_CHINESE; HMI_SetLanguageCache(); - #if BOTH(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) - BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&HMI_flag.language, sizeof(HMI_flag.language)); + #if ALL(EEPROM_SETTINGS, IIC_BL24CXX_EEPROM) + BL24CXX::write(DWIN_LANGUAGE_EEPROM_ADDRESS, (uint8_t*)&hmiFlag.language, sizeof(hmiFlag.language)); #endif } @@ -436,7 +421,7 @@ void Popup_window_PauseOrStop() { DWINUI::Draw_IconWB(ICON_Confirm_C, 26, 280); DWINUI::Draw_IconWB(ICON_Cancel_C, 146, 280); Draw_Select_Highlight(true); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } else DWIN_Popup_ConfirmCancel(ICON_BLTouch, select_print.now == PRINT_PAUSE_RESUME ? GET_TEXT_F(MSG_PAUSE_PRINT) : GET_TEXT_F(MSG_STOP_PRINT)); @@ -453,7 +438,7 @@ void Popup_window_PauseOrStop() { DWIN_Frame_AreaCopy(1, 103, 371, 136, 386, 69, 240); DWIN_Frame_AreaCopy(1, 170, 371, 270, 386, 102, 240); DWINUI::Draw_IconWB(ICON_Confirm_C, 86, 280); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } else DWIN_Popup_Confirm(ICON_TempTooLow, GET_TEXT_F(MSG_HOTEND_TOO_COLD), GET_TEXT_F(MSG_PLEASE_PREHEAT)); @@ -462,7 +447,7 @@ void Popup_window_PauseOrStop() { #endif #if HAS_HOTEND || HAS_HEATED_BED - void DWIN_Popup_Temperature(const bool toohigh) { + void dwinPopupTemperature(const bool toohigh) { HMI_SaveProcessID(WaitResponse); if (HMI_IsChinese()) { DWINUI::ClearMainArea(); @@ -488,7 +473,7 @@ void Popup_window_PauseOrStop() { // Draw status line // void DWIN_DrawStatusLine(const char *text) { - DWIN_Draw_Rectangle(1, HMI_data.StatusBg_Color, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20); + dwinDrawRectangle(1, HMI_data.StatusBg_Color, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20); if (text) DWINUI::Draw_CenteredString(HMI_data.StatusTxt_Color, STATUS_Y + 2, text); } void DWIN_DrawStatusLine(FSTR_P fstr) { DWIN_DrawStatusLine(FTOP(fstr)); } @@ -534,7 +519,7 @@ void DWIN_DrawStatusMessage() { // and the string remaining length uint8_t rlen; const char *stat = MarlinUI::status_and_len(rlen); - DWIN_Draw_Rectangle(1, HMI_data.StatusBg_Color, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20); + dwinDrawRectangle(1, HMI_data.StatusBg_Color, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20); DWINUI::MoveTo(0, STATUS_Y + 2); DWINUI::Draw_String(HMI_data.StatusTxt_Color, stat, LCD_WIDTH); @@ -574,27 +559,31 @@ void Draw_Print_Labels() { } void Draw_Print_ProgressBar() { + const uint8_t _percent_done = ui.get_progress_percent(); DWINUI::Draw_IconWB(ICON_Bar, 15, 93); - DWIN_Draw_Rectangle(1, HMI_data.Barfill_Color, 16 + _percent_done * 240 / 100, 93, 256, 113); + dwinDrawRectangle(1, HMI_data.Barfill_Color, 16 + _percent_done * 240 / 100, 93, 256, 113); DWINUI::Draw_Int(HMI_data.PercentTxt_Color, HMI_data.Background_Color, 3, 117, 133, _percent_done); DWINUI::Draw_String(HMI_data.PercentTxt_Color, 142, 133, F("%")); } void Draw_Print_ProgressElapsed() { char buf[10]; - duration_t elapsed = print_job_timer.duration(); // print timer + duration_t elapsed = print_job_timer.duration(); // Print timer sprintf_P(buf, PSTR("%02i:%02i "), (uint16_t)(elapsed.value / 3600), ((uint16_t)elapsed.value % 3600) / 60); DWINUI::Draw_String(HMI_data.Text_Color, HMI_data.Background_Color, 47, 192, buf); } -void Draw_Print_ProgressRemain() { - char buf[10]; - sprintf_P(buf, PSTR("%02i:%02i "), (uint16_t)(_remain_time / 3600), ((uint16_t)_remain_time % 3600) / 60); - DWINUI::Draw_String(HMI_data.Text_Color, HMI_data.Background_Color, 181, 192, buf); -} +#if ENABLED(SHOW_REMAINING_TIME) + void Draw_Print_ProgressRemain() { + const uint32_t _remain_time = ui.get_remaining_time(); + char buf[10]; + sprintf_P(buf, PSTR("%02i:%02i "), (uint16_t)(_remain_time / 3600), ((uint16_t)_remain_time % 3600) / 60); + DWINUI::Draw_String(HMI_data.Text_Color, HMI_data.Background_Color, 181, 192, buf); + } +#endif void ICON_ResumeOrPause() { - if (checkkey == PrintProcess) printingIsPaused() ? ICON_Resume() : ICON_Pause(); + if (checkkey == PrintProcess) (print_job_timer.isPaused() || hmiFlag.pause_flag) ? ICON_Resume() : ICON_Pause(); } // Update filename on print @@ -602,11 +591,11 @@ void DWIN_Print_Header(const char *text = nullptr) { static char headertxt[31] = ""; // Print header text if (text) { const int8_t size = _MIN(30U, strlen_P(text)); - LOOP_L_N(i, size) headertxt[i] = text[i]; + for (uint8_t i = 0; i < size; ++i) headertxt[i] = text[i]; headertxt[size] = '\0'; } if (checkkey == PrintProcess || checkkey == PrintDone) { - DWIN_Draw_Rectangle(1, HMI_data.Background_Color, 0, 60, DWIN_WIDTH, 60+16); + dwinDrawRectangle(1, HMI_data.Background_Color, 0, 60, DWIN_WIDTH, 60+16); DWINUI::Draw_CenteredString(60, headertxt); } } @@ -617,13 +606,13 @@ void Draw_PrintProcess() { else Title.ShowCaption(GET_TEXT_F(MSG_PRINTING)); DWINUI::ClearMainArea(); - DWIN_Print_Header(SD_Printing() ? card.longest_filename() : nullptr); + DWIN_Print_Header(nullptr); Draw_Print_Labels(); DWINUI::Draw_Icon(ICON_PrintTime, 15, 173); DWINUI::Draw_Icon(ICON_RemainTime, 150, 171); Draw_Print_ProgressBar(); Draw_Print_ProgressElapsed(); - Draw_Print_ProgressRemain(); + TERN_(SHOW_REMAINING_TIME, Draw_Print_ProgressRemain()); ICON_Tune(); ICON_ResumeOrPause(); ICON_Stop(); @@ -637,35 +626,32 @@ void Goto_PrintProcess() { Draw_PrintProcess(); TERN_(DASH_REDRAW, DWIN_RedrawDash()); } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } void Draw_PrintDone() { - // show percent bar and value - _percent_done = 100; - _remain_time = 0; - + TERN_(SET_PROGRESS_PERCENT, ui.set_progress_done()); + TERN_(SET_REMAINING_TIME, ui.reset_remaining_time()); Title.ShowCaption(GET_TEXT_F(MSG_PRINT_DONE)); DWINUI::ClearMainArea(); DWIN_Print_Header(nullptr); - #if HAS_GCODE_PREVIEW - const bool isvalid = Preview_Valid(); - if (isvalid) { - DWIN_ICON_Show(0, 0, 1, 21, 100, 0x00); - DWINUI::Draw_Button(BTN_Continue, 86, 300); + const bool haspreview = Preview_Valid(); + if (haspreview) { + Preview_Show(); + DWINUI::Draw_Button(BTN_Continue, 86, 295); } #else - constexpr bool isvalid = false; + constexpr bool haspreview = false; #endif - if (!isvalid) { + if (!haspreview) { Draw_Print_ProgressBar(); Draw_Print_Labels(); DWINUI::Draw_Icon(ICON_PrintTime, 15, 173); DWINUI::Draw_Icon(ICON_RemainTime, 150, 171); Draw_Print_ProgressElapsed(); - Draw_Print_ProgressRemain(); + TERN_(SHOW_REMAINING_TIME, Draw_Print_ProgressRemain()); DWINUI::Draw_Button(BTN_Continue, 86, 273); } } @@ -675,7 +661,7 @@ void Goto_PrintDone() { if (checkkey != PrintDone) { checkkey = PrintDone; Draw_PrintDone(); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } } @@ -696,7 +682,7 @@ void Goto_Main_Menu() { if (checkkey == MainMenu) return; checkkey = MainMenu; Draw_Main_Menu(); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // Draw X, Y, Z and blink if in an un-homed or un-trusted state @@ -707,7 +693,13 @@ void _update_axis_value(const AxisEnum axis, const uint16_t x, const uint16_t y, // Check for a position change static xyz_pos_t oldpos = { -1, -1, -1 }; - const float p = TERN(SHOW_REAL_POS, stepper.position(axis) / planner.settings.axis_steps_per_mm[axis], current_position[axis]); + const float p = ( + #if ALL(IS_FULL_CARTESIAN, SHOW_REAL_POS) + planner.get_axis_position_mm(axis) + #else + current_position[axis] + #endif + ); const bool changed = oldpos[axis] != p; if (changed) oldpos[axis] = p; @@ -722,34 +714,58 @@ void _update_axis_value(const AxisEnum axis, const uint16_t x, const uint16_t y, } } +void _draw_iconblink(bool &flag, const bool sensor, const uint8_t icon1, const uint8_t icon2, const uint16_t x, const uint16_t y) { + #if DISABLED(NO_BLINK_IND) + if (flag != sensor) { + flag = sensor; + if (!flag) { + dwinDrawBox(1, HMI_data.Background_Color, x, y, 20, 20); + DWINUI::Draw_Icon(icon1, x, y); + } + } + if (flag) { + dwinDrawBox(1, blink ? HMI_data.SplitLine_Color : HMI_data.Background_Color, x, y, 20, 20); + DWINUI::Draw_Icon(icon2, x, y); + } + #else + if (flag != sensor) { + flag = sensor; + dwinDrawBox(1, HMI_data.Background_Color, x, y, 20, 20); + DWINUI::Draw_Icon(flag ? icon2 : icon1, x, y); + } + #endif +} + void _draw_ZOffsetIcon() { #if HAS_LEVELING - #if NO_BLINK_LEV_IND - static bool _leveling_active = false; - if (_leveling_active != planner.leveling_active) { - _leveling_active = planner.leveling_active; - DWIN_Draw_Rectangle(1, HMI_data.Background_Color, 186, 415, 205, 436); - DWINUI::Draw_Icon(_leveling_active ? ICON_SetZOffset : ICON_Zoffset, 187, 416); - } - #else - if (planner.leveling_active) { - DWIN_Draw_Rectangle(1, blink ? HMI_data.SplitLine_Color : HMI_data.Background_Color, 186, 415, 205, 436); - DWINUI::Draw_Icon(ICON_SetZOffset, 186, 416); - } - static bool _leveling_active = false; - if (_leveling_active != planner.leveling_active) { - _leveling_active = planner.leveling_active; - if (!_leveling_active) { - DWIN_Draw_Rectangle(1, HMI_data.Background_Color, 186, 415, 205, 436); - DWINUI::Draw_Icon(ICON_Zoffset, 187, 416); - } - } - #endif + static bool _leveling_active = false; + _draw_iconblink(_leveling_active, planner.leveling_active, ICON_Zoffset, ICON_SetZOffset, 186, 416); #else DWINUI::Draw_Icon(ICON_Zoffset, 187, 416); #endif } +void _draw_feedrate() { + #if ENABLED(SHOW_SPEED_IND) + int16_t _value; + if (blink) { + _value = feedrate_percentage; + DWINUI::Draw_String(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 116 + 4 * STAT_CHR_W + 2, 384, F(" %")); + } + else { + _value = CEIL(feedrate_mm_s * feedrate_percentage / 100); + dwinDrawBox(1, HMI_data.Background_Color, 116 + 5 * STAT_CHR_W + 2, 384, 20, 20); + } + DWINUI::Draw_Int(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 3, 116 + 2 * STAT_CHR_W, 384, _value); + #else + static int16_t _feedrate = 100; + if (_feedrate != feedrate_percentage) { + _feedrate = feedrate_percentage; + DWINUI::Draw_Int(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 3, 116 + 2 * STAT_CHR_W, 384, _feedrate); + } + #endif +} + void _draw_xyz_position(const bool force) { _update_axis_value(X_AXIS, 27, 459, force); _update_axis_value(Y_AXIS, 112, 459, force); @@ -757,6 +773,7 @@ void _draw_xyz_position(const bool force) { } void update_variable() { + _draw_xyz_position(false); #if HAS_HOTEND static celsius_t _hotendtemp = 0, _hotendtarget = 0; const celsius_t hc = thermalManager.wholeDegHotend(0), @@ -810,17 +827,11 @@ void update_variable() { DWINUI::Draw_Int(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 3, 25 + 4 * STAT_CHR_W + 6, 417, _bedtarget); #endif - static int16_t _feedrate = 100; - if (_feedrate != feedrate_percentage) { - _feedrate = feedrate_percentage; - DWINUI::Draw_Int(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 3, 116 + 2 * STAT_CHR_W, 384, _feedrate); - } + _draw_feedrate(); #if HAS_FAN - if (_new_fanspeed) { - _fanspeed = thermalManager.fan_speed[0]; + if (_new_fanspeed) DWINUI::Draw_Int(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 3, 195 + 2 * STAT_CHR_W, 384, _fanspeed); - } #endif static float _offset = 0; @@ -830,7 +841,6 @@ void update_variable() { } _draw_ZOffsetIcon(); - _draw_xyz_position(false); } /** @@ -839,43 +849,43 @@ void update_variable() { bool DWIN_lcd_sd_status = false; -void SetMediaAutoMount() { - Toggle_Chkb_Line(HMI_data.MediaAutoMount); -} +#if ENABLED(MEDIASORT_MENU_ITEM) + void SetMediaSort() { + Toggle_Chkb_Line(HMI_data.MediaSort); + card.setSortOn(HMI_data.MediaSort); + } +#endif + +void SetMediaAutoMount() { Toggle_Chkb_Line(HMI_data.MediaAutoMount); } inline uint16_t nr_sd_menu_items() { return _MIN(card.get_num_items() + !card.flag.workDirIsRoot, MENU_MAX_ITEMS); } void make_name_without_ext(char *dst, char *src, size_t maxlen=MENU_CHAR_LIMIT) { - size_t pos = strlen(src); // index of ending nul + size_t pos = strlen(src); // Index of ending nul // For files, remove the extension // which may be .gcode, .gco, or .g if (!card.flag.filenameIsDir) - while (pos && src[pos] != '.') pos--; // find last '.' (stop at 0) + while (pos && src[pos] != '.') pos--; // Find last '.' (stop at 0) if (!pos) pos = strlen(src); // pos = 0 ('.' not found) restore pos size_t len = pos; // nul or '.' if (len > maxlen) { // Keep the name short - pos = len = maxlen; // move nul down - dst[--pos] = '.'; // insert dots + pos = len = maxlen; // Move nul down + dst[--pos] = '.'; // Insert dots dst[--pos] = '.'; dst[--pos] = '.'; } - dst[len] = '\0'; // end it + dst[len] = '\0'; // End it // Copy down to 0 while (pos--) dst[pos] = src[pos]; } -void Redraw_SD_List() { - InvalidateMenu(); - Draw_Print_File_Menu(); -} - void SDCard_Up() { card.cdup(); DWIN_lcd_sd_status = false; // On next DWIN_Update @@ -898,8 +908,10 @@ void onClickSDItem() { if (card.fileIsBinary()) return DWIN_Popup_Confirm(ICON_Error, F("Please check filenames"), F("Only G-code can be printed")); - else + else { + DWIN_Print_Header(card.longest_filename()); // Save filename return Goto_ConfirmToPrint(); + } } } @@ -925,7 +937,7 @@ void onClickSDItem() { static int8_t shift_amt = 0, shift_len = 0; if (reset) { last_itemselected = 0; - hasUpDir = !card.flag.workDirIsRoot; // is a SubDir + hasUpDir = !card.flag.workDirIsRoot; // Is a SubDir return; } const uint8_t selected = FileMenu->selected; @@ -971,7 +983,7 @@ void Draw_Print_File_Menu() { if (card.isMounted()) { if (SET_MENU(FileMenu, MSG_MEDIA_MENU, nr_sd_menu_items() + 1)) { BACK_ITEM(Goto_Main_Menu); - LOOP_L_N(i, nr_sd_menu_items()) { + for (uint8_t i = 0; i < nr_sd_menu_items(); ++i) { MenuItemAdd(onDrawFileName, onClickSDItem); } } @@ -981,7 +993,7 @@ void Draw_Print_File_Menu() { else { if (SET_MENU(FileMenu, MSG_MEDIA_MENU, 1)) BACK_ITEM(Goto_Main_Menu); UpdateMenu(FileMenu); - DWIN_Draw_Rectangle(1, HMI_data.AlertBg_Color, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); + dwinDrawRectangle(1, HMI_data.AlertBg_Color, 10, MBASE(3) - 10, DWIN_WIDTH - 10, MBASE(4)); DWINUI::Draw_CenteredString(font12x24, HMI_data.AlertTxt_Color, MBASE(3), GET_TEXT_F(MSG_MEDIA_NOT_INSERTED)); } TERN_(SCROLL_LONG_FILENAMES, FileMenuIdle(true)); @@ -991,12 +1003,15 @@ void Draw_Print_File_Menu() { // Watch for media mount / unmount // void HMI_SDCardUpdate() { - if (HMI_flag.home_flag) return; + if (hmiFlag.home_flag) return; if (DWIN_lcd_sd_status != card.isMounted()) { DWIN_lcd_sd_status = card.isMounted(); - if (IsMenu(FileMenu)) Redraw_SD_List(); + ResetMenu(FileMenu); + if (IsMenu(FileMenu)) { + CurrentMenu = nullptr; + Draw_Print_File_Menu(); + } if (!DWIN_lcd_sd_status && SD_Printing()) ui.abort_print(); // Media removed while printing - DWIN_UpdateLCD(); } } @@ -1006,7 +1021,13 @@ void HMI_SDCardUpdate() { void DWIN_Draw_Dashboard() { - DWIN_Draw_Rectangle(1, HMI_data.Background_Color, 0, STATUS_Y + 21, DWIN_WIDTH, DWIN_HEIGHT - 1); + dwinDrawRectangle(1, HMI_data.Background_Color, 0, STATUS_Y + 21, DWIN_WIDTH, DWIN_HEIGHT - 1); + dwinDrawRectangle(1, HMI_data.SplitLine_Color, 0, 449, DWIN_WIDTH, 451); + + DWINUI::Draw_Icon(ICON_MaxSpeedX, 10, 456); + DWINUI::Draw_Icon(ICON_MaxSpeedY, 95, 456); + DWINUI::Draw_Icon(ICON_MaxSpeedZ, 180, 456); + _draw_xyz_position(true); #if HAS_HOTEND DWINUI::Draw_Icon(ICON_HotendTemp, 10, 383); @@ -1028,7 +1049,7 @@ void DWIN_Draw_Dashboard() { DWINUI::Draw_Icon(ICON_Speed, 113, 383); DWINUI::Draw_Int(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 3, 116 + 2 * STAT_CHR_W, 384, feedrate_percentage); - DWINUI::Draw_String(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 116 + 5 * STAT_CHR_W + 2, 384, F("%")); + IF_DISABLED(SHOW_SPEED_IND, DWINUI::Draw_String(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 116 + 5 * STAT_CHR_W + 2, 384, F("%"))); #if HAS_FAN DWINUI::Draw_Icon(ICON_FanSpeed, 187, 383); @@ -1037,17 +1058,8 @@ void DWIN_Draw_Dashboard() { #if HAS_ZOFFSET_ITEM DWINUI::Draw_Icon(planner.leveling_active ? ICON_SetZOffset : ICON_Zoffset, 187, 416); + DWINUI::Draw_Signed_Float(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 2, 2, 204, 417, BABY_Z_VAR); #endif - - DWINUI::Draw_Signed_Float(DWIN_FONT_STAT, HMI_data.Indicator_Color, HMI_data.Background_Color, 2, 2, 204, 417, BABY_Z_VAR); - - DWIN_Draw_Rectangle(1, HMI_data.SplitLine_Color, 0, 449, DWIN_WIDTH, 451); - - DWINUI::Draw_Icon(ICON_MaxSpeedX, 10, 456); - DWINUI::Draw_Icon(ICON_MaxSpeedY, 95, 456); - DWINUI::Draw_Icon(ICON_MaxSpeedZ, 180, 456); - _draw_xyz_position(true); - } void Draw_Info_Menu() { @@ -1073,9 +1085,9 @@ void Draw_Info_Menu() { DWINUI::Draw_CenteredString(122, F(MACHINE_SIZE)); DWINUI::Draw_CenteredString(195, F(SHORT_BUILD_VERSION)); - LOOP_L_N(i, 3) { + for (uint8_t i = 0; i < 3; ++i) { DWINUI::Draw_Icon(ICON_PrintSize + i, ICOX, 99 + i * 73); - DWIN_Draw_HLine(HMI_data.SplitLine_Color, 16, MBASE(2) + i * 73, 240); + dwinDrawHLine(HMI_data.SplitLine_Color, 16, MBASE(2) + i * 73, 240); } } @@ -1118,14 +1130,14 @@ void HMI_MainMenu() { case PAGE_ADVANCE: Draw_AdvancedSettings_Menu(); break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } // Pause or Stop popup void onClick_PauseOrStop() { switch (select_print.now) { - case PRINT_PAUSE_RESUME: if (HMI_flag.select_flag) ui.pause_print(); break; // confirm pause - case PRINT_STOP: if (HMI_flag.select_flag) ui.abort_print(); break; // stop confirmed then abort print + case PRINT_PAUSE_RESUME: if (hmiFlag.select_flag) ui.pause_print(); break; // Confirm pause + case PRINT_STOP: if (hmiFlag.select_flag) ui.abort_print(); break; // Stop confirmed then abort print default: break; } return Goto_PrintProcess(); @@ -1158,7 +1170,7 @@ void HMI_Printing() { switch (select_print.now) { case PRINT_SETUP: Draw_Tune_Menu(); break; case PRINT_PAUSE_RESUME: - if (printingIsPaused()) { // if printer is already in pause + if (printingIsPaused()) { // If printer is already in pause ui.resume_print(); break; } @@ -1169,7 +1181,7 @@ void HMI_Printing() { default: break; } } - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #include "../../../libs/buzzer.h" @@ -1196,12 +1208,6 @@ void Draw_Main_Area() { } } -void HMI_ReturnScreen() { - checkkey = last_checkkey; - wait_for_user = false; - Draw_Main_Area(); -} - void HMI_WaitForUser() { EncoderState encoder_diffState = get_encoder_state(); if (encoder_diffState != ENCODER_DIFF_NO && !ui.backlight) { @@ -1225,14 +1231,19 @@ void HMI_WaitForUser() { } void HMI_Init() { - DWINUI::Draw_Box(1, Color_Black, { 5, 220, DWIN_WIDTH - 5, DWINUI::fontHeight() }); - DWINUI::Draw_CenteredString(Color_White, 220, F("Professional Firmware ")); - for (uint16_t t = 15; t <= 257; t += 10) { - DWINUI::Draw_Icon(ICON_Bar, 15, 260); - DWIN_Draw_Rectangle(1, HMI_data.Background_Color, t, 260, 257, 280); - DWIN_UpdateLCD(); - delay(50); - } + #if ENABLED(SHOW_BOOTSCREEN) + #ifndef BOOTSCREEN_TIMEOUT + #define BOOTSCREEN_TIMEOUT 1100 + #endif + DWINUI::Draw_Box(1, Color_Black, { 5, 220, DWIN_WIDTH - 5, DWINUI::fontHeight() }); + DWINUI::Draw_CenteredString(Color_White, 220, F("ProUI starting up ")); + for (uint16_t t = 15; t < 257; t += 11) { + DWINUI::Draw_Icon(ICON_Bar, 15, 260); + dwinDrawRectangle(1, HMI_data.Background_Color, t, 260, 257, 280); + dwinUpdateLCD(); + safe_delay((BOOTSCREEN_TIMEOUT) / 22); + } + #endif HMI_SetLanguage(); } @@ -1248,7 +1259,11 @@ void EachMomentUpdate() { if (checkkey == ESDiagProcess) ESDiag.Update(); #endif #if SHOW_TUNING_GRAPH - if (checkkey == PidProcess) plot.Update((HMI_value.pidresult == PIDTEMP_START) ? thermalManager.wholeDegHotend(0) : thermalManager.wholeDegBed()); + if (checkkey == PidProcess) { + TERN_(PIDTEMP, if (HMI_value.tempcontrol == PIDTEMP_START) plot.Update(thermalManager.wholeDegHotend(0))); + TERN_(PIDTEMPBED, if (HMI_value.tempcontrol == PIDTEMPBED_START) plot.Update(thermalManager.wholeDegBed())); + } + TERN_(MPCTEMP, if (checkkey == MPCProcess) plot.Update(thermalManager.wholeDegHotend(0))); #endif } @@ -1269,62 +1284,59 @@ void EachMomentUpdate() { if (!PENDING(ms, next_rts_update_ms)) { next_rts_update_ms = ms + DWIN_UPDATE_INTERVAL; - if ((Printing() != HMI_flag.printing_flag) && !HMI_flag.home_flag) { - HMI_flag.printing_flag = Printing(); - if (HMI_flag.printing_flag) + if ((Printing() != hmiFlag.printing_flag) && !hmiFlag.home_flag) { + hmiFlag.printing_flag = Printing(); + if (hmiFlag.printing_flag) DWIN_Print_Started(); - else if (HMI_flag.abort_flag) + else if (hmiFlag.abort_flag) DWIN_Print_Aborted(); else DWIN_Print_Finished(); } - if ((printingIsPaused() != HMI_flag.pause_flag) && !HMI_flag.home_flag) { - HMI_flag.pause_flag = printingIsPaused(); - if (HMI_flag.pause_flag) + if ((printingIsPaused() != hmiFlag.pause_flag) && !hmiFlag.home_flag) { + hmiFlag.pause_flag = printingIsPaused(); + if (hmiFlag.pause_flag) DWIN_Print_Pause(); - else if (HMI_flag.abort_flag) + else if (hmiFlag.abort_flag) DWIN_Print_Aborted(); else DWIN_Print_Resume(); } - if (checkkey == PrintProcess) { // print process + if (checkkey == PrintProcess) { // Print process - duration_t elapsed = print_job_timer.duration(); // print timer + // Progress percent + static uint8_t _percent_done = 255; + if (_percent_done != ui.get_progress_percent()) { + _percent_done = ui.get_progress_percent(); + Draw_Print_ProgressBar(); + } - if (card.isPrinting() && !HMI_flag.percent_flag) { - uint8_t percentDone = card.percentDone(); - if (_percent_done != percentDone) { // print percent - _percent_done = percentDone; - Draw_Print_ProgressBar(); - } - - // Estimate remaining time every 20 seconds - static millis_t next_remain_time_update = 0; - if (_percent_done > 1 && ELAPSED(ms, next_remain_time_update) && !HMI_flag.heat_flag && !HMI_flag.remain_flag) { - _remain_time = (elapsed.value - dwin_heat_time) / (_percent_done * 0.01f) - (elapsed.value - dwin_heat_time); - next_remain_time_update += DWIN_REMAIN_TIME_UPDATE_INTERVAL; + // Remaining time + #if ENABLED(SHOW_REMAINING_TIME) + static uint32_t _remain_time = 0; + if (_remain_time != ui.get_remaining_time()) { + _remain_time = ui.get_remaining_time(); Draw_Print_ProgressRemain(); } - } + #endif - // Print time so far - static uint16_t last_Printtime = 0; - const uint16_t min = (elapsed.value % 3600) / 60; - if (last_Printtime != min) { // 1 minute update - last_Printtime = min; + // Elapsed print time + static uint16_t _printtime = 0; + const uint16_t min = (print_job_timer.duration() % 3600) / 60; + if (_printtime != min) { // 1 minute update + _printtime = min; Draw_Print_ProgressElapsed(); } - } #if ENABLED(POWER_LOSS_RECOVERY) - else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off + else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // Resume print before power off return Goto_PowerLossRecovery(); } - #endif // POWER_LOSS_RECOVERY + #endif - DWIN_UpdateLCD(); + dwinUpdateLCD(); } } @@ -1349,17 +1361,19 @@ void EachMomentUpdate() { const char * const filename = card.diveToFile(true, dir, recovery.info.sd_filename); card.selectFileByName(filename); DWINUI::Draw_CenteredString(HMI_data.PopupTxt_Color, 207, card.longest_filename()); - Draw_Select_Highlight(HMI_flag.select_flag); - DWIN_UpdateLCD(); + DWIN_Print_Header(card.longest_filename()); // Save filename + Draw_Select_Highlight(hmiFlag.select_flag); + dwinUpdateLCD(); } void onClick_PowerLossRecovery() { - if (HMI_flag.select_flag) { + if (hmiFlag.select_flag) { queue.inject(F("M1000C")); select_page.reset(); return Goto_Main_Menu(); } else { + HMI_SaveProcessID(NothingToDo); select_print.set(PRINT_SETUP); queue.inject(F("M1000")); } @@ -1373,7 +1387,6 @@ void EachMomentUpdate() { #endif // POWER_LOSS_RECOVERY - void DWIN_HandleScreen() { switch (checkkey) { case MainMenu: HMI_MainMenu(); break; @@ -1400,37 +1413,54 @@ void DWIN_HandleScreen() { } bool IDisPopUp() { // If ID is popup... - return (checkkey == NothingToDo) - || (checkkey == WaitResponse) - || (checkkey == Homing) - || (checkkey == Leveling) - || (checkkey == PidProcess) - || TERN0(HAS_ESDIAG, (checkkey == ESDiagProcess)) - || (checkkey == Popup); + switch (checkkey) { + case NothingToDo: + case WaitResponse: + case Popup: + case Homing: + case Leveling: + case PidProcess: + TERN_(HAS_ESDIAG, case ESDiagProcess:) + return true; + default: break; + } + return false; } void HMI_SaveProcessID(const uint8_t id) { - if (checkkey != id) { - if (!IDisPopUp()) last_checkkey = checkkey; // if previous is not a popup - if ((id == Popup) - || TERN0(HAS_ESDIAG, (id == ESDiagProcess)) - || (id == PrintDone) - || (id == Leveling) - || (id == WaitResponse)) wait_for_user = true; - checkkey = id; + if (checkkey == id) return; + if (!IDisPopUp()) last_checkkey = checkkey; // If previous is not a popup + checkkey = id; + switch (id) { + case Popup: + case WaitResponse: + case PrintDone: + case Leveling: + TERN_(HAS_ESDIAG, case ESDiagProcess:) + wait_for_user = true; + default: break; } } -void DWIN_HomingStart() { - HMI_flag.home_flag = true; +void HMI_ReturnScreen() { + checkkey = last_checkkey; + wait_for_user = false; + Draw_Main_Area(); +} + +void dwinHomingStart() { + hmiFlag.home_flag = true; HMI_SaveProcessID(Homing); Title.ShowCaption(GET_TEXT_F(MSG_HOMING)); DWIN_Show_Popup(ICON_BLTouch, GET_TEXT_F(MSG_HOMING), GET_TEXT_F(MSG_PLEASE_WAIT)); } -void DWIN_HomingDone() { - HMI_flag.home_flag = false; - HMI_ReturnScreen(); +void dwinHomingDone() { + hmiFlag.home_flag = false; + if (last_checkkey == PrintDone) + Goto_PrintDone(); + else + HMI_ReturnScreen(); } void DWIN_LevelingStart() { @@ -1438,17 +1468,23 @@ void DWIN_LevelingStart() { HMI_SaveProcessID(Leveling); Title.ShowCaption(GET_TEXT_F(MSG_BED_LEVELING)); DWIN_Show_Popup(ICON_AutoLeveling, GET_TEXT_F(MSG_BED_LEVELING), GET_TEXT_F(MSG_PLEASE_WAIT)); - #if BOTH(AUTO_BED_LEVELING_UBL, PREHEAT_BEFORE_LEVELING) - #if HAS_HOTEND - if (thermalManager.degTargetHotend(0) < LEVELING_NOZZLE_TEMP) - thermalManager.setTargetHotend(LEVELING_NOZZLE_TEMP, 0); + #if ALL(AUTO_BED_LEVELING_UBL, PREHEAT_BEFORE_LEVELING) + #if HAS_BED_PROBE + if (!DEBUGGING(DRYRUN)) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, HMI_data.BedLevT); + #else + #if HAS_HOTEND + if (!DEBUGGING(DRYRUN) && thermalManager.degTargetHotend(0) < LEVELING_NOZZLE_TEMP) { + thermalManager.setTargetHotend(LEVELING_NOZZLE_TEMP, 0); + thermalManager.wait_for_hotend(0); + } + #endif + #if HAS_HEATED_BED + if (!DEBUGGING(DRYRUN) && thermalManager.degTargetBed() < HMI_data.BedLevT) { + thermalManager.setTargetBed(HMI_data.BedLevT); + thermalManager.wait_for_bed_heating(); + } + #endif #endif - #if HAS_HEATED_BED - if (thermalManager.degTargetBed() < HMI_data.BedLevT) - thermalManager.setTargetBed(HMI_data.BedLevT); - #endif - TERN_(HAS_HOTEND, thermalManager.wait_for_hotend(0)); - TERN_(HAS_HEATED_BED, thermalManager.wait_for_bed_heating()); #endif #elif ENABLED(MESH_BED_LEVELING) Draw_ManualMesh_Menu(); @@ -1456,15 +1492,13 @@ void DWIN_LevelingStart() { } void DWIN_LevelingDone() { - TERN_(HAS_MESH, Goto_MeshViewer()); + TERN_(HAS_MESH, Goto_MeshViewer(true)); } #if HAS_MESH void DWIN_MeshUpdate(const int8_t cpos, const int8_t tpos, const_float_t zval) { - char msg[33] = ""; char str_1[6] = ""; - sprintf_P(msg, PSTR(S_FMT " %i/%i Z=%s"), GET_TEXT(MSG_PROBING_POINT), cpos, tpos, dtostrf(zval, 1, 2, str_1)); - ui.set_status(msg); + ui.status_printf(0, F(S_FMT " %i/%i Z=%s"), GET_TEXT_F(MSG_PROBING_POINT), cpos, tpos, dtostrf(zval, 1, 2, str_1)); } #endif @@ -1480,7 +1514,7 @@ void DWIN_LevelingDone() { DWINUI::ClearMainArea(); Draw_Popup_Bkgd(); - switch (HMI_value.pidresult) { + switch (HMI_value.tempcontrol) { default: return; #if ENABLED(MPC_AUTOTUNE) case MPCTEMP_START: @@ -1488,7 +1522,7 @@ void DWIN_LevelingDone() { DWINUI::Draw_String(HMI_data.PopupTxt_Color, gfrm.x, gfrm.y - DWINUI::fontHeight() - 4, F("MPC target: Celsius")); break; #endif - #if EITHER(PIDTEMP, PIDTEMPBED) + #if ANY(PIDTEMP, PIDTEMPBED) TERN_(PIDTEMP, case PIDTEMP_START:) TERN_(PIDTEMPBED, case PIDTEMPBED_START:) DWINUI::Draw_CenteredString(HMI_data.PopupTxt_Color, 100, GET_TEXT_F(MSG_PID_AUTOTUNE)); @@ -1497,9 +1531,9 @@ void DWIN_LevelingDone() { #endif } - switch (HMI_value.pidresult) { + switch (HMI_value.tempcontrol) { default: break; - #if EITHER(PIDTEMP, MPC_AUTOTUNE) + #if ANY(PIDTEMP, MPC_AUTOTUNE) TERN_(PIDTEMP, case PIDTEMP_START:) TERN_(MPC_AUTOTUNE, case MPCTEMP_START:) DWINUI::Draw_CenteredString(HMI_data.PopupTxt_Color, 120, F("for Nozzle is running.")); @@ -1512,7 +1546,7 @@ void DWIN_LevelingDone() { #endif } - switch (HMI_value.pidresult) { + switch (HMI_value.tempcontrol) { default: break; #if ENABLED(MPC_AUTOTUNE) case MPCTEMP_START: @@ -1554,7 +1588,7 @@ void DWIN_LevelingDone() { } void DWIN_PidTuning(tempcontrol_t result) { - HMI_value.pidresult = result; + HMI_value.tempcontrol = result; switch (result) { #if ENABLED(PIDTEMP) case PIDTEMP_START: @@ -1588,7 +1622,7 @@ void DWIN_LevelingDone() { checkkey = last_checkkey; DWIN_Popup_Confirm(ICON_TempTooHigh, GET_TEXT_F(MSG_ERROR), GET_TEXT_F(MSG_PID_TIMEOUT)); break; - case PID_DONE: + case AUTOTUNE_DONE: checkkey = last_checkkey; DWIN_Popup_Confirm(ICON_TempTooLow, GET_TEXT_F(MSG_PID_AUTOTUNE), GET_TEXT_F(MSG_BUTTON_DONE)); break; @@ -1603,7 +1637,7 @@ void DWIN_LevelingDone() { #if ENABLED(MPC_AUTOTUNE) void DWIN_MPCTuning(tempcontrol_t result) { - HMI_value.pidresult = result; + HMI_value.tempcontrol = result; switch (result) { case MPCTEMP_START: HMI_SaveProcessID(MPCProcess); @@ -1623,7 +1657,7 @@ void DWIN_LevelingDone() { DWIN_Popup_Confirm(ICON_TempTooHigh, GET_TEXT_F(MSG_ERROR), F(STR_MPC_AUTOTUNE_INTERRUPTED)); ui.reset_alert_level(); break; - case MPC_DONE: + case AUTOTUNE_DONE: checkkey = last_checkkey; DWIN_Popup_Confirm(ICON_TempTooLow, GET_TEXT_F(MSG_MPC_AUTOTUNE), GET_TEXT_F(MSG_BUTTON_DONE)); ui.reset_alert_level(); @@ -1640,12 +1674,10 @@ void DWIN_LevelingDone() { // Started a Print Job void DWIN_Print_Started() { TERN_(HAS_GCODE_PREVIEW, if (Host_Printing()) Preview_Invalidate()); - _percent_done = 0; - _remain_time = 0; - HMI_flag.percent_flag = false; - HMI_flag.remain_flag = false; - HMI_flag.pause_flag = false; - HMI_flag.abort_flag = false; + TERN_(SET_PROGRESS_PERCENT, ui.progress_reset()); + TERN_(SET_REMAINING_TIME, ui.reset_remaining_time()); + hmiFlag.pause_flag = false; + hmiFlag.abort_flag = false; select_print.reset(); Goto_PrintProcess(); } @@ -1664,7 +1696,8 @@ void DWIN_Print_Resume() { // Ended print job void DWIN_Print_Finished() { TERN_(POWER_LOSS_RECOVERY, if (card.isPrinting()) recovery.cancel()); - HMI_flag.pause_flag = false; + hmiFlag.abort_flag = false; + hmiFlag.pause_flag = false; wait_for_heatup = false; planner.finish_and_disable(); thermalManager.cooldown(); @@ -1676,23 +1709,6 @@ void DWIN_Print_Aborted() { DWIN_Print_Finished(); } -// Progress and remaining time update -void DWIN_M73() { - if (parser.seenval('P')) { - _percent_done = parser.value_byte(); - HMI_flag.percent_flag = true; - } - if (parser.seenval('R')) { - _remain_time = parser.value_ulong() * 60; - HMI_flag.remain_flag = true; - } - if (checkkey == PrintProcess) { - Draw_Print_ProgressBar(); - Draw_Print_ProgressRemain(); - Draw_Print_ProgressElapsed(); - } -} - #if HAS_FILAMENT_SENSOR // Filament Runout process void DWIN_FilamentRunout(const uint8_t extruder) { LCD_MESSAGE(MSG_RUNOUT_SENSOR); } @@ -1731,15 +1747,23 @@ void DWIN_SetDataDefaults() { #endif TERN_(PREHEAT_BEFORE_LEVELING, HMI_data.BedLevT = LEVELING_BED_TEMP); TERN_(BAUD_RATE_GCODE, SetBaud250K()); - HMI_data.FullManualTramming = false; + #if ALL(LCD_BED_TRAMMING, HAS_BED_PROBE) + HMI_data.FullManualTramming = DISABLED(BED_TRAMMING_USE_PROBE); + #endif + #if ENABLED(MEDIASORT_MENU_ITEM) + HMI_data.MediaSort = true; + card.setSortOn(true); + #endif HMI_data.MediaAutoMount = ENABLED(HAS_SD_EXTENDER); - #if BOTH(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) + #if ALL(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) HMI_data.z_after_homing = DEF_Z_AFTER_HOMING; #endif - #if BOTH(LED_CONTROL_MENU, HAS_COLOR_LEDS) + #if ALL(LED_CONTROL_MENU, HAS_COLOR_LEDS) TERN_(LED_COLOR_PRESETS, leds.set_default()); ApplyLEDColor(); #endif + TERN_(ADAPTIVE_STEP_SMOOTHING, HMI_data.AdaptiveStepSmoothing = true); + TERN_(HAS_GCODE_PREVIEW, HMI_data.EnablePreview = true); } void DWIN_CopySettingsTo(char * const buff) { @@ -1753,7 +1777,7 @@ void DWIN_CopySettingsFrom(const char * const buff) { TERN_(PREVENT_COLD_EXTRUSION, ApplyExtMinT()); feedrate_percentage = 100; TERN_(BAUD_RATE_GCODE, HMI_SetBaudRate()); - #if BOTH(LED_CONTROL_MENU, HAS_COLOR_LEDS) + #if ALL(LED_CONTROL_MENU, HAS_COLOR_LEDS) leds.set_color( HMI_data.Led_Color.r, HMI_data.Led_Color.g, @@ -1766,51 +1790,50 @@ void DWIN_CopySettingsFrom(const char * const buff) { // Initialize or re-initialize the LCD void MarlinUI::init_lcd() { - delay(750); // wait to wakeup screen - const bool hs = DWIN_Handshake(); UNUSED(hs); - DWIN_Frame_SetDir(1); - DWIN_JPG_CacheTo1(Language_English); - Encoder_Configuration(); + delay(750); // Wait to wakeup screen + const bool hs = dwinHandshake(); UNUSED(hs); + dwinFrameSetDir(1); + dwinJPGCacheTo1(Language_English); + encoderConfiguration(); } -void DWIN_InitScreen() { +void dwinInitScreen() { DWIN_SetColorDefaults(); - HMI_Init(); // draws boot screen + HMI_Init(); // Draws boot screen DWINUI::init(); DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color, HMI_data.StatusBg_Color); DWINUI::onTitleDraw = Draw_Title; InitMenu(); checkkey = 255; hash_changed = true; - last_E = 0; DWIN_DrawStatusLine(); DWIN_Draw_Dashboard(); Goto_Main_Menu(); } void MarlinUI::update() { - EachMomentUpdate(); // Status update HMI_SDCardUpdate(); // SD card update + EachMomentUpdate(); // Status update DWIN_HandleScreen(); // Rotary encoder update } void MarlinUI::refresh() { /* Nothing to see here */ } #if HAS_LCD_BRIGHTNESS - void MarlinUI::_set_brightness() { DWIN_LCD_Brightness(backlight ? brightness : 0); } + void MarlinUI::_set_brightness() { dwinLCDBrightness(backlight ? brightness : 0); } #endif void MarlinUI::kill_screen(FSTR_P const lcd_error, FSTR_P const lcd_component) { DWIN_Draw_Popup(ICON_BLTouch, GET_TEXT_F(MSG_PRINTER_KILLED), lcd_error); DWINUI::Draw_CenteredString(HMI_data.PopupTxt_Color, 270, GET_TEXT_F(MSG_TURN_OFF)); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } void DWIN_RebootScreen() { - DWIN_Frame_Clear(Color_Bg_Black); - DWIN_JPG_ShowAndCache(0); + dwinFrameClear(Color_Bg_Black); + dwinJPGShowAndCache(0); DWINUI::Draw_CenteredString(Color_White, 220, GET_TEXT_F(MSG_PLEASE_WAIT_REBOOT)); - DWIN_UpdateLCD(); + dwinUpdateLCD(); safe_delay(500); } @@ -1826,7 +1849,7 @@ void DWIN_RedrawScreen() { } #if ENABLED(ADVANCED_PAUSE_FEATURE) - void DWIN_Popup_Pause(FSTR_P const fmsg, uint8_t button /*= 0*/) { + void DWIN_Popup_Pause(FSTR_P const fmsg, uint8_t button/*=0*/) { HMI_SaveProcessID(button ? WaitResponse : NothingToDo); DWIN_Show_Popup(ICON_BLTouch, GET_TEXT_F(MSG_ADVANCED_PAUSE), fmsg, button); } @@ -1865,7 +1888,7 @@ void DWIN_RedrawScreen() { } void onClick_FilamentPurge() { - if (HMI_flag.select_flag) + if (hmiFlag.select_flag) pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // "Purge More" button else { HMI_SaveProcessID(NothingToDo); @@ -1881,7 +1904,6 @@ void DWIN_RedrawScreen() { #endif // ADVANCED_PAUSE_FEATURE #if HAS_MESH - void DWIN_MeshViewer() { if (!leveling_is_valid()) DWIN_Popup_Continue(ICON_BLTouch, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); @@ -1890,8 +1912,7 @@ void DWIN_RedrawScreen() { MeshViewer.Draw(); } } - -#endif // HAS_MESH +#endif #if HAS_LOCKSCREEN @@ -1921,11 +1942,11 @@ void DWIN_RedrawScreen() { #if HAS_GCODE_PREVIEW + void SetPreview() { Toggle_Chkb_Line(HMI_data.EnablePreview); } + void onClick_ConfirmToPrint() { - Preview_Reset(); DWIN_ResetStatusLine(); - if (HMI_flag.select_flag) { // Confirm - HMI_flag.heat_flag = true; + if (hmiFlag.select_flag) { // Confirm Goto_Main_Menu(); return card.openAndPrintFile(card.filename); } @@ -1933,16 +1954,13 @@ void DWIN_RedrawScreen() { HMI_ReturnScreen(); } -#endif +#endif // HAS_GCODE_PREVIEW void Goto_ConfirmToPrint() { #if HAS_GCODE_PREVIEW - Goto_Popup(Preview_DrawFromSD, onClick_ConfirmToPrint); - #else - // Print SD file - HMI_flag.heat_flag = true; - card.openAndPrintFile(card.filename); + if (HMI_data.EnablePreview) return Goto_Popup(Preview_DrawFromSD, onClick_ConfirmToPrint); #endif + card.openAndPrintFile(card.filename); // Direct print SD file } #if HAS_ESDIAG @@ -1953,7 +1971,7 @@ void Goto_ConfirmToPrint() { #endif //============================================================================= -// NEW MENU SUBSYSTEM +// MENU SUBSYSTEM //============================================================================= // Tool functions @@ -1962,7 +1980,7 @@ void Goto_ConfirmToPrint() { void WriteEeprom() { DWIN_DrawStatusLine(GET_TEXT_F(MSG_STORE_EEPROM)); - DWIN_UpdateLCD(); + dwinUpdateLCD(); DONE_BUZZ(settings.save()); } @@ -1982,7 +2000,7 @@ void Goto_ConfirmToPrint() { void SaveMesh() { TERN(AUTO_BED_LEVELING_UBL, UBLMeshSave(), WriteEeprom()); } #endif -#endif +#endif // EEPROM_SETTINGS // Reset Printer void RebootPrinter() { @@ -1995,14 +2013,14 @@ void RebootPrinter() { void Goto_Info_Menu() { Draw_Info_Menu(); - DWIN_UpdateLCD(); + dwinUpdateLCD(); HMI_SaveProcessID(WaitResponse); } void DisableMotors() { queue.inject(F("M84")); } void AutoLev() { // Always reacquire the Z "home" position - queue.inject(F(TERN(AUTO_BED_LEVELING_UBL, "G28Z\nG29P1", "G28XYO\nG28Z\nG29"))); + queue.inject(F(TERN(AUTO_BED_LEVELING_UBL, "G29P1", "G29"))); } void AutoHome() { queue.inject_P(G28_STR); } @@ -2011,61 +2029,53 @@ void AutoHome() { queue.inject_P(G28_STR); } void HomeX() { queue.inject(F("G28X")); } void HomeY() { queue.inject(F("G28Y")); } void HomeZ() { queue.inject(F("G28Z")); } - #if BOTH(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) + #if ALL(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) void ApplyZAfterHoming() { HMI_data.z_after_homing = MenuData.Value; }; void SetZAfterHoming() { SetIntOnClick(0, 20, HMI_data.z_after_homing, ApplyZAfterHoming); } #endif #endif -#if HAS_HOME_OFFSET - // Apply workspace offset, making the current position 0,0,0 - void SetHome() { - queue.inject(F("G92X0Y0Z0")); - DONE_BUZZ(true); - } -#endif - #if HAS_ZOFFSET_ITEM void ApplyZOffset() { TERN_(EEPROM_SETTINGS, settings.save()); } void LiveZOffset() { - #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) + #if ANY(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) const_float_t step_zoffset = round((MenuData.Value / 100.0f) * planner.settings.axis_steps_per_mm[Z_AXIS]) - babystep.accum; if (BABYSTEP_ALLOWED()) babystep.add_steps(Z_AXIS, step_zoffset); #endif } void SetZOffset() { - #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) + #if ANY(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) babystep.accum = round(planner.settings.axis_steps_per_mm[Z_AXIS] * BABY_Z_VAR); #endif SetPFloatOnClick(Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX, 2, ApplyZOffset, LiveZOffset); } - void SetMoveZto0() { - #if ENABLED(Z_SAFE_HOMING) - char cmd[54], str_1[5], str_2[5]; - sprintf_P(cmd, PSTR("G28XYO\nG28Z\nG0X%sY%sF5000\nG0Z0F300\nM400"), - dtostrf(Z_SAFE_HOMING_X_POINT, 1, 1, str_1), - dtostrf(Z_SAFE_HOMING_Y_POINT, 1, 1, str_2) - ); - gcode.process_subcommands_now(cmd); - #else - TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); - gcode.process_subcommands_now(F("G28Z\nG0Z0F300\nM400")); - #endif - ui.reset_status(); - DONE_BUZZ(true); - } - - #if !HAS_BED_PROBE - void HomeZandDisable() { - SetMoveZto0(); - DisableMotors(); - } - #endif - #endif // HAS_ZOFFSET_ITEM +void SetMoveZto0() { + #if ENABLED(Z_SAFE_HOMING) + char cmd[54], str_1[5], str_2[5]; + sprintf_P(cmd, PSTR("G28XYO\nG28Z\nG0X%sY%sF5000\nG0Z0F300\nM400"), + dtostrf(Z_SAFE_HOMING_X_POINT, 1, 1, str_1), + dtostrf(Z_SAFE_HOMING_Y_POINT, 1, 1, str_2) + ); + gcode.process_subcommands_now(cmd); + #else + TERN_(HAS_LEVELING, set_bed_leveling_enabled(false)); + gcode.process_subcommands_now(F("G28Z\nG0Z0F300\nM400")); + #endif + ui.reset_status(); + DONE_BUZZ(true); +} + +#if DISABLED(HAS_BED_PROBE) + void HomeZandDisable() { + SetMoveZto0(); + DisableMotors(); + } +#endif + #if HAS_PREHEAT #define _DoPreheat(N) void DoPreheat##N() { ui.preheat_all(N-1); }\ void DoPreheatHotend##N() { ui.preheat_hotend(N-1); } @@ -2082,17 +2092,24 @@ void SetLanguage() { bool EnableLiveMove = false; void SetLiveMove() { Toggle_Chkb_Line(EnableLiveMove); } -void LiveMove() { +void AxisMove(AxisEnum axis) { + #if HAS_HOTEND + if (axis == E_AXIS && thermalManager.tooColdToExtrude(0)) { + gcode.process_subcommands_now(F("G92E0")); // Reset extruder position + return DWIN_Popup_Confirm(ICON_TempTooLow, GET_TEXT_F(MSG_HOTEND_TOO_COLD), GET_TEXT_F(MSG_PLEASE_PREHEAT)); + } + #endif planner.synchronize(); + if (!planner.is_full()) planner.buffer_line(current_position, manual_feedrate_mm_s[axis]); +} +void LiveMove() { if (!EnableLiveMove) return; *MenuData.P_Float = MenuData.Value / MINUNITMULT; - if (!planner.is_full()) planner.buffer_line(current_position, manual_feedrate_mm_s[HMI_value.axis]); + AxisMove(HMI_value.axis); } void ApplyMove() { - planner.synchronize(); if (EnableLiveMove) return; - if (HMI_value.axis == E_AXIS) last_E = MenuData.Value / MINUNITMULT; - if (!planner.is_full()) planner.buffer_line(current_position, manual_feedrate_mm_s[HMI_value.axis]); + AxisMove(HMI_value.axis); } void SetMoveX() { HMI_value.axis = X_AXIS; SetPFloatOnClick(X_MIN_POS, X_MAX_POS, UNITFDIGITS, ApplyMove, LiveMove); } @@ -2101,30 +2118,12 @@ void SetMoveZ() { HMI_value.axis = Z_AXIS; SetPFloatOnClick(Z_MIN_POS, Z_MAX_POS #if HAS_HOTEND void SetMoveE() { - if (thermalManager.tooColdToExtrude(0)) return DWIN_Popup_Confirm(ICON_TempTooLow, GET_TEXT_F(MSG_HOTEND_TOO_COLD), GET_TEXT_F(MSG_PLEASE_PREHEAT)); - HMI_value.axis = E_AXIS; SetPFloatOnClick(E_MIN_POS, E_MAX_POS, UNITFDIGITS, ApplyMove, LiveMove); + const float e_min = current_position.e - (EXTRUDE_MAXLENGTH), + e_max = current_position.e + (EXTRUDE_MAXLENGTH); + HMI_value.axis = E_AXIS; SetPFloatOnClick(e_min, e_max, UNITFDIGITS, ApplyMove, LiveMove); } #endif -#if DWIN_PID_TUNE - void SetPID(celsius_t t, heater_id_t h) { - char cmd[53] = ""; - char str_1[5] = "", str_2[5] = ""; - sprintf_P(cmd, PSTR("G28OXY\nG0Z5F300\nG0X%sY%sF5000\nM84\nM400"), - dtostrf(X_CENTER, 1, 1, str_1), - dtostrf(Y_CENTER, 1, 1, str_2) - ); - gcode.process_subcommands_now(cmd); - thermalManager.PID_autotune(t, h, HMI_data.PidCycles, true); - } - #if ENABLED(PIDTEMP) - void HotendPID() { SetPID(HMI_data.HotendPidT, H_E0); } - #endif - #if ENABLED(PIDTEMPBED) - void BedPID() { SetPID(HMI_data.BedPidT, H_BED); } - #endif -#endif - #if ENABLED(POWER_LOSS_RECOVERY) void SetPwrLossr() { Toggle_Chkb_Line(recovery.enabled); @@ -2138,7 +2137,7 @@ void SetMoveZ() { HMI_value.axis = Z_AXIS; SetPFloatOnClick(Z_MIN_POS, Z_MAX_POS HMI_data.Baud115K ^= true; HMI_SetBaudRate(); Draw_Chkb_Line(CurrentMenu->line(), HMI_data.Baud115K); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } void SetBaud115K() { queue.inject(F("M575 P0 B115200")); HMI_data.Baud115K = true; } void SetBaud250K() { queue.inject(F("M575 P0 B250000")); HMI_data.Baud115K = false; } @@ -2146,7 +2145,7 @@ void SetMoveZ() { HMI_value.axis = Z_AXIS; SetPFloatOnClick(Z_MIN_POS, Z_MAX_POS #if HAS_LCD_BRIGHTNESS void ApplyBrightness() { ui.set_brightness(MenuData.Value); } - void LiveBrightness() { DWIN_LCD_Brightness(MenuData.Value); } + void LiveBrightness() { dwinLCDBrightness(MenuData.Value); } void SetBrightness() { SetIntOnClick(LCD_BRIGHTNESS_MIN, LCD_BRIGHTNESS_MAX, ui.brightness, ApplyBrightness, LiveBrightness); } void TurnOffBacklight() { HMI_SaveProcessID(WaitResponse); ui.set_brightness(0); DWIN_RedrawScreen(); } #endif @@ -2163,7 +2162,7 @@ void SetMoveZ() { HMI_value.axis = Z_AXIS; SetPFloatOnClick(Z_MIN_POS, Z_MAX_POS #endif #if ENABLED(LED_CONTROL_MENU) - #if !BOTH(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) + #if !ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) void SetLedStatus() { leds.toggle(); Show_Chkb_Line(leds.lights_on); @@ -2238,39 +2237,6 @@ void SetMoveZ() { HMI_value.axis = Z_AXIS; SetPFloatOnClick(Z_MIN_POS, Z_MAX_POS void SetExtMinT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP, ApplyExtMinT); } #endif -void RestoreDefaultColors() { - DWIN_SetColorDefaults(); - DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color, HMI_data.StatusBg_Color); - DWIN_RedrawScreen(); -} - -void SelColor() { - MenuData.P_Int = (int16_t*)static_cast(CurrentMenu->SelectedItem())->value; - HMI_value.Color[0] = GetRColor(*MenuData.P_Int); // Red - HMI_value.Color[1] = GetGColor(*MenuData.P_Int); // Green - HMI_value.Color[2] = GetBColor(*MenuData.P_Int); // Blue - Draw_GetColor_Menu(); -} - -void LiveRGBColor() { - HMI_value.Color[CurrentMenu->line() - 2] = MenuData.Value; - uint16_t color = RGB(HMI_value.Color[0], HMI_value.Color[1], HMI_value.Color[2]); - DWIN_Draw_Rectangle(1, color, 20, 315, DWIN_WIDTH - 20, 335); -} -void SetRGBColor() { - const uint8_t color = static_cast(CurrentMenu->SelectedItem())->icon; - SetIntOnClick(0, (color == 1) ? 63 : 31, HMI_value.Color[color], nullptr, LiveRGBColor); -} - -void DWIN_ApplyColor() { - *MenuData.P_Int = RGB(HMI_value.Color[0], HMI_value.Color[1], HMI_value.Color[2]); - DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color, HMI_data.StatusBg_Color); - Draw_SelectColors_Menu(); - hash_changed = true; - LCD_MESSAGE(MSG_COLORS_APPLIED); - DWIN_Draw_Dashboard(); -} - void SetSpeed() { SetPIntOnClick(MIN_PRINT_SPEED, MAX_PRINT_SPEED); } #if HAS_HOTEND @@ -2320,172 +2286,187 @@ void SetFlow() { SetPIntOnClick(MIN_PRINT_FLOW, MAX_PRINT_FLOW, []{ planner.refr // Bed Tramming -void TramXY(const uint8_t point, const float &margin, float &x, float &y) { - switch (point) { - case 0: - LCD_MESSAGE(MSG_LEVBED_FL); - x = y = margin; - break; - case 1: - LCD_MESSAGE(MSG_LEVBED_FR); - x = X_BED_SIZE - margin; y = margin; - break; - case 2: - LCD_MESSAGE(MSG_LEVBED_BR); - x = X_BED_SIZE - margin; y = Y_BED_SIZE - margin; - break; - case 3: - LCD_MESSAGE(MSG_LEVBED_BL); - x = margin; y = Y_BED_SIZE - margin; - break; - case 4: - LCD_MESSAGE(MSG_LEVBED_C); - x = X_CENTER; y = Y_CENTER; - break; +#if ENABLED(LCD_BED_TRAMMING) + + void TramXY(const uint8_t point, float &x, float &y) { + switch (point) { + case 0: + LCD_MESSAGE(MSG_TRAM_FL); + x = bed_tramming_inset_lfbr[0]; + y = bed_tramming_inset_lfbr[1]; + break; + case 1: + LCD_MESSAGE(MSG_TRAM_FR); + x = X_BED_SIZE - bed_tramming_inset_lfbr[2]; + y = bed_tramming_inset_lfbr[1]; + break; + case 2: + LCD_MESSAGE(MSG_TRAM_BR); + x = X_BED_SIZE - bed_tramming_inset_lfbr[2]; + y = Y_BED_SIZE - bed_tramming_inset_lfbr[3]; + break; + case 3: + LCD_MESSAGE(MSG_TRAM_BL); + x = bed_tramming_inset_lfbr[0]; + y = Y_BED_SIZE - bed_tramming_inset_lfbr[3]; + break; + #if ENABLED(BED_TRAMMING_INCLUDE_CENTER) + case 4: + LCD_MESSAGE(MSG_TRAM_C); + x = X_CENTER; y = Y_CENTER; + break; + #endif + } } -} -#if HAS_BED_PROBE + #if HAS_BED_PROBE - float Tram(const uint8_t point) { - char cmd[100] = ""; - static bool inLev = false; - float xpos = 0, ypos = 0, zval = 0, margin = 0; - char str_1[6] = "", str_2[6] = "", str_3[6] = ""; - if (inLev) return NAN; - margin = HMI_data.FullManualTramming ? 30 : PROBING_MARGIN; + float Tram(const uint8_t point) { + char cmd[100] = ""; + static bool inLev = false; + float xpos = 0, ypos = 0, zval = 0; + char str_1[6] = "", str_2[6] = "", str_3[6] = ""; + if (inLev) return NAN; - TramXY(point, margin, xpos, ypos); + TramXY(point, xpos, ypos); - if (HMI_data.FullManualTramming) { - sprintf_P(cmd, PSTR("M420S0\nG28O\nG90\nG0Z5F300\nG0X%sY%sF5000\nG0Z0F300"), - dtostrf(xpos, 1, 1, str_1), - dtostrf(ypos, 1, 1, str_2) - ); + if (HMI_data.FullManualTramming) { + sprintf_P(cmd, PSTR("M420S0\nG28O\nG90\nG0Z5F300\nG0X%sY%sF5000\nG0Z0F300"), + dtostrf(xpos, 1, 1, str_1), + dtostrf(ypos, 1, 1, str_2) + ); + queue.inject(cmd); + } + else { + // AUTO_BED_LEVELING_BILINEAR does not define MESH_INSET + #ifndef MESH_MIN_X + #define MESH_MIN_X (_MAX(X_MIN_BED + PROBING_MARGIN, X_MIN_POS)) + #endif + #ifndef MESH_MIN_Y + #define MESH_MIN_Y (_MAX(Y_MIN_BED + PROBING_MARGIN, Y_MIN_POS)) + #endif + #ifndef MESH_MAX_X + #define MESH_MAX_X (_MIN(X_MAX_BED - (PROBING_MARGIN), X_MAX_POS)) + #endif + #ifndef MESH_MAX_Y + #define MESH_MAX_Y (_MIN(Y_MAX_BED - (PROBING_MARGIN), Y_MAX_POS)) + #endif + + LIMIT(xpos, MESH_MIN_X, MESH_MAX_X); + LIMIT(ypos, MESH_MIN_Y, MESH_MAX_Y); + probe.stow(); + gcode.process_subcommands_now(F("M420S0\nG28O")); + inLev = true; + zval = probe.probe_at_point(xpos, ypos, PROBE_PT_STOW); + if (isnan(zval)) + LCD_MESSAGE(MSG_ZPROBE_OUT); + else { + sprintf_P(cmd, PSTR("X:%s, Y:%s, Z:%s"), + dtostrf(xpos, 1, 1, str_1), + dtostrf(ypos, 1, 1, str_2), + dtostrf(zval, 1, 2, str_3) + ); + ui.set_status(cmd); + } + inLev = false; + } + return zval; + } + + #else + + void Tram(const uint8_t point) { + float xpos = 0, ypos = 0; + TramXY(point, xpos, ypos); + + char cmd[100] = "", str_1[6] = "", str_2[6] = ""; + sprintf_P(cmd, PSTR("M420S0\nG28O\nG90\nG0Z5F300\nG0X%sY%sF5000\nG0Z0F300"), dtostrf(xpos, 1, 1, str_1), dtostrf(ypos, 1, 1, str_2)); queue.inject(cmd); } - else { - // AUTO_BED_LEVELING_BILINEAR does not define MESH_INSET - #ifndef MESH_MIN_X - #define MESH_MIN_X (_MAX(X_MIN_BED + PROBING_MARGIN, X_MIN_POS)) - #endif - #ifndef MESH_MIN_Y - #define MESH_MIN_Y (_MAX(Y_MIN_BED + PROBING_MARGIN, Y_MIN_POS)) - #endif - #ifndef MESH_MAX_X - #define MESH_MAX_X (_MIN(X_MAX_BED - (PROBING_MARGIN), X_MAX_POS)) - #endif - #ifndef MESH_MAX_Y - #define MESH_MAX_Y (_MIN(Y_MAX_BED - (PROBING_MARGIN), Y_MAX_POS)) + + #endif + + inline void TramFL() { Tram(0); } + inline void TramFR() { Tram(1); } + inline void TramBR() { Tram(2); } + inline void TramBL() { Tram(3); } + #if ENABLED(BED_TRAMMING_INCLUDE_CENTER) + inline void TramC() { Tram(4); } + #endif + + #if HAS_BED_PROBE && HAS_MESH + + void Trammingwizard() { + if (HMI_data.FullManualTramming) { + LCD_MESSAGE_F("Disable manual tramming"); + return; + } + bed_mesh_t zval = {0}; + zval[0][0] = TramFL(); + checkkey = NothingToDo; + MeshViewer.DrawMesh(zval, 2, 2); + zval[1][0] = TramFR(); + MeshViewer.DrawMesh(zval, 2, 2); + zval[1][1] = TramBR(); + MeshViewer.DrawMesh(zval, 2, 2); + zval[0][1] = TramBL(); + MeshViewer.DrawMesh(zval, 2, 2); + + DWINUI::Draw_CenteredString(140, F("Calculating average")); + DWINUI::Draw_CenteredString(160, F("and relative heights")); + safe_delay(1000); + float avg = 0.0f; + for (uint8_t x = 0; x < 2; ++x) for (uint8_t y = 0; y < 2; ++y) avg += zval[x][y]; + avg /= 4.0f; + for (uint8_t x = 0; x < 2; ++x) for (uint8_t y = 0; y < 2; ++y) zval[x][y] -= avg; + MeshViewer.DrawMesh(zval, 2, 2); + ui.reset_status(); + + #ifndef BED_TRAMMING_PROBE_TOLERANCE + #define BED_TRAMMING_PROBE_TOLERANCE 0.05 #endif - LIMIT(xpos, MESH_MIN_X, MESH_MAX_X); - LIMIT(ypos, MESH_MIN_Y, MESH_MAX_Y); - probe.stow(); - gcode.process_subcommands_now(F("M420S0\nG28O")); - inLev = true; - zval = probe.probe_at_point(xpos, ypos, PROBE_PT_STOW); - if (isnan(zval)) - LCD_MESSAGE(MSG_ZPROBE_OUT); + if (ABS(MeshViewer.max - MeshViewer.min) < BED_TRAMMING_PROBE_TOLERANCE) { + DWINUI::Draw_CenteredString(140, F("Corners leveled")); + DWINUI::Draw_CenteredString(160, F("Tolerance achieved!")); + } else { - sprintf_P(cmd, PSTR("X:%s, Y:%s, Z:%s"), - dtostrf(xpos, 1, 1, str_1), - dtostrf(ypos, 1, 1, str_2), - dtostrf(zval, 1, 2, str_3) - ); - ui.set_status(cmd); - } - inLev = false; - } - return zval; - } - -#else - - void Tram(const uint8_t point) { - float xpos = 0, ypos = 0, margin = 30; - TramXY(point, margin, xpos, ypos); - - char cmd[100] = "", str_1[6] = "", str_2[6] = ""; - sprintf_P(cmd, PSTR("M420S0\nG28O\nG90\nG0Z5F300\nG0X%sY%sF5000\nG0Z0F300"), dtostrf(xpos, 1, 1, str_1), dtostrf(ypos, 1, 1, str_2)); - queue.inject(cmd); - } - -#endif - -void TramFL() { Tram(0); } -void TramFR() { Tram(1); } -void TramBR() { Tram(2); } -void TramBL() { Tram(3); } -void TramC () { Tram(4); } - -#if HAS_BED_PROBE && HAS_MESH - - void Trammingwizard() { - if (HMI_data.FullManualTramming) { - LCD_MESSAGE_F("Disable manual tramming"); - return; - } - bed_mesh_t zval = {0}; - zval[0][0] = Tram(0); - checkkey = NothingToDo; - MeshViewer.DrawMesh(zval, 2, 2); - zval[1][0] = Tram(1); - MeshViewer.DrawMesh(zval, 2, 2); - zval[1][1] = Tram(2); - MeshViewer.DrawMesh(zval, 2, 2); - zval[0][1] = Tram(3); - MeshViewer.DrawMesh(zval, 2, 2); - - DWINUI::Draw_CenteredString(140, F("Calculating average")); - DWINUI::Draw_CenteredString(160, F("and relative heights")); - safe_delay(1000); - float avg = 0.0f; - LOOP_L_N(x, 2) LOOP_L_N(y, 2) avg += zval[x][y]; - avg /= 4.0f; - LOOP_L_N(x, 2) LOOP_L_N(y, 2) zval[x][y] -= avg; - MeshViewer.DrawMesh(zval, 2, 2); - ui.reset_status(); - - if (ABS(MeshViewer.max - MeshViewer.min) < 0.05f) { - DWINUI::Draw_CenteredString(140, F("Corners leveled")); - DWINUI::Draw_CenteredString(160, F("Tolerance achieved!")); - } - else { - uint8_t p = 0; - float max = 0; - FSTR_P plabel; - bool s = true; - LOOP_L_N(x, 2) LOOP_L_N(y, 2) { - const float d = ABS(zval[x][y]); - if (max < d) { - s = (zval[x][y] >= 0); - max = d; - p = x + 2 * y; + uint8_t p = 0; + float max = 0; + FSTR_P plabel; + bool s = true; + for (uint8_t x = 0; x < 2; ++x) for (uint8_t y = 0; y < 2; ++y) { + const float d = ABS(zval[x][y]); + if (max < d) { + s = (zval[x][y] >= 0); + max = d; + p = x + 2 * y; + } } + switch (p) { + case 0b00 : plabel = GET_TEXT_F(MSG_TRAM_FL); break; + case 0b01 : plabel = GET_TEXT_F(MSG_TRAM_FR); break; + case 0b10 : plabel = GET_TEXT_F(MSG_TRAM_BL); break; + case 0b11 : plabel = GET_TEXT_F(MSG_TRAM_BR); break; + default : plabel = F(""); break; + } + DWINUI::Draw_CenteredString(120, F("Corners not leveled")); + DWINUI::Draw_CenteredString(140, F("Knob adjustment required")); + DWINUI::Draw_CenteredString(Color_Green, 160, s ? F("Lower") : F("Raise")); + DWINUI::Draw_CenteredString(Color_Green, 180, plabel); } - switch (p) { - case 0b00 : plabel = GET_TEXT_F(MSG_LEVBED_FL); break; - case 0b01 : plabel = GET_TEXT_F(MSG_LEVBED_FR); break; - case 0b10 : plabel = GET_TEXT_F(MSG_LEVBED_BL); break; - case 0b11 : plabel = GET_TEXT_F(MSG_LEVBED_BR); break; - default : plabel = F(""); break; - } - DWINUI::Draw_CenteredString(120, F("Corners not leveled")); - DWINUI::Draw_CenteredString(140, F("Knob adjustment required")); - DWINUI::Draw_CenteredString(Color_Green, 160, s ? F("Lower") : F("Raise")); - DWINUI::Draw_CenteredString(Color_Green, 180, plabel); + DWINUI::Draw_Button(BTN_Continue, 86, 305); + checkkey = Menu; + HMI_SaveProcessID(WaitResponse); } - DWINUI::Draw_Button(BTN_Continue, 86, 305); - checkkey = Menu; - HMI_SaveProcessID(WaitResponse); - } - void SetManualTramming() { - Toggle_Chkb_Line(HMI_data.FullManualTramming); - } + void SetManualTramming() { + Toggle_Chkb_Line(HMI_data.FullManualTramming); + } -#endif // HAS_BED_PROBE && HAS_MESH + #endif // HAS_BED_PROBE && HAS_MESH + +#endif // LCD_BED_TRAMMING #if ENABLED(MESH_BED_LEVELING) @@ -2532,67 +2513,68 @@ void TramC () { Tram(4); } #endif void ApplyMaxSpeed() { planner.set_max_feedrate(HMI_value.axis, MenuData.Value / MINUNITMULT); } -void SetMaxSpeedX() { HMI_value.axis = X_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, max_feedrate_edit_values[X_AXIS], UNITFDIGITS, planner.settings.max_feedrate_mm_s[X_AXIS], ApplyMaxSpeed); } -void SetMaxSpeedY() { HMI_value.axis = Y_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, max_feedrate_edit_values[Y_AXIS], UNITFDIGITS, planner.settings.max_feedrate_mm_s[Y_AXIS], ApplyMaxSpeed); } -void SetMaxSpeedZ() { HMI_value.axis = Z_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, max_feedrate_edit_values[Z_AXIS], UNITFDIGITS, planner.settings.max_feedrate_mm_s[Z_AXIS], ApplyMaxSpeed); } +#if HAS_X_AXIS + void SetMaxSpeedX() { HMI_value.axis = X_AXIS, SetFloatOnClick(min_feedrate_edit_values.x, max_feedrate_edit_values.x, UNITFDIGITS, planner.settings.max_feedrate_mm_s[X_AXIS], ApplyMaxSpeed); } +#endif +#if HAS_Y_AXIS + void SetMaxSpeedY() { HMI_value.axis = Y_AXIS, SetFloatOnClick(min_feedrate_edit_values.y, max_feedrate_edit_values.y, UNITFDIGITS, planner.settings.max_feedrate_mm_s[Y_AXIS], ApplyMaxSpeed); } +#endif +#if HAS_Z_AXIS + void SetMaxSpeedZ() { HMI_value.axis = Z_AXIS, SetFloatOnClick(min_feedrate_edit_values.z, max_feedrate_edit_values.z, UNITFDIGITS, planner.settings.max_feedrate_mm_s[Z_AXIS], ApplyMaxSpeed); } +#endif #if HAS_HOTEND - void SetMaxSpeedE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXFEEDSPEED, max_feedrate_edit_values[E_AXIS], UNITFDIGITS, planner.settings.max_feedrate_mm_s[E_AXIS], ApplyMaxSpeed); } + void SetMaxSpeedE() { HMI_value.axis = E_AXIS; SetFloatOnClick(min_feedrate_edit_values.e, max_feedrate_edit_values.e, UNITFDIGITS, planner.settings.max_feedrate_mm_s[E_AXIS], ApplyMaxSpeed); } #endif void ApplyMaxAccel() { planner.set_max_acceleration(HMI_value.axis, MenuData.Value); } -void SetMaxAccelX() { HMI_value.axis = X_AXIS, SetIntOnClick(MIN_MAXACCELERATION, max_acceleration_edit_values[X_AXIS], planner.settings.max_acceleration_mm_per_s2[X_AXIS], ApplyMaxAccel); } -void SetMaxAccelY() { HMI_value.axis = Y_AXIS, SetIntOnClick(MIN_MAXACCELERATION, max_acceleration_edit_values[Y_AXIS], planner.settings.max_acceleration_mm_per_s2[Y_AXIS], ApplyMaxAccel); } -void SetMaxAccelZ() { HMI_value.axis = Z_AXIS, SetIntOnClick(MIN_MAXACCELERATION, max_acceleration_edit_values[Z_AXIS], planner.settings.max_acceleration_mm_per_s2[Z_AXIS], ApplyMaxAccel); } +#if HAS_X_AXIS + void SetMaxAccelX() { HMI_value.axis = X_AXIS, SetIntOnClick(min_acceleration_edit_values.x, max_acceleration_edit_values.x, planner.settings.max_acceleration_mm_per_s2[X_AXIS], ApplyMaxAccel); } +#endif +#if HAS_Y_AXIS + void SetMaxAccelY() { HMI_value.axis = Y_AXIS, SetIntOnClick(min_acceleration_edit_values.y, max_acceleration_edit_values.y, planner.settings.max_acceleration_mm_per_s2[Y_AXIS], ApplyMaxAccel); } +#endif +#if HAS_Z_AXIS + void SetMaxAccelZ() { HMI_value.axis = Z_AXIS, SetIntOnClick(min_acceleration_edit_values.z, max_acceleration_edit_values.z, planner.settings.max_acceleration_mm_per_s2[Z_AXIS], ApplyMaxAccel); } +#endif #if HAS_HOTEND - void SetMaxAccelE() { HMI_value.axis = E_AXIS; SetIntOnClick(MIN_MAXACCELERATION, max_acceleration_edit_values[E_AXIS], planner.settings.max_acceleration_mm_per_s2[E_AXIS], ApplyMaxAccel); } + void SetMaxAccelE() { HMI_value.axis = E_AXIS; SetIntOnClick(min_acceleration_edit_values.e, max_acceleration_edit_values.e, planner.settings.max_acceleration_mm_per_s2[E_AXIS], ApplyMaxAccel); } #endif #if HAS_CLASSIC_JERK void ApplyMaxJerk() { planner.set_max_jerk(HMI_value.axis, MenuData.Value / MINUNITMULT); } - void SetMaxJerkX() { HMI_value.axis = X_AXIS, SetFloatOnClick(MIN_MAXJERK, max_jerk_edit_values[X_AXIS], UNITFDIGITS, planner.max_jerk.x, ApplyMaxJerk); } - void SetMaxJerkY() { HMI_value.axis = Y_AXIS, SetFloatOnClick(MIN_MAXJERK, max_jerk_edit_values[Y_AXIS], UNITFDIGITS, planner.max_jerk.y, ApplyMaxJerk); } - void SetMaxJerkZ() { HMI_value.axis = Z_AXIS, SetFloatOnClick(MIN_MAXJERK, max_jerk_edit_values[Z_AXIS], UNITFDIGITS, planner.max_jerk.z, ApplyMaxJerk); } + #if HAS_X_AXIS + void SetMaxJerkX() { HMI_value.axis = X_AXIS, SetFloatOnClick(min_jerk_edit_values.x, max_jerk_edit_values.x, UNITFDIGITS, planner.max_jerk.x, ApplyMaxJerk); } + #endif + #if HAS_Y_AXIS + void SetMaxJerkY() { HMI_value.axis = Y_AXIS, SetFloatOnClick(min_jerk_edit_values.y, max_jerk_edit_values.y, UNITFDIGITS, planner.max_jerk.y, ApplyMaxJerk); } + #endif + #if HAS_Z_AXIS + void SetMaxJerkZ() { HMI_value.axis = Z_AXIS, SetFloatOnClick(min_jerk_edit_values.z, max_jerk_edit_values.z, UNITFDIGITS, planner.max_jerk.z, ApplyMaxJerk); } + #endif #if HAS_HOTEND - void SetMaxJerkE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXJERK, max_jerk_edit_values[E_AXIS], UNITFDIGITS, planner.max_jerk.e, ApplyMaxJerk); } + void SetMaxJerkE() { HMI_value.axis = E_AXIS; SetFloatOnClick(min_jerk_edit_values.e, max_jerk_edit_values.e, UNITFDIGITS, planner.max_jerk.e, ApplyMaxJerk); } #endif +#elif HAS_JUNCTION_DEVIATION + void ApplyJDmm() { TERN_(LIN_ADVANCE, planner.recalculate_max_e_jerk()); } + void SetJDmm() { SetPFloatOnClick(MIN_JD_MM, MAX_JD_MM, 3, ApplyJDmm); } #endif -void SetStepsX() { HMI_value.axis = X_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); } -void SetStepsY() { HMI_value.axis = Y_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); } -void SetStepsZ() { HMI_value.axis = Z_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); } +#if ENABLED(LIN_ADVANCE) + void SetLA_K() { SetPFloatOnClick(0, 10, 3); } +#endif + +#if HAS_X_AXIS + void SetStepsX() { HMI_value.axis = X_AXIS, SetPFloatOnClick( min_steps_edit_values.x, max_steps_edit_values.x, UNITFDIGITS); } +#endif +#if HAS_Y_AXIS + void SetStepsY() { HMI_value.axis = Y_AXIS, SetPFloatOnClick( min_steps_edit_values.y, max_steps_edit_values.y, UNITFDIGITS); } +#endif +#if HAS_Z_AXIS + void SetStepsZ() { HMI_value.axis = Z_AXIS, SetPFloatOnClick( min_steps_edit_values.z, max_steps_edit_values.z, UNITFDIGITS); } +#endif #if HAS_HOTEND - void SetStepsE() { HMI_value.axis = E_AXIS; SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); } - #if ENABLED(PIDTEMP) - void SetHotendPidT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); } - #endif + void SetStepsE() { HMI_value.axis = E_AXIS; SetPFloatOnClick( min_steps_edit_values.e, max_steps_edit_values.e, UNITFDIGITS); } #endif -#if ENABLED(PIDTEMPBED) - void SetBedPidT() { SetPIntOnClick(MIN_BEDTEMP, MAX_BEDTEMP); } -#endif - -#if DWIN_PID_TUNE - void SetPidCycles() { SetPIntOnClick(3, 50); } - void SetKp() { SetPFloatOnClick(0, 1000, 2); } - void ApplyPIDi() { - *MenuData.P_Float = scalePID_i(MenuData.Value / POW(10, 2)); - TERN_(PIDTEMP, thermalManager.updatePID()); - } - void ApplyPIDd() { - *MenuData.P_Float = scalePID_d(MenuData.Value / POW(10, 2)); - TERN_(PIDTEMP, thermalManager.updatePID()); - } - void SetKi() { - MenuData.P_Float = (float*)static_cast(CurrentMenu->SelectedItem())->value; - const float value = unscalePID_i(*MenuData.P_Float); - SetFloatOnClick(0, 1000, 2, value, ApplyPIDi); - } - void SetKd() { - MenuData.P_Float = (float*)static_cast(CurrentMenu->SelectedItem())->value; - const float value = unscalePID_d(*MenuData.P_Float); - SetFloatOnClick(0, 1000, 2, value, ApplyPIDd); - } -#endif - #if ENABLED(FWRETRACT) void Return_FWRetract_Menu() { (PreviousMenu == FilSetMenu) ? Draw_FilSet_Menu() : Draw_Tune_Menu(); } void SetRetractLength() { SetPFloatOnClick( 0, 10, UNITFDIGITS); } @@ -2679,16 +2661,11 @@ void onDrawAutoHome(MenuItemClass* menuitem, int8_t line) { } #if HAS_ZOFFSET_ITEM - #if EITHER(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) + #if ANY(BABYSTEP_ZPROBE_OFFSET, JUST_BABYSTEP) void onDrawZOffset(MenuItemClass* menuitem, int8_t line) { if (HMI_IsChinese()) menuitem->SetFrame(1, 174, 164, 223, 177); onDrawPFloat2Menu(menuitem, line); } - #else - void onDrawHomeOffset(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) menuitem->SetFrame(1, 43, 89, 98, 101); - onDrawMenuItem(menuitem, line); - } #endif #endif @@ -2720,8 +2697,8 @@ void onDrawLanguage(MenuItemClass* menuitem, int8_t line) { void onDrawSelColorItem(MenuItemClass* menuitem, int8_t line) { const uint16_t color = *(uint16_t*)static_cast(menuitem)->value; - DWIN_Draw_Rectangle(0, HMI_data.Highlight_Color, ICOX + 1, MBASE(line) - 1 + 1, ICOX + 18, MBASE(line) - 1 + 18); - DWIN_Draw_Rectangle(1, color, ICOX + 2, MBASE(line) - 1 + 2, ICOX + 17, MBASE(line) - 1 + 17); + dwinDrawRectangle(0, HMI_data.Highlight_Color, ICOX + 1, MBASE(line) - 1 + 1, ICOX + 18, MBASE(line) - 1 + 18); + dwinDrawRectangle(1, color, ICOX + 2, MBASE(line) - 1 + 2, ICOX + 17, MBASE(line) - 1 + 17); onDrawMenuItem(menuitem, line); } @@ -2734,18 +2711,13 @@ void onDrawGetColorItem(MenuItemClass* menuitem, int8_t line) { case 2: color = RGB(0, 0, 31); break; // Blue default: color = 0; break; } - DWIN_Draw_Rectangle(0, HMI_data.Highlight_Color, ICOX + 1, MBASE(line) - 1 + 1, ICOX + 18, MBASE(line) - 1 + 18); - DWIN_Draw_Rectangle(1, color, ICOX + 2, MBASE(line) - 1 + 2, ICOX + 17, MBASE(line) - 1 + 17); + dwinDrawRectangle(0, HMI_data.Highlight_Color, ICOX + 1, MBASE(line) - 1 + 1, ICOX + 18, MBASE(line) - 1 + 18); + dwinDrawRectangle(1, color, ICOX + 2, MBASE(line) - 1 + 2, ICOX + 17, MBASE(line) - 1 + 17); DWINUI::Draw_String(LBLX, MBASE(line) - 1, menuitem->caption); Draw_Menu_IntValue(HMI_data.Background_Color, line, 4, HMI_value.Color[i]); - DWIN_Draw_HLine(HMI_data.SplitLine_Color, 16, MYPOS(line + 1), 240); + dwinDrawHLine(HMI_data.SplitLine_Color, 16, MYPOS(line + 1), 240); } -#if DWIN_PID_TUNE - void onDrawPIDi(MenuItemClass* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_i(*(float*)static_cast(menuitem)->value)); } - void onDrawPIDd(MenuItemClass* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast(menuitem)->value)); } -#endif - void onDrawSpeedItem(MenuItemClass* menuitem, int8_t line) { if (HMI_IsChinese()) menuitem->SetFrame(1, 116, 164, 171, 176); onDrawPIntMenu(menuitem, line); @@ -2811,29 +2783,35 @@ void onDrawSpeed(MenuItemClass* menuitem, int8_t line) { onDrawSubMenu(menuitem, line); } -void onDrawMaxSpeedX(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 228, 147); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(line)); // X +#if HAS_X_AXIS + void onDrawMaxSpeedX(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 228, 147); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 58, MBASE(line)); // X + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); -} +#endif -void onDrawMaxSpeedY(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 228, 147); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(line)); // Y +#if HAS_Y_AXIS + void onDrawMaxSpeedY(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 228, 147); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 58, MBASE(line)); // Y + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); -} +#endif -void onDrawMaxSpeedZ(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 228, 147); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(line) + 3); // Z +#if HAS_Z_AXIS + void onDrawMaxSpeedZ(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 228, 147); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 58, MBASE(line) + 3); // Z + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); -} +#endif #if HAS_HOTEND void onDrawMaxSpeedE(MenuItemClass* menuitem, int8_t line) { @@ -2853,32 +2831,38 @@ void onDrawAcc(MenuItemClass* menuitem, int8_t line) { onDrawSubMenu(menuitem, line); } -void onDrawMaxAccelX(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 200, 147); - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(line)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 71, MBASE(line)); // X +#if HAS_X_AXIS + void onDrawMaxAccelX(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 200, 147); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(line)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 71, MBASE(line)); // X + } + onDrawPInt32Menu(menuitem, line); } - onDrawPInt32Menu(menuitem, line); -} +#endif -void onDrawMaxAccelY(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 200, 147); - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(line)); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 71, MBASE(line)); // Y +#if HAS_Y_AXIS + void onDrawMaxAccelY(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 200, 147); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(line)); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 71, MBASE(line)); // Y + } + onDrawPInt32Menu(menuitem, line); } - onDrawPInt32Menu(menuitem, line); -} +#endif -void onDrawMaxAccelZ(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 200, 147); - DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(line)); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 71, MBASE(line)); // Z +#if HAS_Z_AXIS + void onDrawMaxAccelZ(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 200, 147); + DWIN_Frame_AreaCopy(1, 28, 149, 69, 161, LBLX + 27, MBASE(line)); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 71, MBASE(line)); // Z + } + onDrawPInt32Menu(menuitem, line); } - onDrawPInt32Menu(menuitem, line); -} +#endif #if HAS_HOTEND void onDrawMaxAccelE(MenuItemClass* menuitem, int8_t line) { @@ -2902,35 +2886,41 @@ void onDrawMaxAccelZ(MenuItemClass* menuitem, int8_t line) { onDrawSubMenu(menuitem, line); } - void onDrawMaxJerkX(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 200, 147); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(line)); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(line)); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(line)); + #if HAS_X_AXIS + void onDrawMaxJerkX(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 200, 147); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(line)); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(line)); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 83, MBASE(line)); + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); - } + #endif - void onDrawMaxJerkY(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 200, 147); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(line)); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(line)); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(line)); + #if HAS_Y_AXIS + void onDrawMaxJerkY(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 200, 147); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(line)); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(line)); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 83, MBASE(line)); + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); - } + #endif - void onDrawMaxJerkZ(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 173, 133, 200, 147); - DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(line)); - DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(line)); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(line)); + #if HAS_Z_AXIS + void onDrawMaxJerkZ(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 173, 133, 200, 147); + DWIN_Frame_AreaCopy(1, 1, 180, 28, 192, LBLX + 27, MBASE(line)); + DWIN_Frame_AreaCopy(1, 202, 133, 228, 147, LBLX + 53, MBASE(line)); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 83, MBASE(line)); + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); - } + #endif #if HAS_HOTEND @@ -2948,29 +2938,35 @@ void onDrawMaxAccelZ(MenuItemClass* menuitem, int8_t line) { #endif // HAS_CLASSIC_JERK -void onDrawStepsX(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 153, 148, 194, 161); - DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 44, MBASE(line)); // X +#if HAS_X_AXIS + void onDrawStepsX(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 153, 148, 194, 161); + DWIN_Frame_AreaCopy(1, 229, 133, 236, 147, LBLX + 44, MBASE(line)); // X + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); -} +#endif -void onDrawStepsY(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 153, 148, 194, 161); - DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 44, MBASE(line)); // Y +#if HAS_Y_AXIS + void onDrawStepsY(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 153, 148, 194, 161); + DWIN_Frame_AreaCopy(1, 1, 150, 7, 160, LBLX + 44, MBASE(line)); // Y + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); -} +#endif -void onDrawStepsZ(MenuItemClass* menuitem, int8_t line) { - if (HMI_IsChinese()) { - menuitem->SetFrame(1, 153, 148, 194, 161); - DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 44, MBASE(line)); // Z +#if HAS_Z_AXIS + void onDrawStepsZ(MenuItemClass* menuitem, int8_t line) { + if (HMI_IsChinese()) { + menuitem->SetFrame(1, 153, 148, 194, 161); + DWIN_Frame_AreaCopy(1, 9, 150, 16, 160, LBLX + 44, MBASE(line)); // Z + } + onDrawPFloatMenu(menuitem, line); } - onDrawPFloatMenu(menuitem, line); -} +#endif #if HAS_HOTEND @@ -2991,10 +2987,7 @@ void onDrawStepsZ(MenuItemClass* menuitem, int8_t line) { // Menu Creation and Drawing functions ====================================================== frame_rect_t selrect(frame_rect_t) { - if (HMI_IsChinese()) - return {133, 1, 28, 13}; - else - return{0}; + return HMI_IsChinese() ? frame_rect_t({ 133, 1, 28, 13 }) : frame_rect_t({ 0 }); } void Draw_Prepare_Menu() { @@ -3005,7 +2998,9 @@ void Draw_Prepare_Menu() { MENU_ITEM(ICON_FilMan, MSG_FILAMENT_MAN, onDrawSubMenu, Draw_FilamentMan_Menu); #endif MENU_ITEM(ICON_Axis, MSG_MOVE_AXIS, onDrawMoveSubMenu, Draw_Move_Menu); - MENU_ITEM(ICON_Tram, MSG_BED_TRAMMING, onDrawSubMenu, Draw_Tramming_Menu); + #if ENABLED(LCD_BED_TRAMMING) + MENU_ITEM(ICON_Tram, MSG_BED_TRAMMING, onDrawSubMenu, Draw_Tramming_Menu); + #endif MENU_ITEM(ICON_CloseMotor, MSG_DISABLE_STEPPERS, onDrawDisableMotors, DisableMotors); #if ENABLED(INDIVIDUAL_AXIS_HOMING_SUBMENU) MENU_ITEM(ICON_Homing, MSG_HOMING, onDrawSubMenu, Draw_Homing_Menu); @@ -3022,8 +3017,6 @@ void Draw_Prepare_Menu() { MENU_ITEM(ICON_SetZOffset, MSG_PROBE_WIZARD, onDrawSubMenu, Draw_ZOffsetWiz_Menu); #elif ENABLED(BABYSTEPPING) EDIT_ITEM(ICON_Zoffset, MSG_HOME_OFFSET_Z, onDrawPFloat2Menu, SetZOffset, &BABY_Z_VAR); - #elif HAS_HOME_OFFSET - MENU_ITEM(ICON_SetHome, MSG_SET_HOME_OFFSETS, onDrawHomeOffset, SetHome); #endif #endif #if HAS_PREHEAT @@ -3037,24 +3030,30 @@ void Draw_Prepare_Menu() { UpdateMenu(PrepareMenu); } -void Draw_Tramming_Menu() { - checkkey = Menu; - if (SET_MENU(TrammingMenu, MSG_BED_TRAMMING, 8)) { - BACK_ITEM(Draw_Prepare_Menu); - #if HAS_BED_PROBE && HAS_MESH - MENU_ITEM(ICON_ProbeSet, MSG_TRAMMING_WIZARD, onDrawMenuItem, Trammingwizard); - EDIT_ITEM(ICON_ProbeSet, MSG_BED_TRAMMING_MANUAL, onDrawChkbMenu, SetManualTramming, &HMI_data.FullManualTramming); - #elif !HAS_BED_PROBE && HAS_ZOFFSET_ITEM - MENU_ITEM_F(ICON_MoveZ0, "Home Z and disable", onDrawMenuItem, HomeZandDisable); - #endif - MENU_ITEM(ICON_Axis, MSG_LEVBED_FL, onDrawMenuItem, TramFL); - MENU_ITEM(ICON_Axis, MSG_LEVBED_FR, onDrawMenuItem, TramFR); - MENU_ITEM(ICON_Axis, MSG_LEVBED_BR, onDrawMenuItem, TramBR); - MENU_ITEM(ICON_Axis, MSG_LEVBED_BL, onDrawMenuItem, TramBL); - MENU_ITEM(ICON_Axis, MSG_LEVBED_C, onDrawMenuItem, TramC ); +#if ENABLED(LCD_BED_TRAMMING) + + void Draw_Tramming_Menu() { + checkkey = Menu; + if (SET_MENU(TrammingMenu, MSG_BED_TRAMMING, 8)) { + BACK_ITEM(Draw_Prepare_Menu); + #if HAS_BED_PROBE && HAS_MESH + MENU_ITEM(ICON_ProbeSet, MSG_TRAMMING_WIZARD, onDrawMenuItem, Trammingwizard); + EDIT_ITEM(ICON_ProbeSet, MSG_BED_TRAMMING_MANUAL, onDrawChkbMenu, SetManualTramming, &HMI_data.FullManualTramming); + #elif !HAS_BED_PROBE && HAS_ZOFFSET_ITEM + MENU_ITEM_F(ICON_MoveZ0, "Home Z and disable", onDrawMenuItem, HomeZandDisable); + #endif + MENU_ITEM(ICON_Axis, MSG_TRAM_FL, onDrawMenuItem, TramFL); + MENU_ITEM(ICON_Axis, MSG_TRAM_FR, onDrawMenuItem, TramFR); + MENU_ITEM(ICON_Axis, MSG_TRAM_BR, onDrawMenuItem, TramBR); + MENU_ITEM(ICON_Axis, MSG_TRAM_BL, onDrawMenuItem, TramBL); + #if ENABLED(BED_TRAMMING_INCLUDE_CENTER) + MENU_ITEM(ICON_Axis, MSG_TRAM_C, onDrawMenuItem, TramC); + #endif + } + UpdateMenu(TrammingMenu); } - UpdateMenu(TrammingMenu); -} + +#endif // LCD_BED_TRAMMING void Draw_Control_Menu() { checkkey = Menu; @@ -3086,7 +3085,7 @@ void Draw_Control_Menu() { void Draw_AdvancedSettings_Menu() { checkkey = Menu; - if (SET_MENU(AdvancedSettings, MSG_ADVANCED_SETTINGS, 19)) { + if (SET_MENU(AdvancedSettings, MSG_ADVANCED_SETTINGS, 22)) { BACK_ITEM(Goto_Main_Menu); #if ENABLED(EEPROM_SETTINGS) MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, WriteEeprom); @@ -3098,15 +3097,18 @@ void Draw_AdvancedSettings_Menu() { MENU_ITEM(ICON_ProbeSet, MSG_ZPROBE_SETTINGS, onDrawSubMenu, Draw_ProbeSet_Menu); #endif MENU_ITEM(ICON_FilSet, MSG_FILAMENT_SET, onDrawSubMenu, Draw_FilSet_Menu); - #if ENABLED(PIDTEMP) + #if ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID " Settings", onDrawSubMenu, Draw_HotendPID_Menu); #endif - #if EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) + #if ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) MENU_ITEM_F(ICON_MPCNozzle, "MPC Settings", onDrawSubMenu, Draw_HotendMPC_Menu); #endif - #if ENABLED(PIDTEMPBED) + #if ENABLED(PIDTEMPBED) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) MENU_ITEM_F(ICON_PIDBed, STR_BED_PID " Settings", onDrawSubMenu, Draw_BedPID_Menu); #endif + #if HAS_TRINAMIC_CONFIG + MENU_ITEM(ICON_TMCSet, MSG_TMC_DRIVERS, onDrawSubMenu, Draw_TrinamicConfig_menu); + #endif #if HAS_ESDIAG MENU_ITEM_F(ICON_ESDiag, "End-stops diag.", onDrawSubMenu, Draw_EndStopDiag); #endif @@ -3123,6 +3125,12 @@ void Draw_AdvancedSettings_Menu() { #if ENABLED(POWER_LOSS_RECOVERY) EDIT_ITEM(ICON_Pwrlossr, MSG_OUTAGE_RECOVERY, onDrawChkbMenu, SetPwrLossr, &recovery.enabled); #endif + #if HAS_GCODE_PREVIEW + EDIT_ITEM(ICON_File, MSG_HAS_PREVIEW, onDrawChkbMenu, SetPreview, &HMI_data.EnablePreview); + #endif + #if ENABLED(MEDIASORT_MENU_ITEM) + EDIT_ITEM(ICON_File, MSG_MEDIA_SORT, onDrawChkbMenu, SetMediaSort, &HMI_data.MediaSort); + #endif EDIT_ITEM(ICON_File, MSG_MEDIA_UPDATE, onDrawChkbMenu, SetMediaAutoMount, &HMI_data.MediaAutoMount); #if ENABLED(BAUD_RATE_GCODE) EDIT_ITEM_F(ICON_SetBaudRate, "115K baud", onDrawChkbMenu, SetBaudRate, &HMI_data.Baud115K); @@ -3131,7 +3139,9 @@ void Draw_AdvancedSettings_Menu() { EDIT_ITEM(ICON_Brightness, MSG_BRIGHTNESS, onDrawPInt8Menu, SetBrightness, &ui.brightness); MENU_ITEM(ICON_Brightness, MSG_BRIGHTNESS_OFF, onDrawMenuItem, TurnOffBacklight); #endif - MENU_ITEM(ICON_Scolor, MSG_COLORS_SELECT, onDrawSubMenu, Draw_SelectColors_Menu); + #if HAS_CUSTOM_COLORS + MENU_ITEM(ICON_Scolor, MSG_COLORS_SELECT, onDrawSubMenu, Draw_SelectColors_Menu); + #endif } ui.reset_status(true); UpdateMenu(AdvancedSettings); @@ -3142,11 +3152,17 @@ void Draw_Move_Menu() { if (SET_MENU_R(MoveMenu, selrect({192, 1, 42, 14}), MSG_MOVE_AXIS, 6)) { BACK_ITEM(Draw_Prepare_Menu); EDIT_ITEM(ICON_Axis, MSG_LIVE_MOVE, onDrawChkbMenu, SetLiveMove, &EnableLiveMove); - EDIT_ITEM(ICON_MoveX, MSG_MOVE_X, onDrawMoveX, SetMoveX, ¤t_position.x); - EDIT_ITEM(ICON_MoveY, MSG_MOVE_Y, onDrawMoveY, SetMoveY, ¤t_position.y); - EDIT_ITEM(ICON_MoveZ, MSG_MOVE_Z, onDrawMoveZ, SetMoveZ, ¤t_position.z); + #if HAS_X_AXIS + EDIT_ITEM(ICON_MoveX, MSG_MOVE_X, onDrawMoveX, SetMoveX, ¤t_position.x); + #endif + #if HAS_Y_AXIS + EDIT_ITEM(ICON_MoveY, MSG_MOVE_Y, onDrawMoveY, SetMoveY, ¤t_position.y); + #endif + #if HAS_Z_AXIS + EDIT_ITEM(ICON_MoveZ, MSG_MOVE_Z, onDrawMoveZ, SetMoveZ, ¤t_position.z); + #endif #if HAS_HOTEND - gcode.process_subcommands_now(F("G92E0")); // reset extruder position + gcode.process_subcommands_now(F("G92E0")); // Reset extruder position EDIT_ITEM(ICON_Extruder, MSG_MOVE_E, onDrawMoveE, SetMoveE, ¤t_position.e); #endif } @@ -3160,14 +3176,20 @@ void Draw_Move_Menu() { checkkey = Menu; if (SET_MENU(HomeOffMenu, MSG_SET_HOME_OFFSETS, 4)) { BACK_ITEM(Draw_PhySet_Menu); - EDIT_ITEM(ICON_HomeOffsetX, MSG_HOME_OFFSET_X, onDrawPFloatMenu, SetHomeOffsetX, &home_offset.x); - EDIT_ITEM(ICON_HomeOffsetY, MSG_HOME_OFFSET_Y, onDrawPFloatMenu, SetHomeOffsetY, &home_offset.y); - EDIT_ITEM(ICON_HomeOffsetZ, MSG_HOME_OFFSET_Z, onDrawPFloatMenu, SetHomeOffsetZ, &home_offset.z); + #if HAS_X_AXIS + EDIT_ITEM(ICON_HomeOffsetX, MSG_HOME_OFFSET_X, onDrawPFloatMenu, SetHomeOffsetX, &home_offset.x); + #endif + #if HAS_Y_AXIS + EDIT_ITEM(ICON_HomeOffsetY, MSG_HOME_OFFSET_Y, onDrawPFloatMenu, SetHomeOffsetY, &home_offset.y); + #endif + #if HAS_Z_AXIS + EDIT_ITEM(ICON_HomeOffsetZ, MSG_HOME_OFFSET_Z, onDrawPFloatMenu, SetHomeOffsetZ, &home_offset.z); + #endif } UpdateMenu(HomeOffMenu); } -#endif +#endif // HAS_HOME_OFFSET #if HAS_BED_PROBE @@ -3175,9 +3197,15 @@ void Draw_Move_Menu() { checkkey = Menu; if (SET_MENU(ProbeSetMenu, MSG_ZPROBE_SETTINGS, 9)) { BACK_ITEM(Draw_AdvancedSettings_Menu); - EDIT_ITEM(ICON_ProbeOffsetX, MSG_ZPROBE_XOFFSET, onDrawPFloatMenu, SetProbeOffsetX, &probe.offset.x); - EDIT_ITEM(ICON_ProbeOffsetY, MSG_ZPROBE_YOFFSET, onDrawPFloatMenu, SetProbeOffsetY, &probe.offset.y); - EDIT_ITEM(ICON_ProbeOffsetZ, MSG_ZPROBE_ZOFFSET, onDrawPFloat2Menu, SetProbeOffsetZ, &probe.offset.z); + #if HAS_X_AXIS + EDIT_ITEM(ICON_ProbeOffsetX, MSG_ZPROBE_XOFFSET, onDrawPFloatMenu, SetProbeOffsetX, &probe.offset.x); + #endif + #if HAS_Y_AXIS + EDIT_ITEM(ICON_ProbeOffsetY, MSG_ZPROBE_YOFFSET, onDrawPFloatMenu, SetProbeOffsetY, &probe.offset.y); + #endif + #if HAS_Z_AXIS + EDIT_ITEM(ICON_ProbeOffsetZ, MSG_ZPROBE_ZOFFSET, onDrawPFloat2Menu, SetProbeOffsetZ, &probe.offset.z); + #endif #if ENABLED(BLTOUCH) MENU_ITEM(ICON_ProbeStow, MSG_MANUAL_STOW, onDrawMenuItem, ProbeStow); MENU_ITEM(ICON_ProbeDeploy, MSG_MANUAL_DEPLOY, onDrawMenuItem, ProbeDeploy); @@ -3191,7 +3219,7 @@ void Draw_Move_Menu() { UpdateMenu(ProbeSetMenu); } -#endif +#endif // HAS_BED_PROBE void Draw_FilSet_Menu() { checkkey = Menu; @@ -3217,47 +3245,7 @@ void Draw_FilSet_Menu() { UpdateMenu(FilSetMenu); } -void Draw_SelectColors_Menu() { - checkkey = Menu; - if (SET_MENU(SelectColorMenu, MSG_COLORS_SELECT, 20)) { - BACK_ITEM(Draw_AdvancedSettings_Menu); - MENU_ITEM(ICON_StockConfiguration, MSG_RESTORE_DEFAULTS, onDrawMenuItem, RestoreDefaultColors); - EDIT_ITEM_F(0, "Screen Background", onDrawSelColorItem, SelColor, &HMI_data.Background_Color); - EDIT_ITEM_F(0, "Cursor", onDrawSelColorItem, SelColor, &HMI_data.Cursor_Color); - EDIT_ITEM_F(0, "Title Background", onDrawSelColorItem, SelColor, &HMI_data.TitleBg_Color); - EDIT_ITEM_F(0, "Title Text", onDrawSelColorItem, SelColor, &HMI_data.TitleTxt_Color); - EDIT_ITEM_F(0, "Text", onDrawSelColorItem, SelColor, &HMI_data.Text_Color); - EDIT_ITEM_F(0, "Selected", onDrawSelColorItem, SelColor, &HMI_data.Selected_Color); - EDIT_ITEM_F(0, "Split Line", onDrawSelColorItem, SelColor, &HMI_data.SplitLine_Color); - EDIT_ITEM_F(0, "Highlight", onDrawSelColorItem, SelColor, &HMI_data.Highlight_Color); - EDIT_ITEM_F(0, "Status Background", onDrawSelColorItem, SelColor, &HMI_data.StatusBg_Color); - EDIT_ITEM_F(0, "Status Text", onDrawSelColorItem, SelColor, &HMI_data.StatusTxt_Color); - EDIT_ITEM_F(0, "Popup Background", onDrawSelColorItem, SelColor, &HMI_data.PopupBg_Color); - EDIT_ITEM_F(0, "Popup Text", onDrawSelColorItem, SelColor, &HMI_data.PopupTxt_Color); - EDIT_ITEM_F(0, "Alert Background", onDrawSelColorItem, SelColor, &HMI_data.AlertBg_Color); - EDIT_ITEM_F(0, "Alert Text", onDrawSelColorItem, SelColor, &HMI_data.AlertTxt_Color); - EDIT_ITEM_F(0, "Percent Text", onDrawSelColorItem, SelColor, &HMI_data.PercentTxt_Color); - EDIT_ITEM_F(0, "Bar Fill", onDrawSelColorItem, SelColor, &HMI_data.Barfill_Color); - EDIT_ITEM_F(0, "Indicator value", onDrawSelColorItem, SelColor, &HMI_data.Indicator_Color); - EDIT_ITEM_F(0, "Coordinate value", onDrawSelColorItem, SelColor, &HMI_data.Coordinate_Color); - } - UpdateMenu(SelectColorMenu); -} - -void Draw_GetColor_Menu() { - checkkey = Menu; - if (SET_MENU(GetColorMenu, MSG_COLORS_GET, 5)) { - BACK_ITEM(DWIN_ApplyColor); - MENU_ITEM(ICON_Cancel, MSG_BUTTON_CANCEL, onDrawMenuItem, Draw_SelectColors_Menu); - MENU_ITEM(0, MSG_COLORS_RED, onDrawGetColorItem, SetRGBColor); - MENU_ITEM(1, MSG_COLORS_GREEN, onDrawGetColorItem, SetRGBColor); - MENU_ITEM(2, MSG_COLORS_BLUE, onDrawGetColorItem, SetRGBColor); - } - UpdateMenu(GetColorMenu); - DWIN_Draw_Rectangle(1, *MenuData.P_Int, 20, 315, DWIN_WIDTH - 20, 335); -} - -#if BOTH(CASE_LIGHT_MENU, CASELIGHT_USES_BRIGHTNESS) +#if ALL(CASE_LIGHT_MENU, CASELIGHT_USES_BRIGHTNESS) void Draw_CaseLight_Menu() { checkkey = Menu; @@ -3277,7 +3265,7 @@ void Draw_GetColor_Menu() { checkkey = Menu; if (SET_MENU(LedControlMenu, MSG_LED_CONTROL, 10)) { BACK_ITEM(Draw_Control_Menu); - #if !BOTH(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) + #if !ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) EDIT_ITEM(ICON_LedControl, MSG_LEDS, onDrawChkbMenu, SetLedStatus, &leds.lights_on); #endif #if HAS_COLOR_LEDS @@ -3307,7 +3295,7 @@ void Draw_GetColor_Menu() { void Draw_Tune_Menu() { checkkey = Menu; - if (SET_MENU_R(TuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, 14)) { + if (SET_MENU_R(TuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, 17)) { BACK_ITEM(Goto_PrintProcess); EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawSpeedItem, SetSpeed, &feedrate_percentage); #if HAS_HOTEND @@ -3319,7 +3307,7 @@ void Draw_Tune_Menu() { #if HAS_FAN FanSpeedItem = EDIT_ITEM(ICON_FanSpeed, MSG_FAN_SPEED, onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]); #endif - #if ALL(HAS_ZOFFSET_ITEM, HAS_BED_PROBE, BABYSTEPPING) + #if ALL(HAS_ZOFFSET_ITEM, HAS_BED_PROBE, BABYSTEP_ZPROBE_OFFSET, BABYSTEPPING) EDIT_ITEM(ICON_Zoffset, MSG_ZPROBE_ZOFFSET, onDrawZOffset, SetZOffset, &BABY_Z_VAR); #elif ALL(HAS_ZOFFSET_ITEM, MESH_BED_LEVELING, BABYSTEPPING) EDIT_ITEM(ICON_Zoffset, MSG_HOME_OFFSET_Z, onDrawPFloat2Menu, SetZOffset, &BABY_Z_VAR); @@ -3331,9 +3319,18 @@ void Draw_Tune_Menu() { #if HAS_FILAMENT_SENSOR EDIT_ITEM(ICON_Runout, MSG_RUNOUT_ENABLE, onDrawChkbMenu, SetRunoutEnable, &runout.enabled); #endif + #if ENABLED(PLR_TUNE_ITEM) + EDIT_ITEM(ICON_Pwrlossr, MSG_OUTAGE_RECOVERY, onDrawChkbMenu, SetPwrLossr, &recovery.enabled); + #endif #if ENABLED(FWRETRACT) MENU_ITEM(ICON_FWRetract, MSG_FWRETRACT, onDrawSubMenu, Draw_FWRetract_Menu); #endif + #if ENABLED(JD_TUNE_ITEM) + EDIT_ITEM(ICON_JDmm, MSG_JUNCTION_DEVIATION, onDrawPFloat3Menu, SetJDmm, &planner.junction_deviation_mm); + #endif + #if ENABLED(ADVK_TUNE_ITEM) + EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, SetLA_K, &planner.extruder_advance_K[0]); + #endif #if HAS_LOCKSCREEN MENU_ITEM(ICON_Lock, MSG_LOCKSCREEN, onDrawMenuItem, DWIN_LockScreen); #endif @@ -3350,30 +3347,133 @@ void Draw_Tune_Menu() { UpdateMenu(TuneMenu); } +#if ENABLED(ADAPTIVE_STEP_SMOOTHING) + void SetAdaptiveStepSmoothing() { + Toggle_Chkb_Line(HMI_data.AdaptiveStepSmoothing); + } +#endif + +#if ENABLED(SHAPING_MENU) + void ApplyShapingFreq() { stepper.set_shaping_frequency(HMI_value.axis, MenuData.Value / 100); } + void ApplyShapingZeta() { stepper.set_shaping_damping_ratio(HMI_value.axis, MenuData.Value / 100); } + + #if ENABLED(INPUT_SHAPING_X) + void onDrawShapingXFreq(MenuItemClass* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, stepper.get_shaping_frequency(X_AXIS)); } + void onDrawShapingXZeta(MenuItemClass* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, stepper.get_shaping_damping_ratio(X_AXIS)); } + void SetShapingXFreq() { HMI_value.axis = X_AXIS; SetFloatOnClick(0, 200, 2, stepper.get_shaping_frequency(X_AXIS), ApplyShapingFreq); } + void SetShapingXZeta() { HMI_value.axis = X_AXIS; SetFloatOnClick(0, 1, 2, stepper.get_shaping_damping_ratio(X_AXIS), ApplyShapingZeta); } + #endif + + #if ENABLED(INPUT_SHAPING_Y) + void onDrawShapingYFreq(MenuItemClass* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, stepper.get_shaping_frequency(Y_AXIS)); } + void onDrawShapingYZeta(MenuItemClass* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, stepper.get_shaping_damping_ratio(Y_AXIS)); } + void SetShapingYFreq() { HMI_value.axis = Y_AXIS; SetFloatOnClick(0, 200, 2, stepper.get_shaping_frequency(Y_AXIS), ApplyShapingFreq); } + void SetShapingYZeta() { HMI_value.axis = Y_AXIS; SetFloatOnClick(0, 1, 2, stepper.get_shaping_damping_ratio(Y_AXIS), ApplyShapingZeta); } + #endif + + void Draw_InputShaping_menu() { + checkkey = Menu; + if (SET_MENU(InputShapingMenu, MSG_INPUT_SHAPING, 5)) { + BACK_ITEM(Draw_Motion_Menu); + #if ENABLED(INPUT_SHAPING_X) + MENU_ITEM(ICON_ShapingX, MSG_SHAPING_A_FREQ, onDrawShapingXFreq, SetShapingXFreq); + MENU_ITEM(ICON_ShapingX, MSG_SHAPING_A_ZETA, onDrawShapingXZeta, SetShapingXZeta); + #endif + #if ENABLED(INPUT_SHAPING_Y) + MENU_ITEM(ICON_ShapingY, MSG_SHAPING_B_FREQ, onDrawShapingYFreq, SetShapingYFreq); + MENU_ITEM(ICON_ShapingY, MSG_SHAPING_B_ZETA, onDrawShapingYZeta, SetShapingYZeta); + #endif + } + UpdateMenu(InputShapingMenu); + } +#endif + +#if HAS_TRINAMIC_CONFIG + #if AXIS_IS_TMC(X) + void SetXTMCCurrent() { SetPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperX.refresh_stepper_current(); }); } + #endif + #if AXIS_IS_TMC(Y) + void SetYTMCCurrent() { SetPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperY.refresh_stepper_current(); }); } + #endif + #if AXIS_IS_TMC(Z) + void SetZTMCCurrent() { SetPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperZ.refresh_stepper_current(); }); } + #endif + #if AXIS_IS_TMC(E0) + void SetETMCCurrent() { SetPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperE0.refresh_stepper_current(); }); } + #endif + + void Draw_TrinamicConfig_menu() { + checkkey = Menu; + if (SET_MENU(TrinamicConfigMenu, MSG_TMC_DRIVERS, 5)) { + BACK_ITEM(Draw_AdvancedSettings_Menu); + #if AXIS_IS_TMC(X) + EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, SetXTMCCurrent, &stepperX.val_mA); + #endif + #if AXIS_IS_TMC(Y) + EDIT_ITEM(ICON_TMCYSet, MSG_TMC_BCURRENT, onDrawPIntMenu, SetYTMCCurrent, &stepperY.val_mA); + #endif + #if AXIS_IS_TMC(Z) + EDIT_ITEM(ICON_TMCZSet, MSG_TMC_CCURRENT, onDrawPIntMenu, SetZTMCCurrent, &stepperZ.val_mA); + #endif + #if AXIS_IS_TMC(E0) + EDIT_ITEM(ICON_TMCESet, MSG_TMC_ECURRENT, onDrawPIntMenu, SetETMCCurrent, &stepperE0.val_mA); + #endif + } + UpdateMenu(TrinamicConfigMenu); + } +#endif + void Draw_Motion_Menu() { checkkey = Menu; - if (SET_MENU_R(MotionMenu, selrect({1, 16, 28, 13}), MSG_MOTION, 6)) { + if (SET_MENU_R(MotionMenu, selrect({1, 16, 28, 13}), MSG_MOTION, 10)) { BACK_ITEM(Draw_Control_Menu); MENU_ITEM(ICON_MaxSpeed, MSG_SPEED, onDrawSpeed, Draw_MaxSpeed_Menu); MENU_ITEM(ICON_MaxAccelerated, MSG_ACCELERATION, onDrawAcc, Draw_MaxAccel_Menu); #if HAS_CLASSIC_JERK MENU_ITEM(ICON_MaxJerk, MSG_JERK, onDrawJerk, Draw_MaxJerk_Menu); + #elif HAS_JUNCTION_DEVIATION + EDIT_ITEM(ICON_JDmm, MSG_JUNCTION_DEVIATION, onDrawPFloat3Menu, SetJDmm, &planner.junction_deviation_mm); + #endif + #if ENABLED(LIN_ADVANCE) + EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, SetLA_K, &planner.extruder_advance_K[0]); + #endif + #if ENABLED(SHAPING_MENU) + MENU_ITEM(ICON_InputShaping, MSG_INPUT_SHAPING, onDrawSubMenu, Draw_InputShaping_menu); + #endif + #if ENABLED(ADAPTIVE_STEP_SMOOTHING) + EDIT_ITEM(ICON_UBLActive, MSG_STEP_SMOOTHING, onDrawChkbMenu, SetAdaptiveStepSmoothing, &HMI_data.AdaptiveStepSmoothing); #endif MENU_ITEM(ICON_Step, MSG_STEPS_PER_MM, onDrawSteps, Draw_Steps_Menu); EDIT_ITEM(ICON_Flow, MSG_FLOW, onDrawPIntMenu, SetFlow, &planner.flow_percentage[0]); + EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawPIntMenu, SetSpeed, &feedrate_percentage); } UpdateMenu(MotionMenu); } +#if HAS_PREHEAT + void Draw_PreheatHotend_Menu() { + checkkey = Menu; + if (SET_MENU(PreheatHotendMenu, MSG_PREHEAT_HOTEND, 1 + PREHEAT_COUNT)) { + BACK_ITEM(Draw_FilamentMan_Menu); + #define _ITEM_PREHEAT_HE(N) MENU_ITEM(ICON_Preheat##N, MSG_PREHEAT_##N, onDrawMenuItem, DoPreheatHotend##N); + REPEAT_1(PREHEAT_COUNT, _ITEM_PREHEAT_HE) + } + UpdateMenu(PreheatHotendMenu); + } +#endif + #if ENABLED(ADVANCED_PAUSE_FEATURE) void Draw_FilamentMan_Menu() { checkkey = Menu; - if (SET_MENU(FilamentMenu, MSG_FILAMENT_MAN, 5)) { + if (SET_MENU(FilamentMenu, MSG_FILAMENT_MAN, 6)) { BACK_ITEM(Draw_Prepare_Menu); #if ENABLED(NOZZLE_PARK_FEATURE) MENU_ITEM(ICON_Park, MSG_FILAMENT_PARK_ENABLED, onDrawMenuItem, ParkHead); #endif + #if HAS_PREHEAT + MENU_ITEM(ICON_SetEndTemp, MSG_PREHEAT_HOTEND, onDrawSubMenu, Draw_PreheatHotend_Menu); + #endif MENU_ITEM(ICON_FilMan, MSG_FILAMENTCHANGE, onDrawMenuItem, ChangeFilament); #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) MENU_ITEM(ICON_FilUnload, MSG_FILAMENTUNLOAD, onDrawMenuItem, UnloadFilament); @@ -3426,7 +3526,7 @@ void Draw_Motion_Menu() { #define _Preheat_Menu(N) \ void Draw_Preheat## N ##_Menu() { \ - HMI_value.Select = N-1; \ + HMI_value.Select = (N) - 1; \ Draw_Preheat_Menu(SET_MENU(PreheatMenu, MSG_PREHEAT_## N ##_SETTINGS, 5)); \ } REPEAT_1(PREHEAT_COUNT, _Preheat_Menu) @@ -3458,9 +3558,15 @@ void Draw_MaxSpeed_Menu() { checkkey = Menu; if (SET_MENU_R(MaxSpeedMenu, selrect({1, 16, 28, 13}), MSG_MAX_SPEED, 5)) { BACK_ITEM(Draw_Motion_Menu); - EDIT_ITEM(ICON_MaxSpeedX, MSG_VMAX_A, onDrawMaxSpeedX, SetMaxSpeedX, &planner.settings.max_feedrate_mm_s[X_AXIS]); - EDIT_ITEM(ICON_MaxSpeedY, MSG_VMAX_B, onDrawMaxSpeedY, SetMaxSpeedY, &planner.settings.max_feedrate_mm_s[Y_AXIS]); - EDIT_ITEM(ICON_MaxSpeedZ, MSG_VMAX_C, onDrawMaxSpeedZ, SetMaxSpeedZ, &planner.settings.max_feedrate_mm_s[Z_AXIS]); + #if HAS_X_AXIS + EDIT_ITEM(ICON_MaxSpeedX, MSG_VMAX_A, onDrawMaxSpeedX, SetMaxSpeedX, &planner.settings.max_feedrate_mm_s[X_AXIS]); + #endif + #if HAS_Y_AXIS + EDIT_ITEM(ICON_MaxSpeedY, MSG_VMAX_B, onDrawMaxSpeedY, SetMaxSpeedY, &planner.settings.max_feedrate_mm_s[Y_AXIS]); + #endif + #if HAS_Z_AXIS + EDIT_ITEM(ICON_MaxSpeedZ, MSG_VMAX_C, onDrawMaxSpeedZ, SetMaxSpeedZ, &planner.settings.max_feedrate_mm_s[Z_AXIS]); + #endif #if HAS_HOTEND EDIT_ITEM(ICON_MaxSpeedE, MSG_VMAX_E, onDrawMaxSpeedE, SetMaxSpeedE, &planner.settings.max_feedrate_mm_s[E_AXIS]); #endif @@ -3472,9 +3578,15 @@ void Draw_MaxAccel_Menu() { checkkey = Menu; if (SET_MENU_R(MaxAccelMenu, selrect({1, 16, 28, 13}), MSG_AMAX_EN, 5)) { BACK_ITEM(Draw_Motion_Menu); - EDIT_ITEM(ICON_MaxAccX, MSG_AMAX_A, onDrawMaxAccelX, SetMaxAccelX, &planner.settings.max_acceleration_mm_per_s2[X_AXIS]); - EDIT_ITEM(ICON_MaxAccY, MSG_AMAX_B, onDrawMaxAccelY, SetMaxAccelY, &planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); - EDIT_ITEM(ICON_MaxAccZ, MSG_AMAX_C, onDrawMaxAccelZ, SetMaxAccelZ, &planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + #if HAS_X_AXIS + EDIT_ITEM(ICON_MaxAccX, MSG_AMAX_A, onDrawMaxAccelX, SetMaxAccelX, &planner.settings.max_acceleration_mm_per_s2[X_AXIS]); + #endif + #if HAS_Y_AXIS + EDIT_ITEM(ICON_MaxAccY, MSG_AMAX_B, onDrawMaxAccelY, SetMaxAccelY, &planner.settings.max_acceleration_mm_per_s2[Y_AXIS]); + #endif + #if HAS_Z_AXIS + EDIT_ITEM(ICON_MaxAccZ, MSG_AMAX_C, onDrawMaxAccelZ, SetMaxAccelZ, &planner.settings.max_acceleration_mm_per_s2[Z_AXIS]); + #endif #if HAS_HOTEND EDIT_ITEM(ICON_MaxAccE, MSG_AMAX_E, onDrawMaxAccelE, SetMaxAccelE, &planner.settings.max_acceleration_mm_per_s2[E_AXIS]); #endif @@ -3488,9 +3600,15 @@ void Draw_MaxAccel_Menu() { checkkey = Menu; if (SET_MENU_R(MaxJerkMenu, selrect({1, 16, 28, 13}), MSG_JERK, 5)) { BACK_ITEM(Draw_Motion_Menu); - EDIT_ITEM(ICON_MaxSpeedJerkX, MSG_VA_JERK, onDrawMaxJerkX, SetMaxJerkX, &planner.max_jerk.x); - EDIT_ITEM(ICON_MaxSpeedJerkY, MSG_VB_JERK, onDrawMaxJerkY, SetMaxJerkY, &planner.max_jerk.y); - EDIT_ITEM(ICON_MaxSpeedJerkZ, MSG_VC_JERK, onDrawMaxJerkZ, SetMaxJerkZ, &planner.max_jerk.z); + #if HAS_X_AXIS + EDIT_ITEM(ICON_MaxSpeedJerkX, MSG_VA_JERK, onDrawMaxJerkX, SetMaxJerkX, &planner.max_jerk.x); + #endif + #if HAS_Y_AXIS + EDIT_ITEM(ICON_MaxSpeedJerkY, MSG_VB_JERK, onDrawMaxJerkY, SetMaxJerkY, &planner.max_jerk.y); + #endif + #if HAS_Z_AXIS + EDIT_ITEM(ICON_MaxSpeedJerkZ, MSG_VC_JERK, onDrawMaxJerkZ, SetMaxJerkZ, &planner.max_jerk.z); + #endif #if HAS_HOTEND EDIT_ITEM(ICON_MaxSpeedJerkE, MSG_VE_JERK, onDrawMaxJerkE, SetMaxJerkE, &planner.max_jerk.e); #endif @@ -3504,9 +3622,15 @@ void Draw_Steps_Menu() { checkkey = Menu; if (SET_MENU_R(StepsMenu, selrect({1, 16, 28, 13}), MSG_STEPS_PER_MM, 5)) { BACK_ITEM(Draw_Motion_Menu); - EDIT_ITEM(ICON_StepX, MSG_A_STEPS, onDrawStepsX, SetStepsX, &planner.settings.axis_steps_per_mm[X_AXIS]); - EDIT_ITEM(ICON_StepY, MSG_B_STEPS, onDrawStepsY, SetStepsY, &planner.settings.axis_steps_per_mm[Y_AXIS]); - EDIT_ITEM(ICON_StepZ, MSG_C_STEPS, onDrawStepsZ, SetStepsZ, &planner.settings.axis_steps_per_mm[Z_AXIS]); + #if HAS_X_AXIS + EDIT_ITEM(ICON_StepX, MSG_A_STEPS, onDrawStepsX, SetStepsX, &planner.settings.axis_steps_per_mm[X_AXIS]); + #endif + #if HAS_Y_AXIS + EDIT_ITEM(ICON_StepY, MSG_B_STEPS, onDrawStepsY, SetStepsY, &planner.settings.axis_steps_per_mm[Y_AXIS]); + #endif + #if HAS_Z_AXIS + EDIT_ITEM(ICON_StepZ, MSG_C_STEPS, onDrawStepsZ, SetStepsZ, &planner.settings.axis_steps_per_mm[Z_AXIS]); + #endif #if HAS_HOTEND EDIT_ITEM(ICON_StepE, MSG_E_STEPS, onDrawStepsE, SetStepsE, &planner.settings.axis_steps_per_mm[E_AXIS]); #endif @@ -3514,32 +3638,93 @@ void Draw_Steps_Menu() { UpdateMenu(StepsMenu); } -#if ENABLED(PIDTEMP) +//============================================================================= +// UI editable custom colors +//============================================================================= - void Draw_HotendPID_Menu() { - checkkey = Menu; - if (SET_MENU_F(HotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { - BACK_ITEM(Draw_AdvancedSettings_Menu); - MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, HotendPID); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KP, onDrawPFloat2Menu, SetKp, &thermalManager.temp_hotend[0].pid.Kp); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KI, onDrawPIDi, SetKi, &thermalManager.temp_hotend[0].pid.Ki); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KD, onDrawPIDd, SetKd, &thermalManager.temp_hotend[0].pid.Kd); - EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, SetHotendPidT, &HMI_data.HotendPidT); - EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, SetPidCycles, &HMI_data.PidCycles); - #if ENABLED(EEPROM_SETTINGS) - MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, WriteEeprom); - #endif - } - UpdateMenu(HotendPIDMenu); +#if HAS_CUSTOM_COLORS + + void RestoreDefaultColors() { + DWIN_SetColorDefaults(); + DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color, HMI_data.StatusBg_Color); + DWIN_RedrawScreen(); } -#endif + void SelColor() { + MenuData.P_Int = (int16_t*)static_cast(CurrentMenu->SelectedItem())->value; + HMI_value.Color[0] = GetRColor(*MenuData.P_Int); // Red + HMI_value.Color[1] = GetGColor(*MenuData.P_Int); // Green + HMI_value.Color[2] = GetBColor(*MenuData.P_Int); // Blue + Draw_GetColor_Menu(); + } -#if EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) + void LiveRGBColor() { + HMI_value.Color[CurrentMenu->line() - 2] = MenuData.Value; + uint16_t color = RGB(HMI_value.Color[0], HMI_value.Color[1], HMI_value.Color[2]); + dwinDrawRectangle(1, color, 20, 315, DWIN_WIDTH - 20, 335); + } + void SetRGBColor() { + const uint8_t color = static_cast(CurrentMenu->SelectedItem())->icon; + SetIntOnClick(0, (color == 1) ? 63 : 31, HMI_value.Color[color], nullptr, LiveRGBColor); + } + + void DWIN_ApplyColor() { + *MenuData.P_Int = RGB(HMI_value.Color[0], HMI_value.Color[1], HMI_value.Color[2]); + DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color, HMI_data.StatusBg_Color); + Draw_SelectColors_Menu(); + hash_changed = true; + LCD_MESSAGE(MSG_COLORS_APPLIED); + DWIN_Draw_Dashboard(); + } + + void Draw_SelectColors_Menu() { + checkkey = Menu; + if (SET_MENU(SelectColorMenu, MSG_COLORS_SELECT, 20)) { + BACK_ITEM(Draw_AdvancedSettings_Menu); + MENU_ITEM(ICON_StockConfiguration, MSG_RESTORE_DEFAULTS, onDrawMenuItem, RestoreDefaultColors); + EDIT_ITEM_F(0, "Screen Background", onDrawSelColorItem, SelColor, &HMI_data.Background_Color); + EDIT_ITEM_F(0, "Cursor", onDrawSelColorItem, SelColor, &HMI_data.Cursor_Color); + EDIT_ITEM_F(0, "Title Background", onDrawSelColorItem, SelColor, &HMI_data.TitleBg_Color); + EDIT_ITEM_F(0, "Title Text", onDrawSelColorItem, SelColor, &HMI_data.TitleTxt_Color); + EDIT_ITEM_F(0, "Text", onDrawSelColorItem, SelColor, &HMI_data.Text_Color); + EDIT_ITEM_F(0, "Selected", onDrawSelColorItem, SelColor, &HMI_data.Selected_Color); + EDIT_ITEM_F(0, "Split Line", onDrawSelColorItem, SelColor, &HMI_data.SplitLine_Color); + EDIT_ITEM_F(0, "Highlight", onDrawSelColorItem, SelColor, &HMI_data.Highlight_Color); + EDIT_ITEM_F(0, "Status Background", onDrawSelColorItem, SelColor, &HMI_data.StatusBg_Color); + EDIT_ITEM_F(0, "Status Text", onDrawSelColorItem, SelColor, &HMI_data.StatusTxt_Color); + EDIT_ITEM_F(0, "Popup Background", onDrawSelColorItem, SelColor, &HMI_data.PopupBg_Color); + EDIT_ITEM_F(0, "Popup Text", onDrawSelColorItem, SelColor, &HMI_data.PopupTxt_Color); + EDIT_ITEM_F(0, "Alert Background", onDrawSelColorItem, SelColor, &HMI_data.AlertBg_Color); + EDIT_ITEM_F(0, "Alert Text", onDrawSelColorItem, SelColor, &HMI_data.AlertTxt_Color); + EDIT_ITEM_F(0, "Percent Text", onDrawSelColorItem, SelColor, &HMI_data.PercentTxt_Color); + EDIT_ITEM_F(0, "Bar Fill", onDrawSelColorItem, SelColor, &HMI_data.Barfill_Color); + EDIT_ITEM_F(0, "Indicator value", onDrawSelColorItem, SelColor, &HMI_data.Indicator_Color); + EDIT_ITEM_F(0, "Coordinate value", onDrawSelColorItem, SelColor, &HMI_data.Coordinate_Color); + } + UpdateMenu(SelectColorMenu); + } + + void Draw_GetColor_Menu() { + checkkey = Menu; + if (SET_MENU(GetColorMenu, MSG_COLORS_GET, 5)) { + BACK_ITEM(DWIN_ApplyColor); + MENU_ITEM(ICON_Cancel, MSG_BUTTON_CANCEL, onDrawMenuItem, Draw_SelectColors_Menu); + MENU_ITEM(0, MSG_COLORS_RED, onDrawGetColorItem, SetRGBColor); + MENU_ITEM(1, MSG_COLORS_GREEN, onDrawGetColorItem, SetRGBColor); + MENU_ITEM(2, MSG_COLORS_BLUE, onDrawGetColorItem, SetRGBColor); + } + UpdateMenu(GetColorMenu); + dwinDrawRectangle(1, *MenuData.P_Int, 20, 315, DWIN_WIDTH - 20, 335); + } + +#endif // HAS_CUSTOM_COLORS + +//============================================================================= +// Nozzle and Bed PID/MPC +//============================================================================= + +#if ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) - #if ENABLED(MPC_AUTOTUNE_MENU) - void HotendMPC() { thermalManager.MPC_autotune(active_extruder); } - #endif #if ENABLED(MPC_EDIT_MENU) void SetHeaterPower() { SetPFloatOnClick(1, 200, 1); } void SetBlkHeatCapacity() { SetPFloatOnClick(0, 40, 2); } @@ -3558,7 +3743,7 @@ void Draw_Steps_Menu() { MPC_t &mpc = thermalManager.temp_hotend[0].mpc; BACK_ITEM(Draw_AdvancedSettings_Menu); #if ENABLED(MPC_AUTOTUNE_MENU) - MENU_ITEM(ICON_MPCNozzle, MSG_MPC_AUTOTUNE, onDrawMenuItem, HotendMPC); + MENU_ITEM(ICON_MPCNozzle, MSG_MPC_AUTOTUNE, onDrawMenuItem, []{ thermalManager.MPC_autotune(active_extruder, Temperature::MPCTuningType::AUTO); }); #endif #if ENABLED(MPC_EDIT_MENU) EDIT_ITEM(ICON_MPCHeater, MSG_MPC_POWER, onDrawPFloatMenu, SetHeaterPower, &mpc.heater_power); @@ -3575,18 +3760,97 @@ void Draw_Steps_Menu() { #endif // MPC_EDIT_MENU || MPC_AUTOTUNE_MENU -#if ENABLED(PIDTEMPBED) +#if DWIN_PID_TUNE + void SetPID(celsius_t t, heater_id_t h) { + char cmd[53] = ""; + char str_1[5] = "", str_2[5] = ""; + sprintf_P(cmd, PSTR("G28OXY\nG0Z5F300\nG0X%sY%sF5000\nM84\nM400"), + dtostrf(X_CENTER, 1, 1, str_1), + dtostrf(Y_CENTER, 1, 1, str_2) + ); + gcode.process_subcommands_now(cmd); + thermalManager.PID_autotune(t, h, HMI_data.PidCycles, true); + } + void SetPidCycles() { SetPIntOnClick(3, 50); } +#endif + +#if ALL(HAS_PID_HEATING, PID_EDIT_MENU) + + void SetKp() { SetPFloatOnClick(0, 1000, 2); } + void ApplyPIDi() { + *MenuData.P_Float = scalePID_i(MenuData.Value / POW(10, 2)); + TERN_(PIDTEMP, thermalManager.updatePID()); + } + void ApplyPIDd() { + *MenuData.P_Float = scalePID_d(MenuData.Value / POW(10, 2)); + TERN_(PIDTEMP, thermalManager.updatePID()); + } + void SetKi() { + MenuData.P_Float = (float*)static_cast(CurrentMenu->SelectedItem())->value; + const float value = unscalePID_i(*MenuData.P_Float); + SetFloatOnClick(0, 1000, 2, value, ApplyPIDi); + } + void SetKd() { + MenuData.P_Float = (float*)static_cast(CurrentMenu->SelectedItem())->value; + const float value = unscalePID_d(*MenuData.P_Float); + SetFloatOnClick(0, 1000, 2, value, ApplyPIDd); + } + void onDrawPIDi(MenuItemClass* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_i(*(float*)static_cast(menuitem)->value)); } + void onDrawPIDd(MenuItemClass* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast(menuitem)->value)); } + +#endif // HAS_PID_HEATING && PID_EDIT_MENU + +#if ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) + + #if ENABLED(PID_AUTOTUNE_MENU) + void HotendPID() { SetPID(HMI_data.HotendPidT, H_E0); } + void SetHotendPidT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); } + #endif + + void Draw_HotendPID_Menu() { + checkkey = Menu; + if (SET_MENU_F(HotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { + BACK_ITEM(Draw_AdvancedSettings_Menu); + #if ENABLED(PID_AUTOTUNE_MENU) + MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, HotendPID); + EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, SetHotendPidT, &HMI_data.HotendPidT); + EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, SetPidCycles, &HMI_data.PidCycles); + #endif + #if ENABLED(PID_EDIT_MENU) + EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KP, onDrawPFloat2Menu, SetKp, &thermalManager.temp_hotend[0].pid.Kp); + EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KI, onDrawPIDi, SetKi, &thermalManager.temp_hotend[0].pid.Ki); + EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KD, onDrawPIDd, SetKd, &thermalManager.temp_hotend[0].pid.Kd); + #endif + #if ENABLED(EEPROM_SETTINGS) + MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, WriteEeprom); + #endif + } + UpdateMenu(HotendPIDMenu); + } + +#endif // PIDTEMP && (PID_AUTOTUNE_MENU || PID_EDIT_MENU) + +#if ENABLED(PIDTEMPBED) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) + + #if ENABLED(PID_AUTOTUNE_MENU) + void BedPID() { SetPID(HMI_data.BedPidT, H_BED); } + void SetBedPidT() { SetPIntOnClick(MIN_BEDTEMP, MAX_BEDTEMP); } + #endif void Draw_BedPID_Menu() { checkkey = Menu; if (SET_MENU_F(BedPIDMenu, STR_BED_PID " Settings", 8)) { BACK_ITEM(Draw_AdvancedSettings_Menu); - MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,BedPID); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KP, onDrawPFloat2Menu, SetKp, &thermalManager.temp_bed.pid.Kp); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KI, onDrawPIDi, SetKi, &thermalManager.temp_bed.pid.Ki); - EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KD, onDrawPIDd, SetKd, &thermalManager.temp_bed.pid.Kd); - EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, SetBedPidT, &HMI_data.BedPidT); - EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, SetPidCycles, &HMI_data.PidCycles); + #if ENABLED(PID_AUTOTUNE_MENU) + MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,BedPID); + EDIT_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawPIntMenu, SetBedPidT, &HMI_data.BedPidT); + EDIT_ITEM(ICON_PIDCycles, MSG_PID_CYCLE, onDrawPIntMenu, SetPidCycles, &HMI_data.PidCycles); + #endif + #if ENABLED(PID_EDIT_MENU) + EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KP, onDrawPFloat2Menu, SetKp, &thermalManager.temp_bed.pid.Kp); + EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KI, onDrawPIDi, SetKi, &thermalManager.temp_bed.pid.Ki); + EDIT_ITEM_F(ICON_PIDValue, "Set" STR_KD, onDrawPIDd, SetKd, &thermalManager.temp_bed.pid.Kd); + #endif #if ENABLED(EEPROM_SETTINGS) MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, WriteEeprom); #endif @@ -3594,7 +3858,9 @@ void Draw_Steps_Menu() { UpdateMenu(BedPIDMenu); } -#endif // PIDTEMPBED +#endif // PIDTEMPBED && (PID_AUTOTUNE_MENU || PID_EDIT_MENU) + +//============================================================================= #if HAS_BED_PROBE @@ -3619,9 +3885,15 @@ void Draw_Steps_Menu() { if (SET_MENU(HomingMenu, MSG_HOMING, 6)) { BACK_ITEM(Draw_Prepare_Menu); MENU_ITEM(ICON_Homing, MSG_AUTO_HOME, onDrawMenuItem, AutoHome); - MENU_ITEM(ICON_HomeX, MSG_AUTO_HOME_X, onDrawMenuItem, HomeX); - MENU_ITEM(ICON_HomeY, MSG_AUTO_HOME_Y, onDrawMenuItem, HomeY); - MENU_ITEM(ICON_HomeZ, MSG_AUTO_HOME_Z, onDrawMenuItem, HomeZ); + #if HAS_X_AXIS + MENU_ITEM(ICON_HomeX, MSG_AUTO_HOME_X, onDrawMenuItem, HomeX); + #endif + #if HAS_Y_AXIS + MENU_ITEM(ICON_HomeY, MSG_AUTO_HOME_Y, onDrawMenuItem, HomeY); + #endif + #if HAS_Z_AXIS + MENU_ITEM(ICON_HomeZ, MSG_AUTO_HOME_Z, onDrawMenuItem, HomeZ); + #endif #if ENABLED(MESH_BED_LEVELING) EDIT_ITEM(ICON_ZAfterHome, MSG_Z_AFTER_HOME, onDrawPInt8Menu, SetZAfterHoming, &HMI_data.z_after_homing); #endif @@ -3629,7 +3901,7 @@ void Draw_Steps_Menu() { UpdateMenu(HomingMenu); } -#endif +#endif // INDIVIDUAL_AXIS_HOMING_SUBMENU #if ENABLED(FWRETRACT) @@ -3660,7 +3932,7 @@ void Draw_Steps_Menu() { void SetMeshActive() { set_bed_leveling_enabled(!planner.leveling_active); Draw_Chkb_Line(CurrentMenu->line(), planner.leveling_active); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #if ENABLED(PREHEAT_BEFORE_LEVELING) @@ -3673,8 +3945,9 @@ void Draw_Steps_Menu() { void LiveEditMesh() { ((MenuItemPtrClass*)EditZValueItem)->value = &bedlevel.z_values[HMI_value.Select ? bedLevelTools.mesh_x : MenuData.Value][HMI_value.Select ? MenuData.Value : bedLevelTools.mesh_y]; EditZValueItem->redraw(); } void ApplyEditMeshX() { bedLevelTools.mesh_x = MenuData.Value; } - void SetEditMeshX() { HMI_value.Select = 0; SetIntOnClick(0, GRID_MAX_POINTS_X - 1, bedLevelTools.mesh_x, ApplyEditMeshX, LiveEditMesh); } void ApplyEditMeshY() { bedLevelTools.mesh_y = MenuData.Value; } + void ResetMesh() { bedLevelTools.mesh_reset(); LCD_MESSAGE(MSG_MESH_RESET); } + void SetEditMeshX() { HMI_value.Select = 0; SetIntOnClick(0, GRID_MAX_POINTS_X - 1, bedLevelTools.mesh_x, ApplyEditMeshX, LiveEditMesh); } void SetEditMeshY() { HMI_value.Select = 1; SetIntOnClick(0, GRID_MAX_POINTS_Y - 1, bedLevelTools.mesh_y, ApplyEditMeshY, LiveEditMesh); } void SetEditZValue() { SetPFloatOnClick(Z_OFFSET_MIN, Z_OFFSET_MAX, 3); } #endif @@ -3695,18 +3968,18 @@ void Draw_Steps_Menu() { void UBLMeshTilt() { NOLESS(bedlevel.storage_slot, 0); - char buf[15]; + char buf[9]; if (bedLevelTools.tilt_grid > 1) { - sprintf_P(buf, PSTR("G28O\nG29 J%i"), bedLevelTools.tilt_grid); + sprintf_P(buf, PSTR("G29J%i"), bedLevelTools.tilt_grid); gcode.process_subcommands_now(buf); } else - gcode.process_subcommands_now(F("G28O\nG29J")); + gcode.process_subcommands_now(F("G29J")); LCD_MESSAGE(MSG_UBL_MESH_TILTED); } void UBLSmartFillMesh() { - LOOP_L_N(x, GRID_MAX_POINTS_Y) bedlevel.smart_fill_mesh(); + for (uint8_t x = 0; x < GRID_MAX_POINTS_Y; ++x) bedlevel.smart_fill_mesh(); LCD_MESSAGE(MSG_UBL_MESH_FILLED); } @@ -3728,7 +4001,7 @@ void Draw_Steps_Menu() { void Draw_MeshSet_Menu() { checkkey = Menu; - if (SET_MENU(MeshMenu, MSG_MESH_LEVELING, 13)) { + if (SET_MENU(MeshMenu, MSG_MESH_LEVELING, 14)) { BACK_ITEM(Draw_AdvancedSettings_Menu); #if ENABLED(PREHEAT_BEFORE_LEVELING) EDIT_ITEM(ICON_Temperature, MSG_UBL_SET_TEMP_BED, onDrawPIntMenu, SetBedLevT, &HMI_data.BedLevT); @@ -3747,6 +4020,7 @@ void Draw_Steps_Menu() { MENU_ITEM(ICON_UBLSmartFill, MSG_UBL_SMART_FILLIN, onDrawMenuItem, UBLSmartFillMesh); #endif #if ENABLED(MESH_EDIT_MENU) + MENU_ITEM(ICON_MeshReset, MSG_MESH_RESET, onDrawMenuItem, ResetMesh); MENU_ITEM(ICON_MeshEdit, MSG_EDIT_MESH, onDrawSubMenu, Draw_EditMesh_Menu); #endif MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW, onDrawSubMenu, DWIN_MeshViewer); diff --git a/Marlin/src/lcd/e3v2/proui/dwin.h b/Marlin/src/lcd/e3v2/proui/dwin.h index 26b77da5fb..bd1e802458 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.h +++ b/Marlin/src/lcd/e3v2/proui/dwin.h @@ -24,8 +24,8 @@ /** * DWIN Enhanced implementation for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 3.21.2 - * Date: 2022/12/02 + * Version: 3.25.3 + * Date: 2023/05/18 */ #include "../../../inc/MarlinConfig.h" @@ -33,9 +33,10 @@ #include "dwin_defines.h" #include "dwinui.h" #include "../common/encoder.h" +#include "../common/limits.h" #include "../../../libs/BL24CXX.h" -#if EITHER(BABYSTEPPING, HAS_BED_PROBE) +#if ANY(BABYSTEPPING, HAS_BED_PROBE) #define HAS_ZOFFSET_ITEM 1 #if !HAS_BED_PROBE #define JUST_BABYSTEP 1 @@ -74,11 +75,10 @@ enum processID : uint8_t { NothingToDo }; -#if EITHER(DWIN_PID_TUNE, MPC_AUTOTUNE) +#if ANY(DWIN_PID_TUNE, MPC_AUTOTUNE) enum tempcontrol_t : uint8_t { #if DWIN_PID_TUNE - PID_DONE, PIDTEMP_START, PIDTEMPBED_START, PID_BAD_HEATER_ID, @@ -86,11 +86,11 @@ enum processID : uint8_t { PID_TUNING_TIMEOUT, #endif #if ENABLED(MPC_AUTOTUNE) - MPC_DONE, MPCTEMP_START, MPC_TEMP_ERROR, - MPC_INTERRUPTED + MPC_INTERRUPTED, #endif + AUTOTUNE_DONE }; #endif @@ -140,13 +140,16 @@ typedef struct { #endif bool FullManualTramming = false; + bool MediaSort = true; bool MediaAutoMount = ENABLED(HAS_SD_EXTENDER); - #if BOTH(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) + #if ALL(INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) uint8_t z_after_homing = DEF_Z_AFTER_HOMING; #endif - #if BOTH(LED_CONTROL_MENU, HAS_COLOR_LEDS) + #if ALL(LED_CONTROL_MENU, HAS_COLOR_LEDS) LEDColor Led_Color = Def_Leds_Color; #endif + bool AdaptiveStepSmoothing = true; + bool EnablePreview = true; } HMI_data_t; extern HMI_data_t HMI_data; @@ -154,8 +157,8 @@ static constexpr size_t eeprom_data_size = sizeof(HMI_data_t); typedef struct { int8_t Color[3]; // Color components - #if DWIN_PID_TUNE - tempcontrol_t pidresult = PID_DONE; + #if ANY(DWIN_PID_TUNE, MPCTEMP) + tempcontrol_t tempcontrol = AUTOTUNE_DONE; #endif uint8_t Select = 0; // Auxiliary selector variable AxisEnum axis = X_AXIS; // Axis Select @@ -166,21 +169,17 @@ typedef struct { bool printing_flag:1; // sd or host printing bool abort_flag:1; // sd or host was aborted bool pause_flag:1; // printing is paused - bool percent_flag:1; // percent was override by M73 - bool remain_flag:1; // remain was override by M73 bool select_flag:1; // Popup button selected bool home_flag:1; // homing in course - bool heat_flag:1; // 0: heating done 1: during heating } HMI_flag_t; extern HMI_value_t HMI_value; -extern HMI_flag_t HMI_flag; +extern HMI_flag_t hmiFlag; extern uint8_t checkkey; -extern millis_t dwin_heat_time; // Popups #if HAS_HOTEND || HAS_HEATED_BED - void DWIN_Popup_Temperature(const bool toohigh); + void dwinPopupTemperature(const bool toohigh); #endif #if ENABLED(POWER_LOSS_RECOVERY) void Popup_PowerLossRecovery(); @@ -205,12 +204,6 @@ void AutoHome(); REPEAT_1(PREHEAT_COUNT, _DOPREHEAT) #endif void DoCoolDown(); -#if ENABLED(PIDTEMP) - void HotendPID(); -#endif -#if ENABLED(PIDTEMPBED) - void BedPID(); -#endif #if ENABLED(BAUD_RATE_GCODE) void HMI_SetBaudRate(); void SetBaud115K(); @@ -224,7 +217,7 @@ void ParkHead(); #if HAS_ONESTEP_LEVELING void Trammingwizard(); #endif -#if BOTH(LED_CONTROL_MENU, HAS_COLOR_LEDS) +#if ALL(LED_CONTROL_MENU, HAS_COLOR_LEDS) void ApplyLEDColor(); #endif #if ENABLED(AUTO_BED_LEVELING_UBL) @@ -235,7 +228,7 @@ void ParkHead(); #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION) void HostShutDown(); #endif -#if !HAS_BED_PROBE +#if DISABLED(HAS_BED_PROBE) void HomeZandDisable(); #endif @@ -251,7 +244,6 @@ void DWIN_DrawStatusLine(const char *text = ""); // Draw simple status text void DWIN_RedrawDash(); // Redraw Dash and Status line void DWIN_RedrawScreen(); // Redraw all screen elements void HMI_MainMenu(); // Main process screen -void HMI_SelectFile(); // File page void HMI_Printing(); // Print page void HMI_ReturnScreen(); // Return to previous screen before popups void HMI_WaitForUser(); @@ -259,11 +251,11 @@ void HMI_SaveProcessID(const uint8_t id); void HMI_SDCardUpdate(); void EachMomentUpdate(); void update_variable(); -void DWIN_InitScreen(); +void dwinInitScreen(); void DWIN_HandleScreen(); void DWIN_CheckStatusMessage(); -void DWIN_HomingStart(); -void DWIN_HomingDone(); +void dwinHomingStart(); +void dwinHomingDone(); #if HAS_MESH void DWIN_MeshUpdate(const int8_t cpos, const int8_t tpos, const_float_t zval); #endif @@ -277,10 +269,8 @@ void DWIN_Print_Aborted(); #if HAS_FILAMENT_SENSOR void DWIN_FilamentRunout(const uint8_t extruder); #endif -void DWIN_M73(); void DWIN_Print_Header(const char *text); void DWIN_SetColorDefaults(); -void DWIN_ApplyColor(); void DWIN_CopySettingsTo(char * const buff); void DWIN_CopySettingsFrom(const char * const buff); void DWIN_SetDataDefaults(); @@ -290,7 +280,6 @@ void DWIN_RebootScreen(); void DWIN_Popup_Pause(FSTR_P const fmsg, uint8_t button=0); void Draw_Popup_FilamentPurge(); void Goto_FilamentPurge(); - void HMI_FilamentPurge(); #endif // Utility and extensions @@ -330,9 +319,7 @@ void Draw_FilSet_Menu(); void Draw_ParkPos_Menu(); #endif void Draw_PhySet_Menu(); -void Draw_SelectColors_Menu(); -void Draw_GetColor_Menu(); -#if BOTH(CASE_LIGHT_MENU, CASELIGHT_USES_BRIGHTNESS) +#if ALL(CASE_LIGHT_MENU, CASELIGHT_USES_BRIGHTNESS) void Draw_CaseLight_Menu(); #endif #if ENABLED(LED_CONTROL_MENU) @@ -353,7 +340,7 @@ void Draw_MaxAccel_Menu(); void Draw_MaxJerk_Menu(); #endif void Draw_Steps_Menu(); -#if EITHER(HAS_BED_PROBE, BABYSTEPPING) +#if ANY(HAS_BED_PROBE, BABYSTEPPING) void Draw_ZOffsetWiz_Menu(); #endif #if ENABLED(INDIVIDUAL_AXIS_HOMING_SUBMENU) @@ -368,22 +355,42 @@ void Draw_Steps_Menu(); void Draw_EditMesh_Menu(); #endif #endif +#if HAS_TRINAMIC_CONFIG + void Draw_TrinamicConfig_menu(); +#endif + +// Custom colors editing +#if HAS_CUSTOM_COLORS + void DWIN_ApplyColor(); + void Draw_SelectColors_Menu(); + void Draw_GetColor_Menu(); +#endif // PID #if DWIN_PID_TUNE #include "../../../module/temperature.h" void DWIN_StartM303(const bool seenC, const int c, const bool seenS, const heater_id_t hid, const celsius_t temp); void DWIN_PidTuning(tempcontrol_t result); - #if ENABLED(PIDTEMP) +#endif +#if ENABLED(PIDTEMP) + #if ENABLED(PID_AUTOTUNE_MENU) + void HotendPID(); + #endif + #if ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) void Draw_HotendPID_Menu(); #endif - #if ENABLED(PIDTEMPBED) +#endif +#if ENABLED(PIDTEMPBED) + #if ENABLED(PID_AUTOTUNE_MENU) + void BedPID(); + #endif + #if ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU) void Draw_BedPID_Menu(); #endif #endif // MPC -#if EITHER(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) +#if ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) void Draw_HotendMPC_Menu(); #endif #if ENABLED(MPC_AUTOTUNE) diff --git a/Marlin/src/lcd/e3v2/proui/dwin_defines.h b/Marlin/src/lcd/e3v2/proui/dwin_defines.h index e87aedf311..6f4520e23b 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_defines.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_defines.h @@ -29,7 +29,6 @@ */ //#define DEBUG_DWIN 1 -//#define NEED_HEX_PRINT 1 #if defined(__STM32F1__) || defined(STM32F1) #define DASH_REDRAW 1 @@ -66,7 +65,7 @@ #define Def_Indicator_Color Color_White #define Def_Coordinate_Color Color_White #define Def_Button_Color RGB( 0, 23, 16) -#if BOTH(LED_CONTROL_MENU, HAS_COLOR_LEDS) +#if ALL(LED_CONTROL_MENU, HAS_COLOR_LEDS) #define Def_Leds_Color LEDColorWhite() #endif #if ENABLED(CASELIGHT_USES_BRIGHTNESS) diff --git a/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp b/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp index 6cdafc8a93..180b35e2ec 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin_lcd.cpp @@ -23,8 +23,8 @@ /** * DWIN Enhanced implementation for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 3.10.1 - * Date: 2022/03/06 + * Version: 3.12.1 + * Date: 2023/01/22 */ #include "../../../inc/MarlinConfigPre.h" @@ -44,20 +44,20 @@ // str: multi-bit data void DWIN_Draw_QR(uint8_t QR_Pixel, uint16_t x, uint16_t y, char *string) { size_t i = 0; - DWIN_Byte(i, 0x21); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Byte(i, QR_Pixel); - DWIN_Text(i, string); - DWIN_Send(i); + dwinByte(i, 0x21); + dwinWord(i, x); + dwinWord(i, y); + dwinByte(i, QR_Pixel); + dwinText(i, string); + dwinSend(i); } // Draw an Icon with transparent background // libID: Icon library ID // picID: Icon ID // x/y: Upper-left point -void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { - DWIN_ICON_Show(false, false, true, libID, picID, x, y); +void dwinIconShow(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { + dwinIconShow(false, false, true, libID, picID, x, y); } // Copy area from current virtual display area to current screen @@ -66,14 +66,14 @@ void DWIN_ICON_Show(uint8_t libID, uint8_t picID, uint16_t x, uint16_t y) { // x/y: Screen paste point void DWIN_Frame_AreaCopy(uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y) { size_t i = 0; - DWIN_Byte(i, 0x26); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Send(i); + dwinByte(i, 0x26); + dwinWord(i, xStart); + dwinWord(i, yStart); + dwinWord(i, xEnd); + dwinWord(i, yEnd); + dwinWord(i, x); + dwinWord(i, y); + dwinSend(i); } // Copy area from virtual display area to current screen @@ -86,15 +86,15 @@ void DWIN_Frame_AreaCopy(uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16 // x/y: Screen paste point void DWIN_Frame_AreaCopy(bool IBD, bool BIR, bool BFI, uint8_t cacheID, uint16_t xStart, uint16_t yStart, uint16_t xEnd, uint16_t yEnd, uint16_t x, uint16_t y) { size_t i = 0; - DWIN_Byte(i, 0x27); - DWIN_Byte(i, (IBD & 1) << 7 | (BIR & 1) << 6 | (BFI & 1) << 5 | cacheID); - DWIN_Word(i, xStart); - DWIN_Word(i, yStart); - DWIN_Word(i, xEnd); - DWIN_Word(i, yEnd); - DWIN_Word(i, x); - DWIN_Word(i, y); - DWIN_Send(i); + dwinByte(i, 0x27); + dwinByte(i, (IBD & 1) << 7 | (BIR & 1) << 6 | (BFI & 1) << 5 | cacheID); + dwinWord(i, xStart); + dwinWord(i, yStart); + dwinWord(i, xEnd); + dwinWord(i, yEnd); + dwinWord(i, x); + dwinWord(i, y); + dwinSend(i); } // Copy area from virtual display area to current screen with transparent background @@ -122,39 +122,59 @@ void DWIN_WriteToMem(uint8_t mem, uint16_t addr, uint16_t length, uint8_t *data) indx = block * max_size; to_send = _MIN(pending, max_size); size_t i = 0; - DWIN_Byte(i, 0x31); - DWIN_Byte(i, mem); - DWIN_Word(i, addr + indx); // start address of the data block + dwinByte(i, 0x31); + dwinByte(i, mem); + dwinWord(i, addr + indx); // start address of the data block ++i; - LOOP_L_N(j, i) { LCD_SERIAL.write(DWIN_SendBuf[j]); delayMicroseconds(1); } // Buf header + for (uint8_t j = 0; j < i; ++j) { LCD_SERIAL.write(dwinSendBuf[j]); delayMicroseconds(1); } // Buf header for (uint16_t j = indx; j <= indx + to_send - 1; j++) LCD_SERIAL.write(*(data + j)); delayMicroseconds(1); // write block of data - LOOP_L_N(j, 4) { LCD_SERIAL.write(DWIN_BufTail[j]); delayMicroseconds(1); } + for (uint8_t j = 0; j < 4; ++j) { LCD_SERIAL.write(dwinBufTail[j]); delayMicroseconds(1); } block++; pending -= to_send; } } +// Draw an Icon from SRAM without background transparency for DACAI Screens support +void DACAI_ICON_Show(uint16_t x, uint16_t y, uint16_t addr) { + NOMORE(x, DWIN_WIDTH - 1); + NOMORE(y, DWIN_HEIGHT - 1); + size_t i = 0; + dwinByte(i, 0x70); + dwinWord(i, x); + dwinWord(i, y); + dwinWord(i, addr); + dwinSend(i); +} + +void dwinIconShow(uint16_t x, uint16_t y, uint16_t addr) { + #if ENABLED(DACAI_DISPLAY) + DACAI_ICON_Show(x, y, addr); + #else + dwinIconShow(0, 0, 1, x, y, addr); + #endif +} + // Write the contents of the 32KB SRAM data memory into the designated image memory space. // picID: Picture memory space location, 0x00-0x0F, each space is 32Kbytes void DWIN_SRAMToPic(uint8_t picID) { size_t i = 0; - DWIN_Byte(i, 0x33); - DWIN_Byte(i, 0x5A); - DWIN_Byte(i, 0xA5); - DWIN_Byte(i, picID); - DWIN_Send(i); + dwinByte(i, 0x33); + dwinByte(i, 0x5A); + dwinByte(i, 0xA5); + dwinByte(i, picID); + dwinSend(i); } //--------------------------Test area ------------------------- //void DWIN_ReadSRAM(uint16_t addr, const uint8_t length, const char * const data) { // size_t i = 0; -// DWIN_Byte(i, 0x32); -// DWIN_Byte(i, 0x5A); // 0x5A Read from SRAM - 0xA5 Read from Flash -// DWIN_Word(i, addr); // 0x0000 to 0x7FFF +// dwinByte(i, 0x32); +// dwinByte(i, 0x5A); // 0x5A Read from SRAM - 0xA5 Read from Flash +// dwinWord(i, addr); // 0x0000 to 0x7FFF // const size_t len = _MIN(0xF0, length); -// DWIN_Byte(i, len); -// DWIN_Send(i); +// dwinByte(i, len); +// dwinSend(i); //} #endif // DWIN_LCD_PROUI diff --git a/Marlin/src/lcd/e3v2/proui/dwin_lcd.h b/Marlin/src/lcd/e3v2/proui/dwin_lcd.h index 6e0a254db4..8c9c063367 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_lcd.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_lcd.h @@ -24,8 +24,8 @@ /** * DWIN Enhanced implementation for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 3.10.1 - * Date: 2022/03/06 + * Version: 3.12.1 + * Date: 2023/01/22 */ #include "../common/dwin_api.h" @@ -71,6 +71,11 @@ void DWIN_Frame_AreaCopy(bool IBD, bool BIR, bool BFI, uint8_t cacheID, uint16_t // data: address of the buffer with data void DWIN_WriteToMem(uint8_t mem, uint16_t addr, uint16_t length, uint8_t *data); +// Draw an Icon from SRAM +// x/y: Upper-left point +// addr: SRAM address +void dwinIconShow(uint16_t x, uint16_t y, uint16_t addr); + // Write the contents of the 32KB SRAM data memory into the designated image memory space. // picID: Picture memory space location, 0x00-0x0F, each space is 32Kbytes void DWIN_SRAMToPic(uint8_t picID); diff --git a/Marlin/src/lcd/e3v2/proui/dwin_popup.cpp b/Marlin/src/lcd/e3v2/proui/dwin_popup.cpp index 552075f9dc..7b22069c69 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_popup.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin_popup.cpp @@ -45,27 +45,27 @@ uint16_t HighlightYPos = 280; void Draw_Select_Highlight(const bool sel, const uint16_t ypos) { HighlightYPos = ypos; - HMI_flag.select_flag = sel; + hmiFlag.select_flag = sel; const uint16_t c1 = sel ? HMI_data.Highlight_Color : HMI_data.PopupBg_Color, c2 = sel ? HMI_data.PopupBg_Color : HMI_data.Highlight_Color; - DWIN_Draw_Rectangle(0, c1, 25, ypos - 1, 126, ypos + 38); - DWIN_Draw_Rectangle(0, c1, 24, ypos - 2, 127, ypos + 39); - DWIN_Draw_Rectangle(0, c2, 145, ypos - 1, 246, ypos + 38); - DWIN_Draw_Rectangle(0, c2, 144, ypos - 2, 247, ypos + 39); + dwinDrawRectangle(0, c1, 25, ypos - 1, 126, ypos + 38); + dwinDrawRectangle(0, c1, 24, ypos - 2, 127, ypos + 39); + dwinDrawRectangle(0, c2, 145, ypos - 1, 246, ypos + 38); + dwinDrawRectangle(0, c2, 144, ypos - 2, 247, ypos + 39); } void DWIN_Popup_Continue(const uint8_t icon, FSTR_P const fmsg1, FSTR_P const fmsg2) { HMI_SaveProcessID(WaitResponse); DWIN_Draw_Popup(icon, fmsg1, fmsg2, BTN_Continue); // Button Continue - DWIN_UpdateLCD(); + dwinUpdateLCD(); } void DWIN_Popup_ConfirmCancel(const uint8_t icon, FSTR_P const fmsg2) { DWIN_Draw_Popup(ICON_BLTouch, F("Please confirm"), fmsg2); DWINUI::Draw_Button(BTN_Confirm, 26, 280); DWINUI::Draw_Button(BTN_Cancel, 146, 280); - Draw_Select_Highlight(HMI_flag.select_flag); - DWIN_UpdateLCD(); + Draw_Select_Highlight(hmiFlag.select_flag); + dwinUpdateLCD(); } void Goto_Popup(const popupDrawFunc_t fnDraw, const popupClickFunc_t fnClick/*=nullptr*/, const popupChangeFunc_t fnChange/*=nullptr*/) { @@ -73,7 +73,7 @@ void Goto_Popup(const popupDrawFunc_t fnDraw, const popupClickFunc_t fnClick/*=n popupClick = fnClick; popupChange = fnChange; HMI_SaveProcessID(Popup); - HMI_flag.select_flag = false; + hmiFlag.select_flag = false; popupDraw(); } @@ -87,7 +87,7 @@ void HMI_Popup() { if (encoder_diffState == ENCODER_DIFF_CW || encoder_diffState == ENCODER_DIFF_CCW) { const bool change = encoder_diffState != ENCODER_DIFF_CW; if (popupChange) popupChange(change); else Draw_Select_Highlight(change, HighlightYPos); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } } } diff --git a/Marlin/src/lcd/e3v2/proui/dwin_popup.h b/Marlin/src/lcd/e3v2/proui/dwin_popup.h index f24aac582e..5009f36b3b 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_popup.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_popup.h @@ -44,8 +44,8 @@ void Goto_Popup(const popupDrawFunc_t fnDraw, const popupClickFunc_t fnClick=nul void HMI_Popup(); inline void Draw_Popup_Bkgd() { - DWIN_Draw_Rectangle(1, HMI_data.PopupBg_Color, 14, 60, 258, 330); - DWIN_Draw_Rectangle(0, HMI_data.Highlight_Color, 14, 60, 258, 330); + dwinDrawRectangle(1, HMI_data.PopupBg_Color, 14, 60, 258, 330); + dwinDrawRectangle(0, HMI_data.Highlight_Color, 14, 60, 258, 330); } template @@ -61,13 +61,13 @@ void DWIN_Draw_Popup(const uint8_t icon, T amsg1=nullptr, U amsg2=nullptr, uint8 template void DWIN_Show_Popup(const uint8_t icon, T amsg1=nullptr, U amsg2=nullptr, uint8_t button=0) { DWIN_Draw_Popup(icon, amsg1, amsg2, button); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } template void DWIN_Popup_Confirm(const uint8_t icon, T amsg1, U amsg2) { HMI_SaveProcessID(WaitResponse); DWIN_Draw_Popup(icon, amsg1, amsg2, BTN_Confirm); // Button Confirm - DWIN_UpdateLCD(); + dwinUpdateLCD(); } diff --git a/Marlin/src/lcd/e3v2/proui/dwinui.cpp b/Marlin/src/lcd/e3v2/proui/dwinui.cpp index f950d7451c..235b30f9fa 100644 --- a/Marlin/src/lcd/e3v2/proui/dwinui.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwinui.cpp @@ -23,8 +23,8 @@ /** * DWIN Enhanced implementation for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 3.20.1 - * Date: 2022/10/25 + * Version: 3.21.1 + * Date: 2023/03/21 */ #include "../../../inc/MarlinConfig.h" @@ -32,7 +32,6 @@ #if ENABLED(DWIN_LCD_PROUI) #include "dwin_defines.h" -#include "dwin_lcd.h" #include "dwinui.h" xy_int_t DWINUI::cursor = { 0 }; @@ -60,16 +59,18 @@ void DWINUI::setFont(fontid_t fid) { fontid = fid; } // Get font character width uint8_t DWINUI::fontWidth(fontid_t fid) { switch (fid) { - case font6x12 : return 6; + #if DISABLED(TJC_DISPLAY) + case font6x12 : return 6; + case font20x40: return 20; + case font24x48: return 24; + case font28x56: return 28; + case font32x64: return 32; + #endif case font8x16 : return 8; case font10x20: return 10; case font12x24: return 12; case font14x28: return 14; case font16x32: return 16; - case font20x40: return 20; - case font24x48: return 24; - case font28x56: return 28; - case font32x64: return 32; default: return 0; } } @@ -77,16 +78,18 @@ uint8_t DWINUI::fontWidth(fontid_t fid) { // Get font character height uint8_t DWINUI::fontHeight(fontid_t fid) { switch (fid) { + #if DISABLED(TJC_DISPLAY) case font6x12 : return 12; + case font20x40: return 40; + case font24x48: return 48; + case font28x56: return 56; + case font32x64: return 64; + #endif case font8x16 : return 16; case font10x20: return 20; case font12x24: return 24; case font14x28: return 28; case font16x32: return 32; - case font20x40: return 40; - case font24x48: return 48; - case font28x56: return 56; - case font32x64: return 64; default: return 0; } } @@ -137,7 +140,7 @@ void DWINUI::MoveBy(xy_int_t point) { // Draw a Centered string using arbitrary x1 and x2 margins void DWINUI::Draw_CenteredString(bool bShow, fontid_t fid, uint16_t color, uint16_t bColor, uint16_t x1, uint16_t x2, uint16_t y, const char * const string) { const uint16_t x = _MAX(0U, x2 + x1 - strlen_P(string) * fontWidth(fid)) / 2 - 1; - DWIN_Draw_String(bShow, fid, color, bColor, x, y, string); + dwinDrawString(bShow, fid, color, bColor, x, y, string); } // Draw a char @@ -147,7 +150,7 @@ void DWINUI::Draw_CenteredString(bool bShow, fontid_t fid, uint16_t color, uint1 // c: ASCII code of char void DWINUI::Draw_Char(uint16_t color, uint16_t x, uint16_t y, const char c) { const char string[2] = { c, 0}; - DWIN_Draw_String(false, fontid, color, backcolor, x, y, string, 1); + dwinDrawString(false, fontid, color, backcolor, x, y, string, 1); } // Draw a char at cursor position and increment cursor @@ -161,11 +164,11 @@ void DWINUI::Draw_Char(uint16_t color, const char c) { // *string: The string // rlimit: For draw less chars than string length use rlimit void DWINUI::Draw_String(const char * const string, uint16_t rlimit) { - DWIN_Draw_String(false, fontid, textcolor, backcolor, cursor.x, cursor.y, string, rlimit); + dwinDrawString(false, fontid, textcolor, backcolor, cursor.x, cursor.y, string, rlimit); MoveBy(strlen(string) * fontWidth(fontid), 0); } void DWINUI::Draw_String(uint16_t color, const char * const string, uint16_t rlimit) { - DWIN_Draw_String(false, fontid, color, backcolor, cursor.x, cursor.y, string, rlimit); + dwinDrawString(false, fontid, color, backcolor, cursor.x, cursor.y, string, rlimit); MoveBy(strlen(string) * fontWidth(fontid), 0); } @@ -181,7 +184,7 @@ void DWINUI::Draw_String(uint16_t color, const char * const string, uint16_t rli void DWINUI::Draw_Int(uint8_t bShow, bool signedMode, fontid_t fid, uint16_t color, uint16_t bColor, uint8_t iNum, uint16_t x, uint16_t y, int32_t value) { char nstr[10]; sprintf_P(nstr, PSTR("%*li"), (signedMode ? iNum + 1 : iNum), value); - DWIN_Draw_String(bShow, fid, color, bColor, x, y, nstr); + dwinDrawString(bShow, fid, color, bColor, x, y, nstr); } // Draw a numeric float value @@ -196,7 +199,7 @@ void DWINUI::Draw_Int(uint8_t bShow, bool signedMode, fontid_t fid, uint16_t col // value: float value void DWINUI::Draw_Float(uint8_t bShow, bool signedMode, fontid_t fid, uint16_t color, uint16_t bColor, uint8_t iNum, uint8_t fNum, uint16_t x, uint16_t y, float value) { char nstr[10]; - DWIN_Draw_String(bShow, fid, color, bColor, x, y, dtostrf(value, iNum + (signedMode ? 2:1) + fNum, fNum, nstr)); + dwinDrawString(bShow, fid, color, bColor, x, y, dtostrf(value, iNum + (signedMode ? 2:1) + fNum, fNum, nstr)); } // ------------------------- Icons -------------------------------// @@ -209,13 +212,13 @@ void DWINUI::Draw_Float(uint8_t bShow, bool signedMode, fontid_t fid, uint16_t c void DWINUI::ICON_Show(bool BG, uint8_t icon, uint16_t x, uint16_t y) { const uint8_t libID = ICON TERN_(HAS_CUSTOMICONS, + (icon / 100)); const uint8_t picID = icon TERN_(HAS_CUSTOMICONS, % 100); - DWIN_ICON_Show(BG, false, !BG, libID, picID, x, y); + dwinIconShow(BG, false, !BG, libID, picID, x, y); } // ------------------------- Buttons ------------------------------// void DWINUI::Draw_Button(uint16_t color, uint16_t bcolor, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, const char * const caption) { - DWIN_Draw_Rectangle(1, bcolor, x1, y1, x2, y2); + dwinDrawRectangle(1, bcolor, x1, y1, x2, y2); Draw_CenteredString(0, fontid, color, bcolor, x1, x2, (y2 + y1 - fontHeight())/2, caption); } @@ -243,14 +246,14 @@ void DWINUI::Draw_Circle(uint16_t color, uint16_t x, uint16_t y, uint8_t r) { while (a <= b) { b = SQRT(sq(r) - sq(a)); if (a == 0) b--; - DWIN_Draw_Point(color, 1, 1, x + a, y + b); // Draw some sector 1 - DWIN_Draw_Point(color, 1, 1, x + b, y + a); // Draw some sector 2 - DWIN_Draw_Point(color, 1, 1, x + b, y - a); // Draw some sector 3 - DWIN_Draw_Point(color, 1, 1, x + a, y - b); // Draw some sector 4 - DWIN_Draw_Point(color, 1, 1, x - a, y - b); // Draw some sector 5 - DWIN_Draw_Point(color, 1, 1, x - b, y - a); // Draw some sector 6 - DWIN_Draw_Point(color, 1, 1, x - b, y + a); // Draw some sector 7 - DWIN_Draw_Point(color, 1, 1, x - a, y + b); // Draw some sector 8 + dwinDrawPoint(color, 1, 1, x + a, y + b); // Draw some sector 1 + dwinDrawPoint(color, 1, 1, x + b, y + a); // Draw some sector 2 + dwinDrawPoint(color, 1, 1, x + b, y - a); // Draw some sector 3 + dwinDrawPoint(color, 1, 1, x + a, y - b); // Draw some sector 4 + dwinDrawPoint(color, 1, 1, x - a, y - b); // Draw some sector 5 + dwinDrawPoint(color, 1, 1, x - b, y - a); // Draw some sector 6 + dwinDrawPoint(color, 1, 1, x - b, y + a); // Draw some sector 7 + dwinDrawPoint(color, 1, 1, x - a, y + b); // Draw some sector 8 a++; } } @@ -261,15 +264,13 @@ void DWINUI::Draw_Circle(uint16_t color, uint16_t x, uint16_t y, uint8_t r) { // y: ordinate of the center of the circle // r: circle radius void DWINUI::Draw_FillCircle(uint16_t bcolor, uint16_t x,uint16_t y,uint8_t r) { - int a = 0, b = 0; - while (a <= b) { - b = SQRT(sq(r) - sq(a)); // b=sqrt(r*r-a*a); - if (a == 0) b--; - DWIN_Draw_Line(bcolor, x-b,y-a,x+b,y-a); - DWIN_Draw_Line(bcolor, x-a,y-b,x+a,y-b); - DWIN_Draw_Line(bcolor, x-b,y+a,x+b,y+a); - DWIN_Draw_Line(bcolor, x-a,y+b,x+a,y+b); - a++; + dwinDrawLine(bcolor, x - r, y, x + r, y); + uint16_t b = 1; + while (b <= r) { + uint16_t a = SQRT(sq(r) - sq(b)); + dwinDrawLine(bcolor, x - a, y + b, x + a, y + b); + dwinDrawLine(bcolor, x - a, y - b, x + a, y - b); + b += TERN(TJC_DISPLAY, 2, 1); } } @@ -322,13 +323,13 @@ uint16_t DWINUI::RainbowInt(int16_t val, int16_t minv, int16_t maxv) { // x/y: Upper-left point // mode : 0 : unchecked, 1 : checked void DWINUI::Draw_Checkbox(uint16_t color, uint16_t bcolor, uint16_t x, uint16_t y, bool checked=false) { - DWIN_Draw_Rectangle(0, color, x + 2, y + 2, x + 17, y + 17); - DWIN_Draw_Rectangle(1, checked ? color : bcolor, x + 6, y + 6, x + 13, y + 13); + dwinDrawRectangle(0, color, x + 2, y + 2, x + 17, y + 17); + dwinDrawRectangle(1, checked ? color : bcolor, x + 6, y + 6, x + 13, y + 13); } // Clear Menu by filling the menu area with background color void DWINUI::ClearMainArea() { - DWIN_Draw_Rectangle(1, backcolor, 0, TITLE_HEIGHT, DWIN_WIDTH - 1, STATUS_Y - 1); + dwinDrawRectangle(1, backcolor, 0, TITLE_HEIGHT, DWIN_WIDTH - 1, STATUS_Y - 1); } /* Title Class ==============================================================*/ diff --git a/Marlin/src/lcd/e3v2/proui/dwinui.h b/Marlin/src/lcd/e3v2/proui/dwinui.h index 85d969043f..06daece9d0 100644 --- a/Marlin/src/lcd/e3v2/proui/dwinui.h +++ b/Marlin/src/lcd/e3v2/proui/dwinui.h @@ -24,8 +24,8 @@ /** * DWIN Enhanced implementation for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 3.18.1 - * Date: 2022/07/05 + * Version: 3.21.1 + * Date: 2023/03/21 */ #include "../../../inc/MarlinConfigPre.h" @@ -68,7 +68,8 @@ #define ICON_HomeOffsetY ICON_StepY #define ICON_HomeOffsetZ ICON_StepZ #define ICON_HSMode ICON_StockConfiguration -#define ICON_InvertE0 ICON_StepE +#define ICON_InputShaping ICON_MaxAccelerated +#define ICON_JDmm ICON_MaxJerk #define ICON_Tram ICON_SetEndTemp #define ICON_Level ICON_HotendTemp #define ICON_Lock ICON_Cool @@ -82,6 +83,7 @@ #define ICON_MeshEditZ ICON_MoveZ #define ICON_MeshNext ICON_Axis #define ICON_MeshPoints ICON_SetEndTemp +#define ICON_MeshReset ICON_StockConfiguration #define ICON_MeshSave ICON_WriteEEPROM #define ICON_MeshViewer ICON_HotendTemp #define ICON_MoveZ0 ICON_HotendTemp @@ -132,8 +134,14 @@ #define ICON_SetPreheat8 ICON_SetCustomPreheat #define ICON_SetPreheat9 ICON_SetCustomPreheat #define ICON_SetPreheat10 ICON_SetCustomPreheat +#define ICON_ShapingX ICON_MoveX +#define ICON_ShapingY ICON_MoveY #define ICON_Sound ICON_Cool -#define ICON_TBSetup ICON_Contact +#define ICON_TMCSet ICON_PrintSize +#define ICON_TMCXSet ICON_MoveX +#define ICON_TMCYSet ICON_MoveY +#define ICON_TMCZSet ICON_MoveZ +#define ICON_TMCESet ICON_Extruder #define ICON_UBLActive ICON_HotendTemp #define ICON_UBLActive ICON_HotendTemp #define ICON_UBLSlot ICON_ResumeEEPROM @@ -286,10 +294,10 @@ namespace DWINUI { // color: Line segment color // x/y: End point inline void LineTo(uint16_t color, uint16_t x, uint16_t y) { - DWIN_Draw_Line(color, cursor.x, cursor.y, x, y); + dwinDrawLine(color, cursor.x, cursor.y, x, y); } inline void LineTo(uint16_t x, uint16_t y) { - DWIN_Draw_Line(pencolor, cursor.x, cursor.y, x, y); + dwinDrawLine(pencolor, cursor.x, cursor.y, x, y); } // Extend a frame box @@ -462,28 +470,28 @@ namespace DWINUI { // x/y: Upper-left coordinate of the string // *string: The string inline void Draw_String(uint16_t x, uint16_t y, const char * const string) { - DWIN_Draw_String(false, fontid, textcolor, backcolor, x, y, string); + dwinDrawString(false, fontid, textcolor, backcolor, x, y, string); } inline void Draw_String(uint16_t x, uint16_t y, FSTR_P title) { - DWIN_Draw_String(false, fontid, textcolor, backcolor, x, y, FTOP(title)); + dwinDrawString(false, fontid, textcolor, backcolor, x, y, FTOP(title)); } inline void Draw_String(uint16_t color, uint16_t x, uint16_t y, const char * const string) { - DWIN_Draw_String(false, fontid, color, backcolor, x, y, string); + dwinDrawString(false, fontid, color, backcolor, x, y, string); } inline void Draw_String(uint16_t color, uint16_t x, uint16_t y, FSTR_P title) { - DWIN_Draw_String(false, fontid, color, backcolor, x, y, title); + dwinDrawString(false, fontid, color, backcolor, x, y, title); } inline void Draw_String(uint16_t color, uint16_t bgcolor, uint16_t x, uint16_t y, const char * const string) { - DWIN_Draw_String(true, fontid, color, bgcolor, x, y, string); + dwinDrawString(true, fontid, color, bgcolor, x, y, string); } inline void Draw_String(uint16_t color, uint16_t bgcolor, uint16_t x, uint16_t y, FSTR_P title) { - DWIN_Draw_String(true, fontid, color, bgcolor, x, y, title); + dwinDrawString(true, fontid, color, bgcolor, x, y, title); } inline void Draw_String(fontid_t fid, uint16_t color, uint16_t bgcolor, uint16_t x, uint16_t y, const char * const string) { - DWIN_Draw_String(true, fid, color, bgcolor, x, y, string); + dwinDrawString(true, fid, color, bgcolor, x, y, string); } inline void Draw_String(fontid_t fid, uint16_t color, uint16_t bgcolor, uint16_t x, uint16_t y, FSTR_P title) { - DWIN_Draw_String(true, fid, color, bgcolor, x, y, title); + dwinDrawString(true, fid, color, bgcolor, x, y, title); } // Draw a centered string using DWIN_WIDTH @@ -527,7 +535,7 @@ namespace DWINUI { // color: Rectangle color // frame: Box coordinates and size inline void Draw_Box(uint8_t mode, uint16_t color, frame_rect_t frame) { - DWIN_Draw_Box(mode, color, frame.x, frame.y, frame.w, frame.h); + dwinDrawBox(mode, color, frame.x, frame.y, frame.w, frame.h); } // Draw a circle diff --git a/Marlin/src/lcd/e3v2/proui/endstop_diag.cpp b/Marlin/src/lcd/e3v2/proui/endstop_diag.cpp index 96ee732678..c6d014e53c 100644 --- a/Marlin/src/lcd/e3v2/proui/endstop_diag.cpp +++ b/Marlin/src/lcd/e3v2/proui/endstop_diag.cpp @@ -23,22 +23,20 @@ /** * DWIN Endstops diagnostic page for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 1.3.3 - * Date: 2022/10/07 + * Version: 1.4.3 + * Date: 2023/05/10 */ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(DWIN_LCD_PROUI, HAS_ESDIAG) +#if ALL(DWIN_LCD_PROUI, HAS_ESDIAG) #include "endstop_diag.h" #include "../../../core/types.h" #include "../../marlinui.h" -#include "dwin_lcd.h" -#include "dwinui.h" -#include "dwin_popup.h" #include "dwin.h" +#include "dwin_popup.h" #if HAS_FILAMENT_SENSOR #include "../../../feature/runout.h" @@ -60,7 +58,7 @@ void draw_es_label(FSTR_P const flabel=nullptr) { void draw_es_state(const bool is_hit) { const uint8_t LM = 130; DWINUI::cursor.x = LM; - DWIN_Draw_Rectangle(1, HMI_data.PopupBg_Color, LM, DWINUI::cursor.y, LM + 100, DWINUI::cursor.y + 20); + dwinDrawRectangle(1, HMI_data.PopupBg_Color, LM, DWINUI::cursor.y, LM + 100, DWINUI::cursor.y + 20); is_hit ? DWINUI::Draw_String(RGB(31,31,16), F(STR_ENDSTOP_HIT)) : DWINUI::Draw_String(RGB(16,63,16), F(STR_ENDSTOP_OPEN)); DWINUI::MoveBy(0, 25); } @@ -72,9 +70,9 @@ void ESDiagClass::Draw() { DWINUI::Draw_Button(BTN_Continue, 86, 250); DWINUI::cursor.y = 80; #define ES_LABEL(S) draw_es_label(F(STR_##S)) - TERN_(HAS_X_MIN, ES_LABEL(X_MIN)); TERN_(HAS_X_MAX, ES_LABEL(X_MAX)); - TERN_(HAS_Y_MIN, ES_LABEL(Y_MIN)); TERN_(HAS_Y_MAX, ES_LABEL(Y_MAX)); - TERN_(HAS_Z_MIN, ES_LABEL(Z_MIN)); TERN_(HAS_Z_MAX, ES_LABEL(Z_MAX)); + TERN_(USE_X_MIN, ES_LABEL(X_MIN)); TERN_(USE_X_MAX, ES_LABEL(X_MAX)); + TERN_(USE_Y_MIN, ES_LABEL(Y_MIN)); TERN_(USE_Y_MAX, ES_LABEL(Y_MAX)); + TERN_(HAS_Z_MIN_PIN, ES_LABEL(Z_MIN)); TERN_(USE_Z_MAX, ES_LABEL(Z_MAX)); TERN_(HAS_FILAMENT_SENSOR, draw_es_label(F(STR_FILAMENT))); Update(); } @@ -82,11 +80,11 @@ void ESDiagClass::Draw() { void ESDiagClass::Update() { DWINUI::cursor.y = 80; #define ES_REPORT(S) draw_es_state(READ(S##_PIN) == S##_ENDSTOP_HIT_STATE) - TERN_(HAS_X_MIN, ES_REPORT(X_MIN)); TERN_(HAS_X_MAX, ES_REPORT(X_MAX)); - TERN_(HAS_Y_MIN, ES_REPORT(Y_MIN)); TERN_(HAS_Y_MAX, ES_REPORT(Y_MAX)); - TERN_(HAS_Z_MIN, ES_REPORT(Z_MIN)); TERN_(HAS_Z_MAX, ES_REPORT(Z_MAX)); + TERN_(USE_X_MIN, ES_REPORT(X_MIN)); TERN_(USE_X_MAX, ES_REPORT(X_MAX)); + TERN_(USE_Y_MIN, ES_REPORT(Y_MIN)); TERN_(USE_Y_MAX, ES_REPORT(Y_MAX)); + TERN_(HAS_Z_MIN_PIN, ES_REPORT(Z_MIN)); TERN_(USE_Z_MAX, ES_REPORT(Z_MAX)); TERN_(HAS_FILAMENT_SENSOR, draw_es_state(READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE)); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } #endif // DWIN_LCD_PROUI && HAS_ESDIAG diff --git a/Marlin/src/lcd/e3v2/proui/endstop_diag.h b/Marlin/src/lcd/e3v2/proui/endstop_diag.h index 33f1d10d2d..236262282e 100644 --- a/Marlin/src/lcd/e3v2/proui/endstop_diag.h +++ b/Marlin/src/lcd/e3v2/proui/endstop_diag.h @@ -24,14 +24,14 @@ /** * DWIN End Stops diagnostic page for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 1.3.2 - * Date: 2022/10/07 + * Version: 1.4.3 + * Date: 2023/05/10 */ class ESDiagClass { public: - void Draw(); - void Update(); + static void Draw(); + static void Update(); }; extern ESDiagClass ESDiag; diff --git a/Marlin/src/lcd/e3v2/proui/gcode_preview.cpp b/Marlin/src/lcd/e3v2/proui/gcode_preview.cpp index f8bcda8353..3dddbe6f61 100644 --- a/Marlin/src/lcd/e3v2/proui/gcode_preview.cpp +++ b/Marlin/src/lcd/e3v2/proui/gcode_preview.cpp @@ -23,25 +23,26 @@ /** * DWIN G-code thumbnail preview * Author: Miguel A. Risco-Castillo - * version: 3.1.2 - * Date: 2022/09/03 + * version: 3.3.2 + * Date: 2023/06/18 */ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(DWIN_LCD_PROUI, HAS_GCODE_PREVIEW) +#if ALL(DWIN_LCD_PROUI, HAS_GCODE_PREVIEW) #include "../../../core/types.h" #include "../../marlinui.h" #include "../../../sd/cardreader.h" #include "../../../MarlinCore.h" // for wait_for_user -#include "dwin_lcd.h" -#include "dwinui.h" #include "dwin.h" #include "dwin_popup.h" #include "base64.hpp" #include "gcode_preview.h" +#define THUMBWIDTH 230 +#define THUMBHEIGHT 180 + typedef struct { char name[13] = ""; //8.3 + null uint32_t thumbstart = 0; @@ -104,7 +105,7 @@ void Get_Value(char *buf, const char * const key, float &value) { } bool Has_Preview() { - const char * tbstart = "; thumbnail begin 230x180"; + const char * tbstart = "; thumbnail begin " STRINGIFY(THUMBWIDTH) "x" STRINGIFY(THUMBHEIGHT); char * posptr = 0; uint8_t nbyte = 1; uint32_t indx = 0; @@ -187,6 +188,8 @@ bool Has_Preview() { card.closefile(); buf64[readed] = 0; + fileprop.thumbwidth = THUMBWIDTH; + fileprop.thumbheight = THUMBHEIGHT; fileprop.thumbsize = decode_base64(buf64, fileprop.thumbdata); card.closefile(); DWINUI::WriteToSRAM(0x00, fileprop.thumbsize, fileprop.thumbdata); delete[] fileprop.thumbdata; @@ -199,7 +202,7 @@ void Preview_DrawFromSD() { char str_1[6] = ""; char str_2[6] = ""; char str_3[6] = ""; - DWIN_Draw_Rectangle(1, HMI_data.Background_Color, 0, 0, DWIN_WIDTH, STATUS_Y - 1); + dwinDrawRectangle(1, HMI_data.Background_Color, 0, 0, DWIN_WIDTH, STATUS_Y - 1); if (fileprop.time) { sprintf_P(buf, PSTR("Estimated time: %i:%02i"), (uint16_t)fileprop.time / 3600, ((uint16_t)fileprop.time % 3600) / 60); DWINUI::Draw_String(20, 10, buf); @@ -218,26 +221,28 @@ void Preview_DrawFromSD() { } DWINUI::Draw_Button(BTN_Print, 26, 290); DWINUI::Draw_Button(BTN_Cancel, 146, 290); - DWIN_ICON_Show(0, 0, 1, 21, 90, 0x00); + Preview_Show(); Draw_Select_Highlight(true, 290); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } else { - HMI_flag.select_flag = 1; + hmiFlag.select_flag = 1; wait_for_user = false; } } void Preview_Invalidate() { - fileprop.thumbstart = 0; -} - -bool Preview_Valid() { - return !!fileprop.thumbstart; -} - -void Preview_Reset() { fileprop.thumbsize = 0; } +bool Preview_Valid() { + return !!fileprop.thumbsize; +} + +void Preview_Show() { + const uint8_t xpos = (DWIN_WIDTH - fileprop.thumbwidth) / 2; + const uint8_t ypos = (205 - fileprop.thumbheight) / 2 + 87; + dwinIconShow(xpos, ypos, 0x00); +} + #endif // HAS_GCODE_PREVIEW && DWIN_LCD_PROUI diff --git a/Marlin/src/lcd/e3v2/proui/gcode_preview.h b/Marlin/src/lcd/e3v2/proui/gcode_preview.h index 2452797d0c..b90180db29 100644 --- a/Marlin/src/lcd/e3v2/proui/gcode_preview.h +++ b/Marlin/src/lcd/e3v2/proui/gcode_preview.h @@ -31,4 +31,4 @@ void Preview_DrawFromSD(); void Preview_Invalidate(); bool Preview_Valid(); -void Preview_Reset(); +void Preview_Show(); diff --git a/Marlin/src/lcd/e3v2/proui/lockscreen.cpp b/Marlin/src/lcd/e3v2/proui/lockscreen.cpp index 85f35582b2..50874e0fc2 100644 --- a/Marlin/src/lcd/e3v2/proui/lockscreen.cpp +++ b/Marlin/src/lcd/e3v2/proui/lockscreen.cpp @@ -29,7 +29,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(DWIN_LCD_PROUI, HAS_LOCKSCREEN) +#if ALL(DWIN_LCD_PROUI, HAS_LOCKSCREEN) #include "dwin_defines.h" #include "dwinui.h" @@ -55,9 +55,9 @@ void LockScreenClass::draw() { DWINUI::Draw_CenteredString(Color_White, 180, GET_TEXT_F(MSG_LOCKSCREEN_LOCKED)); DWINUI::Draw_CenteredString(Color_White, 200, GET_TEXT_F(MSG_LOCKSCREEN_UNLOCK)); DWINUI::Draw_CenteredString(Color_White, 240, F("-> | <-")); - DWIN_Draw_Box(1, HMI_data.Barfill_Color, 0, 260, DWIN_WIDTH, 20); - DWIN_Draw_VLine(Color_Yellow, lock_pos * DWIN_WIDTH / 255, 260, 20); - DWIN_UpdateLCD(); + dwinDrawBox(1, HMI_data.Barfill_Color, 0, 260, DWIN_WIDTH, 20); + dwinDrawVLine(Color_Yellow, lock_pos * DWIN_WIDTH / 255, 260, 20); + dwinUpdateLCD(); } void LockScreenClass::onEncoder(EncoderState encoder_diffState) { @@ -67,9 +67,9 @@ void LockScreenClass::onEncoder(EncoderState encoder_diffState) { case ENCODER_DIFF_ENTER: unlocked = (lock_pos == 128); break; default: break; } - DWIN_Draw_Box(1, HMI_data.Barfill_Color, 0, 260, DWIN_WIDTH, 20); - DWIN_Draw_VLine(Color_Yellow, lock_pos * DWIN_WIDTH / 255, 260, 20); - DWIN_UpdateLCD(); + dwinDrawBox(1, HMI_data.Barfill_Color, 0, 260, DWIN_WIDTH, 20); + dwinDrawVLine(Color_Yellow, lock_pos * DWIN_WIDTH / 255, 260, 20); + dwinUpdateLCD(); } #endif // DWIN_LCD_PROUI && HAS_LOCKSCREEN diff --git a/Marlin/src/lcd/e3v2/proui/menus.cpp b/Marlin/src/lcd/e3v2/proui/menus.cpp index dfcfaa7bbc..54892b6acb 100644 --- a/Marlin/src/lcd/e3v2/proui/menus.cpp +++ b/Marlin/src/lcd/e3v2/proui/menus.cpp @@ -23,8 +23,8 @@ /** * Menu functions for ProUI * Author: Miguel A. Risco-Castillo - * Version: 1.9.1 - * Date: 2022/12/02 + * Version: 1.10.1 + * Date: 2022/05/01 */ #include "../../../inc/MarlinConfigPre.h" @@ -32,8 +32,6 @@ #if ENABLED(DWIN_LCD_PROUI) #include "../common/encoder.h" -#include "dwin_lcd.h" -#include "dwinui.h" #include "dwin.h" #include "menus.h" @@ -47,22 +45,17 @@ MenuData_t MenuData; // Menuitem Drawing functions ================================================= void Draw_Title(TitleClass* title) { - DWIN_Draw_Rectangle(1, HMI_data.TitleBg_Color, 0, 0, DWIN_WIDTH - 1, TITLE_HEIGHT - 1); + dwinDrawRectangle(1, HMI_data.TitleBg_Color, 0, 0, DWIN_WIDTH - 1, TITLE_HEIGHT - 1); if (title->frameid) DWIN_Frame_AreaCopy(title->frameid, title->frame.left, title->frame.top, title->frame.right, title->frame.bottom, 14, (TITLE_HEIGHT - (title->frame.bottom - title->frame.top)) / 2 - 1); else #if ENABLED(TITLE_CENTERED) DWINUI::Draw_CenteredString(false, DWIN_FONT_HEAD, HMI_data.TitleTxt_Color, HMI_data.TitleBg_Color, (TITLE_HEIGHT - DWINUI::fontHeight(DWIN_FONT_HEAD)) / 2 - 1, title->caption); #else - DWIN_Draw_String(false, DWIN_FONT_HEAD, HMI_data.TitleTxt_Color, HMI_data.TitleBg_Color, 14, (TITLE_HEIGHT - DWINUI::fontHeight(DWIN_FONT_HEAD)) / 2 - 1, title->caption); + dwinDrawString(false, DWIN_FONT_HEAD, HMI_data.TitleTxt_Color, HMI_data.TitleBg_Color, 14, (TITLE_HEIGHT - DWINUI::fontHeight(DWIN_FONT_HEAD)) / 2 - 1, title->caption); #endif } -void Draw_Menu(MenuClass* menu) { - DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color, HMI_data.StatusBg_Color); - DWIN_Draw_Rectangle(1, DWINUI::backcolor, 0, TITLE_HEIGHT, DWIN_WIDTH - 1, STATUS_Y - 1); -} - void Draw_Menu_Cursor(const int8_t line) { const uint16_t ypos = MYPOS(line); DWINUI::Draw_Box(1, HMI_data.Cursor_Color, {0, ypos, 15, MLINE - 1}); @@ -79,15 +72,15 @@ void Erase_Menu_Text(const int8_t line) { DWINUI::Draw_Box(1, HMI_data.Background_Color, {LBLX, ypos, DWIN_WIDTH - LBLX, MLINE - 2}); } -void Draw_Menu_Line(const uint8_t line, const uint8_t icon /*=0*/, const char * const label /*=nullptr*/, bool more /*=false*/, bool selected /*=false*/) { +void Draw_Menu_Line(const uint8_t line, const uint8_t icon/*=0*/, const char * const label/*=nullptr*/, bool more/*=false*/, bool selected/*=false*/) { if (icon) DWINUI::Draw_Icon(icon, ICOX, MBASE(line) - 3); if (label) DWINUI::Draw_String(LBLX, MBASE(line) - 1, (char*)label); if (more) DWINUI::Draw_Icon(ICON_More, VALX + 16, MBASE(line) - 3); if (selected) Draw_Menu_Cursor(line); - DWIN_Draw_HLine(HMI_data.SplitLine_Color, 16, MYPOS(line + 1), 240); + dwinDrawHLine(HMI_data.SplitLine_Color, 16, MYPOS(line + 1), 240); } -void Draw_Menu_Line(const uint8_t line, const uint8_t icon /*=0*/, FSTR_P label /*=nullptr*/, bool more /*=false*/, bool selected /*=false*/) { +void Draw_Menu_Line(const uint8_t line, const uint8_t icon/*=0*/, FSTR_P label/*=nullptr*/, bool more/*=false*/, bool selected/*=false*/) { Draw_Menu_Line(line, icon, FTOP(label), more, selected); } @@ -98,7 +91,7 @@ void Draw_Chkb_Line(const uint8_t line, const bool checked) { void Show_Chkb_Line(const bool checked) { const uint8_t line = CurrentMenu->line(); DWINUI::Draw_Checkbox(HMI_data.Text_Color, HMI_data.Background_Color, VALX + 3 * DWINUI::fontWidth(), MBASE(line) - 1, checked); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } void Toggle_Chkb_Line(bool &checked) { @@ -106,7 +99,7 @@ void Toggle_Chkb_Line(bool &checked) { Show_Chkb_Line(checked); } -void Draw_Menu_IntValue(uint16_t bcolor, const uint8_t line, uint8_t iNum, const int32_t value /*=0*/) { +void Draw_Menu_IntValue(uint16_t bcolor, const uint8_t line, uint8_t iNum, const int32_t value/*=0*/) { DWINUI::Draw_Signed_Int(HMI_data.Text_Color, bcolor, iNum , VALX, MBASE(line) - 1, value); } @@ -116,7 +109,7 @@ void onDrawMenuItem(MenuItemClass* menuitem, int8_t line) { DWIN_Frame_AreaCopy(menuitem->frameid, menuitem->frame.left, menuitem->frame.top, menuitem->frame.right, menuitem->frame.bottom, LBLX, MBASE(line)); else if (menuitem->caption) DWINUI::Draw_String(LBLX, MBASE(line) - 1, menuitem->caption); - DWIN_Draw_HLine(HMI_data.SplitLine_Color, 16, MYPOS(line + 1), 240); + dwinDrawHLine(HMI_data.SplitLine_Color, 16, MYPOS(line + 1), 240); } void onDrawSubMenu(MenuItemClass* menuitem, int8_t line) { @@ -189,7 +182,7 @@ void DrawItemEdit(const bool selected) { // val: value / scaled value // LiveUpdate: live update function when the encoder changes // Apply: update function when the encoder is pressed -void SetOnClick(uint8_t process, const int32_t lo, const int32_t hi, uint8_t dp, const int32_t val, void (*Apply)() /*= nullptr*/, void (*LiveUpdate)() /*= nullptr*/) { +void SetOnClick(uint8_t process, const int32_t lo, const int32_t hi, uint8_t dp, const int32_t val, void (*Apply)()/*=nullptr*/, void (*LiveUpdate)()/*=nullptr*/) { checkkey = process; MenuData.MinValue = lo; MenuData.MaxValue = hi; @@ -197,7 +190,7 @@ void SetOnClick(uint8_t process, const int32_t lo, const int32_t hi, uint8_t dp, MenuData.Apply = Apply; MenuData.LiveUpdate = LiveUpdate; MenuData.Value = constrain(val, lo, hi); - EncoderRate.enabled = true; + encoderRate.enabled = true; } // Generic onclick event for integer values @@ -207,7 +200,7 @@ void SetOnClick(uint8_t process, const int32_t lo, const int32_t hi, uint8_t dp, // val: value // LiveUpdate: live update function when the encoder changes // Apply: update function when the encoder is pressed -void SetValueOnClick(uint8_t process, const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)() /*= nullptr*/, void (*LiveUpdate)() /*= nullptr*/) { +void SetValueOnClick(uint8_t process, const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)()/*=nullptr*/, void (*LiveUpdate)()/*=nullptr*/) { SetOnClick(process, lo, hi, 0, val, Apply, LiveUpdate); DrawItemEdit(true); } @@ -219,7 +212,7 @@ void SetValueOnClick(uint8_t process, const int32_t lo, const int32_t hi, const // val: value // LiveUpdate: live update function when the encoder changes // Apply: update function when the encoder is pressed -void SetValueOnClick(uint8_t process, const float lo, const float hi, uint8_t dp, const float val, void (*Apply)() /*= nullptr*/, void (*LiveUpdate)() /*= nullptr*/) { +void SetValueOnClick(uint8_t process, const float lo, const float hi, uint8_t dp, const float val, void (*Apply)()/*=nullptr*/, void (*LiveUpdate)()/*=nullptr*/) { const int32_t value = round(val * POW(10, dp)); SetOnClick(process, lo * POW(10, dp), hi * POW(10, dp), dp, value, Apply, LiveUpdate); DrawItemEdit(true); @@ -231,7 +224,7 @@ void SetValueOnClick(uint8_t process, const float lo, const float hi, uint8_t dp // val: value // LiveUpdate: live update function when the encoder changes // Apply: update function when the encoder is pressed -void SetIntOnClick(const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)() /*= nullptr*/, void (*LiveUpdate)() /*= nullptr*/) { +void SetIntOnClick(const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)()/*=nullptr*/, void (*LiveUpdate)()/*=nullptr*/) { SetValueOnClick(SetInt, lo, hi, val, Apply, LiveUpdate); } @@ -240,7 +233,7 @@ void SetIntOnClick(const int32_t lo, const int32_t hi, const int32_t val, void ( // hi: high limit // LiveUpdate: live update function when the encoder changes // Apply: update function when the encoder is pressed -void SetPIntOnClick(const int32_t lo, const int32_t hi, void (*Apply)() /*= nullptr*/, void (*LiveUpdate)() /*= nullptr*/) { +void SetPIntOnClick(const int32_t lo, const int32_t hi, void (*Apply)()/*=nullptr*/, void (*LiveUpdate)()/*=nullptr*/) { MenuData.P_Int = (int16_t*)static_cast(CurrentMenu->SelectedItem())->value; const int32_t value = *MenuData.P_Int; SetValueOnClick(SetPInt, lo, hi, value, Apply, LiveUpdate); @@ -252,7 +245,7 @@ void SetPIntOnClick(const int32_t lo, const int32_t hi, void (*Apply)() /*= null // hi: high limit // dp: decimal places // val: value -void SetFloatOnClick(const float lo, const float hi, uint8_t dp, const float val, void (*Apply)() /*= nullptr*/, void (*LiveUpdate)() /*= nullptr*/) { +void SetFloatOnClick(const float lo, const float hi, uint8_t dp, const float val, void (*Apply)()/*=nullptr*/, void (*LiveUpdate)()/*=nullptr*/) { SetValueOnClick(SetFloat, lo, hi, dp, val, Apply, LiveUpdate); } @@ -261,7 +254,7 @@ void SetFloatOnClick(const float lo, const float hi, uint8_t dp, const float val // hi: high limit // LiveUpdate: live update function when the encoder changes // Apply: update function when the encoder is pressed -void SetPFloatOnClick(const float lo, const float hi, uint8_t dp, void (*Apply)() /*= nullptr*/, void (*LiveUpdate)() /*= nullptr*/) { +void SetPFloatOnClick(const float lo, const float hi, uint8_t dp, void (*Apply)()/*=nullptr*/, void (*LiveUpdate)()/*=nullptr*/) { MenuData.P_Float = (float*)static_cast(CurrentMenu->SelectedItem())->value; SetValueOnClick(SetPFloat, lo, hi, dp, *MenuData.P_Float, Apply, LiveUpdate); } @@ -290,10 +283,10 @@ int8_t HMI_Get(bool draw) { const int32_t lo = MenuData.MinValue; const int32_t hi = MenuData.MaxValue; const int32_t cval = MenuData.Value; - EncoderState encoder_diffState = get_encoder_state(); + EncoderState encoder_diffState = TERN(SMOOTH_ENCODER_MENUITEMS, get_encoder_state(), encoderReceiveAnalyze()); if (encoder_diffState != ENCODER_DIFF_NO) { - if (Apply_Encoder(encoder_diffState, MenuData.Value)) { - EncoderRate.enabled = false; + if (applyEncoder(encoder_diffState, MenuData.Value)) { + encoderRate.enabled = false; if (draw) DrawItemEdit(false); checkkey = Menu; return 2; @@ -354,11 +347,12 @@ MenuClass::MenuClass() { void MenuClass::draw() { MenuTitle.draw(); - Draw_Menu(this); + DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color, HMI_data.StatusBg_Color); + dwinDrawRectangle(1, DWINUI::backcolor, 0, TITLE_HEIGHT, DWIN_WIDTH - 1, STATUS_Y - 1); for (int8_t i = 0; i < MenuItemCount; i++) MenuItems[i]->draw(i - topline); Draw_Menu_Cursor(line()); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } void MenuClass::onScroll(bool dir) { @@ -367,20 +361,20 @@ void MenuClass::onScroll(bool dir) { LIMIT(sel, 0, MenuItemCount - 1); if (sel != selected) { Erase_Menu_Cursor(line()); - DWIN_UpdateLCD(); + dwinUpdateLCD(); if ((sel - topline) == TROWS) { - DWIN_Frame_AreaMove(1, DWIN_SCROLL_UP, MLINE, DWINUI::backcolor, 0, TITLE_HEIGHT + 1, DWIN_WIDTH, STATUS_Y - 1); + dwinFrameAreaMove(1, DWIN_SCROLL_UP, MLINE, DWINUI::backcolor, 0, TITLE_HEIGHT + 1, DWIN_WIDTH, STATUS_Y - 1); topline++; MenuItems[sel]->draw(TROWS - 1); } if ((sel < topline)) { - DWIN_Frame_AreaMove(1, DWIN_SCROLL_DOWN, MLINE, DWINUI::backcolor, 0, TITLE_HEIGHT + 1, DWIN_WIDTH, STATUS_Y - 1); + dwinFrameAreaMove(1, DWIN_SCROLL_DOWN, MLINE, DWINUI::backcolor, 0, TITLE_HEIGHT + 1, DWIN_WIDTH, STATUS_Y - 1); topline--; MenuItems[sel]->draw(0); } selected = sel; Draw_Menu_Cursor(line()); - DWIN_UpdateLCD(); + dwinUpdateLCD(); } } @@ -407,7 +401,7 @@ void CustomMenuItemClass::draw(int8_t line) { if (onDraw != nullptr) (*onDraw)(static_cast(this), line); }; -void CustomMenuItemClass::redraw(bool erase /*=false*/) { +void CustomMenuItemClass::redraw(bool erase/*=false*/) { const int8_t line = CurrentMenu->line(this->pos); if (erase) Erase_Menu_Text(line); draw(line); @@ -507,8 +501,8 @@ MenuItemClass* EditItemAdd(uint8_t cicon, const char * const text, OnDrawItem on } void InitMenu() { + CurrentMenu = nullptr; PreviousMenu = nullptr; - InvalidateMenu(); } bool SetMenu(MenuClass* &menu, FSTR_P title, int8_t totalitems) { @@ -534,14 +528,18 @@ bool SetMenu(MenuClass* &menu, frame_rect_t cn, FSTR_P title, int8_t totalitems) return NotCurrent; } -void InvalidateMenu() { - if (CurrentMenu) { - CurrentMenu->topline = 0; - CurrentMenu->selected = 0; - CurrentMenu = nullptr; +void ResetMenu(MenuClass* &menu) { + if (menu) { + menu->topline = 0; + menu->selected = 0; } } +void InvalidateMenu() { + ResetMenu(CurrentMenu); + CurrentMenu = nullptr; +} + void UpdateMenu(MenuClass* &menu) { if (!menu) return; if (CurrentMenu != menu) { @@ -551,9 +549,13 @@ void UpdateMenu(MenuClass* &menu) { menu->draw(); } -void ReDrawMenu(bool force /*= false*/) { - if (CurrentMenu && (force || checkkey==Menu)) CurrentMenu->draw(); +void ReDrawMenu(bool force/*=false*/) { + if (CurrentMenu && (force || checkkey == Menu)) CurrentMenu->draw(); if (force) DrawItemEdit(true); } +void ReDrawItem() { + static_cast(CurrentMenu->SelectedItem())->redraw(false); +} + #endif // DWIN_LCD_PROUI diff --git a/Marlin/src/lcd/e3v2/proui/menus.h b/Marlin/src/lcd/e3v2/proui/menus.h index 072bf7584d..f0855e7073 100644 --- a/Marlin/src/lcd/e3v2/proui/menus.h +++ b/Marlin/src/lcd/e3v2/proui/menus.h @@ -24,14 +24,17 @@ /** * Menu functions for ProUI * Author: Miguel A. Risco-Castillo - * Version: 1.9.1 - * Date: 2022/12/02 + * Version: 1.10.1 + * Date: 2022/05/01 */ #include "dwinui.h" #define MENU_CHAR_LIMIT 24 -#define MENU_MAX_ITEMS TERN(SDSORT_LIMIT, SDSORT_LIMIT, 64) + +#ifndef MENU_MAX_ITEMS + #define MENU_MAX_ITEMS 100 +#endif typedef struct { int32_t MaxValue = 0; // Auxiliar max integer/scaled float value @@ -123,7 +126,6 @@ extern MenuClass *PreviousMenu; // Menuitem Drawing functions ================================================= void Draw_Title(TitleClass* title); -void Draw_Menu(MenuClass* menu); void Draw_Menu_Cursor(const int8_t line); void Erase_Menu_Cursor(const int8_t line); void Erase_Menu_Text(const int8_t line); @@ -150,13 +152,13 @@ void onDrawChkbMenu(MenuItemClass* menuitem, int8_t line); // On click functions ========================================================= -void SetOnClick(uint8_t process, const int32_t lo, const int32_t hi, uint8_t dp, const int32_t val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); -void SetValueOnClick(uint8_t process, const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); -void SetValueOnClick(uint8_t process, const float lo, const float hi, uint8_t dp, const float val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); -void SetIntOnClick(const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); -void SetPIntOnClick(const int32_t lo, const int32_t hi, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); -void SetFloatOnClick(const float lo, const float hi, uint8_t dp, const float val, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); -void SetPFloatOnClick(const float lo, const float hi, uint8_t dp, void (*Apply)() = nullptr, void (*LiveUpdate)() = nullptr); +void SetOnClick(uint8_t process, const int32_t lo, const int32_t hi, uint8_t dp, const int32_t val, void (*Apply)()=nullptr, void (*LiveUpdate)()=nullptr); +void SetValueOnClick(uint8_t process, const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)()=nullptr, void (*LiveUpdate)()=nullptr); +void SetValueOnClick(uint8_t process, const float lo, const float hi, uint8_t dp, const float val, void (*Apply)()=nullptr, void (*LiveUpdate)()=nullptr); +void SetIntOnClick(const int32_t lo, const int32_t hi, const int32_t val, void (*Apply)()=nullptr, void (*LiveUpdate)()=nullptr); +void SetPIntOnClick(const int32_t lo, const int32_t hi, void (*Apply)()=nullptr, void (*LiveUpdate)()=nullptr); +void SetFloatOnClick(const float lo, const float hi, uint8_t dp, const float val, void (*Apply)()=nullptr, void (*LiveUpdate)()=nullptr); +void SetPFloatOnClick(const float lo, const float hi, uint8_t dp, void (*Apply)()=nullptr, void (*LiveUpdate)()=nullptr); // HMI user control functions ================================================= @@ -175,6 +177,9 @@ void InitMenu(); bool SetMenu(MenuClass* &menu, FSTR_P title, int8_t totalitems); bool SetMenu(MenuClass* &menu, frame_rect_t cn, FSTR_P title, int8_t totalitems); +// Reset top line and selected item +void ResetMenu(MenuClass* &menu); + // Invalidate CurrentMenu to prepare for full menu drawing void InvalidateMenu(); @@ -182,7 +187,10 @@ void InvalidateMenu(); void UpdateMenu(MenuClass* &menu); //Redraw the current Menu if it is valid -void ReDrawMenu(bool force = false); +void ReDrawMenu(bool force=false); + +//Redraw selected menu item +void ReDrawItem(); // Clear MenuItems array and free MenuItems elements void MenuItemsClear(); @@ -196,7 +204,7 @@ bool IsMenu(MenuClass* menu); // Add elements to the MenuItems array CustomMenuItemClass* MenuItemAdd(OnDrawItem ondraw=nullptr, OnClickItem onclick=nullptr); MenuItemClass* MenuItemAdd(uint8_t cicon, const char * const text=nullptr, OnDrawItem ondraw=nullptr, OnClickItem onclick=nullptr); -inline MenuItemClass* MenuItemAdd(uint8_t cicon, FSTR_P text = nullptr, OnDrawItem ondraw=nullptr, OnClickItem onclick=nullptr) { +inline MenuItemClass* MenuItemAdd(uint8_t cicon, FSTR_P text=nullptr, OnDrawItem ondraw=nullptr, OnClickItem onclick=nullptr) { return MenuItemAdd(cicon, FTOP(text), ondraw, onclick); } MenuItemClass* MenuItemAdd(uint8_t cicon, uint8_t id, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, OnDrawItem ondraw=nullptr, OnClickItem onclick=nullptr); diff --git a/Marlin/src/lcd/e3v2/proui/meshviewer.cpp b/Marlin/src/lcd/e3v2/proui/meshviewer.cpp index 18cdffd00d..086795d943 100644 --- a/Marlin/src/lcd/e3v2/proui/meshviewer.cpp +++ b/Marlin/src/lcd/e3v2/proui/meshviewer.cpp @@ -23,122 +23,134 @@ /** * Mesh Viewer for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * version: 3.14.1 - * Date: 2022/04/11 + * version: 4.2.1 + * Date: 2023/05/05 */ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(DWIN_LCD_PROUI, HAS_MESH) +#if ALL(DWIN_LCD_PROUI, HAS_MESH) #include "../../../core/types.h" #include "../../marlinui.h" -#include "dwin_lcd.h" -#include "dwinui.h" #include "dwin.h" #include "dwin_popup.h" #include "../../../feature/bedlevel/bedlevel.h" #include "meshviewer.h" -#if ENABLED(AUTO_BED_LEVELING_UBL) +#if ENABLED(USE_GRID_MESHVIEWER) #include "bedlevel_tools.h" #endif +bool meshredraw; // Redraw mesh points +uint8_t sizex, sizey; // Mesh XY size +uint8_t rmax; // Maximum radius +#define margin 25 // XY Margins +#define rmin 5 // Minimum radius +#define zmin -20 // rmin at z=-0.20 +#define zmax 20 // rmax at z= 0.20 +#define width DWIN_WIDTH - 2 * margin +#define r(z) ((z - zmin) * (rmax - rmin) / (zmax - zmin) + rmin) +#define px(xp) (margin + (xp) * (width) / (sizex - 1)) +#define py(yp) (30 + DWIN_WIDTH - margin - (yp) * (width) / (sizey - 1)) + +constexpr uint8_t meshfont = TERN(TJC_DISPLAY, font8x16, font6x12); + MeshViewerClass MeshViewer; -void MeshViewerClass::DrawMesh(bed_mesh_t zval, const uint8_t sizex, const uint8_t sizey) { - const int8_t mx = 25, my = 25; // Margins - const int16_t stx = (DWIN_WIDTH - 2 * mx) / (sizex - 1), // Steps - sty = (DWIN_WIDTH - 2 * my) / (sizey - 1); - const int8_t rmax = _MIN(mx - 2, stx / 2); - const int8_t rmin = 7; - int16_t zmesh[sizex][sizey]; - #define px(xp) (mx + (xp) * stx) - #define py(yp) (30 + DWIN_WIDTH - my - (yp) * sty) - #define rm(z) ((z - minz) * (rmax - rmin) / _MAX(1, (maxz - minz)) + rmin) - #define DrawMeshValue(xp, yp, zv) DWINUI::Draw_Signed_Float(font6x12, 1, 2, px(xp) - 18, py(yp) - 6, zv) - #define DrawMeshHLine(yp) DWIN_Draw_HLine(HMI_data.SplitLine_Color, px(0), py(yp), DWIN_WIDTH - 2 * mx) - #define DrawMeshVLine(xp) DWIN_Draw_VLine(HMI_data.SplitLine_Color, px(xp), py(sizey - 1), DWIN_WIDTH - 2 * my) - int16_t maxz =-32000; int16_t minz = 32000; - LOOP_L_N(y, sizey) LOOP_L_N(x, sizex) { - const float v = isnan(zval[x][y]) ? 0 : round(zval[x][y] * 100); - zmesh[x][y] = v; - NOLESS(maxz, v); - NOMORE(minz, v); - } - max = (float)maxz / 100; - min = (float)minz / 100; +float MeshViewerClass::max, MeshViewerClass::min; + +void MeshViewerClass::DrawMeshGrid(const uint8_t csizex, const uint8_t csizey) { + sizex = csizex; + sizey = csizey; + rmax = _MIN(margin - 2, 0.5 * (width) / (sizex - 1)); + min = 100; + max = -100; DWINUI::ClearMainArea(); - DWIN_Draw_Rectangle(0, HMI_data.SplitLine_Color, px(0), py(0), px(sizex - 1), py(sizey - 1)); - LOOP_S_L_N(x, 1, sizex - 1) DrawMeshVLine(x); - LOOP_S_L_N(y, 1, sizey - 1) DrawMeshHLine(y); - LOOP_L_N(y, sizey) { - hal.watchdog_refresh(); - LOOP_L_N(x, sizex) { - uint16_t color = DWINUI::RainbowInt(zmesh[x][y], _MIN(-5, minz), _MAX(5, maxz)); - uint8_t radius = rm(zmesh[x][y]); - DWINUI::Draw_FillCircle(color, px(x), py(y), radius); - if (sizex < 9) { - if (zmesh[x][y] == 0) DWINUI::Draw_Float(font6x12, 1, 2, px(x) - 12, py(y) - 6, 0); - else DWINUI::Draw_Signed_Float(font6x12, 1, 2, px(x) - 18, py(y) - 6, zval[x][y]); - } - else { - char str_1[9]; - str_1[0] = 0; - switch (zmesh[x][y]) { - case -999 ... -100: - DWINUI::Draw_Signed_Float(font6x12, 1, 1, px(x) - 18, py(y) - 6, zval[x][y]); - break; - case -99 ... -1: - sprintf_P(str_1, PSTR("-.%02i"), -zmesh[x][y]); - break; - case 0: - DWIN_Draw_String(false, font6x12, DWINUI::textcolor, DWINUI::backcolor, px(x) - 4, py(y) - 6, "0"); - break; - case 1 ... 99: - sprintf_P(str_1, PSTR(".%02i"), zmesh[x][y]); - break; - case 100 ... 999: - DWINUI::Draw_Signed_Float(font6x12, 1, 1, px(x) - 18, py(y) - 6, zval[x][y]); - break; - } - if (str_1[0]) - DWIN_Draw_String(false, font6x12, DWINUI::textcolor, DWINUI::backcolor, px(x) - 12, py(y) - 6, str_1); - } + dwinDrawRectangle(0, HMI_data.SplitLine_Color, px(0), py(0), px(sizex - 1), py(sizey - 1)); + for (uint8_t x = 1; x < sizex - 1; ++x) dwinDrawVLine(HMI_data.SplitLine_Color, px(x), py(sizey - 1), width); + for (uint8_t y = 1; y < sizey - 1; ++y) dwinDrawHLine(HMI_data.SplitLine_Color, px(0), py(y), width); +} + +void MeshViewerClass::DrawMeshPoint(const uint8_t x, const uint8_t y, const float z) { + const uint8_t fs = DWINUI::fontWidth(meshfont); + const int16_t v = isnan(z) ? 0 : round(z * 100); + NOLESS(max, z); + NOMORE(min, z); + const uint16_t color = DWINUI::RainbowInt(v, zmin, zmax); + DWINUI::Draw_FillCircle(color, px(x), py(y), r(_MAX(_MIN(v,zmax),zmin))); + TERN_(TJC_DISPLAY, delay(100)); + if (sizex < (ENABLED(TJC_DISPLAY) ? 8 : 9)) { + if (v == 0) DWINUI::Draw_Float(meshfont, 1, 2, px(x) - 2*fs, py(y) - fs, 0); + else DWINUI::Draw_Signed_Float(meshfont, 1, 2, px(x) - 3*fs, py(y) - fs, z); + } + else { + char str_1[9]; + str_1[0] = '\0'; + switch (v) { + case -999 ... -100: + DWINUI::Draw_Signed_Float(meshfont, 1, 1, px(x) - 3*fs, py(y) - fs, z); + break; + case -99 ... -1: + sprintf_P(str_1, PSTR("-.%02i"), -v); + break; + case 0: + dwinDrawString(false, meshfont, DWINUI::textcolor, DWINUI::backcolor, px(x) - 4, py(y) - fs, "0"); + break; + case 1 ... 99: + sprintf_P(str_1, PSTR(".%02i"), v); + break; + case 100 ... 999: + DWINUI::Draw_Signed_Float(meshfont, 1, 1, px(x) - 3 * fs, py(y) - fs, z); + break; } + if (str_1[0]) + dwinDrawString(false, meshfont, DWINUI::textcolor, DWINUI::backcolor, px(x) - 2 * fs, py(y) - fs, str_1); } } -void MeshViewerClass::Draw(bool withsave /*= false*/) { +void MeshViewerClass::DrawMesh(const bed_mesh_t zval, const uint8_t csizex, const uint8_t csizey) { + DrawMeshGrid(csizex, csizey); + for (uint8_t y = 0; y < csizey; ++y) { + hal.watchdog_refresh(); + for (uint8_t x = 0; x < csizex; ++x) DrawMeshPoint(x, y, zval[x][y]); + } +} + +void MeshViewerClass::Draw(const bool withsave/*=false*/, const bool redraw/*=true*/) { Title.ShowCaption(GET_TEXT_F(MSG_MESH_VIEWER)); - #if USE_UBL_VIEWER + #if ENABLED(USE_GRID_MESHVIEWER) DWINUI::ClearMainArea(); bedLevelTools.viewer_print_value = true; bedLevelTools.Draw_Bed_Mesh(-1, 1, 8, 10 + TITLE_HEIGHT); #else - DrawMesh(bedlevel.z_values, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y); + if (redraw) DrawMesh(bedlevel.z_values, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y); + else DWINUI::Draw_Box(1, HMI_data.Background_Color, { 89, 305, 99, 38 }); #endif if (withsave) { DWINUI::Draw_Button(BTN_Save, 26, 305); DWINUI::Draw_Button(BTN_Continue, 146, 305); - Draw_Select_Highlight(HMI_flag.select_flag, 305); + Draw_Select_Highlight(hmiFlag.select_flag, 305); } else DWINUI::Draw_Button(BTN_Continue, 86, 305); - #if USE_UBL_VIEWER + #if ENABLED(USE_GRID_MESHVIEWER) bedLevelTools.Set_Mesh_Viewer_Status(); #else char str_1[6], str_2[6] = ""; - ui.status_printf(0, F("Mesh minZ: %s, maxZ: %s"), - dtostrf(min, 1, 2, str_1), - dtostrf(max, 1, 2, str_2) - ); + ui.status_printf(0, F("Mesh minZ: %s, maxZ: %s"), dtostrf(min, 1, 2, str_1), dtostrf(max, 1, 2, str_2)); #endif } -void Draw_MeshViewer() { MeshViewer.Draw(true); } -void onClick_MeshViewer() { if (HMI_flag.select_flag) SaveMesh(); HMI_ReturnScreen(); } -void Goto_MeshViewer() { if (leveling_is_valid()) Goto_Popup(Draw_MeshViewer, onClick_MeshViewer); else HMI_ReturnScreen(); } +void Draw_MeshViewer() { MeshViewer.Draw(true, meshredraw); } + +void onClick_MeshViewer() { if (hmiFlag.select_flag) SaveMesh(); HMI_ReturnScreen(); } + +void Goto_MeshViewer(const bool redraw) { + meshredraw = redraw; + if (leveling_is_valid()) Goto_Popup(Draw_MeshViewer, onClick_MeshViewer); + else HMI_ReturnScreen(); +} #endif // DWIN_LCD_PROUI && HAS_MESH diff --git a/Marlin/src/lcd/e3v2/proui/meshviewer.h b/Marlin/src/lcd/e3v2/proui/meshviewer.h index 3aafe16984..1f45a83480 100644 --- a/Marlin/src/lcd/e3v2/proui/meshviewer.h +++ b/Marlin/src/lcd/e3v2/proui/meshviewer.h @@ -24,17 +24,19 @@ /** * Mesh Viewer for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * version: 3.14.1 - * Date: 2022/04/11 + * version: 4.2.1 + * Date: 2023/05/05 */ class MeshViewerClass { public: - float max, min; - void Draw(bool withsave = false); - void DrawMesh(bed_mesh_t zval, const uint8_t sizex, const uint8_t sizey); + static float max, min; + static void DrawMeshGrid(const uint8_t csizex, const uint8_t csizey); + static void DrawMeshPoint(const uint8_t x, const uint8_t y, const float z); + static void Draw(const bool withsave=false, const bool redraw=true); + static void DrawMesh(const bed_mesh_t zval, const uint8_t csizex, const uint8_t csizey); }; extern MeshViewerClass MeshViewer; -void Goto_MeshViewer(); +void Goto_MeshViewer(const bool redraw); diff --git a/Marlin/src/lcd/e3v2/proui/plot.cpp b/Marlin/src/lcd/e3v2/proui/plot.cpp index fddaf3963a..45341ae624 100644 --- a/Marlin/src/lcd/e3v2/proui/plot.cpp +++ b/Marlin/src/lcd/e3v2/proui/plot.cpp @@ -23,20 +23,18 @@ /** * DWIN Single var plot * Author: Miguel A. Risco-Castillo - * Version: 2.1.2 - * Date: 2022/11/20 + * Version: 2.2.3 + * Date: 2023/01/29 */ #include "../../../inc/MarlinConfig.h" -#if BOTH(DWIN_LCD_PROUI, SHOW_TUNING_GRAPH) +#if ALL(DWIN_LCD_PROUI, SHOW_TUNING_GRAPH) -#include "plot.h" +#include "dwin.h" #include "../../../core/types.h" #include "../../marlinui.h" -#include "dwin_lcd.h" -#include "dwinui.h" -#include "dwin.h" +#include "plot.h" #define Plot_Bg_Color RGB( 1, 12, 8) @@ -46,7 +44,7 @@ uint16_t grphpoints, r, x2, y2 = 0; frame_rect_t grphframe = {0}; float scale = 0; -void PlotClass::Draw(const frame_rect_t &frame, const celsius_t max, const_float_t ref/*=0*/) { +void PlotClass::Draw(const frame_rect_t &frame, const_float_t max, const_float_t ref/*=0*/) { grphframe = frame; grphpoints = 0; scale = frame.h / max; @@ -54,22 +52,22 @@ void PlotClass::Draw(const frame_rect_t &frame, const celsius_t max, const_float y2 = frame.y + frame.h - 1; r = round((y2) - ref * scale); DWINUI::Draw_Box(1, Plot_Bg_Color, frame); - for (uint8_t i = 1; i < 4; i++) if (i * 50 < frame.w) DWIN_Draw_VLine(Line_Color, i * 50 + frame.x, frame.y, frame.h); + for (uint8_t i = 1; i < 4; i++) if (i * 50 < frame.w) dwinDrawVLine(Line_Color, i * 50 + frame.x, frame.y, frame.h); DWINUI::Draw_Box(0, Color_White, DWINUI::ExtendFrame(frame, 1)); - DWIN_Draw_HLine(Color_Red, frame.x, r, frame.w); + dwinDrawHLine(Color_Red, frame.x, r, frame.w); } void PlotClass::Update(const_float_t value) { if (!scale) return; const uint16_t y = round((y2) - value * scale); if (grphpoints < grphframe.w) { - DWIN_Draw_Point(Color_Yellow, 1, 1, grphpoints + grphframe.x, y); + dwinDrawPoint(Color_Yellow, 1, 1, grphpoints + grphframe.x, y); } else { - DWIN_Frame_AreaMove(1, 0, 1, Plot_Bg_Color, grphframe.x, grphframe.y, x2, y2); - if ((grphpoints % 50) == 0) DWIN_Draw_VLine(Line_Color, x2 - 1, grphframe.y + 1, grphframe.h - 2); - DWIN_Draw_Point(Color_Red, 1, 1, x2 - 1, r); - DWIN_Draw_Point(Color_Yellow, 1, 1, x2 - 1, y); + dwinFrameAreaMove(1, 0, 1, Plot_Bg_Color, grphframe.x, grphframe.y, x2, y2); + if ((grphpoints % 50) == 0) dwinDrawVLine(Line_Color, x2 - 1, grphframe.y + 1, grphframe.h - 2); + dwinDrawPoint(Color_Red, 1, 1, x2 - 1, r); + dwinDrawPoint(Color_Yellow, 1, 1, x2 - 1, y); } grphpoints++; } diff --git a/Marlin/src/lcd/e3v2/proui/plot.h b/Marlin/src/lcd/e3v2/proui/plot.h index 14e7058b01..144ba0073b 100644 --- a/Marlin/src/lcd/e3v2/proui/plot.h +++ b/Marlin/src/lcd/e3v2/proui/plot.h @@ -24,15 +24,15 @@ /** * DWIN Single var plot * Author: Miguel A. Risco-Castillo - * Version: 2.1.2 - * Date: 2022/11/20 + * Version: 2.2.3 + * Date: 2023/01/29 */ #include "dwinui.h" class PlotClass { public: - static void Draw(const frame_rect_t &frame, const celsius_t max, const_float_t ref=0); + static void Draw(const frame_rect_t &frame, const_float_t max, const_float_t ref=0); static void Update(const_float_t value); }; diff --git a/Marlin/src/lcd/e3v2/proui/printstats.cpp b/Marlin/src/lcd/e3v2/proui/printstats.cpp index 638cd34208..093040ebf4 100644 --- a/Marlin/src/lcd/e3v2/proui/printstats.cpp +++ b/Marlin/src/lcd/e3v2/proui/printstats.cpp @@ -23,13 +23,13 @@ /** * Print Stats page for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 1.4.2 + * Version: 1.4.0 * Date: 2022/12/03 */ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(DWIN_LCD_PROUI, PRINTCOUNTER) +#if ALL(DWIN_LCD_PROUI, PRINTCOUNTER) #include "printstats.h" @@ -37,10 +37,8 @@ #include "../../../MarlinCore.h" #include "../../marlinui.h" #include "../../../module/printcounter.h" -#include "dwin_lcd.h" -#include "dwinui.h" -#include "dwin_popup.h" #include "dwin.h" +#include "dwin_popup.h" PrintStatsClass PrintStats; @@ -82,7 +80,7 @@ void Goto_PrintStats() { // Print Stats Reset popup void Popup_ResetStats() { DWIN_Popup_ConfirmCancel(ICON_Info_0, GET_TEXT_F(MSG_RESET_STATS)); } void OnClick_ResetStats() { - if (HMI_flag.select_flag) PrintStatsClass::Reset(); + if (hmiFlag.select_flag) PrintStatsClass::Reset(); HMI_ReturnScreen(); } void PrintStatsReset() { Goto_Popup(Popup_ResetStats, OnClick_ResetStats); } diff --git a/Marlin/src/lcd/e3v2/proui/printstats.h b/Marlin/src/lcd/e3v2/proui/printstats.h index 4a38306886..aadb3e8dce 100644 --- a/Marlin/src/lcd/e3v2/proui/printstats.h +++ b/Marlin/src/lcd/e3v2/proui/printstats.h @@ -24,7 +24,7 @@ /** * Print Stats page for PRO UI * Author: Miguel A. Risco-Castillo (MRISCOC) - * Version: 1.4.2 + * Version: 1.4.0 * Date: 2022/12/03 */ diff --git a/Marlin/src/lcd/extui/anycubic/Tunes.cpp b/Marlin/src/lcd/extui/anycubic/Tunes.cpp index d1fb888d17..6e7aecefa9 100644 --- a/Marlin/src/lcd/extui/anycubic/Tunes.cpp +++ b/Marlin/src/lcd/extui/anycubic/Tunes.cpp @@ -31,7 +31,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if EITHER(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_VYPER) +#if ANY(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_VYPER) #include "Tunes.h" #include "../../../libs/buzzer.h" @@ -39,7 +39,7 @@ namespace Anycubic { - void PlayTune(const uint16_t *tune, const uint8_t speed/*=1*/) { + void playTune(const uint16_t *tune, const uint8_t speed/*=1*/) { const uint16_t wholenotelen = tune[0] / speed; for (uint8_t pos = 1; pos < MAX_TUNE_LENGTH; pos += 2) { const uint16_t freq = tune[pos]; diff --git a/Marlin/src/lcd/extui/anycubic/Tunes.h b/Marlin/src/lcd/extui/anycubic/Tunes.h index 8b99f1f863..73483a9bdd 100644 --- a/Marlin/src/lcd/extui/anycubic/Tunes.h +++ b/Marlin/src/lcd/extui/anycubic/Tunes.h @@ -61,7 +61,7 @@ n_END=10000 // end of tune marker namespace Anycubic { - void PlayTune(const uint16_t *tune, const uint8_t speed=1); + void playTune(const uint16_t *tune, const uint8_t speed=1); // Only uncomment the tunes you are using to save memory // This will help you write tunes! diff --git a/Marlin/src/lcd/extui/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/anycubic_chiron/FileNavigator.cpp index 6e77b2b2fd..ffc485a3dc 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron/FileNavigator.cpp @@ -60,21 +60,21 @@ using namespace ExtUI; namespace Anycubic { FileNavigator filenavigator; -FileList FileNavigator::filelist; // Instance of the Marlin file API +FileList FileNavigator::filelist; // ExtUI file API uint16_t FileNavigator::lastpanelindex; uint16_t FileNavigator::currentindex; // override the panel request uint8_t FileNavigator::folderdepth; -uint16_t FileNavigator::currentfolderindex[MAX_FOLDER_DEPTH]; // track folder pos for iteration -char FileNavigator::currentfoldername[MAX_PATH_LEN + 1]; // Current folder path +uint16_t FileNavigator::currentDirIndex[MAX_FOLDER_DEPTH]; // track folder pos for iteration +char FileNavigator::currentDirPath[MAX_PATH_LEN + 1]; // Current folder path FileNavigator::FileNavigator() { reset(); } void FileNavigator::reset() { - currentfoldername[0] = '\0'; + currentDirPath[0] = '\0'; folderdepth = 0; currentindex = 0; lastpanelindex = 0; - ZERO(currentfolderindex); + ZERO(currentDirIndex); // Start at root folder while (!filelist.isAtRootDir()) filelist.upDir(); @@ -85,9 +85,9 @@ void FileNavigator::refresh() { filelist.refresh(); } void FileNavigator::changeDIR(const char *folder) { if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth - currentfolderindex[folderdepth] = currentindex; - strcat(currentfoldername, folder); - strcat(currentfoldername, "/"); + currentDirIndex[folderdepth] = currentindex; + strcat(currentDirPath, folder); + strcat(currentDirPath, "/"); filelist.changeDir(folder); folderdepth++; currentindex = 0; @@ -97,15 +97,15 @@ void FileNavigator::upDIR() { if (!filelist.isAtRootDir()) { filelist.upDir(); folderdepth--; - currentindex = currentfolderindex[folderdepth]; // restore last position in the folder + currentindex = currentDirIndex[folderdepth]; // restore last position in the folder filelist.seek(currentindex); // restore file information } // Remove the child folder from the stored path if (folderdepth == 0) - currentfoldername[0] = '\0'; + currentDirPath[0] = '\0'; else { - char * const pos = strchr(currentfoldername, '/'); + char * const pos = strchr(currentDirPath, '/'); *(pos + 1) = '\0'; } } @@ -151,7 +151,7 @@ void FileNavigator::skiptofileindex(uint16_t skip) { // The new panel ignores entries that don't end in .GCO or .gcode so add and pad them. if (paneltype <= AC_panel_new) { TFTSer.println("<<.GCO"); - Chiron.SendtoTFTLN(F(".. .gcode")); + chiron.tftSendLn(F(".. .gcode")); } else { TFTSer.println("<<"); @@ -186,7 +186,7 @@ void FileNavigator::skiptofileindex(uint16_t skip) { } else { // Not DIR TFTSer.write('/'); - if (folderdepth > 0) TFTSer.print(currentfoldername); + if (folderdepth > 0) TFTSer.print(currentDirPath); TFTSer.println(filelist.shortFilename()); TFTSer.print(filelist.longFilename()); @@ -233,9 +233,9 @@ void FileNavigator::skiptofileindex(uint16_t skip) { void FileNavigator::sendFile(panel_type_t paneltype) { TFTSer.write('/'); - if (folderdepth > 0) TFTSer.print(currentfoldername); + if (folderdepth > 0) TFTSer.print(currentDirPath); TFTSer.println(filelist.shortFilename()); - if (folderdepth > 0) TFTSer.print(currentfoldername); + if (folderdepth > 0) TFTSer.print(currentDirPath); TFTSer.println(filelist.longFilename()); } diff --git a/Marlin/src/lcd/extui/anycubic_chiron/FileNavigator.h b/Marlin/src/lcd/extui/anycubic_chiron/FileNavigator.h index 71236c4df9..f4fad96653 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/FileNavigator.h +++ b/Marlin/src/lcd/extui/anycubic_chiron/FileNavigator.h @@ -52,8 +52,8 @@ namespace Anycubic { static uint16_t lastpanelindex; static uint16_t currentindex; static uint8_t folderdepth; - static uint16_t currentfolderindex[MAX_FOLDER_DEPTH]; - static char currentfoldername[MAX_PATH_LEN + 1]; + static uint16_t currentDirIndex[MAX_FOLDER_DEPTH]; + static char currentDirPath[MAX_PATH_LEN + 1]; }; extern FileNavigator filenavigator; diff --git a/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp b/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp index 520ca587e3..4ed0461afe 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron/chiron_extui.cpp @@ -37,17 +37,17 @@ using namespace Anycubic; namespace ExtUI { - void onStartup() { Chiron.Startup(); } + void onStartup() { chiron.startup(); } - void onIdle() { Chiron.IdleLoop(); } + void onIdle() { chiron.idleLoop(); } void onPrinterKilled(FSTR_P const error, FSTR_P const component) { - Chiron.PrinterKilled(error, component); + chiron.printerKilled(error, component); } - void onMediaInserted() { Chiron.MediaEvent(AC_media_inserted); } - void onMediaError() { Chiron.MediaEvent(AC_media_error); } - void onMediaRemoved() { Chiron.MediaEvent(AC_media_removed); } + void onMediaInserted() { chiron.mediaEvent(AC_media_inserted); } + void onMediaError() { chiron.mediaEvent(AC_media_error); } + void onMediaRemoved() { chiron.mediaEvent(AC_media_removed); } void onPlayTone(const uint16_t frequency, const uint16_t duration) { #if ENABLED(SPEAKER) @@ -55,15 +55,15 @@ namespace ExtUI { #endif } - void onPrintTimerStarted() { Chiron.TimerEvent(AC_timer_started); } - void onPrintTimerPaused() { Chiron.TimerEvent(AC_timer_paused); } - void onPrintTimerStopped() { Chiron.TimerEvent(AC_timer_stopped); } + void onPrintTimerStarted() { chiron.timerEvent(AC_timer_started); } + void onPrintTimerPaused() { chiron.timerEvent(AC_timer_paused); } + void onPrintTimerStopped() { chiron.timerEvent(AC_timer_stopped); } void onPrintDone() {} - void onFilamentRunout(const extruder_t) { Chiron.FilamentRunout(); } + void onFilamentRunout(const extruder_t) { chiron.filamentRunout(); } - void onUserConfirmRequired(const char * const msg) { Chiron.ConfirmationRequest(msg); } - void onStatusChanged(const char * const msg) { Chiron.StatusChange(msg); } + void onUserConfirmRequired(const char * const msg) { chiron.confirmationRequest(msg); } + void onStatusChanged(const char * const msg) { chiron.statusChange(msg); } void onHomingStart() {} void onHomingDone() {} @@ -104,10 +104,12 @@ namespace ExtUI { // whether successful or not. } - #if HAS_MESH + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #endif + #if HAS_MESH void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated //SERIAL_ECHOLNPGM("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); @@ -127,7 +129,7 @@ namespace ExtUI { // Called when power-loss state is detected } // Called on resume from power-loss - void onPowerLossResume() { Chiron.PowerLossRecovery(); } + void onPowerLossResume() { chiron.powerLossRecovery(); } #endif #if HAS_PID_HEATING diff --git a/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp index f3bc64a024..6c8c3aa3a5 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.cpp @@ -42,9 +42,13 @@ #include "../../../libs/numtostr.h" #include "../../../MarlinCore.h" +#define DEBUG_OUT ACDEBUGLEVEL +#include "../../../core/debug_out.h" + namespace Anycubic { -ChironTFT Chiron; +ChironTFT chiron; + #if AUTO_DETECT_CHIRON_TFT panel_type_t ChironTFT::panel_type = AC_panel_unknown; #endif @@ -60,7 +64,7 @@ uint8_t ChironTFT::command_len; float ChironTFT::live_Zoffset; file_menu_t ChironTFT::file_menu; -void ChironTFT::Startup() { +void ChironTFT::startup() { selectedfile[0] = '\0'; panel_command[0] = '\0'; command_len = 0; @@ -84,81 +88,76 @@ void ChironTFT::Startup() { // So we need to know what we are working with. // Panel type can be defined otherwise detect it automatically switch (panel_type) { - case AC_panel_new: - SERIAL_ECHOLNF(AC_msg_new_panel_set); - break; - case AC_panel_standard: - SERIAL_ECHOLNF(AC_msg_old_panel_set); - break; - default: - SERIAL_ECHOLNF(AC_msg_auto_panel_detection); - DetectPanelType(); + case AC_panel_new: SERIAL_ECHOLN(AC_msg_new_panel_set); break; + case AC_panel_standard: SERIAL_ECHOLN(AC_msg_old_panel_set); break; + default: SERIAL_ECHOLN(AC_msg_auto_panel_detection); + detectPanelType(); break; } // Signal Board has reset - SendtoTFTLN(AC_msg_main_board_has_reset); + tftSendLn(AC_msg_main_board_has_reset); // Enable leveling and Disable end stops during print // as Z home places nozzle above the bed so we need to allow it past the end stops injectCommands(AC_cmnd_enable_leveling); - // Startup tunes are defined in Tunes.h - PlayTune(TERN(AC_DEFAULT_STARTUP_TUNE, Anycubic_PowerOn, GB_PowerOn)); + // startup tunes are defined in Tunes.h + playTune(TERN(AC_DEFAULT_STARTUP_TUNE, Anycubic_PowerOn, GB_PowerOn)); #if ACDEBUGLEVEL - SERIAL_ECHOLNPGM("AC Debug Level ", ACDEBUGLEVEL); + DEBUG_ECHOLNPGM("AC Debug Level ", ACDEBUGLEVEL); #endif - SendtoTFTLN(AC_msg_ready); + tftSendLn(AC_msg_ready); } -void ChironTFT::DetectPanelType() { +void ChironTFT::detectPanelType() { #if AUTO_DETECT_CHIRON_TFT // Send a query to the TFT - SendtoTFTLN(AC_Test_for_OldPanel); // The panel will respond with 'SXY 480 320' - SendtoTFTLN(AC_Test_for_NewPanel); // the panel will respond with '[0]=0 ' to '[19]=0 ' + tftSendLn(AC_Test_for_OldPanel); // The panel will respond with 'SXY 480 320' + tftSendLn(AC_Test_for_NewPanel); // the panel will respond with '[0]=0 ' to '[19]=0 ' #endif } -void ChironTFT::IdleLoop() { - if (ReadTFTCommand()) { - ProcessPanelRequest(); +void ChironTFT::idleLoop() { + if (readTFTCommand()) { + processPanelRequest(); command_len = 0; } - CheckHeaters(); + checkHeaters(); } -void ChironTFT::PrinterKilled(FSTR_P const error, FSTR_P const component) { - SendtoTFTLN(AC_msg_kill_lcd); +void ChironTFT::printerKilled(FSTR_P const error, FSTR_P const component) { + tftSendLn(AC_msg_kill_lcd); #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPGM("PrinterKilled()\nerror: ", error , "\ncomponent: ", component); + DEBUG_ECHOLNPGM("printerKilled()\nerror: ", error , "\ncomponent: ", component); #endif } -void ChironTFT::MediaEvent(media_event_t event) { +void ChironTFT::mediaEvent(media_event_t event) { #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPGM("ProcessMediaStatus() ", event); + DEBUG_ECHOLNPGM("ProcessMediaStatus() ", event); #endif switch (event) { case AC_media_inserted: - SendtoTFTLN(AC_msg_sd_card_inserted); + tftSendLn(AC_msg_sd_card_inserted); break; case AC_media_removed: - SendtoTFTLN(AC_msg_sd_card_removed); + tftSendLn(AC_msg_sd_card_removed); break; case AC_media_error: last_error = AC_error_noSD; - SendtoTFTLN(AC_msg_no_sd_card); + tftSendLn(AC_msg_no_sd_card); break; } } -void ChironTFT::TimerEvent(timer_event_t event) { +void ChironTFT::timerEvent(timer_event_t event) { #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPGM("TimerEvent() ", event); - SERIAL_ECHOLNPGM("Printer State: ", printer_state); + DEBUG_ECHOLNPGM("timerEvent() ", event); + DEBUG_ECHOLNPGM("Printer State: ", printer_state); #endif switch (event) { @@ -166,44 +165,44 @@ void ChironTFT::TimerEvent(timer_event_t event) { live_Zoffset = 0.0; // reset print offset setSoftEndstopState(false); // disable endstops to print printer_state = AC_printer_printing; - SendtoTFTLN(AC_msg_print_from_sd_card); + tftSendLn(AC_msg_print_from_sd_card); } break; case AC_timer_paused: { printer_state = AC_printer_paused; pause_state = AC_paused_idle; - SendtoTFTLN(AC_msg_paused); + tftSendLn(AC_msg_paused); } break; case AC_timer_stopped: { if (printer_state != AC_printer_idle) { printer_state = AC_printer_stopping; - SendtoTFTLN(AC_msg_print_complete); + tftSendLn(AC_msg_print_complete); } setSoftEndstopState(true); // enable endstops } break; } } -void ChironTFT::FilamentRunout() { +void ChironTFT::filamentRunout() { #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPGM("FilamentRunout() printer_state ", printer_state); + DEBUG_ECHOLNPGM("filamentRunout() printer_state ", printer_state); #endif // 1 Signal filament out last_error = AC_error_filament_runout; - SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); - PlayTune(FilamentOut); + tftSendLn(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); + playTune(FilamentOut); } -void ChironTFT::ConfirmationRequest(const char * const msg) { +void ChironTFT::confirmationRequest(const char * const msg) { // M108 continue #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPGM("ConfirmationRequest() ", msg, " printer_state:", printer_state); + DEBUG_ECHOLNPGM("confirmationRequest() ", msg, " printer_state:", printer_state); #endif switch (printer_state) { case AC_printer_pausing: { if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 || strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0) { - SendtoTFTLN(AC_msg_paused); // enable continue button + tftSendLn(AC_msg_paused); // enable continue button printer_state = AC_printer_paused; } } break; @@ -214,18 +213,18 @@ void ChironTFT::ConfirmationRequest(const char * const msg) { // Heater timeout, send acknowledgement if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0) { pause_state = AC_paused_heater_timed_out; - SendtoTFTLN(AC_msg_paused); // enable continue button - PlayTune(HeaterTimeout); + tftSendLn(AC_msg_paused); // enable continue button + playTune(HeaterTimeout); } // Reheat finished, send acknowledgement else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0) { pause_state = AC_paused_idle; - SendtoTFTLN(AC_msg_paused); // enable continue button + tftSendLn(AC_msg_paused); // enable continue button } // Filament Purging, send acknowledgement enter run mode else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0) { pause_state = AC_paused_purging_filament; - SendtoTFTLN(AC_msg_paused); // enable continue button + tftSendLn(AC_msg_paused); // enable continue button } } break; default: @@ -233,10 +232,10 @@ void ChironTFT::ConfirmationRequest(const char * const msg) { } } -void ChironTFT::StatusChange(const char * const msg) { +void ChironTFT::statusChange(const char * const msg) { #if ACDEBUG(AC_MARLIN) - SERIAL_ECHOLNPGM("StatusChange() ", msg); - SERIAL_ECHOLNPGM("printer_state:", printer_state); + DEBUG_ECHOLNPGM("statusChange() ", msg); + DEBUG_ECHOLNPGM("printer_state:", printer_state); #endif bool msg_matched = false; // The only way to get printer status is to parse messages @@ -247,15 +246,15 @@ void ChironTFT::StatusChange(const char * const msg) { // Ignore the custom machine name if (strcmp_P(msg + strlen(MACHINE_NAME), MARLIN_msg_ready) == 0) { injectCommands(F("M500\nG27")); - SendtoTFTLN(AC_msg_probing_complete); + tftSendLn(AC_msg_probing_complete); printer_state = AC_printer_idle; msg_matched = true; } // If probing fails don't save the mesh raise the probe above the bad point if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0) { - PlayTune(BeepBeepBeeep); + playTune(BeepBeepBeeep); injectCommands(F("G1 Z50 F500")); - SendtoTFTLN(AC_msg_probing_complete); + tftSendLn(AC_msg_probing_complete); printer_state = AC_printer_idle; msg_matched = true; } @@ -263,14 +262,14 @@ void ChironTFT::StatusChange(const char * const msg) { case AC_printer_printing: { if (strcmp_P(msg, MARLIN_msg_reheating) == 0) { - SendtoTFTLN(AC_msg_paused); // enable continue button + tftSendLn(AC_msg_paused); // enable continue button msg_matched = true; } } break; case AC_printer_pausing: { if (strcmp_P(msg, MARLIN_msg_print_paused) == 0) { - SendtoTFTLN(AC_msg_paused); + tftSendLn(AC_msg_paused); printer_state = AC_printer_paused; pause_state = AC_paused_idle; msg_matched = true; @@ -279,7 +278,7 @@ void ChironTFT::StatusChange(const char * const msg) { case AC_printer_stopping: { if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0) { - SendtoTFTLN(AC_msg_stop); + tftSendLn(AC_msg_stop); printer_state = AC_printer_idle; msg_matched = true; } @@ -291,11 +290,11 @@ void ChironTFT::StatusChange(const char * const msg) { // If not matched earlier see if this was a heater message if (!msg_matched) { if (strcmp_P(msg, MARLIN_msg_extruder_heating) == 0) { - SendtoTFTLN(AC_msg_nozzle_heating); + tftSendLn(AC_msg_nozzle_heating); hotend_state = AC_heater_temp_set; } else if (strcmp_P(msg, MARLIN_msg_bed_heating) == 0) { - SendtoTFTLN(AC_msg_bed_heating); + tftSendLn(AC_msg_bed_heating); hotbed_state = AC_heater_temp_set; } else if (strcmp_P(msg, MARLIN_msg_EEPROM_version) == 0) { @@ -304,33 +303,33 @@ void ChironTFT::StatusChange(const char * const msg) { } } -void ChironTFT::PowerLossRecovery() { +void ChironTFT::powerLossRecovery() { printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover. last_error = AC_error_powerloss; - PlayTune(SOS); - SERIAL_ECHOLNF(AC_msg_powerloss_recovery); + playTune(SOS); + SERIAL_ECHOLN(AC_msg_powerloss_recovery); } -void ChironTFT::PrintComplete() { - SendtoTFT(AC_msg_print_complete); +void ChironTFT::printComplete() { + tftSend(AC_msg_print_complete); printer_state = AC_printer_idle; setSoftEndstopState(true); // enable endstops } -void ChironTFT::SendtoTFT(FSTR_P const fstr/*=nullptr*/) { // A helper to print PROGMEM string to the panel +void ChironTFT::tftSend(FSTR_P const fstr/*=nullptr*/) { // A helper to print PROGMEM string to the panel #if ACDEBUG(AC_SOME) - SERIAL_ECHOF(fstr); + DEBUG_ECHO(fstr); #endif PGM_P str = FTOP(fstr); while (const char c = pgm_read_byte(str++)) TFTSer.write(c); } -void ChironTFT::SendtoTFTLN(FSTR_P const fstr/*=nullptr*/) { +void ChironTFT::tftSendLn(FSTR_P const fstr/*=nullptr*/) { if (fstr) { #if ACDEBUG(AC_SOME) - SERIAL_ECHOPGM("> "); + DEBUG_ECHOPGM("> "); #endif - SendtoTFT(fstr); + tftSend(fstr); #if ACDEBUG(AC_SOME) SERIAL_EOL(); #endif @@ -338,7 +337,7 @@ void ChironTFT::SendtoTFTLN(FSTR_P const fstr/*=nullptr*/) { TFTSer.println(); } -bool ChironTFT::ReadTFTCommand() { +bool ChironTFT::readTFTCommand() { bool command_ready = false; while (TFTSer.available() > 0 && command_len < MAX_CMND_LEN) { panel_command[command_len] = TFTSer.read(); @@ -352,29 +351,29 @@ bool ChironTFT::ReadTFTCommand() { if (command_ready || command_len == MAX_CMND_LEN) { panel_command[command_len] = '\0'; #if ACDEBUG(AC_ALL) - SERIAL_ECHOLNPGM("len(",command_len,") < ", panel_command); + DEBUG_ECHOLNPGM("len(",command_len,") < ", panel_command); #endif command_ready = true; } return command_ready; } -int8_t ChironTFT::FindToken(char c) { +int8_t ChironTFT::findToken(char c) { for (int8_t pos = 0; pos < command_len; pos++) { if (panel_command[pos] == c) { #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Tpos:", pos, " ", c); + DEBUG_ECHOLNPGM("Tpos:", pos, " ", c); #endif return pos; } } #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Not found: ", c); + DEBUG_ECHOLNPGM("Not found: ", c); #endif return -1; } -void ChironTFT::CheckHeaters() { +void ChironTFT::checkHeaters() { uint8_t faultDuration = 0; // if the hotend temp is abnormal, confirm state before signalling panel @@ -382,7 +381,7 @@ void ChironTFT::CheckHeaters() { while (!WITHIN(temp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP)) { faultDuration++; if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + tftSendLn(AC_msg_nozzle_temp_abnormal); last_error = AC_error_abnormal_temp_t0; SERIAL_ECHOLNPGM("Extruder temp abnormal! : ", temp); break; @@ -397,7 +396,7 @@ void ChironTFT::CheckHeaters() { while (!WITHIN(temp, BED_MINTEMP, BED_MAXTEMP)) { faultDuration++; if (faultDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + tftSendLn(AC_msg_nozzle_temp_abnormal); last_error = AC_error_abnormal_temp_bed; SERIAL_ECHOLNPGM("Bed temp abnormal! : ", temp); break; @@ -409,7 +408,7 @@ void ChironTFT::CheckHeaters() { // Update panel with hotend heater status if (hotend_state != AC_heater_temp_reached) { if (WITHIN(getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -(TEMP_WINDOW), TEMP_WINDOW)) { - SendtoTFTLN(AC_msg_nozzle_heating_done); + tftSendLn(AC_msg_nozzle_heating_done); hotend_state = AC_heater_temp_reached; } } @@ -417,23 +416,23 @@ void ChironTFT::CheckHeaters() { // Update panel with bed heater status if (hotbed_state != AC_heater_temp_reached) { if (WITHIN(getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -(TEMP_BED_WINDOW), TEMP_BED_WINDOW)) { - SendtoTFTLN(AC_msg_bed_heating_done); + tftSendLn(AC_msg_bed_heating_done); hotbed_state = AC_heater_temp_reached; } } } -void ChironTFT::SendFileList(int8_t startindex) { +void ChironTFT::sendFileList(int8_t startindex) { // Respond to panel request for 4 files starting at index #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("## SendFileList ## ", startindex); + DEBUG_ECHOLNPGM("## sendFileList ## ", startindex); #endif - SendtoTFTLN(F("FN ")); + tftSendLn(F("FN ")); filenavigator.getFiles(startindex, panel_type, 4); - SendtoTFTLN(F("END")); + tftSendLn(F("END")); } -void ChironTFT::SelectFile() { +void ChironTFT::selectFile() { if (panel_type <= AC_panel_new) { strncpy(selectedfile, panel_command + 4, command_len - 3); selectedfile[command_len - 4] = '\0'; @@ -443,64 +442,64 @@ void ChironTFT::SelectFile() { selectedfile[command_len - 5] = '\0'; } #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPGM(" Selected File: ",selectedfile); + DEBUG_ECHOLNPGM(" Selected File: ", selectedfile); #endif switch (selectedfile[0]) { case '/': // Valid file selected - SendtoTFTLN(AC_msg_sd_file_open_success); + tftSendLn(AC_msg_sd_file_open_success); break; case '<': // .. (go up folder level) filenavigator.upDIR(); - SendtoTFTLN(AC_msg_sd_file_open_failed); - SendFileList( 0 ); + tftSendLn(AC_msg_sd_file_open_failed); + sendFileList( 0 ); break; default: // enter sub folder // for new panel remove the '.GCO' tag that was added to the end of the path if (panel_type <= AC_panel_new) selectedfile[strlen(selectedfile) - 4] = '\0'; filenavigator.changeDIR(selectedfile); - SendtoTFTLN(AC_msg_sd_file_open_failed); - SendFileList( 0 ); + tftSendLn(AC_msg_sd_file_open_failed); + sendFileList( 0 ); break; } } -void ChironTFT::ProcessPanelRequest() { +void ChironTFT::processPanelRequest() { // Break these up into logical blocks // as its easier to navigate than one huge switch case! - int8_t tpos = FindToken('A'); + int8_t tpos = findToken('A'); // Panel request are 'A0' - 'A36' if (tpos >= 0) { const int8_t req = atoi(&panel_command[tpos + 1]); // Information requests A0 - A8 and A33 - if (req <= 8 || req == 33) PanelInfo(req); + if (req <= 8 || req == 33) panelInfo(req); // Simple Actions A9 - A28 - else if (req <= 28) PanelAction(req); + else if (req <= 28) panelAction(req); // Process Initiation - else if (req <= 36) PanelProcess(req); + else if (req <= 36) panelProcess(req); } else { #if AUTO_DETECT_CHIRON_TFT // This may be a response to a panel type detection query if (panel_type == AC_panel_unknown) { - tpos = FindToken('S'); // old panel will respond to 'SIZE' with 'SXY 480 320' + tpos = findToken('S'); // old panel will respond to 'SIZE' with 'SXY 480 320' if (tpos >= 0) { if (panel_command[tpos + 1] == 'X' && panel_command[tpos + 2] =='Y') { panel_type = AC_panel_standard; - SERIAL_ECHOLNF(AC_msg_old_panel_detected); + SERIAL_ECHOLN(AC_msg_old_panel_detected); } } else { // new panel will respond to 'J200' with '[0]=0' // it seems only after a power cycle so detection assumes a new panel - tpos = FindToken('['); + tpos = findToken('['); if (tpos >= 0) { if (panel_command[tpos + 1] == '0' && panel_command[tpos + 2] ==']') { panel_type = AC_panel_new; - SERIAL_ECHOLNF(AC_msg_new_panel_detected); + SERIAL_ECHOLN(AC_msg_new_panel_detected); } } } @@ -508,94 +507,94 @@ void ChironTFT::ProcessPanelRequest() { } #endif - SendtoTFTLN(); // Ignore unknown requests + tftSendLn(); // Ignore unknown requests } } -void ChironTFT::PanelInfo(uint8_t req) { +void ChironTFT::panelInfo(uint8_t req) { // information requests A0-A8 and A33 switch (req) { case 0: // A0 Get HOTEND Temp - SendtoTFT(F("A0V ")); + tftSend(F("A0V ")); TFTSer.println(getActualTemp_celsius(E0)); break; case 1: // A1 Get HOTEND Target Temp - SendtoTFT(F("A1V ")); + tftSend(F("A1V ")); TFTSer.println(getTargetTemp_celsius(E0)); break; case 2: // A2 Get BED Temp - SendtoTFT(F("A2V ")); + tftSend(F("A2V ")); TFTSer.println(getActualTemp_celsius(BED)); break; case 3: // A3 Get BED Target Temp - SendtoTFT(F("A3V ")); + tftSend(F("A3V ")); TFTSer.println(getTargetTemp_celsius(BED)); break; case 4: // A4 Get FAN Speed - SendtoTFT(F("A4V ")); + tftSend(F("A4V ")); TFTSer.println(getActualFan_percent(FAN0)); break; case 5: // A5 Get Current Coordinates - SendtoTFT(F("A5V X: ")); + tftSend(F("A5V X: ")); TFTSer.print(getAxisPosition_mm(X)); - SendtoTFT(F(" Y: ")); + tftSend(F(" Y: ")); TFTSer.print(getAxisPosition_mm(Y)); - SendtoTFT(F(" Z: ")); + tftSend(F(" Z: ")); TFTSer.println(getAxisPosition_mm(Z)); break; case 6: // A6 Get printing progress if (isPrintingFromMedia()) { - SendtoTFT(F("A6V ")); + tftSend(F("A6V ")); TFTSer.println(ui8tostr2(getProgress_percent())); } else - SendtoTFTLN(F("A6V ---")); + tftSendLn(F("A6V ---")); break; case 7: { // A7 Get Printing Time uint32_t time = getProgress_seconds_elapsed() / 60; - SendtoTFT(F("A7V ")); + tftSend(F("A7V ")); TFTSer.print(ui8tostr2(time / 60)); - SendtoTFT(F(" H ")); + tftSend(F(" H ")); TFTSer.print(ui8tostr2(time % 60)); - SendtoTFT(F(" M")); + tftSend(F(" M")); #if ACDEBUG(AC_ALL) - SERIAL_ECHOLNPGM("Print time ", ui8tostr2(time / 60), ":", ui8tostr2(time % 60)); + DEBUG_ECHOLNPGM("Print time ", ui8tostr2(time / 60), ":", ui8tostr2(time % 60)); #endif } break; case 8: // A8 Get SD Card list A8 S0 if (!isMediaInserted()) safe_delay(500); if (!isMediaInserted()) // Make sure the card is removed - SendtoTFTLN(AC_msg_no_sd_card); + tftSendLn(AC_msg_no_sd_card); else if (panel_command[3] == 'S') - SendFileList( atoi( &panel_command[4] ) ); + sendFileList( atoi( &panel_command[4] ) ); break; case 33: // A33 Get firmware info - SendtoTFT(F("J33 ")); + tftSend(F("J33 ")); // If there is an error recorded, show that instead of the FW version - if (!GetLastError()) SendtoTFTLN(F(SHORT_BUILD_VERSION)); + if (!getLastError()) tftSendLn(F(SHORT_BUILD_VERSION)); break; } } -void ChironTFT::PanelAction(uint8_t req) { +void ChironTFT::panelAction(uint8_t req) { switch (req) { case 9: // A9 Pause SD print if (isPrintingFromMedia()) { - SendtoTFTLN(AC_msg_pause); + tftSendLn(AC_msg_pause); pausePrint(); printer_state = AC_printer_pausing; } else - SendtoTFTLN(AC_msg_stop); + tftSendLn(AC_msg_stop); break; case 10: // A10 Resume SD Print @@ -613,7 +612,7 @@ void ChironTFT::PanelAction(uint8_t req) { else { if (printer_state == AC_printer_resuming_from_power_outage) injectCommands(F("M1000 C")); // Cancel recovery - SendtoTFTLN(AC_msg_stop); + tftSendLn(AC_msg_stop); printer_state = AC_printer_idle; } break; @@ -623,7 +622,7 @@ void ChironTFT::PanelAction(uint8_t req) { break; case 13: // A13 Select file - SelectFile(); + selectFile(); break; case 14: // A14 Start Printing @@ -632,11 +631,9 @@ void ChironTFT::PanelAction(uint8_t req) { injectCommands(F("M1000 C")); // Cancel recovery printer_state = AC_printer_idle; } - #if ACDebugLevel >= 1 - SERIAL_ECHOLNPGM("Print: ", selectedfile); - #endif + DEBUG_ECHOLNPGM("Print: ", selectedfile); printFile(selectedfile); - SendtoTFTLN(AC_msg_print_from_sd_card); + tftSendLn(AC_msg_print_from_sd_card); break; case 15: // A15 Resuming from outage @@ -671,7 +668,7 @@ void ChironTFT::PanelAction(uint8_t req) { case 19: // A19 Motors off if (!isPrinting()) { stepper.disable_all_steppers(); - SendtoTFTLN(AC_msg_ready); + tftSendLn(AC_msg_ready); } break; @@ -679,7 +676,7 @@ void ChironTFT::PanelAction(uint8_t req) { if (panel_command[4] == 'S') setFeedrate_percent(atoi(&panel_command[5])); else { - SendtoTFT(F("A20V ")); + tftSend(F("A20V ")); TFTSer.println(getFeedrate_percent()); } break; @@ -707,7 +704,7 @@ void ChironTFT::PanelAction(uint8_t req) { char MoveCmnd[30]; sprintf_P(MoveCmnd, PSTR("G91\nG0%s\nG90"), panel_command + 3); #if ACDEBUG(AC_ACTION) - SERIAL_ECHOLNPGM("Move: ", MoveCmnd); + DEBUG_ECHOLNPGM("Move: ", MoveCmnd); #endif setSoftEndstopState(true); // enable endstops injectCommands(MoveCmnd); @@ -720,7 +717,7 @@ void ChironTFT::PanelAction(uint8_t req) { // Temps defined in configuration.h setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, E0); - SendtoTFTLN(); + tftSendLn(); hotbed_state = AC_heater_temp_set; hotend_state = AC_heater_temp_set; } @@ -731,7 +728,7 @@ void ChironTFT::PanelAction(uint8_t req) { if (!isPrinting()) { setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, E0); - SendtoTFTLN(); + tftSendLn(); hotbed_state = AC_heater_temp_set; hotend_state = AC_heater_temp_set; } @@ -742,7 +739,7 @@ void ChironTFT::PanelAction(uint8_t req) { if (!isPrinting()) { setTargetTemp_celsius(0, E0); setTargetTemp_celsius(0, BED); - SendtoTFTLN(AC_msg_ready); + tftSendLn(AC_msg_ready); hotbed_state = AC_heater_off; hotend_state = AC_heater_off; } @@ -761,21 +758,21 @@ void ChironTFT::PanelAction(uint8_t req) { case 28: // A28 Filament set A28 O/C // Ignore request if printing if (isPrinting()) break; - SendtoTFTLN(); + tftSendLn(); break; } } -void ChironTFT::PanelProcess(uint8_t req) { +void ChironTFT::panelProcess(uint8_t req) { switch (req) { case 29: { // A29 Read Mesh Point A29 X1 Y1 xy_uint8_t pos; float pos_z; - pos.x = atoi(&panel_command[FindToken('X')+1]); - pos.y = atoi(&panel_command[FindToken('Y')+1]); + pos.x = atoi(&panel_command[findToken('X')+1]); + pos.y = atoi(&panel_command[findToken('Y')+1]); pos_z = getMeshPoint(pos); - SendtoTFT(F("A29V ")); + tftSend(F("A29V ")); TFTSer.println(pos_z * 100); if (!isPrinting()) { setSoftEndstopState(true); // disable endstops @@ -786,7 +783,7 @@ void ChironTFT::PanelProcess(uint8_t req) { if (isPositionKnown()) { #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Moving to mesh point at x: ", pos.x, " y: ", pos.y, " z: ", pos_z); + DEBUG_ECHOLNPGM("Moving to mesh point at x: ", pos.x, " y: ", pos.y, " z: ", pos_z); #endif // Go up before moving setAxisPosition_mm(3.0,Z); @@ -795,7 +792,7 @@ void ChironTFT::PanelProcess(uint8_t req) { setAxisPosition_mm(20 + (93 * pos.y), Y); setAxisPosition_mm(0.0, Z); #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Current Z: ", getAxisPosition_mm(Z)); + DEBUG_ECHOLNPGM("Current Z: ", getAxisPosition_mm(Z)); #endif } } @@ -805,42 +802,42 @@ void ChironTFT::PanelProcess(uint8_t req) { } break; case 30: // A30 Auto leveling - if (FindToken('S') >= 0) { // Start probing New panel adds spaces.. + if (findToken('S') >= 0) { // Start probing New panel adds spaces.. // Ignore request if printing if (isPrinting()) - SendtoTFTLN(AC_msg_probing_not_allowed); // forbid auto leveling + tftSendLn(AC_msg_probing_not_allowed); // forbid auto leveling else { - SendtoTFTLN(AC_msg_start_probing); + tftSendLn(AC_msg_start_probing); injectCommands(F("G28\nG29")); printer_state = AC_printer_probing; } } else - SendtoTFTLN(AC_msg_start_probing); // Just enter levelling menu + tftSendLn(AC_msg_start_probing); // Just enter levelling menu break; case 31: // A31 Adjust all Probe Points // The tokens can occur in different places on the new panel so we need to find it. - if (FindToken('C') >= 0) { // Restore and apply original offsets + if (findToken('C') >= 0) { // Restore and apply original offsets if (!isPrinting()) { injectCommands(F("M501\nM420 S1")); selectedmeshpoint.x = selectedmeshpoint.y = 99; - SERIAL_ECHOLNF(AC_msg_mesh_changes_abandoned); + SERIAL_ECHOLN(AC_msg_mesh_changes_abandoned); } } - else if (FindToken('D') >= 0) { // Save Z Offset tables and restore leveling state + else if (findToken('D') >= 0) { // Save Z Offset tables and restore leveling state if (!isPrinting()) { setAxisPosition_mm(1.0,Z); // Lift nozzle before any further movements are made injectCommands(F("M500")); - SERIAL_ECHOLNF(AC_msg_mesh_changes_saved); + SERIAL_ECHOLN(AC_msg_mesh_changes_saved); selectedmeshpoint.x = selectedmeshpoint.y = 99; } } - else if (FindToken('G') >= 0) { // Get current offset - SendtoTFT(F("A31V ")); + else if (findToken('G') >= 0) { // Get current offset + tftSend(F("A31V ")); // When printing use the live z Offset position // we will use babystepping to move the print head if (isPrinting()) @@ -852,7 +849,7 @@ void ChironTFT::PanelProcess(uint8_t req) { } else { - int8_t tokenpos = FindToken('S'); + int8_t tokenpos = findToken('S'); if (tokenpos >= 0) { // Set offset (adjusts all points by value) float Zshift = atof(&panel_command[tokenpos+1]); setSoftEndstopState(false); // disable endstops @@ -860,22 +857,22 @@ void ChironTFT::PanelProcess(uint8_t req) { // From the leveling panel use the all points UI to adjust the print pos. if (isPrinting()) { #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift); + DEBUG_ECHOLNPGM("Change Zoffset from:", live_Zoffset, " to ", live_Zoffset + Zshift); #endif if (isAxisPositionKnown(Z)) { #if ACDEBUG(AC_INFO) const float currZpos = getAxisPosition_mm(Z); - SERIAL_ECHOLNPGM("Nudge Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); + DEBUG_ECHOLNPGM("Nudge Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); #endif // Use babystepping to adjust the head position int16_t steps = mmToWholeSteps(constrain(Zshift,-0.05,0.05), Z); #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Steps to move Z: ", steps); + DEBUG_ECHOLNPGM("Steps to move Z: ", steps); #endif babystepAxis_steps(steps, Z); live_Zoffset += Zshift; } - SendtoTFT(F("A31V ")); + tftSend(F("A31V ")); TFTSer.println(live_Zoffset); } else { @@ -884,23 +881,23 @@ void ChironTFT::PanelProcess(uint8_t req) { const float currval = getMeshPoint(pos); setMeshPoint(pos, constrain(currval + Zshift, AC_LOWEST_MESHPOINT_VAL, 2)); #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Change mesh point X", x," Y",y ," from ", currval, " to ", getMeshPoint(pos) ); + DEBUG_ECHOLNPGM("Change mesh point X", x," Y",y ," from ", currval, " to ", getMeshPoint(pos) ); #endif } const float currZOffset = getZOffset_mm(); #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Change probe offset from ", currZOffset, " to ", currZOffset + Zshift); + DEBUG_ECHOLNPGM("Change probe offset from ", currZOffset, " to ", currZOffset + Zshift); #endif setZOffset_mm(currZOffset + Zshift); - SendtoTFT(F("A31V ")); + tftSend(F("A31V ")); TFTSer.println(getZOffset_mm()); if (isAxisPositionKnown(Z)) { // Move Z axis const float currZpos = getAxisPosition_mm(Z); #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Move Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); + DEBUG_ECHOLNPGM("Move Z pos from ", currZpos, " to ", currZpos + constrain(Zshift, -0.05, 0.05)); #endif setAxisPosition_mm(currZpos+constrain(Zshift,-0.05,0.05),Z); } @@ -916,7 +913,7 @@ void ChironTFT::PanelProcess(uint8_t req) { //TFTSer.println(); break; - // A33 firmware info request see PanelInfo() + // A33 firmware info request see panelInfo() case 34: // A34 Adjust single mesh point A34 C/S X1 Y1 V123 if (panel_command[3] == 'C') { // Restore original offsets @@ -932,8 +929,8 @@ void ChironTFT::PanelProcess(uint8_t req) { float currmesh = getMeshPoint(pos); float newval = atof(&panel_command[11])/100; #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Change mesh point x:", pos.x, " y:", pos.y); - SERIAL_ECHOLNPGM("from ", currmesh, " to ", newval); + DEBUG_ECHOLNPGM("Change mesh point x:", pos.x, " y:", pos.y); + DEBUG_ECHOLNPGM("from ", currmesh, " to ", newval); #endif // Update Meshpoint setMeshPoint(pos,newval); @@ -944,7 +941,7 @@ void ChironTFT::PanelProcess(uint8_t req) { setSoftEndstopState(false); float currZpos = getAxisPosition_mm(Z); #if ACDEBUG(AC_INFO) - SERIAL_ECHOLNPGM("Move Z pos from ", currZpos, " to ", currZpos + constrain(newval - currmesh, -0.05, 0.05)); + DEBUG_ECHOLNPGM("Move Z pos from ", currZpos, " to ", currZpos + constrain(newval - currmesh, -0.05, 0.05)); #endif setAxisPosition_mm(currZpos + constrain(newval - currmesh, -0.05, 0.05), Z); } @@ -953,19 +950,19 @@ void ChironTFT::PanelProcess(uint8_t req) { break; case 36: // A36 Auto leveling for new TFT bet that was a typo in the panel code! - SendtoTFTLN(AC_msg_start_probing); + tftSendLn(AC_msg_start_probing); break; } } -bool ChironTFT::GetLastError() { +bool ChironTFT::getLastError() { switch (last_error) { - case AC_error_abnormal_temp_bed: SendtoTFTLN(AC_msg_error_bed_temp); break; - case AC_error_abnormal_temp_t0: SendtoTFTLN(AC_msg_error_hotend_temp); break; - case AC_error_noSD: SendtoTFTLN(AC_msg_error_sd_card); break; - case AC_error_powerloss: SendtoTFTLN(AC_msg_power_loss); break; - case AC_error_EEPROM: SendtoTFTLN(AC_msg_eeprom_version); break; - case AC_error_filament_runout: SendtoTFTLN(AC_msg_filament_out); break; + case AC_error_abnormal_temp_bed: tftSendLn(AC_msg_error_bed_temp); break; + case AC_error_abnormal_temp_t0: tftSendLn(AC_msg_error_hotend_temp); break; + case AC_error_noSD: tftSendLn(AC_msg_error_sd_card); break; + case AC_error_powerloss: tftSendLn(AC_msg_power_loss); break; + case AC_error_EEPROM: tftSendLn(AC_msg_eeprom_version); break; + case AC_error_filament_runout: tftSendLn(AC_msg_filament_out); break; default: return false; } last_error = AC_error_none; diff --git a/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.h index e0517ec640..25b8145b13 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.h +++ b/Marlin/src/lcd/extui/anycubic_chiron/chiron_tft.h @@ -57,32 +57,32 @@ class ChironTFT { static float live_Zoffset; static file_menu_t file_menu; public: - static void Startup(); - static void IdleLoop(); - static void PrinterKilled(FSTR_P, FSTR_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(); - static void PrintComplete(); - static void SendtoTFT(FSTR_P const=nullptr); - static void SendtoTFTLN(FSTR_P const=nullptr); + static void startup(); + static void idleLoop(); + static void printerKilled(FSTR_P, FSTR_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(); + static void printComplete(); + static void tftSend(FSTR_P const=nullptr); + static void tftSendLn(FSTR_P const=nullptr); private: - static void DetectPanelType(); - static bool ReadTFTCommand(); - static int8_t FindToken(char); - static void CheckHeaters(); - static void SendFileList(int8_t); - static void SelectFile(); - static void ProcessPanelRequest(); - static void PanelInfo(uint8_t); - static void PanelAction(uint8_t); - static void PanelProcess(uint8_t); - static bool GetLastError(); + static void detectPanelType(); + static bool readTFTCommand(); + static int8_t findToken(char); + static void checkHeaters(); + static void sendFileList(int8_t); + static void selectFile(); + static void processPanelRequest(); + static void panelInfo(uint8_t); + static void panelAction(uint8_t); + static void panelProcess(uint8_t); + static bool getLastError(); }; -extern ChironTFT Chiron; +extern ChironTFT chiron; } // Anycubic namespace diff --git a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp index a2ad678ac6..2bd2a458b8 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_extui.cpp @@ -35,20 +35,20 @@ namespace ExtUI { - void onStartup() { AnycubicTFT.OnSetup(); } - void onIdle() { AnycubicTFT.OnCommandScan(); } - void onPrinterKilled(FSTR_P const error, FSTR_P const component) { AnycubicTFT.OnKillTFT(); } - void onMediaInserted() { AnycubicTFT.OnSDCardStateChange(true); } - void onMediaError() { AnycubicTFT.OnSDCardError(); } - void onMediaRemoved() { AnycubicTFT.OnSDCardStateChange(false); } + void onStartup() { anycubicTFT.onSetup(); } + void onIdle() { anycubicTFT.onCommandScan(); } + void onPrinterKilled(FSTR_P const error, FSTR_P const component) { anycubicTFT.onKillTFT(); } + void onMediaInserted() { anycubicTFT.onSDCardStateChange(true); } + void onMediaError() { anycubicTFT.onSDCardError(); } + void onMediaRemoved() { anycubicTFT.onSDCardStateChange(false); } void onPlayTone(const uint16_t frequency, const uint16_t duration) { TERN_(SPEAKER, ::tone(BEEPER_PIN, frequency, duration)); } - void onPrintTimerStarted() { AnycubicTFT.OnPrintTimerStarted(); } - void onPrintTimerPaused() { AnycubicTFT.OnPrintTimerPaused(); } - void onPrintTimerStopped() { AnycubicTFT.OnPrintTimerStopped(); } - void onFilamentRunout(const extruder_t extruder) { AnycubicTFT.OnFilamentRunout(); } - void onUserConfirmRequired(const char * const msg) { AnycubicTFT.OnUserConfirmRequired(msg); } + void onPrintTimerStarted() { anycubicTFT.onPrintTimerStarted(); } + void onPrintTimerPaused() { anycubicTFT.onPrintTimerPaused(); } + void onPrintTimerStopped() { anycubicTFT.onPrintTimerStopped(); } + void onFilamentRunout(const extruder_t extruder) { anycubicTFT.onFilamentRunout(); } + void onUserConfirmRequired(const char * const msg) { anycubicTFT.onUserConfirmRequired(msg); } void onStatusChanged(const char * const msg) {} void onHomingStart() {} @@ -91,11 +91,12 @@ namespace ExtUI { // whether successful or not. } - #if HAS_MESH - + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #endif + #if HAS_MESH 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/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 36b24861fe..8b073652b0 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -24,6 +24,8 @@ #if ENABLED(ANYCUBIC_LCD_I3MEGA) //#define ANYCUBIC_LCD_DEBUG +#define DEBUG_OUT ENABLED(ANYCUBIC_LCD_DEBUG) +#include "../../../core/debug_out.h" #include "anycubic_i3mega_lcd.h" #include "../ui_api.h" @@ -40,13 +42,8 @@ #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) do{ sendLine_P(PSTR(x)); SERIAL_ECHOLNPGM(y); }while(0) - #define SENDLINE_DBG_PGM_VAL(x,y,z) do{ sendLine_P(PSTR(x)); SERIAL_ECHOLNPGM(y, z); }while(0) -#else - #define SENDLINE_DBG_PGM(x,y) sendLine_P(PSTR(x)) - #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) -#endif +#define SENDLINE_DBG_PGM(x,y) do{ sendLine_P(PSTR(x)); DEBUG_ECHOLNPGM(y); }while(0) +#define SENDLINE_DBG_PGM_VAL(x,y,z) do{ sendLine_P(PSTR(x)); DEBUG_ECHOLNPGM(y, z); }while(0) // Append ".gcode" to filename, if requested. Used for some DGUS-clone displays with built-in filter. // Filenames are limited to 26 characters, so the actual name for the FILENAME can be 20 characters at most. @@ -54,21 +51,19 @@ #define SPECIAL_MENU_FILENAME(A) A TERN_(ANYCUBIC_LCD_GCODE_EXT, ".gcode") #define SPECIAL_MENU_ALTNAME(A, B) TERN(ANYCUBIC_LCD_GCODE_EXT, A ".gcode", B) -AnycubicTFTClass AnycubicTFT; +AnycubicTFT anycubicTFT; -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; +char AnycubicTFT::tftCommands[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; +int AnycubicTFT::tftBufLen = 0, + AnycubicTFT::tftBufIndR = 0, + AnycubicTFT::tftBufIndW = 0; +char* AnycubicTFT::tftStrchrPtr; +uint8_t AnycubicTFT::specialMenu = false; +AnycubicMediaPrintState AnycubicTFT::mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; +AnycubicMediaPauseState AnycubicTFT::mediaPauseState = AMPAUSESTATE_NOT_PAUSED; -char AnycubicTFTClass::SelectedDirectory[30]; -char AnycubicTFTClass::SelectedFile[FILENAME_LENGTH]; +char AnycubicTFT::selectedDirectory[30]; +char AnycubicTFT::selectedFile[FILENAME_LENGTH]; // Serial helpers static void sendNewLine() { LCD_SERIAL.write('\r'); LCD_SERIAL.write('\n'); } @@ -82,9 +77,9 @@ static void sendLine_P(PGM_P str) { send_P(str); sendNewLine(); } using namespace ExtUI; -AnycubicTFTClass::AnycubicTFTClass() {} +AnycubicTFT::AnycubicTFT() {} -void AnycubicTFTClass::OnSetup() { +void AnycubicTFT::onSetup() { #ifndef LCD_BAUDRATE #define LCD_BAUDRATE 115200 #endif @@ -94,9 +89,6 @@ void AnycubicTFTClass::OnSetup() { delay_ms(10); // Init the state of the key pins running on the TFT - #if BOTH(HAS_MEDIA, HAS_SD_DETECT) - SET_INPUT_PULLUP(SD_DETECT_PIN); - #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) SET_INPUT_PULLUP(FIL_RUNOUT1_PIN); #endif @@ -104,30 +96,26 @@ void AnycubicTFTClass::OnSetup() { mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - // DoSDCardStateCheck(); + // doSDCardStateCheck(); SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready delay_ms(10); - DoFilamentRunoutCheck(); - SelectedFile[0] = 0; + doFilamentRunoutCheck(); + selectedFile[0] = 0; #if ENABLED(STARTUP_CHIME) injectCommands(F("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"); - #endif + DEBUG_ECHOLNPGM("TFT Serial Debug: Finished startup"); } -void AnycubicTFTClass::OnCommandScan() { +void AnycubicTFT::onCommandScan() { static millis_t nextStopCheck = 0; // used to slow the stopped print check down to reasonable times const millis_t ms = millis(); if (ELAPSED(ms, nextStopCheck)) { nextStopCheck = ms + 1000UL; - if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); - #endif + if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && isNozzleHomed()) { + DEBUG_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; injectCommands(F("M84\nM27")); // disable stepper motors and force report of SD status @@ -137,44 +125,36 @@ void AnycubicTFTClass::OnCommandScan() { } } - if (TFTbuflen < (TFTBUFSIZE - 1)) - GetCommandFromTFT(); + if (tftBufLen < (TFTBUFSIZE) - 1) + getCommandFromTFT(); - if (TFTbuflen) { - TFTbuflen = (TFTbuflen - 1); - TFTbufindr = (TFTbufindr + 1) % TFTBUFSIZE; + if (tftBufLen) { + --tftBufLen; + tftBufIndR = (tftBufIndR + 1) % (TFTBUFSIZE); } } -void AnycubicTFTClass::OnKillTFT() { +void AnycubicTFT::onKillTFT() { SENDLINE_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); } -void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardStateChange event triggered...", isInserted); - #endif - DoSDCardStateCheck(); +void AnycubicTFT::onSDCardStateChange(bool isInserted) { + DEBUG_ECHOLNPGM("TFT Serial Debug: onSDCardStateChange event triggered...", isInserted); + doSDCardStateCheck(); } -void AnycubicTFTClass::OnSDCardError() { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); - #endif +void AnycubicTFT::onSDCardError() { + DEBUG_ECHOLNPGM("TFT Serial Debug: onSDCardError event triggered..."); SENDLINE_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); } -void AnycubicTFTClass::OnFilamentRunout() { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); - #endif - DoFilamentRunoutCheck(); +void AnycubicTFT::onFilamentRunout() { + DEBUG_ECHOLNPGM("TFT Serial Debug: onFilamentRunout triggered..."); + doFilamentRunoutCheck(); } -void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: OnUserConfirmRequired triggered... ", msg); - #endif +void AnycubicTFT::onUserConfirmRequired(const char * const msg) { + DEBUG_ECHOLNPGM("TFT Serial Debug: onUserConfirmRequired triggered... ", msg); #if HAS_MEDIA /** @@ -225,190 +205,188 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { #endif } -float AnycubicTFTClass::CodeValue() { - return (strtod(&TFTcmdbuffer[TFTbufindr][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindr] + 1], nullptr)); +float AnycubicTFT::codeValue() { + return (strtod(&tftCommands[tftBufIndR][tftStrchrPtr - tftCommands[tftBufIndR] + 1], nullptr)); } -bool AnycubicTFTClass::CodeSeen(char code) { - TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindr], code); - return !!TFTstrchr_pointer; // Return True if a character was found +bool AnycubicTFT::codeSeen(char code) { + tftStrchrPtr = strchr(tftCommands[tftBufIndR], code); + return !!tftStrchrPtr; // Return True if a character was found } -bool AnycubicTFTClass::IsNozzleHomed() { +bool AnycubicTFT::isNozzleHomed() { 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); } -void AnycubicTFTClass::HandleSpecialMenu() { +void AnycubicTFT::handleSpecialMenu() { /** * NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. */ - if (SelectedDirectory[0] == '<') { - switch (SelectedDirectory[1]) { - case 'e': // "" - SpecialMenu = false; - return; + if (selectedDirectory[0] != '<') { + DEBUG_ECHOLNPGM("TFT Serial Debug: Attempted to handleSpecialMenu on non-special menu... ", selectedDirectory); + return; + } + + switch (selectedDirectory[1]) { + default: break; + + case 'e': specialMenu = false; return; // "" + + #if ENABLED(PROBE_MANUALLY) + + case '0': + switch (selectedDirectory[2]) { + default: break; + + case '1': // "<01ZUp0.1>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Z Up 0.1")); + injectCommands(F("G91\nG1 Z+0.1\nG90")); + break; + + case '2': // "<02ZUp0.02>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Z Up 0.02")); + injectCommands(F("G91\nG1 Z+0.02\nG90")); + break; + + case '3': // "<03ZDn0.02>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Z Down 0.02")); + injectCommands(F("G91\nG1 Z-0.02\nG90")); + break; + + case '4': // "<04ZDn0.1>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Z Down 0.1")); + injectCommands(F("G91\nG1 Z-0.1\nG90")); + break; + + case '5': // "<05PrehtBed>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Preheat Bed")); + injectCommands(F("M140 S65")); + break; + + case '6': // "<06SMeshLvl>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Start Mesh Leveling")); + injectCommands(F("G29S1")); + break; + + case '7': // "<07MeshNPnt>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Next Mesh Point")); + injectCommands(F("G29S2")); + break; + + case '8': // "<08HtEndPID>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Tune Hotend PID")); + // need to dwell for half a second to give the fan a chance to start before the pid tuning starts + injectCommands(F("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + break; + + case '9': // "<09HtBedPID>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Tune Hotbed Pid")); + injectCommands(F("M303 E-1 S65 C6 U1")); + break; + } break; - #if ENABLED(PROBE_MANUALLY) - case '0': - switch (SelectedDirectory[2]) { - case '1': // "<01ZUp0.1>" - SERIAL_ECHOLNPGM("Special Menu: Z Up 0.1"); - injectCommands(F("G91\nG1 Z+0.1\nG90")); - break; + case '1': + switch (selectedDirectory[2]) { + default: break; - case '2': // "<02ZUp0.02>" - SERIAL_ECHOLNPGM("Special Menu: Z Up 0.02"); - injectCommands(F("G91\nG1 Z+0.02\nG90")); - break; - - case '3': // "<03ZDn0.02>" - SERIAL_ECHOLNPGM("Special Menu: Z Down 0.02"); - injectCommands(F("G91\nG1 Z-0.02\nG90")); - break; - - case '4': // "<04ZDn0.1>" - SERIAL_ECHOLNPGM("Special Menu: Z Down 0.1"); - injectCommands(F("G91\nG1 Z-0.1\nG90")); - break; - - case '5': // "<05PrehtBed>" - SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - injectCommands(F("M140 S65")); - break; - - case '6': // "<06SMeshLvl>" - SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); - injectCommands(F("G29S1")); - break; - - case '7': // "<07MeshNPnt>" - SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); - injectCommands(F("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 - injectCommands(F("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); - break; - - case '9': // "<09HtBedPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - injectCommands(F("M303 E-1 S65 C6 U1")); - break; - - default: - break; - } + case '0': // "<10FWDeflts>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Load FW Defaults")); + injectCommands(F("M502\nM300 P105 S1661\nM300 P210 S1108")); break; - case '1': - switch (SelectedDirectory[2]) { - case '0': // "<10FWDeflts>" - SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - injectCommands(F("M502\nM300 P105 S1661\nM300 P210 S1108")); - break; - - case '1': // "<11SvEEPROM>" - SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - injectCommands(F("M500\nM300 P105 S1108\nM300 P210 S1661")); - break; - - default: - break; - } + case '1': // "<11SvEEPROM>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Save EEPROM")); + injectCommands(F("M500\nM300 P105 S1108\nM300 P210 S1661")); break; - #else // if ENABLED(PROBE_MANUALLY) - case '0': - switch (SelectedDirectory[2]) { - case '1': // "<01PrehtBed>" - SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - injectCommands(F("M140 S65")); - break; + } + break; - case '2': // "<02ABL>" - SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); - injectCommands(F("G29N")); - break; + #else // !PROBE_MANUALLY - 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 - injectCommands(F("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); - break; + case '0': + switch (selectedDirectory[2]) { + default: break; - case '4': // "<04HtbedPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - injectCommands(F("M303 E-1 S65 C6 U1")); - break; - - case '5': // "<05FWDeflts>" - SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - injectCommands(F("M502\nM300 P105 S1661\nM300 P210 S1108")); - break; - - case '6': // "<06SvEEPROM>" - SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - injectCommands(F("M500\nM300 P105 S1108\nM300 P210 S1661")); - break; - - case '7': // <07SendM108> - SERIAL_ECHOLNPGM("Special Menu: Send User Confirmation"); - injectCommands(F("M108")); - break; - - default: - break; - } + case '1': // "<01PrehtBed>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Preheat Bed")); + injectCommands(F("M140 S65")); break; - #endif // PROBE_MANUALLY - default: + case '2': // "<02ABL>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Bed Leveling")); + injectCommands(F("G29N")); break; - } - #if ENABLED(ANYCUBIC_LCD_DEBUG) - } - else { - SERIAL_ECHOPGM("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); - SERIAL_ECHOLN(SelectedDirectory); - #endif + + case '3': // "<03HtendPID>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Tune Hotend PID")); + // need to dwell for half a second to give the fan a chance to start before the pid tuning starts + injectCommands(F("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + break; + + case '4': // "<04HtbedPID>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Auto Tune Hotbed Pid")); + injectCommands(F("M303 E-1 S65 C6 U1")); + break; + + case '5': // "<05FWDeflts>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Load FW Defaults")); + injectCommands(F("M502\nM300 P105 S1661\nM300 P210 S1108")); + break; + + case '6': // "<06SvEEPROM>" + SERIAL_ECHOLNPGM("Special Menu: ", F("Save EEPROM")); + injectCommands(F("M500\nM300 P105 S1108\nM300 P210 S1661")); + break; + + case '7': // <07SendM108> + SERIAL_ECHOLNPGM("Special Menu: ", F("Send User Confirmation")); + injectCommands(F("M108")); + break; + } + break; + + #endif // !PROBE_MANUALLY } + } -void AnycubicTFTClass::RenderCurrentFileList() { +void AnycubicTFT::renderCurrentFileList() { #if HAS_MEDIA uint16_t selectedNumber = 0; - SelectedDirectory[0] = 0; - SelectedFile[0] = 0; + selectedDirectory[0] = 0; + selectedFile[0] = 0; FileList currentFileList; SENDLINE_PGM("FN "); // Filelist start - if (!isMediaInserted() && !SpecialMenu) { + if (!isMediaInserted() && !specialMenu) { SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); SENDLINE_PGM("")); } else { - if (CodeSeen('S')) - selectedNumber = CodeValue(); + if (codeSeen('S')) + selectedNumber = codeValue(); - if (SpecialMenu) - RenderSpecialMenu(selectedNumber); + if (specialMenu) + renderSpecialMenu(selectedNumber); else if (selectedNumber <= currentFileList.count()) - RenderCurrentFolder(selectedNumber); + renderCurrentFolder(selectedNumber); } SENDLINE_PGM("END"); // Filelist stop #endif // HAS_MEDIA } -void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { +void AnycubicTFT::renderSpecialMenu(uint16_t selectedNumber) { + switch (selectedNumber) { + default: break; + #if ENABLED(PROBE_MANUALLY) case 0: // First Page SENDLINE_PGM("<01ZUP~1.GCO"); @@ -442,7 +420,9 @@ void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { SENDLINE_PGM("")); break; - #else + + #else // !PROBE_MANUALLY + case 0: // First Page SENDLINE_PGM("<01PRE~1.GCO"); SENDLINE_PGM(SPECIAL_MENU_FILENAME("")); @@ -465,25 +445,16 @@ void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { SENDLINE_PGM(SPECIAL_MENU_FILENAME("")); break; - #endif // PROBE_MANUALLY - - default: - break; + #endif // !PROBE_MANUALLY } } -void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { +void AnycubicTFT::renderCurrentFolder(uint16_t selectedNumber) { FileList currentFileList; - uint16_t cnt = selectedNumber; - uint16_t max_files; - uint16_t dir_files = currentFileList.count(); + const uint16_t dir_files = currentFileList.count(), + max_files = (dir_files - selectedNumber) < 4 ? dir_files : selectedNumber + 3; - if ((dir_files - selectedNumber) < 4) - max_files = dir_files; - else - max_files = selectedNumber + 3; - - for (cnt = selectedNumber; cnt <= max_files; cnt++) { + for (uint16_t cnt = selectedNumber; cnt <= max_files; cnt++) { if (cnt == 0) { // Special Entry if (currentFileList.isAtRootDir()) { SENDLINE_PGM(" 0 && TFTbuflen < TFTBUFSIZE) { - serial3_char = LCD_SERIAL.read(); - if (serial3_char == '\n' || - serial3_char == '\r' || - serial3_char == ':' || - serial3_count >= (TFT_MAX_CMD_SIZE - 1) - ) { + while (LCD_SERIAL.available() > 0 && tftBufLen < (TFTBUFSIZE)) { + char c = LCD_SERIAL.read(); + if (c != '\n' && c != '\r' && c != ':' && serial_count < (TFT_MAX_CMD_SIZE - 1)) { + tftCommands[tftBufIndW][serial_count++] = c; + continue; + } - if (!serial3_count) return; // if empty line + if (!serial_count) return; // if empty line - TFTcmdbuffer[TFTbufindw][serial3_count] = 0; // terminate string + tftCommands[tftBufIndW][serial_count] = 0; // terminate string - if ((strchr(TFTcmdbuffer[TFTbufindw], 'A') != nullptr)) { - int16_t a_command; - TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); - a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], nullptr)))); + if ((strchr(tftCommands[tftBufIndW], 'A') != nullptr)) { + int16_t a_command; + tftStrchrPtr = strchr(tftCommands[tftBufIndW], 'A'); + a_command = ((int)((strtod(&tftCommands[tftBufIndW][tftStrchrPtr - tftCommands[tftBufIndW] + 1], nullptr)))); - #if ENABLED(ANYCUBIC_LCD_DEBUG) - if ((a_command > 7) && (a_command != 20)) // No debugging of status polls, please! - SERIAL_ECHOLNPGM("TFT Serial Command: ", TFTcmdbuffer[TFTbufindw]); - #endif - - switch (a_command) { - case 0: { // A0 GET HOTEND TEMP - const celsius_float_t hotendActualTemp = getActualTemp_celsius(E0); - SEND_PGM_VAL("A0V ", ROUND(hotendActualTemp)); - } - break; - - case 1: { // A1 GET HOTEND TARGET TEMP - const celsius_float_t hotendTargetTemp = getTargetTemp_celsius(E0); - SEND_PGM_VAL("A1V ", ROUND(hotendTargetTemp)); - } - break; - - case 2: { // A2 GET HOTBED TEMP - const celsius_float_t heatedBedActualTemp = getActualTemp_celsius(BED); - SEND_PGM_VAL("A2V ", ROUND(heatedBedActualTemp)); - } - break; - - case 3: { // A3 GET HOTBED TARGET TEMP - const celsius_float_t heatedBedTargetTemp = getTargetTemp_celsius(BED); - SEND_PGM_VAL("A3V ", ROUND(heatedBedTargetTemp)); - } break; - - case 4: { // A4 GET FAN SPEED - SEND_PGM_VAL("A4V ", int(getActualFan_percent(FAN0))); - } break; - - case 5: { // A5 GET CURRENT COORDINATE - 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); - SENDLINE_PGM(""); - } break; - - case 6: // A6 GET SD CARD PRINTING STATUS - #if HAS_MEDIA - if (isPrintingFromMedia()) { - SEND_PGM("A6V "); - if (isMediaInserted()) - SENDLINE(ui8tostr3rj(getProgress_percent())); - else - SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); - } - else - SENDLINE_PGM("A6V ---"); - #endif - break; - - case 7: { // A7 GET PRINTING TIME - const uint32_t elapsedSeconds = getProgress_seconds_elapsed(); - SEND_PGM("A7V "); - if (elapsedSeconds != 0) { // print time - const uint32_t elapsedMinutes = elapsedSeconds / 60; - SEND(ui8tostr2(elapsedMinutes / 60)); - SEND_PGM(" H "); - SEND(ui8tostr2(elapsedMinutes % 60)); - SENDLINE_PGM(" M"); - } - else - SENDLINE_PGM(" 999:999"); - } - break; - - case 8: // A8 GET SD LIST - #if HAS_MEDIA - SelectedFile[0] = 0; - RenderCurrentFileList(); - #endif - break; - - case 9: // A9 pause sd print - #if HAS_MEDIA - if (isPrintingFromMedia()) - PausePrint(); - #endif - break; - - case 10: // A10 resume sd print - #if HAS_MEDIA - if (isPrintingFromMediaPaused()) - ResumePrint(); - #endif - break; - - case 11: // A11 STOP SD PRINT - TERN_(HAS_MEDIA, StopPrint()); - break; - - case 12: // A12 kill - kill(F(STR_ERR_KILLED)); - break; - - case 13: // A13 SELECTION FILE - #if HAS_MEDIA - if (isMediaInserted()) { - starpos = (strchr(TFTstrchr_pointer + 4, '*')); - if (TFTstrchr_pointer[4] == '/') { - strcpy(SelectedDirectory, TFTstrchr_pointer + 5); - SelectedFile[0] = 0; - SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected - SENDLINE_PGM(""); - } - else if (TFTstrchr_pointer[4] == '<') { - strcpy(SelectedDirectory, TFTstrchr_pointer + 4); - SpecialMenu = true; - SelectedFile[0] = 0; - SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected - SENDLINE_PGM(""); - } - else { - SelectedDirectory[0] = 0; - - if (starpos) *(starpos - 1) = '\0'; - - strcpy(SelectedFile, TFTstrchr_pointer + 4); - SENDLINE_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected - } - } - #endif - break; - - case 14: // A14 START PRINTING - #if HAS_MEDIA - if (!isPrinting() && strlen(SelectedFile) > 0) - StartPrint(); - #endif - break; - - case 15: // A15 RESUMING FROM OUTAGE - // TODO: JBA implement resume form outage - break; - - case 16: { // A16 set hotend temp - uint16_t tempvalue; - if (CodeSeen('S')) { - tempvalue = constrain(CodeValue(), 0, 275); - setTargetTemp_celsius(tempvalue, (extruder_t)E0); - } - else if (CodeSeen('C') && !isPrinting()) { - if (getAxisPosition_mm(Z) < 10) - injectCommands(F("G1 Z10")); // RASE Z AXIS - tempvalue = constrain(CodeValue(), 0, 275); - setTargetTemp_celsius(tempvalue, (extruder_t)E0); - } - } - break; - - case 17: { // A17 set heated bed temp - uint16_t tempbed; - if (CodeSeen('S')) { - tempbed = constrain(CodeValue(), 0, 100); - setTargetTemp_celsius(tempbed, (heater_t)BED); - } - } - break; - - case 18: { // A18 set fan speed - float fanPercent; - if (CodeSeen('S')) { - fanPercent = CodeValue(); - fanPercent = constrain(fanPercent, 0, 100); - setTargetFan_percent(fanPercent, FAN0); - } - else - fanPercent = 100; - - 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 (!isPrinting()) { - quickstop_stepper(); - stepper.disable_all_steppers(); - } - - SENDLINE_PGM(""); - break; - - case 20: // A20 read printing speed - if (CodeSeen('S')) - feedrate_percentage = constrain(CodeValue(), 40, 999); - else - SEND_PGM_VAL("A20V ", feedrate_percentage); - break; - - case 21: // A21 all home - if (!isPrinting() && !isPrintingFromMediaPaused()) { - if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { - if (CodeSeen('X')) - injectCommands(F("G28X")); - if (CodeSeen('Y')) - injectCommands(F("G28Y")); - if (CodeSeen('Z')) - injectCommands(F("G28Z")); - } - else if (CodeSeen('C')) { - injectCommands_P(G28_STR); - } - } - break; - - case 22: // A22 move X/Y/Z or extrude - if (!isPrinting()) { - float coorvalue; - uint16_t movespeed = 0; - char commandStr[30]; - char fullCommandStr[38]; - - commandStr[0] = 0; // empty string - if (CodeSeen('F')) // Set feedrate - movespeed = CodeValue(); - - if (CodeSeen('X')) { // Move in X direction - coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) - sprintf_P(commandStr, PSTR("G1 X0.1F%i"), movespeed); - else if ((coorvalue <= -0.1) && coorvalue > -1) - sprintf_P(commandStr, PSTR("G1 X-0.1F%i"), movespeed); - else - sprintf_P(commandStr, PSTR("G1 X%iF%i"), int(coorvalue), movespeed); - } - else if (CodeSeen('Y')) { // Move in Y direction - coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) - sprintf_P(commandStr, PSTR("G1 Y0.1F%i"), movespeed); - else if ((coorvalue <= -0.1) && coorvalue > -1) - sprintf_P(commandStr, PSTR("G1 Y-0.1F%i"), movespeed); - else - sprintf_P(commandStr, PSTR("G1 Y%iF%i"), int(coorvalue), movespeed); - } - else if (CodeSeen('Z')) { // Move in Z direction - coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) - sprintf_P(commandStr, PSTR("G1 Z0.1F%i"), movespeed); - else if ((coorvalue <= -0.1) && coorvalue > -1) - sprintf_P(commandStr, PSTR("G1 Z-0.1F%i"), movespeed); - else - sprintf_P(commandStr, PSTR("G1 Z%iF%i"), int(coorvalue), movespeed); - } - else if (CodeSeen('E')) { // Extrude - coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) - sprintf_P(commandStr, PSTR("G1 E0.1F%i"), movespeed); - else if ((coorvalue <= -0.1) && coorvalue > -1) - sprintf_P(commandStr, PSTR("G1 E-0.1F%i"), movespeed); - else - sprintf_P(commandStr, PSTR("G1 E%iF500"), int(coorvalue)); - } - - if (strlen(commandStr) > 0) { - sprintf_P(fullCommandStr, PSTR("G91\n%s\nG90"), commandStr); - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); - SERIAL_ECHOLN(fullCommandStr); - #endif - injectCommands(fullCommandStr); - } - } - SENDLINE_PGM(""); - break; - - case 23: // A23 preheat pla - if (!isPrinting()) { - if (getAxisPosition_mm(Z) < 10) - injectCommands(F("G1 Z10")); // RASE Z AXIS - - 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 (!isPrinting()) { - if (getAxisPosition_mm(Z) < 10) - injectCommands(F("G1 Z10")); // RASE Z AXIS - - 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 (!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 - } - break; - - case 26: // A26 refresh SD - #if HAS_MEDIA - if (isMediaInserted()) { - if (strlen(SelectedDirectory) > 0) { - FileList currentFileList; - if ((SelectedDirectory[0] == '.') && (SelectedDirectory[1] == '.')) { - currentFileList.upDir(); - } - else { - if (SelectedDirectory[0] == '<') - HandleSpecialMenu(); - else - currentFileList.changeDir(SelectedDirectory); - } - } - } - else { - SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); - } - - SelectedDirectory[0] = 0; - #endif - break; - - #if ENABLED(SERVO_ENDSTOPS) - case 27: break; // A27 servos angles adjust - #endif - - case 28: // A28 filament test - if (CodeSeen('O')) - NOOP; - else if (CodeSeen('C')) - NOOP; - SENDLINE_PGM(""); - break; - - case 33: // A33 get version info - SEND_PGM("J33 "); - SENDLINE_PGM(DETAILED_BUILD_VERSION); - break; - - default: - break; - } + if (a_command > 7 && a_command != 20) { // No debugging of status polls, please! + DEBUG_ECHOLNPGM("TFT Serial Command: ", tftCommands[tftBufIndW]); } - TFTbufindw = (TFTbufindw + 1) % TFTBUFSIZE; - TFTbuflen += 1; - serial3_count = 0; // clear buffer + switch (a_command) { + case 0: { // A0 GET HOTEND TEMP + const celsius_float_t hotendActualTemp = getActualTemp_celsius(E0); + SEND_PGM_VAL("A0V ", ROUND(hotendActualTemp)); + } + break; + + case 1: { // A1 GET HOTEND TARGET TEMP + const celsius_float_t hotendTargetTemp = getTargetTemp_celsius(E0); + SEND_PGM_VAL("A1V ", ROUND(hotendTargetTemp)); + } + break; + + case 2: { // A2 GET HOTBED TEMP + const celsius_float_t heatedBedActualTemp = getActualTemp_celsius(BED); + SEND_PGM_VAL("A2V ", ROUND(heatedBedActualTemp)); + } + break; + + case 3: { // A3 GET HOTBED TARGET TEMP + const celsius_float_t heatedBedTargetTemp = getTargetTemp_celsius(BED); + SEND_PGM_VAL("A3V ", ROUND(heatedBedTargetTemp)); + } break; + + case 4: { // A4 GET FAN SPEED + SEND_PGM_VAL("A4V ", int(getActualFan_percent(FAN0))); + } break; + + case 5: { // A5 GET CURRENT COORDINATE + 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); + SENDLINE_PGM(""); + } break; + + case 6: // A6 GET SD CARD PRINTING STATUS + #if HAS_MEDIA + if (isPrintingFromMedia()) { + SEND_PGM("A6V "); + if (isMediaInserted()) + SENDLINE(ui8tostr3rj(getProgress_percent())); + else + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); + } + else + SENDLINE_PGM("A6V ---"); + #endif + break; + + case 7: { // A7 GET PRINTING TIME + const uint32_t elapsedSeconds = getProgress_seconds_elapsed(); + SEND_PGM("A7V "); + if (elapsedSeconds != 0) { // print time + const uint32_t elapsedMinutes = elapsedSeconds / 60; + SEND(ui8tostr2(elapsedMinutes / 60)); + SEND_PGM(" H "); + SEND(ui8tostr2(elapsedMinutes % 60)); + SENDLINE_PGM(" M"); + } + else + SENDLINE_PGM(" 999:999"); + } + break; + + case 8: // A8 GET SD LIST + #if HAS_MEDIA + selectedFile[0] = 0; + renderCurrentFileList(); + #endif + break; + + case 9: // A9 pause sd print + TERN_(HAS_MEDIA, if (isPrintingFromMedia()) pausePrint()); + break; + + case 10: // A10 resume sd print + #if HAS_MEDIA + if (isPrintingFromMediaPaused()) + resumePrint(); + #endif + break; + + case 11: // A11 STOP SD PRINT + TERN_(HAS_MEDIA, stopPrint()); + break; + + case 12: // A12 kill + kill(F(STR_ERR_KILLED)); + break; + + case 13: // A13 SELECTION FILE + #if HAS_MEDIA + if (isMediaInserted()) { + starpos = (strchr(tftStrchrPtr + 4, '*')); + if (tftStrchrPtr[4] == '/') { + strcpy(selectedDirectory, tftStrchrPtr + 5); + selectedFile[0] = 0; + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + SENDLINE_PGM(""); + } + else if (tftStrchrPtr[4] == '<') { + strcpy(selectedDirectory, tftStrchrPtr + 4); + specialMenu = true; + selectedFile[0] = 0; + SENDLINE_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + SENDLINE_PGM(""); + } + else { + selectedDirectory[0] = 0; + + if (starpos) *(starpos - 1) = '\0'; + + strcpy(selectedFile, tftStrchrPtr + 4); + SENDLINE_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", selectedFile); // J20 File Selected + } + } + #endif + break; + + case 14: // A14 START PRINTING + #if HAS_MEDIA + if (!isPrinting() && strlen(selectedFile) > 0) + startPrint(); + #endif + break; + + case 15: // A15 RESUMING FROM OUTAGE + // TODO: JBA implement resume form outage + break; + + case 16: { // A16 set hotend temp + uint16_t tempvalue; + if (codeSeen('S')) { + tempvalue = constrain(codeValue(), 0, 275); + setTargetTemp_celsius(tempvalue, (extruder_t)E0); + } + else if (codeSeen('C') && !isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands(F("G1 Z10")); // RASE Z AXIS + tempvalue = constrain(codeValue(), 0, 275); + setTargetTemp_celsius(tempvalue, (extruder_t)E0); + } + } + break; + + case 17: { // A17 set heated bed temp + uint16_t tempbed; + if (codeSeen('S')) { + tempbed = constrain(codeValue(), 0, 100); + setTargetTemp_celsius(tempbed, (heater_t)BED); + } + } + break; + + case 18: { // A18 set fan speed + float fanPercent; + if (codeSeen('S')) { + fanPercent = codeValue(); + fanPercent = constrain(fanPercent, 0, 100); + setTargetFan_percent(fanPercent, FAN0); + } + else + fanPercent = 100; + + 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 (!isPrinting()) { + quickstop_stepper(); + stepper.disable_all_steppers(); + } + + SENDLINE_PGM(""); + break; + + case 20: // A20 read printing speed + if (codeSeen('S')) + feedrate_percentage = constrain(codeValue(), 40, 999); + else + SEND_PGM_VAL("A20V ", feedrate_percentage); + break; + + case 21: // A21 all home + if (!isPrinting() && !isPrintingFromMediaPaused()) { + if (codeSeen('X') || codeSeen('Y') || codeSeen('Z')) { + if (codeSeen('X')) + injectCommands(F("G28X")); + if (codeSeen('Y')) + injectCommands(F("G28Y")); + if (codeSeen('Z')) + injectCommands(F("G28Z")); + } + else if (codeSeen('C')) { + injectCommands_P(G28_STR); + } + } + break; + + case 22: // A22 move X/Y/Z or extrude + if (!isPrinting()) { + float coorvalue; + uint16_t movespeed = 0; + char commandStr[30]; + char fullCommandStr[38]; + + commandStr[0] = 0; // empty string + if (codeSeen('F')) // Set feedrate + movespeed = codeValue(); + + if (codeSeen('X')) { // Move in X direction + coorvalue = codeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) + sprintf_P(commandStr, PSTR("G1 X0.1F%i"), movespeed); + else if ((coorvalue <= -0.1) && coorvalue > -1) + sprintf_P(commandStr, PSTR("G1 X-0.1F%i"), movespeed); + else + sprintf_P(commandStr, PSTR("G1 X%iF%i"), int(coorvalue), movespeed); + } + else if (codeSeen('Y')) { // Move in Y direction + coorvalue = codeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) + sprintf_P(commandStr, PSTR("G1 Y0.1F%i"), movespeed); + else if ((coorvalue <= -0.1) && coorvalue > -1) + sprintf_P(commandStr, PSTR("G1 Y-0.1F%i"), movespeed); + else + sprintf_P(commandStr, PSTR("G1 Y%iF%i"), int(coorvalue), movespeed); + } + else if (codeSeen('Z')) { // Move in Z direction + coorvalue = codeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) + sprintf_P(commandStr, PSTR("G1 Z0.1F%i"), movespeed); + else if ((coorvalue <= -0.1) && coorvalue > -1) + sprintf_P(commandStr, PSTR("G1 Z-0.1F%i"), movespeed); + else + sprintf_P(commandStr, PSTR("G1 Z%iF%i"), int(coorvalue), movespeed); + } + else if (codeSeen('E')) { // Extrude + coorvalue = codeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) + sprintf_P(commandStr, PSTR("G1 E0.1F%i"), movespeed); + else if ((coorvalue <= -0.1) && coorvalue > -1) + sprintf_P(commandStr, PSTR("G1 E-0.1F%i"), movespeed); + else + sprintf_P(commandStr, PSTR("G1 E%iF500"), int(coorvalue)); + } + + if (strlen(commandStr) > 0) { + sprintf_P(fullCommandStr, PSTR("G91\n%s\nG90"), commandStr); + DEBUG_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); + DEBUG_ECHOLN(fullCommandStr); + injectCommands(fullCommandStr); + } + } + SENDLINE_PGM(""); + break; + + case 23: // A23 preheat pla + if (!isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands(F("G1 Z10")); // RASE Z AXIS + + 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 (!isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands(F("G1 Z10")); // RASE Z AXIS + + 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 (!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 + } + break; + + case 26: // A26 refresh SD + #if HAS_MEDIA + if (isMediaInserted()) { + if (strlen(selectedDirectory) > 0) { + FileList currentFileList; + if ((selectedDirectory[0] == '.') && (selectedDirectory[1] == '.')) { + currentFileList.upDir(); + } + else { + if (selectedDirectory[0] == '<') + handleSpecialMenu(); + else + currentFileList.changeDir(selectedDirectory); + } + } + } + else { + SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); + } + + selectedDirectory[0] = 0; + #endif + break; + + #if ENABLED(SERVO_ENDSTOPS) + case 27: break; // A27 servos angles adjust + #endif + + case 28: // A28 filament test + if (codeSeen('O')) + NOOP; + else if (codeSeen('C')) + NOOP; + SENDLINE_PGM(""); + break; + + case 33: // A33 get version info + SEND_PGM("J33 "); + SENDLINE_PGM(DETAILED_BUILD_VERSION); + break; + + default: + break; + } } - else { - TFTcmdbuffer[TFTbufindw][serial3_count++] = serial3_char; - } - } + + tftBufIndW = (tftBufIndW + 1) % (TFTBUFSIZE); + tftBufLen++; + serial_count = 0; // clear buffer + + } // while } -void AnycubicTFTClass::DoSDCardStateCheck() { - #if BOTH(HAS_MEDIA, HAS_SD_DETECT) +void AnycubicTFT::doSDCardStateCheck() { + #if ALL(HAS_MEDIA, HAS_SD_DETECT) bool isInserted = isMediaInserted(); if (isInserted) SENDLINE_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); @@ -934,7 +894,7 @@ void AnycubicTFTClass::DoSDCardStateCheck() { #endif } -void AnycubicTFTClass::DoFilamentRunoutCheck() { +void AnycubicTFT::doFilamentRunoutCheck() { #if ENABLED(FILAMENT_RUNOUT_SENSOR) // 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 @@ -953,23 +913,18 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { #endif // FILAMENT_RUNOUT_SENSOR } -void AnycubicTFTClass::StartPrint() { +void AnycubicTFT::startPrint() { #if HAS_MEDIA - if (!isPrinting() && strlen(SelectedFile) > 0) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); - SERIAL_ECHO(isPrinting()); - SERIAL_ECHOPGM(" "); - SERIAL_ECHOLN(SelectedFile); - #endif + if (!isPrinting() && strlen(selectedFile) > 0) { + DEBUG_ECHOLNPGM("TFT Serial Debug: About to print file ... ", isPrinting(), " ", selectedFile); mediaPrintingState = AMPRINTSTATE_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - printFile(SelectedFile); + printFile(selectedFile); } #endif // SDUPPORT } -void AnycubicTFTClass::PausePrint() { +void AnycubicTFT::pausePrint() { #if HAS_MEDIA if (isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; @@ -983,16 +938,14 @@ void AnycubicTFTClass::PausePrint() { #endif } -void AnycubicTFTClass::ResumePrint() { +void AnycubicTFT::resumePrint() { #if HAS_MEDIA #if ENABLED(FILAMENT_RUNOUT_SENSOR) if (READ(FIL_RUNOUT1_PIN)) { - #if ENABLED(ANYCUBIC_LCD_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); - #endif + DEBUG_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); // trigger the user message box - DoFilamentRunoutCheck(); + doFilamentRunoutCheck(); // re-enable the continue button SENDLINE_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still tripped... J18"); @@ -1019,7 +972,7 @@ void AnycubicTFTClass::ResumePrint() { #endif } -void AnycubicTFTClass::StopPrint() { +void AnycubicTFT::stopPrint() { #if HAS_MEDIA mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; diff --git a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.h b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.h index 8fcadc1553..78eae62326 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.h +++ b/Marlin/src/lcd/extui/anycubic_i3mega/anycubic_i3mega_lcd.h @@ -45,51 +45,48 @@ enum AnycubicMediaPauseState { AMPAUSESTATE_REHEAT_FINISHED }; -class AnycubicTFTClass { +class AnycubicTFT { public: - AnycubicTFTClass(); - 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(); + AnycubicTFT(); + 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: - 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 char tftCommands[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; + static int tftBufLen, tftBufIndR, tftBufIndW; + static char *tftStrchrPtr; + static uint8_t specialMenu; static AnycubicMediaPrintState mediaPrintingState; static AnycubicMediaPauseState mediaPauseState; - 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(); + 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 handleSpecialMenu(); + static void doSDCardStateCheck(); + static void doFilamentRunoutCheck(); + static void startPrint(); + static void pausePrint(); + static void resumePrint(); + static void stopPrint(); - static char SelectedDirectory[30]; - static char SelectedFile[FILENAME_LENGTH]; + static char selectedDirectory[30]; + static char selectedFile[FILENAME_LENGTH]; }; -extern AnycubicTFTClass AnycubicTFT; +extern AnycubicTFT anycubicTFT; extern const char G28_STR[]; diff --git a/Marlin/src/lcd/extui/anycubic_vyper/FileNavigator.cpp b/Marlin/src/lcd/extui/anycubic_vyper/FileNavigator.cpp index 03eba4c5b3..e3cd68fd9d 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/FileNavigator.cpp @@ -40,8 +40,8 @@ using namespace ExtUI; namespace Anycubic { - FileList FileNavigator::filelist; // Instance of the Marlin file API - char FileNavigator::currentfoldername[MAX_PATH_LEN + 1]; // Current folder path + FileList FileNavigator::filelist; // ExtUI file API + char FileNavigator::currentDirPath[MAX_PATH_LEN + 1]; // Current folder path uint16_t FileNavigator::lastindex; uint8_t FileNavigator::folderdepth; uint16_t FileNavigator::currentindex; // override the panel request @@ -51,7 +51,7 @@ namespace Anycubic { FileNavigator::FileNavigator() { reset(); } void FileNavigator::reset() { - currentfoldername[0] = '\0'; + currentDirPath[0] = '\0'; folderdepth = 0; currentindex = 0; lastindex = 0; @@ -91,10 +91,10 @@ namespace Anycubic { if (filelist.seek(_seek)) { //sendFile(); - DgusTFT::SendTxtToTFT(filelist.longFilename(), TXT_FILE_0 + file_num*0x30); + DgusTFT::sendTxtToTFT(filelist.longFilename(), TXT_FILE_0 + file_num*0x30); #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPGM("seek: ", _seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); + SERIAL_ECHOLNPGM("seek: ", _seek, " '", filelist.longFilename(), "' '", currentDirPath, "", filelist.shortFilename(), "'\n"); #endif } else { @@ -102,7 +102,7 @@ namespace Anycubic { SERIAL_ECHOLNPGM("over seek: ", _seek); #endif - DgusTFT::SendTxtToTFT("\0", TXT_FILE_0 + file_num*0x30); + DgusTFT::sendTxtToTFT("\0", TXT_FILE_0 + file_num*0x30); } file_num++; @@ -115,16 +115,16 @@ namespace Anycubic { // Permitted special characters in file name: -_*#~ // Panel can display 22 characters per line. if (!filelist.isDir()) - DgusTFT::SendTxtToTFT(filelist.longFilename(), TXT_FILE_0); + DgusTFT::sendTxtToTFT(filelist.longFilename(), TXT_FILE_0); } void FileNavigator::changeDIR(char *folder) { #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPGM("currentfolder: ", currentfoldername, " New: ", folder); + SERIAL_ECHOLNPGM("currentfolder: ", currentDirPath, " New: ", folder); #endif if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth - strcat(currentfoldername, folder); - strcat(currentfoldername, "/"); + strcat(currentDirPath, folder); + strcat(currentDirPath, "/"); filelist.changeDir(folder); refresh(); folderdepth++; @@ -138,22 +138,22 @@ namespace Anycubic { currentindex = 0; // Remove the last child folder from the stored path if (folderdepth == 0) { - currentfoldername[0] = '\0'; + currentDirPath[0] = '\0'; reset(); } else { char *pos = nullptr; for (uint8_t f = 0; f < folderdepth; f++) - pos = strchr(currentfoldername, '/'); + pos = strchr(currentDirPath, '/'); *(pos + 1) = '\0'; } #if ACDEBUG(AC_FILE) - SERIAL_ECHOLNPGM("depth: ", folderdepth, " currentfoldername: ", currentfoldername); + SERIAL_ECHOLNPGM("depth: ", folderdepth, " currentDirPath: ", currentDirPath); #endif } - char* FileNavigator::getCurrentFolderName() { return currentfoldername; } + char* FileNavigator::getCurrentDirPath() { return currentDirPath; } uint16_t FileNavigator::getFileNum() { return filelist.count(); } } diff --git a/Marlin/src/lcd/extui/anycubic_vyper/FileNavigator.h b/Marlin/src/lcd/extui/anycubic_vyper/FileNavigator.h index dd4b0b0f74..2505ae7c4c 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/FileNavigator.h +++ b/Marlin/src/lcd/extui/anycubic_vyper/FileNavigator.h @@ -43,13 +43,13 @@ namespace Anycubic { static void changeDIR(char *); static void sendFile(); static void refresh(); - static char* getCurrentFolderName(); + static char* getCurrentDirPath(); static uint16_t getFileNum(); private: static uint16_t lastindex; static uint16_t currentindex; static uint8_t folderdepth; - static char currentfoldername[MAX_PATH_LEN + 1]; + static char currentDirPath[MAX_PATH_LEN + 1]; }; extern FileNavigator filenavigator; diff --git a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp index 387557f2af..f27e638b32 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp @@ -111,12 +111,12 @@ namespace Anycubic { uint8_t pop_up_index_saved; uint32_t key_value_saved; - void DEBUG_PRINT_PAUSED_STATE(FSTR_P const msg, paused_state_t state); - void DEBUG_PRINT_PRINTER_STATE(FSTR_P const msg, printer_state_t state); - void DEBUG_PRINT_TIMER_EVENT(FSTR_P const msg, timer_event_t event); - void DEBUG_PRINT_MEDIA_EVENT(FSTR_P const msg, media_event_t event); + void DEBUG_PRINT_PAUSED_STATE(const paused_state_t state, FSTR_P const msg=nullptr); + void DEBUG_PRINT_PRINTER_STATE(const printer_state_t state, FSTR_P const msg=nullptr); + void DEBUG_PRINT_TIMER_EVENT(const timer_event_t event, FSTR_P const msg=nullptr); + void DEBUG_PRINT_MEDIA_EVENT(const media_event_t event, FSTR_P const msg=nullptr); - DgusTFT Dgus; + DgusTFT dgus; DgusTFT::DgusTFT() { data_buf[0] = '\0'; @@ -127,9 +127,9 @@ namespace Anycubic { feedrate_back = -1; } - void DgusTFT::Startup() { + void DgusTFT::startup() { #if ACDEBUG(AC_MARLIN) - DEBUG_ECHOLNPGM("DgusTFT::Startup()"); + DEBUG_ECHOLNPGM("DgusTFT::startup()"); #endif selectedfile[0] = '\0'; panel_command[0] = '\0'; @@ -148,22 +148,22 @@ namespace Anycubic { TFTSer.begin(115200); // Signal Board has reset - SendtoTFTLN(AC_msg_main_board_has_reset); + tftSendLn(AC_msg_main_board_has_reset); // Enable levelling and Disable end stops during print // as Z home places nozzle above the bed so we need to allow it past the end stops injectCommands(AC_cmnd_enable_leveling); #if ACDEBUGLEVEL - DEBUG_ECHOLNPGM("Startup AC Debug Level ", ACDEBUGLEVEL); + DEBUG_ECHOLNPGM("startup AC Debug Level ", ACDEBUGLEVEL); #endif - SendtoTFTLN(AC_msg_ready); + tftSendLn(AC_msg_ready); } - void DgusTFT::ParamInit() { + void DgusTFT::paramInit() { #if ACDEBUG(AC_MARLIN) - DEBUG_ECHOLNPGM("DgusTFT::ParamInit()"); + DEBUG_ECHOLNPGM("DgusTFT::paramInit()"); #endif if (lcd_info.language == CHS) @@ -171,32 +171,32 @@ namespace Anycubic { else if (lcd_info.language == ENG) page_index_now = 121; - LcdAudioSet(lcd_info.audio_on); + lcdAudioSet(lcd_info.audio_on); #if ACDEBUG(AC_MARLIN) if (lcd_info.language == CHS) - DEBUG_ECHOLNPGM("ParamInit lcd language: CHS"); + DEBUG_ECHOLNPGM("paramInit lcd language: CHS"); else if (lcd_info.language == ENG) - DEBUG_ECHOLNPGM("ParamInit lcd language: ENG"); + DEBUG_ECHOLNPGM("paramInit lcd language: ENG"); if (lcd_info.audio_on) - DEBUG_ECHOLNPGM("ParamInit lcd audio: ON"); + DEBUG_ECHOLNPGM("paramInit lcd audio: ON"); else - DEBUG_ECHOLNPGM("ParamInit lcd audio: OFF"); + DEBUG_ECHOLNPGM("paramInit lcd audio: OFF"); #endif - RequestValueFromTFT(0x14); // get page ID + requestValueFromTFT(0x14); // get page ID } - void DgusTFT::IdleLoop() { - if (ReadTFTCommand()) { - ProcessPanelRequest(); + void DgusTFT::idleLoop() { + if (readTFTCommand()) { + processPanelRequest(); command_len = 0; } #if ACDEBUG(AC_MARLIN) if (key_value) { - DEBUG_ECHOLNPGM("IdleLoop page: ", page_index_now); + DEBUG_ECHOLNPGM("idleLoop page: ", page_index_now); DEBUG_ECHOLNPGM("key: ", key_value); } #endif @@ -266,7 +266,7 @@ namespace Anycubic { pop_up_manager(); key_value = 0; - CheckHeaters(); + checkHeaters(); } uint8_t FSHlength(FSTR_P FSHinput) { @@ -276,7 +276,7 @@ namespace Anycubic { return stringLength; } - void DgusTFT::PrinterKilled(FSTR_P error_p, FSTR_P component_p) { + void DgusTFT::printerKilled(FSTR_P error_p, FSTR_P component_p) { // copy string in FLASH to RAM for strcmp_P @@ -288,19 +288,19 @@ namespace Anycubic { char component[FSHlength(component_p) + 1]; memcpy_P(component, component_p, textLength + 1); // +1 for the null terminator - SendtoTFTLN(AC_msg_kill_lcd); + tftSendLn(AC_msg_kill_lcd); #if ACDEBUG(AC_MARLIN) - DEBUG_ECHOLNPGM("PrinterKilled()\nerror: ", error, "\ncomponent: ", component); + DEBUG_ECHOLNPGM("printerKilled()\nerror: ", error, "\ncomponent: ", component); #endif if (strcmp_P(error, PSTR("Heating Failed")) == 0) { if (strcmp_P(component, PSTR("Bed")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_BED_HEATER); + changePageOfTFT(PAGE_CHS_ABNORMAL_BED_HEATER); SERIAL_ECHOLNPGM("Check Bed heater"); } else if (strcmp_P(component, PSTR("E1")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_HOTEND_HEATER); + changePageOfTFT(PAGE_CHS_ABNORMAL_HOTEND_HEATER); SERIAL_ECHOLNPGM("Check E1 heater"); } @@ -308,11 +308,11 @@ namespace Anycubic { else if (strcmp_P(error, PSTR("Err: MINTEMP")) == 0) { if (strcmp_P(component, PSTR("Bed")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_BED_NTC); + changePageOfTFT(PAGE_CHS_ABNORMAL_BED_NTC); SERIAL_ECHOLNPGM("Check Bed thermistor"); } else if (strcmp_P(component, PSTR("E1")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_HOTEND_NTC); + changePageOfTFT(PAGE_CHS_ABNORMAL_HOTEND_NTC); SERIAL_ECHOLNPGM("Check E1 thermistor"); } @@ -320,11 +320,11 @@ namespace Anycubic { else if (strcmp_P(error, PSTR("Err: MAXTEMP")) == 0) { if (strcmp_P(component, PSTR("Bed")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_BED_NTC); + changePageOfTFT(PAGE_CHS_ABNORMAL_BED_NTC); SERIAL_ECHOLNPGM("Check Bed thermistor"); } else if (strcmp_P(component, PSTR("E1")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_HOTEND_NTC); + changePageOfTFT(PAGE_CHS_ABNORMAL_HOTEND_NTC); SERIAL_ECHOLNPGM("Check E1 thermistor"); } @@ -332,11 +332,11 @@ namespace Anycubic { else if (strcmp_P(error, PSTR("THERMAL RUNAWAY")) == 0) { if (strcmp_P(component, PSTR("Bed")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_BED_HEATER); + changePageOfTFT(PAGE_CHS_ABNORMAL_BED_HEATER); SERIAL_ECHOLNPGM("Check Bed thermal runaway"); } else if (strcmp_P(component, PSTR("E1")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_HOTEND_HEATER); + changePageOfTFT(PAGE_CHS_ABNORMAL_HOTEND_HEATER); SERIAL_ECHOLNPGM("Check E1 thermal runaway"); } @@ -344,15 +344,15 @@ namespace Anycubic { else if (strcmp_P(error, PSTR("Homing Failed")) == 0) { if (strcmp_P(component, PSTR("X")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_X_ENDSTOP); + changePageOfTFT(PAGE_CHS_ABNORMAL_X_ENDSTOP); SERIAL_ECHOLNPGM("Check X endstop"); } else if (strcmp_P(component, PSTR("Y")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_Y_ENDSTOP); + changePageOfTFT(PAGE_CHS_ABNORMAL_Y_ENDSTOP); SERIAL_ECHOLNPGM("Check Y endstop"); } else if (strcmp_P(component, PSTR("Z")) == 0) { - ChangePageOfTFT(PAGE_CHS_ABNORMAL_Z_ENDSTOP); + changePageOfTFT(PAGE_CHS_ABNORMAL_Z_ENDSTOP); SERIAL_ECHOLNPGM("Check Z endstop"); } @@ -361,12 +361,12 @@ namespace Anycubic { } void DgusTFT::set_descript_color(const uint16_t color, const uint8_t index/*=lcd_txtbox_index*/) { - SendColorToTFT(color, TXT_DESCRIPT_0 + 0x30 * (index - 1)); + sendColorToTFT(color, TXT_DESCRIPT_0 + 0x30 * (index - 1)); } - void DgusTFT::MediaEvent(media_event_t event) { + void DgusTFT::mediaEvent(media_event_t event) { #if ACDEBUG(AC_MARLIN) - DEBUG_PRINT_MEDIA_EVENT(F("ProcessMediaStatus() "), event); + DEBUG_PRINT_MEDIA_EVENT(event); #endif switch (event) { case AC_media_inserted: @@ -379,12 +379,12 @@ namespace Anycubic { lcd_txtbox_index = 0; } - SendFileList(lcd_txtbox_index); + sendFileList(lcd_txtbox_index); break; case AC_media_removed: - SendtoTFTLN(AC_msg_sd_card_removed); + tftSendLn(AC_msg_sd_card_removed); filenavigator.reset(); @@ -394,39 +394,39 @@ namespace Anycubic { lcd_txtbox_index = 0; } - SendFileList(lcd_txtbox_index); + sendFileList(lcd_txtbox_index); break; case AC_media_error: - SendtoTFTLN(AC_msg_no_sd_card); + tftSendLn(AC_msg_no_sd_card); break; } } - void DgusTFT::TimerEvent(timer_event_t event) { + void DgusTFT::timerEvent(timer_event_t event) { #if ACDEBUG(AC_MARLIN) - DEBUG_PRINT_TIMER_EVENT(F("TimerEvent() "), event); - DEBUG_PRINT_PRINTER_STATE(F("Printer State: "), printer_state); + DEBUG_PRINT_TIMER_EVENT(event); + DEBUG_PRINT_PRINTER_STATE(printer_state); #endif switch (event) { case AC_timer_started: setSoftEndstopState(false); // disable endstops to print printer_state = AC_printer_printing; - SendtoTFTLN(AC_msg_print_from_sd_card); + tftSendLn(AC_msg_print_from_sd_card); break; case AC_timer_paused: //printer_state = AC_printer_paused; //pause_state = AC_paused_idle; - SendtoTFTLN(AC_msg_paused); + tftSendLn(AC_msg_paused); break; case AC_timer_stopped: if (printer_state != AC_printer_idle) { if (printer_state == AC_printer_stopping_from_media_remove) { - ChangePageOfTFT(PAGE_NO_SD); + changePageOfTFT(PAGE_NO_SD); } else { printer_state = AC_printer_stopping; @@ -436,9 +436,9 @@ namespace Anycubic { char str_buf[20]; sprintf(str_buf, "%s H ", utostr3(time / 60)); sprintf(str_buf + strlen(str_buf), "%s M", utostr3(time % 60)); - SendTxtToTFT(str_buf, TXT_FINISH_TIME); - ChangePageOfTFT(PAGE_PRINT_FINISH); - SendtoTFTLN(AC_msg_print_complete); + sendTxtToTFT(str_buf, TXT_FINISH_TIME); + changePageOfTFT(PAGE_PRINT_FINISH); + tftSendLn(AC_msg_print_complete); pop_up_index = 100; } } @@ -449,12 +449,12 @@ namespace Anycubic { #if ENABLED(FILAMENT_RUNOUT_SENSOR) - void DgusTFT::FilamentRunout() { + void DgusTFT::filamentRunout() { #if ACDEBUG(AC_MARLIN) - DEBUG_PRINT_PRINTER_STATE(F("FilamentRunout() printer_state "), printer_state); + DEBUG_PRINT_PRINTER_STATE(printer_state, F("filamentRunout() ")); // 1 Signal filament out - SendtoTFTLN(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); + tftSendLn(isPrintingFromMedia() ? AC_msg_filament_out_alert : AC_msg_filament_out_block); //printer_state = AC_printer_filament_out; DEBUG_ECHOLNPGM("getFilamentRunoutState: ", getFilamentRunoutState()); @@ -463,7 +463,7 @@ namespace Anycubic { pop_up_index = 15; // show filament lack. if (READ(FIL_RUNOUT_PIN) == FIL_RUNOUT_STATE) { - PlayTune(FilamentOut); + playTune(FilamentOut); feedrate_back = getFeedrate_percent(); @@ -477,20 +477,20 @@ namespace Anycubic { #endif // FILAMENT_RUNOUT_SENSOR - void DgusTFT::ConfirmationRequest(const char * const msg) { + void DgusTFT::confirmationRequest(const char * const msg) { // M108 continue #if ACDEBUG(AC_MARLIN) DEBUG_ECHOLNPGM("HomingComplete, line: ", __LINE__); - DEBUG_ECHOLNPGM("ConfirmationRequest() ", msg); - DEBUG_PRINT_PRINTER_STATE(F("printer_state: " ), printer_state); - DEBUG_PRINT_PAUSED_STATE(F("pause_state: "), pause_state); + DEBUG_ECHOLNPGM("confirmationRequest() ", msg); + DEBUG_PRINT_PRINTER_STATE(printer_state); + DEBUG_PRINT_PAUSED_STATE(pause_state); #endif switch (printer_state) { case AC_printer_pausing: { if (strcmp_P(msg, MARLIN_msg_print_paused) == 0 || strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0) { if (pause_state != AC_paused_filament_lack) - ChangePageOfTFT(PAGE_STATUS1); // enable continue button + changePageOfTFT(PAGE_STATUS1); // enable continue button printer_state = AC_printer_paused; } } @@ -504,8 +504,8 @@ namespace Anycubic { // Heater timout, send acknowledgement if (strcmp_P(msg, MARLIN_msg_heater_timeout) == 0) { pause_state = AC_paused_heater_timed_out; - SendtoTFTLN(AC_msg_paused); // enable continue button - PlayTune(HeaterTimeout); + tftSendLn(AC_msg_paused); // enable continue button + playTune(HeaterTimeout); } // Reheat finished, send acknowledgement else if (strcmp_P(msg, MARLIN_msg_reheat_done) == 0) { @@ -517,12 +517,12 @@ namespace Anycubic { if (pause_state != AC_paused_filament_lack) pause_state = AC_paused_idle; - SendtoTFTLN(AC_msg_paused); // enable continue button + tftSendLn(AC_msg_paused); // enable continue button } // Filament Purging, send acknowledgement enter run mode else if (strcmp_P(msg, MARLIN_msg_filament_purging) == 0) { pause_state = AC_paused_purging_filament; - SendtoTFTLN(AC_msg_paused); // enable continue button + tftSendLn(AC_msg_paused); // enable continue button } else if (strcmp_P(msg, MARLIN_msg_nozzle_parked) == 0) { #if ACDEBUG(AC_MARLIN) @@ -540,16 +540,16 @@ namespace Anycubic { } } - void DgusTFT::StatusChange(const char * const msg) { + void DgusTFT::statusChange(const char * const msg) { #if ACDEBUG(AC_MARLIN) - DEBUG_ECHOLNPGM("StatusChange() ", msg); - DEBUG_PRINT_PRINTER_STATE(F("printer_state: "), printer_state); - DEBUG_PRINT_PAUSED_STATE(F("pause_state: "), pause_state); + DEBUG_ECHOLNPGM("statusChange() ", msg); + DEBUG_PRINT_PRINTER_STATE(printer_state); + DEBUG_PRINT_PAUSED_STATE(pause_state); #endif bool msg_matched = false; #if HAS_LEVELING - static uint8_t probe_cnt = 0; + static grid_count_t probe_cnt = 0; #endif // The only way to get printer status is to parse messages @@ -564,11 +564,11 @@ namespace Anycubic { // If probing completes ok save the mesh and park // Ignore the custom machine name if (strcmp_P(msg + strlen(MACHINE_NAME), MARLIN_msg_ready) == 0) { - if (probe_cnt == GRID_MAX_POINTS_X * GRID_MAX_POINTS_Y) { + if (probe_cnt == GRID_MAX_POINTS) { probe_cnt = 0; injectCommands(F("M500")); // G27 park nozzle - //ChangePageOfTFT(PAGE_PreLEVEL); - FakeChangePageOfTFT(PAGE_PreLEVEL); // Prevent UI refreshing too quickly when probing is done + //changePageOfTFT(PAGE_PreLEVEL); + fakeChangePageOfTFT(PAGE_PreLEVEL); // Prevent UI refreshing too quickly when probing is done printer_state = AC_printer_idle; msg_matched = true; } @@ -576,27 +576,27 @@ namespace Anycubic { // If probing fails don't save the mesh raise the probe above the bad point if (strcmp_P(msg, MARLIN_msg_probing_failed) == 0) { - PlayTune(BeepBeepBeeep); + playTune(BeepBeepBeeep); injectCommands(F("G1 Z50 F500")); - ChangePageOfTFT(PAGE_CHS_ABNORMAL_LEVELING_SENSOR); - SendtoTFTLN(AC_msg_probing_complete); + changePageOfTFT(PAGE_CHS_ABNORMAL_LEVELING_SENSOR); + tftSendLn(AC_msg_probing_complete); printer_state = AC_printer_idle; msg_matched = true; } if (strcmp_P(msg, MARLIN_msg_probe_preheat_start) == 0) - ChangePageOfTFT(PAGE_CHS_PROBE_PREHEATING); + changePageOfTFT(PAGE_CHS_PROBE_PREHEATING); if (strcmp_P(msg, MARLIN_msg_probe_preheat_stop) == 0) - ChangePageOfTFT(PAGE_LEVELING); + changePageOfTFT(PAGE_LEVELING); break; #endif case AC_printer_printing: if (strcmp_P(msg, MARLIN_msg_reheating) == 0) { - SendtoTFTLN(AC_msg_paused); // enable continue button - ChangePageOfTFT(PAGE_STATUS2); + tftSendLn(AC_msg_paused); // enable continue button + changePageOfTFT(PAGE_STATUS2); msg_matched = true; } else if (strcmp_P(msg, MARLIN_msg_media_removed) == 0) { @@ -616,7 +616,7 @@ namespace Anycubic { case AC_printer_pausing: if (strcmp_P(msg, MARLIN_msg_print_paused) == 0) { if (pause_state != AC_paused_filament_lack) { - ChangePageOfTFT(PAGE_STATUS1); // show resume + changePageOfTFT(PAGE_STATUS1); // show resume pause_state = AC_paused_idle; } @@ -628,7 +628,7 @@ namespace Anycubic { case AC_printer_paused: if (strcmp_P(msg, MARLIN_msg_print_paused) == 0) { if (pause_state != AC_paused_filament_lack) { - ChangePageOfTFT(PAGE_STATUS1); // show resume + changePageOfTFT(PAGE_STATUS1); // show resume pause_state = AC_paused_idle; } @@ -639,7 +639,7 @@ namespace Anycubic { case AC_printer_stopping: if (strcmp_P(msg, MARLIN_msg_print_aborted) == 0) { - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); printer_state = AC_printer_idle; msg_matched = true; } @@ -652,14 +652,14 @@ namespace Anycubic { if (!msg_matched) { #if HAS_HOTEND if (strcmp_P(msg, MARLIN_msg_extruder_heating) == 0) { - SendtoTFTLN(AC_msg_nozzle_heating); + tftSendLn(AC_msg_nozzle_heating); hotend_state = AC_heater_temp_set; return; } #endif #if HAS_HEATED_BED if (strcmp_P(msg, MARLIN_msg_bed_heating) == 0) { - SendtoTFTLN(AC_msg_bed_heating); + tftSendLn(AC_msg_bed_heating); hotbed_state = AC_heater_temp_set; } #endif @@ -668,25 +668,25 @@ namespace Anycubic { #if ENABLED(POWER_LOSS_RECOVERY) - void DgusTFT::PowerLoss() { + void DgusTFT::powerLoss() { // On: 5A A5 05 82 00 82 00 00 // Off: 5A A5 05 82 00 82 00 64 uint8_t data[] = { 0x5A, 0xA5, 0x05, 0x82, 0x00, 0x82, 0x00, uint8_t(recovery.enabled ? 0x00 : 0x64) }; - LOOP_L_N(i, COUNT(data)) TFTSer.write(data[i]); + for (uint8_t i = 0; i < COUNT(data); ++i) TFTSer.write(data[i]); } - void DgusTFT::PowerLossRecovery() { + void DgusTFT::powerLossRecovery() { printer_state = AC_printer_resuming_from_power_outage; // Play tune to notify user we can recover. } #endif // POWER_LOSS_RECOVERY - void DgusTFT::HomingStart() { + void DgusTFT::homingStart() { if (!isPrintingFromMedia()) - ChangePageOfTFT(PAGE_CHS_HOMING); + changePageOfTFT(PAGE_CHS_HOMING); } - void DgusTFT::HomingComplete() { + void DgusTFT::homingComplete() { if (lcd_info.language == ENG && page_index_last > 120) page_index_last -= 120; @@ -696,23 +696,23 @@ namespace Anycubic { #endif if (!isPrintingFromMedia()) - ChangePageOfTFT(page_index_last); + changePageOfTFT(page_index_last); } - void DgusTFT::SendtoTFT(FSTR_P const fstr/*=nullptr*/) { // A helper to print PROGMEM string to the panel + void DgusTFT::tftSend(FSTR_P const fstr/*=nullptr*/) { // A helper to print PROGMEM string to the panel #if ACDEBUG(AC_SOME) - DEBUG_ECHOF(fstr); + DEBUG_ECHO(fstr); #endif PGM_P str = FTOP(fstr); while (const char c = pgm_read_byte(str++)) TFTSer.write(c); } - void DgusTFT::SendtoTFTLN(FSTR_P const fstr/*=nullptr*/) { + void DgusTFT::tftSendLn(FSTR_P const fstr/*=nullptr*/) { if (fstr) { #if ACDEBUG(AC_SOME) DEBUG_ECHOPGM("> "); #endif - SendtoTFT(fstr); + tftSend(fstr); #if ACDEBUG(AC_SOME) SERIAL_EOL(); #endif @@ -720,37 +720,37 @@ namespace Anycubic { TFTSer.println(); } - void DgusTFT::SendValueToTFT(const uint16_t value, const uint16_t address) { + void DgusTFT::sendValueToTFT(const uint16_t value, const uint16_t address) { uint8_t data[] = { 0x5A, 0xA5, 0x05, 0x82, uint8_t(address >> 8), uint8_t(address & 0xFF), uint8_t(value >> 8), uint8_t(value & 0xFF) }; - LOOP_L_N(i, COUNT(data)) TFTSer.write(data[i]); + for (uint8_t i = 0; i < COUNT(data); ++i) TFTSer.write(data[i]); } - void DgusTFT::RequestValueFromTFT(const uint16_t address) { + void DgusTFT::requestValueFromTFT(const uint16_t address) { uint8_t data[] = { 0x5A, 0xA5, 0x04, 0x83, uint8_t(address >> 8), uint8_t(address & 0xFF), 0x01 }; - LOOP_L_N(i, COUNT(data)) TFTSer.write(data[i]); + for (uint8_t i = 0; i < COUNT(data); ++i) TFTSer.write(data[i]); } - void DgusTFT::SendTxtToTFT(const char *pdata, const uint16_t address) { + void DgusTFT::sendTxtToTFT(const char *pdata, const uint16_t address) { uint8_t data_len = strlen(pdata); uint8_t data[] = { 0x5A, 0xA5, uint8_t(data_len + 5), 0x82, uint8_t(address >> 8), uint8_t(address & 0xFF) }; - LOOP_L_N(i, COUNT(data)) TFTSer.write(data[i]); - LOOP_L_N(i, data_len) TFTSer.write(pdata[i]); + for (uint8_t i = 0; i < COUNT(data); ++i) TFTSer.write(data[i]); + for (uint8_t i = 0; i < data_len; ++i) TFTSer.write(pdata[i]); TFTSer.write(0xFF); TFTSer.write(0xFF); } - void DgusTFT::SendColorToTFT(const uint16_t color, const uint16_t address) { + void DgusTFT::sendColorToTFT(const uint16_t color, const uint16_t address) { uint8_t data[] = { 0x5A, 0xA5, 0x05, 0x82, uint8_t(address >> 8), uint8_t(address & 0xFF), uint8_t(color >> 8), uint8_t(color & 0xFF) }; - LOOP_L_N(i, COUNT(data)) TFTSer.write(data[i]); + for (uint8_t i = 0; i < COUNT(data); ++i) TFTSer.write(data[i]); } - void DgusTFT::SendReadNumOfTxtToTFT(const uint8_t number, const uint16_t address) { + void DgusTFT::sendReadNumOfTxtToTFT(const uint8_t number, const uint16_t address) { uint8_t data[] = { 0x5A, 0xA5, 0x04, 0x83, uint8_t(address >> 8), uint8_t(address & 0xFF), number }; - LOOP_L_N(i, COUNT(data)) TFTSer.write(data[i]); + for (uint8_t i = 0; i < COUNT(data); ++i) TFTSer.write(data[i]); } - void DgusTFT::ChangePageOfTFT(const uint16_t page_index, const bool no_send/*=false*/) { + void DgusTFT::changePageOfTFT(const uint16_t page_index, const bool no_send/*=false*/) { #if ACDEBUG(AC_MARLIN) - DEBUG_ECHOLNPGM("ChangePageOfTFT: ", page_index); + DEBUG_ECHOLNPGM("changePageOfTFT: ", page_index); #endif uint32_t data_temp = 0; @@ -775,7 +775,7 @@ namespace Anycubic { if (!no_send) { uint8_t data[] = { 0x5A, 0xA5, 0x07, 0x82, 0x00, 0x84, 0x5A, 0x01, uint8_t(data_temp >> 8), uint8_t(data_temp & 0xFF) }; - LOOP_L_N(i, COUNT(data)) TFTSer.write(data[i]); + for (uint8_t i = 0; i < COUNT(data); ++i) TFTSer.write(data[i]); } page_index_last_2 = page_index_last; @@ -789,22 +789,22 @@ namespace Anycubic { #endif } - void DgusTFT::FakeChangePageOfTFT(const uint16_t page_index) { + void DgusTFT::fakeChangePageOfTFT(const uint16_t page_index) { #if ACDEBUG(AC_MARLIN) if (page_index_saved != page_index_now) - DEBUG_ECHOLNPGM("FakeChangePageOfTFT: ", page_index); + DEBUG_ECHOLNPGM("fakeChangePageOfTFT: ", page_index); #endif - ChangePageOfTFT(page_index, true); + changePageOfTFT(page_index, true); } - void DgusTFT::LcdAudioSet(const bool audio_on) { + void DgusTFT::lcdAudioSet(const bool audio_on) { // On: 5A A5 07 82 00 80 5A 00 00 1A // Off: 5A A5 07 82 00 80 5A 00 00 12 uint8_t data[] = { 0x5A, 0xA5, 0x07, 0x82, 0x00, 0x80, 0x5A, 0x00, 0x00, uint8_t(audio_on ? 0x1A : 0x12) }; - LOOP_L_N(i, 10) TFTSer.write(data[i]); + for (uint8_t i = 0; i < 10; ++i) TFTSer.write(data[i]); } - bool DgusTFT::ReadTFTCommand() { + bool DgusTFT::readTFTCommand() { static uint8_t length = 0, cnt = 0, tft_receive_steps = 0; uint8_t data; @@ -858,7 +858,7 @@ namespace Anycubic { #if 0 { - //SERIAL_ECHOLNPGM("ReadTFTCommand: ", millis()); + //SERIAL_ECHOLNPGM("readTFTCommand: ", millis()); //return -1; bool command_ready = false; @@ -888,7 +888,7 @@ namespace Anycubic { uint8_t req = atoi(&panel_command[1]); if (req > 7 && req != 20) { DEBUG_ECHOLNPGM("> ", panel_command); - DEBUG_PRINT_PRINTER_STATE(F("printer_state: "), printer_state); + DEBUG_PRINT_PRINTER_STATE(printer_state); } #endif } @@ -896,13 +896,13 @@ namespace Anycubic { } #endif - int8_t DgusTFT::Findcmndpos(const char * buff, const char q) { + int8_t DgusTFT::findCmdPos(const char * buff, const char q) { for (int8_t pos = 0; pos < MAX_CMND_LEN; ++pos) if (buff[pos] == q) return pos; return -1; } - void DgusTFT::CheckHeaters() { + void DgusTFT::checkHeaters() { static uint32_t time_last = 0; if (PENDING(millis(), time_last)) return; time_last = millis() + 500; @@ -916,7 +916,7 @@ namespace Anycubic { if (!WITHIN(temp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP)) { faultE0Duration++; if (faultE0Duration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_nozzle_temp_abnormal); + tftSendLn(AC_msg_nozzle_temp_abnormal); #if ACDEBUG(AC_MARLIN) DEBUG_ECHOLNPGM("Extruder temp abnormal! : ", temp); #endif @@ -931,7 +931,7 @@ namespace Anycubic { if (!WITHIN(temp, BED_MINTEMP, BED_MAXTEMP)) { faultBedDuration++; if (faultBedDuration >= AC_HEATER_FAULT_VALIDATION_TIME) { - SendtoTFTLN(AC_msg_bed_temp_abnormal); + tftSendLn(AC_msg_bed_temp_abnormal); #if ACDEBUG(AC_MARLIN) DEBUG_ECHOLNPGM("Bed temp abnormal! : ", temp); #endif @@ -944,7 +944,7 @@ namespace Anycubic { // Update panel with hotend heater status if (hotend_state != AC_heater_temp_reached) { if (WITHIN(getActualTemp_celsius(E0) - getTargetTemp_celsius(E0), -1, 1)) { - SendtoTFTLN(AC_msg_nozzle_heating_done); + tftSendLn(AC_msg_nozzle_heating_done); hotend_state = AC_heater_temp_reached; } } @@ -952,22 +952,22 @@ namespace Anycubic { // Update panel with bed heater status if (hotbed_state != AC_heater_temp_reached) { if (WITHIN(getActualTemp_celsius(BED) - getTargetTemp_celsius(BED), -0.5, 0.5)) { - SendtoTFTLN(AC_msg_bed_heating_done); + tftSendLn(AC_msg_bed_heating_done); hotbed_state = AC_heater_temp_reached; } } #endif } - void DgusTFT::SendFileList(int8_t startindex) { + void DgusTFT::sendFileList(int8_t startindex) { // Respond to panel request for 4 files starting at index #if ACDEBUG(AC_INFO) - DEBUG_ECHOLNPGM("## SendFileList ## ", startindex); + DEBUG_ECHOLNPGM("## sendFileList ## ", startindex); #endif filenavigator.getFiles(startindex); } - void DgusTFT::SelectFile() { + void DgusTFT::selectFile() { strncpy(selectedfile, panel_command + 4, command_len - 4); selectedfile[command_len - 5] = '\0'; #if ACDEBUG(AC_FILE) @@ -975,22 +975,22 @@ namespace Anycubic { #endif switch (selectedfile[0]) { case '/': // Valid file selected - SendtoTFTLN(AC_msg_sd_file_open_success); + tftSendLn(AC_msg_sd_file_open_success); break; case '<': // .. (go up folder level) filenavigator.upDIR(); - SendtoTFTLN(AC_msg_sd_file_open_failed); - SendFileList(0); + tftSendLn(AC_msg_sd_file_open_failed); + sendFileList(0); break; default: // enter sub folder filenavigator.changeDIR(selectedfile); - SendtoTFTLN(AC_msg_sd_file_open_failed); - SendFileList(0); + tftSendLn(AC_msg_sd_file_open_failed); + sendFileList(0); break; } } - void DgusTFT::ProcessPanelRequest() { + void DgusTFT::processPanelRequest() { uint16_t control_index = 0; uint32_t control_value; uint16_t temp; @@ -1012,7 +1012,7 @@ namespace Anycubic { temp = constrain(uint16_t(control_value), 0, HEATER_0_MAXTEMP); setTargetTemp_celsius(temp, E0); //sprintf(str_buf,"%u/%u", (uint16_t)thermalManager.degHotend(0), uint16_t(control_value)); - //SendTxtToTFT(str_buf, TXT_PRINT_HOTEND); + //sendTxtToTFT(str_buf, TXT_PRINT_HOTEND); } #endif @@ -1022,7 +1022,7 @@ namespace Anycubic { temp = constrain(uint16_t(control_value), 0, BED_MAXTEMP); setTargetTemp_celsius(temp, BED); //sprintf(str_buf,"%u/%u", uint16_t(thermalManager.degBed()), uint16_t(control_value)); - //SendTxtToTFT(str_buf, TXT_PRINT_BED); + //sendTxtToTFT(str_buf, TXT_PRINT_BED); } #endif @@ -1030,8 +1030,8 @@ namespace Anycubic { else if (control_index == TXT_FAN_SPEED_TARGET) { // fan speed control_value = (uint16_t(data_buf[4]) << 8) | uint16_t(data_buf[5]); temp = constrain(uint16_t(control_value), 0, 100); - SendValueToTFT(temp, TXT_FAN_SPEED_NOW); - SendValueToTFT(temp, TXT_FAN_SPEED_TARGET); + sendValueToTFT(temp, TXT_FAN_SPEED_NOW); + sendValueToTFT(temp, TXT_FAN_SPEED_TARGET); setTargetFan_percent(temp, FAN0); } #endif @@ -1041,47 +1041,47 @@ namespace Anycubic { const uint16_t feedrate = constrain(uint16_t(control_value), 40, 999); //feedrate_percentage=constrain(control_value,40,999); sprintf(str_buf, "%u", feedrate); - SendTxtToTFT(str_buf, TXT_PRINT_SPEED); - SendValueToTFT(feedrate, TXT_PRINT_SPEED_NOW); - SendValueToTFT(feedrate, TXT_PRINT_SPEED_TARGET); + sendTxtToTFT(str_buf, TXT_PRINT_SPEED); + sendValueToTFT(feedrate, TXT_PRINT_SPEED_NOW); + sendValueToTFT(feedrate, TXT_PRINT_SPEED_TARGET); setFeedrate_percent(feedrate); } else if (control_index == REG_LCD_READY) { control_value = (uint32_t(data_buf[3]) << 16) | (uint32_t(data_buf[4]) << 8) | uint32_t(data_buf[5]); if (control_value == 0x010072) { // startup last gif - LcdAudioSet(lcd_info.audio_on); + lcdAudioSet(lcd_info.audio_on); - SendValueToTFT(2, ADDRESS_MOVE_DISTANCE); + sendValueToTFT(2, ADDRESS_MOVE_DISTANCE); #if ENABLED(CASE_LIGHT_ENABLE) - SendValueToTFT(getCaseLightState(), ADDRESS_SYSTEM_LED_STATUS); - SendValueToTFT(getCaseLightState(), ADDRESS_PRINT_SETTING_LED_STATUS); + sendValueToTFT(getCaseLightState(), ADDRESS_SYSTEM_LED_STATUS); + sendValueToTFT(getCaseLightState(), ADDRESS_PRINT_SETTING_LED_STATUS); #endif #if ENABLED(POWER_LOSS_RECOVERY) const bool is_outage = AC_printer_resuming_from_power_outage == printer_state; if (is_outage) { - ChangePageOfTFT(PAGE_OUTAGE_RECOVERY); + changePageOfTFT(PAGE_OUTAGE_RECOVERY); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) char filename[64] = { '\0' }; card.getLongPath(filename, recovery.info.sd_filename); - SendTxtToTFT(filename, TXT_OUTAGE_RECOVERY_FILE); + sendTxtToTFT(filename, TXT_OUTAGE_RECOVERY_FILE); #else - SendTxtToTFT(recovery.info.sd_filename, TXT_OUTAGE_RECOVERY_FILE); + sendTxtToTFT(recovery.info.sd_filename, TXT_OUTAGE_RECOVERY_FILE); #endif - PlayTune(SOS); + playTune(SOS); } #else constexpr bool is_outage = false; #endif - if (!is_outage) ChangePageOfTFT(PAGE_MAIN); + if (!is_outage) changePageOfTFT(PAGE_MAIN); } else if (control_value == 0x010000) { // startup first gif - // Startup tunes are defined in Tunes.h - PlayTune(Anycubic_PowerOn); // takes 3500 ms + // startup tunes are defined in Tunes.h + playTune(Anycubic_PowerOn); // takes 3500 ms } } @@ -1112,15 +1112,15 @@ namespace Anycubic { int8_t req = atoi(&panel_command[1]); // Information requests A0 - A8 and A33 - if (req <= 8 || req == 33) PanelInfo(req); + if (req <= 8 || req == 33) panelInfo(req); // Simple Actions A9 - A28 - else if (req <= 28) PanelAction(req); + else if (req <= 28) panelAction(req); // Process Initiation - else if (req <= 34) PanelProcess(req); + else if (req <= 34) panelProcess(req); - else SendtoTFTLN(); + else tftSendLn(); } #endif @@ -1133,7 +1133,7 @@ namespace Anycubic { } void DgusTFT::goto_system_page() { - ChangePageOfTFT(lcd_info.language == CHS + changePageOfTFT(lcd_info.language == CHS ? (lcd_info.audio_on ? PAGE_SYSTEM_CHS_AUDIO_ON : PAGE_SYSTEM_CHS_AUDIO_OFF) : (lcd_info.audio_on ? 11 : 50) // PAGE_SYSTEM_ENG_AUDIO_ON/OFF - 120 ); @@ -1142,7 +1142,7 @@ namespace Anycubic { void DgusTFT::toggle_audio() { lcd_info.audio_on = !lcd_info.audio_on; goto_system_page(); - LcdAudioSet(lcd_info.audio_on); + lcdAudioSet(lcd_info.audio_on); } void DgusTFT::store_changes() { @@ -1156,7 +1156,7 @@ namespace Anycubic { void DgusTFT::send_temperature_hotend(uint32_t addr) { char str_buf[16]; sprintf(str_buf, "%u/%u", uint16_t(getActualTemp_celsius(E0)), uint16_t(getTargetTemp_celsius(E0))); - SendTxtToTFT(str_buf, addr); + sendTxtToTFT(str_buf, addr); } #endif @@ -1164,7 +1164,7 @@ namespace Anycubic { void DgusTFT::send_temperature_bed(uint32_t addr) { char str_buf[16]; sprintf(str_buf, "%u/%u", uint16_t(getActualTemp_celsius(BED)), uint16_t(getTargetTemp_celsius(BED))); - SendTxtToTFT(str_buf, addr); + sendTxtToTFT(str_buf, addr); } #endif @@ -1186,19 +1186,19 @@ namespace Anycubic { set_descript_color(COLOR_BLUE); lcd_txtbox_index = 0; } - ChangePageOfTFT(PAGE_FILE); - SendFileList(0); + changePageOfTFT(PAGE_FILE); + sendFileList(0); } break; case 2: { // tool - ChangePageOfTFT(PAGE_TOOL); + changePageOfTFT(PAGE_TOOL); #if ENABLED(CASE_LIGHT_ENABLE) - SendValueToTFT(getCaseLightState(), ADDRESS_SYSTEM_LED_STATUS); + sendValueToTFT(getCaseLightState(), ADDRESS_SYSTEM_LED_STATUS); #endif } break; case 3: // prepare - ChangePageOfTFT(PAGE_PREPARE); + changePageOfTFT(PAGE_PREPARE); break; case 4: // system @@ -1208,7 +1208,7 @@ namespace Anycubic { #if 0 if (message_index < 30) { - SendTxtToTFT(p_mesage[message_index], TXT_MAIN_MESSAGE); + sendTxtToTFT(p_mesage[message_index], TXT_MAIN_MESSAGE); message_index = 30; } #endif @@ -1238,7 +1238,7 @@ namespace Anycubic { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); set_descript_color(COLOR_BLUE); break; @@ -1249,7 +1249,7 @@ namespace Anycubic { set_descript_color(COLOR_BLUE); lcd_txtbox_index = 0; - SendFileList(lcd_txtbox_page * 5); + sendFileList(lcd_txtbox_page * 5); } break; @@ -1260,7 +1260,7 @@ namespace Anycubic { set_descript_color(COLOR_BLUE); lcd_txtbox_index = 0; - SendFileList(lcd_txtbox_page * 5); + sendFileList(lcd_txtbox_page * 5); } break; @@ -1274,12 +1274,12 @@ namespace Anycubic { set_descript_color(COLOR_BLUE); lcd_txtbox_index = 0; } - SendFileList(lcd_txtbox_index); + sendFileList(lcd_txtbox_index); break; case 5: // resume of outage(last power off) #if ACDEBUG(AC_MARLIN) - DEBUG_PRINT_PRINTER_STATE(F("printer_state: "), printer_state); + DEBUG_PRINT_PRINTER_STATE(printer_state); #endif if (lcd_txtbox_index > 0 && lcd_txtbox_index < 6) { // 1~5 @@ -1292,14 +1292,14 @@ namespace Anycubic { char str_buf[20]; strncpy_P(str_buf, filenavigator.filelist.longFilename(), 17); str_buf[17] = '\0'; - SendTxtToTFT(str_buf, TXT_PRINT_NAME); + sendTxtToTFT(str_buf, TXT_PRINT_NAME); #if ENABLED(POWER_LOSS_RECOVERY) if (printer_state == AC_printer_resuming_from_power_outage) { // Need to home here to restore the Z position //injectCommands(AC_cmnd_power_loss_recovery); //SERIAL_ECHOLNPGM("start resuming from power outage: ", AC_cmnd_power_loss_recovery); - ChangePageOfTFT(PAGE_STATUS2); // show pause + changePageOfTFT(PAGE_STATUS2); // show pause injectCommands(F("M1000")); // home and start recovery } #endif @@ -1331,20 +1331,20 @@ namespace Anycubic { char str_buf[20]; strncpy_P(str_buf, filenavigator.filelist.longFilename(), 17); str_buf[17] = '\0'; - SendTxtToTFT(str_buf, TXT_PRINT_NAME); + sendTxtToTFT(str_buf, TXT_PRINT_NAME); sprintf(str_buf, "%5.2f", getFeedrate_percent()); - SendTxtToTFT(str_buf, TXT_PRINT_SPEED); + sendTxtToTFT(str_buf, TXT_PRINT_SPEED); sprintf(str_buf, "%u", uint16_t(getProgress_percent())); - SendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); + sendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); uint32_t time = 0; sprintf(str_buf, "%s H ", utostr3(time / 60)); sprintf(str_buf + strlen(str_buf), "%s M", utostr3(time % 60)); - SendTxtToTFT(str_buf, TXT_PRINT_TIME); + sendTxtToTFT(str_buf, TXT_PRINT_TIME); - ChangePageOfTFT(PAGE_STATUS2); + changePageOfTFT(PAGE_STATUS2); } } break; @@ -1393,13 +1393,13 @@ namespace Anycubic { case 1: // return if (!isPrintingFromMedia()) // only idle status can return - ChangePageOfTFT(PAGE_FILE); + changePageOfTFT(PAGE_FILE); break; case 2: // resume print #if ACDEBUG(AC_MARLIN) - DEBUG_PRINT_PRINTER_STATE(F("printer_state: "), printer_state); - DEBUG_PRINT_PAUSED_STATE(F("pause_state :"), pause_state); + DEBUG_PRINT_PRINTER_STATE(printer_state); + DEBUG_PRINT_PAUSED_STATE(pause_state); #endif if ( pause_state == AC_paused_idle || pause_state == AC_paused_filament_lack @@ -1408,7 +1408,7 @@ namespace Anycubic { printer_state = AC_printer_idle; pause_state = AC_paused_idle; resumePrint(); - ChangePageOfTFT(PAGE_STATUS2); // show pause print + changePageOfTFT(PAGE_STATUS2); // show pause print flash_time = ms + 1500; } else @@ -1417,16 +1417,16 @@ namespace Anycubic { case 3: // print stop if (isPrintingFromMedia()) - ChangePageOfTFT(PAGE_STOP_CONF); + changePageOfTFT(PAGE_STOP_CONF); break; case 4: // print change param - ChangePageOfTFT(PAGE_ADJUST); - TERN_(CASE_LIGHT_ENABLE, SendValueToTFT(getCaseLightState(), ADDRESS_PRINT_SETTING_LED_STATUS)); - TERN_(HAS_HOTEND, SendValueToTFT(uint16_t(getTargetTemp_celsius(E0)), TXT_ADJUST_HOTEND)); - TERN_(HAS_HEATED_BED, SendValueToTFT(uint16_t(getTargetTemp_celsius(BED)), TXT_ADJUST_BED)); + changePageOfTFT(PAGE_ADJUST); + TERN_(CASE_LIGHT_ENABLE, sendValueToTFT(getCaseLightState(), ADDRESS_PRINT_SETTING_LED_STATUS)); + TERN_(HAS_HOTEND, sendValueToTFT(uint16_t(getTargetTemp_celsius(E0)), TXT_ADJUST_HOTEND)); + TERN_(HAS_HEATED_BED, sendValueToTFT(uint16_t(getTargetTemp_celsius(BED)), TXT_ADJUST_BED)); feedrate_back = getFeedrate_percent(); - SendValueToTFT(uint16_t(feedrate_back), TXT_ADJUST_SPEED); + sendValueToTFT(uint16_t(feedrate_back), TXT_ADJUST_SPEED); flash_time = ms + 1500; break; } @@ -1444,13 +1444,13 @@ namespace Anycubic { DEBUG_ECHOLNPGM("print speed: ", str_buf); DEBUG_ECHOLNPGM("feedrate_back: ", feedrate_back); #endif - SendTxtToTFT(str_buf, TXT_PRINT_SPEED); + sendTxtToTFT(str_buf, TXT_PRINT_SPEED); feedrate_back = getFeedrate_percent(); } if (progress_last != getProgress_percent()) { sprintf(str_buf, "%u", getProgress_percent()); - SendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); + sendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); progress_last = getProgress_percent(); } @@ -1458,7 +1458,7 @@ namespace Anycubic { uint32_t time = getProgress_seconds_elapsed() / 60; sprintf(str_buf, "%s H ", utostr3(time / 60)); sprintf(str_buf + strlen(str_buf), "%s M", utostr3(time % 60)); - SendTxtToTFT(str_buf, TXT_PRINT_TIME); + sendTxtToTFT(str_buf, TXT_PRINT_TIME); TERN_(HAS_HOTEND, send_temperature_hotend(TXT_PRINT_HOTEND)); TERN_(HAS_HEATED_BED, send_temperature_bed(TXT_PRINT_BED)); @@ -1481,7 +1481,7 @@ namespace Anycubic { case 1: // return if (!isPrintingFromMedia()) // only is idle status can return - ChangePageOfTFT(PAGE_FILE); + changePageOfTFT(PAGE_FILE); break; case 2: // print pause @@ -1489,29 +1489,29 @@ namespace Anycubic { pausePrint(); printer_state = AC_printer_pausing; pause_state = AC_paused_idle; - ChangePageOfTFT(PAGE_WAIT_PAUSE); + changePageOfTFT(PAGE_WAIT_PAUSE); //injectCommands(F("M108")); // stop waiting temperature M109 } break; case 3: // print stop if (isPrintingFromMedia()) - ChangePageOfTFT(PAGE_STOP_CONF); + changePageOfTFT(PAGE_STOP_CONF); break; case 4: // print settings - ChangePageOfTFT(PAGE_ADJUST); - TERN_(CASE_LIGHT_ENABLE, SendValueToTFT(getCaseLightState(), ADDRESS_PRINT_SETTING_LED_STATUS)); - TERN_(HAS_HOTEND, SendValueToTFT(uint16_t(getTargetTemp_celsius(E0)), TXT_ADJUST_HOTEND)); - TERN_(HAS_HEATED_BED, SendValueToTFT(uint16_t(getTargetTemp_celsius(BED)), TXT_ADJUST_BED)); + changePageOfTFT(PAGE_ADJUST); + TERN_(CASE_LIGHT_ENABLE, sendValueToTFT(getCaseLightState(), ADDRESS_PRINT_SETTING_LED_STATUS)); + TERN_(HAS_HOTEND, sendValueToTFT(uint16_t(getTargetTemp_celsius(E0)), TXT_ADJUST_HOTEND)); + TERN_(HAS_HEATED_BED, sendValueToTFT(uint16_t(getTargetTemp_celsius(BED)), TXT_ADJUST_BED)); feedrate_back = getFeedrate_percent(); - SendValueToTFT((uint16_t)feedrate_back, TXT_ADJUST_SPEED); - TERN_(HAS_FAN, SendValueToTFT(uint16_t(getActualFan_percent(FAN0)), TXT_FAN_SPEED_TARGET)); + sendValueToTFT((uint16_t)feedrate_back, TXT_ADJUST_SPEED); + TERN_(HAS_FAN, sendValueToTFT(uint16_t(getActualFan_percent(FAN0)), TXT_FAN_SPEED_TARGET)); str_buf[0] = 0; strcat(str_buf, ftostr52sprj(getZOffset_mm()) + 3); - SendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); - //SendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); - RequestValueFromTFT(TXT_ADJUST_SPEED); // attempt to make feedrate visible on visit to this page + sendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); + //sendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); + requestValueFromTFT(TXT_ADJUST_SPEED); // attempt to make feedrate visible on visit to this page break; } @@ -1526,20 +1526,20 @@ namespace Anycubic { else sprintf(str_buf, "%d", feedrate_back); - SendTxtToTFT(str_buf, TXT_PRINT_SPEED); + sendTxtToTFT(str_buf, TXT_PRINT_SPEED); feedrate_back = getFeedrate_percent(); } if (progress_last != getProgress_percent()) { sprintf(str_buf, "%u", getProgress_percent()); - SendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); + sendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); progress_last = getProgress_percent(); } uint32_t time = getProgress_seconds_elapsed() / 60; sprintf(str_buf, "%s H ", utostr3(time / 60)); sprintf(str_buf + strlen(str_buf), "%s M", utostr3(time % 60)); - SendTxtToTFT(str_buf, TXT_PRINT_TIME); + sendTxtToTFT(str_buf, TXT_PRINT_TIME); TERN_(HAS_HOTEND, send_temperature_hotend(TXT_PRINT_HOTEND)); TERN_(HAS_HEATED_BED, send_temperature_bed(TXT_PRINT_BED)); @@ -1560,9 +1560,9 @@ namespace Anycubic { case 1: // return if (AC_printer_printing == printer_state) - ChangePageOfTFT(PAGE_STATUS2); // show pause + changePageOfTFT(PAGE_STATUS2); // show pause else if (AC_printer_paused == printer_state) - ChangePageOfTFT(PAGE_STATUS1); // show print + changePageOfTFT(PAGE_STATUS1); // show print break; #if ENABLED(MESH_EDIT_MENU) @@ -1578,8 +1578,8 @@ namespace Anycubic { char str_buf[10]; str_buf[0] = 0; strcat(str_buf, ftostr52sprj(getZOffset_mm()) + 2); - SendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); - //SendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); + sendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); + //sendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); //if (isAxisPositionKnown(Z)) { // Move Z axis // SERIAL_ECHOLNPGM("Z now:", getAxisPosition_mm(Z)); @@ -1619,8 +1619,8 @@ namespace Anycubic { char str_buf[10]; str_buf[0] = '\0'; strcat(str_buf, ftostr52sprj(getZOffset_mm()) + 2); - SendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); - //SendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); + sendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); + //sendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); //int16_t steps = mmToWholeSteps(constrain(Zshift,-0.05,0.05), Z); @@ -1655,22 +1655,22 @@ namespace Anycubic { #if ENABLED(CASE_LIGHT_ENABLE) case 4: { // light control const bool cls = !getCaseLightState(); - SendValueToTFT(cls, ADDRESS_PRINT_SETTING_LED_STATUS); + sendValueToTFT(cls, ADDRESS_PRINT_SETTING_LED_STATUS); setCaseLightState(cls); } break; #endif case 5: - ChangePageOfTFT(PAGE_DONE); + changePageOfTFT(PAGE_DONE); break; case 6: break; case 7: - TERN_(HAS_HEATED_BED, RequestValueFromTFT(TXT_ADJUST_BED)); - RequestValueFromTFT(TXT_ADJUST_SPEED); - TERN_(HAS_HOTEND, RequestValueFromTFT(TXT_ADJUST_HOTEND)); - TERN_(HAS_FAN, RequestValueFromTFT(TXT_FAN_SPEED_TARGET)); + TERN_(HAS_HEATED_BED, requestValueFromTFT(TXT_ADJUST_BED)); + requestValueFromTFT(TXT_ADJUST_SPEED); + TERN_(HAS_HOTEND, requestValueFromTFT(TXT_ADJUST_HOTEND)); + TERN_(HAS_FAN, requestValueFromTFT(TXT_FAN_SPEED_TARGET)); if (z_change == true) { injectCommands(F("M500")); @@ -1678,9 +1678,9 @@ namespace Anycubic { } if (AC_printer_printing == printer_state) - ChangePageOfTFT(PAGE_STATUS2); // show pause + changePageOfTFT(PAGE_STATUS2); // show pause else if (AC_printer_paused == printer_state) - ChangePageOfTFT(PAGE_STATUS1); // show print + changePageOfTFT(PAGE_STATUS1); // show print break; } @@ -1712,33 +1712,33 @@ namespace Anycubic { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); break; case 2: - ChangePageOfTFT(PAGE_MOVE); + changePageOfTFT(PAGE_MOVE); break; case 3: // set temperature - ChangePageOfTFT(PAGE_TEMP); + changePageOfTFT(PAGE_TEMP); #if HAS_HOTEND - SendValueToTFT(uint16_t(getActualTemp_celsius(E0)), TXT_HOTEND_NOW); - SendValueToTFT(uint16_t(getTargetTemp_celsius(E0)), TXT_HOTEND_TARGET); + sendValueToTFT(uint16_t(getActualTemp_celsius(E0)), TXT_HOTEND_NOW); + sendValueToTFT(uint16_t(getTargetTemp_celsius(E0)), TXT_HOTEND_TARGET); #endif #if HAS_HEATED_BED - SendValueToTFT(uint16_t(getActualTemp_celsius(BED)), TXT_BED_NOW); - SendValueToTFT(uint16_t(getTargetTemp_celsius(BED)), TXT_BED_TARGET); + sendValueToTFT(uint16_t(getActualTemp_celsius(BED)), TXT_BED_NOW); + sendValueToTFT(uint16_t(getTargetTemp_celsius(BED)), TXT_BED_TARGET); #endif break; case 4: - ChangePageOfTFT(PAGE_SPEED); + changePageOfTFT(PAGE_SPEED); #if HAS_FAN - SendValueToTFT(uint16_t(getActualFan_percent(FAN0)), TXT_FAN_SPEED_NOW); - SendValueToTFT(uint16_t(getTargetFan_percent(FAN0)), TXT_FAN_SPEED_TARGET); + sendValueToTFT(uint16_t(getActualFan_percent(FAN0)), TXT_FAN_SPEED_NOW); + sendValueToTFT(uint16_t(getTargetFan_percent(FAN0)), TXT_FAN_SPEED_TARGET); #endif - SendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_NOW); - SendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_TARGET); + sendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_NOW); + sendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_TARGET); break; case 5: // turn off the xyz motor @@ -1749,7 +1749,7 @@ namespace Anycubic { #if ENABLED(CASE_LIGHT_ENABLE) case 6: { // light control const bool cls = !getCaseLightState(); - SendValueToTFT(cls, ADDRESS_SYSTEM_LED_STATUS); + sendValueToTFT(cls, ADDRESS_SYSTEM_LED_STATUS); setCaseLightState(cls); } break; #endif @@ -1780,7 +1780,7 @@ namespace Anycubic { break; case 1: // return - ChangePageOfTFT(PAGE_TOOL); + changePageOfTFT(PAGE_TOOL); break; case 5: @@ -1835,17 +1835,17 @@ namespace Anycubic { case 3: move_dis = 0.1f; - SendValueToTFT(1, ADDRESS_MOVE_DISTANCE); + sendValueToTFT(1, ADDRESS_MOVE_DISTANCE); break; case 7: move_dis = 1.0f; - SendValueToTFT(2, ADDRESS_MOVE_DISTANCE); + sendValueToTFT(2, ADDRESS_MOVE_DISTANCE); break; case 11: move_dis = 10.0f; - SendValueToTFT(3, ADDRESS_MOVE_DISTANCE); + sendValueToTFT(3, ADDRESS_MOVE_DISTANCE); break; //case 14: @@ -1875,7 +1875,7 @@ namespace Anycubic { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_TOOL); + changePageOfTFT(PAGE_TOOL); break; case 2: break; @@ -1886,13 +1886,13 @@ namespace Anycubic { case 6: // cooling setTargetTemp_celsius(0, E0); setTargetTemp_celsius(0, BED); - ChangePageOfTFT(PAGE_TOOL); + changePageOfTFT(PAGE_TOOL); break; case 7: // send target temp - RequestValueFromTFT(TXT_HOTEND_TARGET); - RequestValueFromTFT(TXT_BED_TARGET); - ChangePageOfTFT(PAGE_TOOL); + requestValueFromTFT(TXT_HOTEND_TARGET); + requestValueFromTFT(TXT_BED_TARGET); + changePageOfTFT(PAGE_TOOL); break; } @@ -1901,8 +1901,8 @@ namespace Anycubic { if (PENDING(ms, flash_time)) return; flash_time = ms + 1500; - SendValueToTFT(uint16_t(getActualTemp_celsius(E0)), TXT_HOTEND_NOW); - SendValueToTFT(uint16_t(getActualTemp_celsius(BED)), TXT_BED_NOW); + sendValueToTFT(uint16_t(getActualTemp_celsius(E0)), TXT_HOTEND_NOW); + sendValueToTFT(uint16_t(getActualTemp_celsius(BED)), TXT_BED_NOW); } void DgusTFT::page10() { @@ -1917,7 +1917,7 @@ namespace Anycubic { switch (key_value) { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_TOOL); + changePageOfTFT(PAGE_TOOL); break; case 2: break; @@ -1926,9 +1926,9 @@ namespace Anycubic { case 5: break; case 6: // ok - RequestValueFromTFT(TXT_FAN_SPEED_TARGET); - RequestValueFromTFT(TXT_PRINT_SPEED_TARGET); - ChangePageOfTFT(PAGE_TOOL); + requestValueFromTFT(TXT_FAN_SPEED_TARGET); + requestValueFromTFT(TXT_PRINT_SPEED_TARGET); + changePageOfTFT(PAGE_TOOL); break; } @@ -1937,8 +1937,8 @@ namespace Anycubic { if (PENDING(ms, flash_time)) return; flash_time = ms + 1500; - SendValueToTFT(uint16_t(getActualFan_percent(FAN0)), TXT_FAN_SPEED_NOW); - SendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_NOW); + sendValueToTFT(uint16_t(getActualFan_percent(FAN0)), TXT_FAN_SPEED_NOW); + sendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_NOW); } void DgusTFT::page11() { @@ -1953,7 +1953,7 @@ namespace Anycubic { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); store_changes(); break; @@ -1972,12 +1972,12 @@ namespace Anycubic { char str_ver[32]; //sprintf(str_ver, "%04d-%02d-%02d %02d:%02d:%02d\n", BUILD_YEAR, BUILD_MONTH, BUILD_DAY, BUILD_HOUR, BUILD_MIN, BUILD_SEC); sprintf(str_ver, MAIN_BOARD_FIRMWARE_VER); - SendTxtToTFT(str_ver, TXT_VERSION); - ChangePageOfTFT(PAGE_ABOUT); + sendTxtToTFT(str_ver, TXT_VERSION); + changePageOfTFT(PAGE_ABOUT); } break; case 6: - ChangePageOfTFT(PAGE_RECORD); + changePageOfTFT(PAGE_RECORD); break; } } @@ -1993,7 +1993,7 @@ namespace Anycubic { switch (key_value) { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_SYSTEM_CHS_AUDIO_ON); + changePageOfTFT(PAGE_SYSTEM_CHS_AUDIO_ON); break; } } @@ -2047,16 +2047,16 @@ namespace Anycubic { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); break; case 2: - ChangePageOfTFT(PAGE_PreLEVEL); + changePageOfTFT(PAGE_PreLEVEL); break; #if HAS_HOTEND || HAS_HEATED_BED case 3: { - ChangePageOfTFT(PAGE_PREHEAT); + changePageOfTFT(PAGE_PREHEAT); TERN_(HAS_HOTEND, send_temperature_hotend(TXT_PREHEAT_HOTEND)); TERN_(HAS_HEATED_BED, send_temperature_bed(TXT_PREHEAT_BED)); } break; @@ -2065,7 +2065,7 @@ namespace Anycubic { #if HAS_EXTRUDERS case 4: { send_temperature_hotend(TXT_FILAMENT_TEMP); - ChangePageOfTFT(PAGE_FILAMENT); + changePageOfTFT(PAGE_FILAMENT); } break; #endif } @@ -2082,13 +2082,13 @@ namespace Anycubic { switch (key_value) { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_PREPARE); + changePageOfTFT(PAGE_PREPARE); break; case 2: if (!isPrinting()) { - //ChangePageOfTFT(PAGE_LEVEL_ENSURE); - ChangePageOfTFT(PAGE_CHS_PROBE_PRECHECK); + //changePageOfTFT(PAGE_LEVEL_ENSURE); + changePageOfTFT(PAGE_CHS_PROBE_PRECHECK); } break; @@ -2096,13 +2096,13 @@ namespace Anycubic { char str_buf[10]; str_buf[0] = '\0'; strcat(str_buf, ftostr52sprj(getZOffset_mm()) + 2); - SendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); - //SendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); - ChangePageOfTFT(PAGE_LEVEL_ADVANCE); + sendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); + //sendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); + changePageOfTFT(PAGE_LEVEL_ADVANCE); } break; case 4: - ChangePageOfTFT(PAGE_AUTO_OFFSET); + changePageOfTFT(PAGE_AUTO_OFFSET); break; } } @@ -2120,7 +2120,7 @@ namespace Anycubic { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_PreLEVEL); + changePageOfTFT(PAGE_PreLEVEL); break; case 2: { @@ -2131,8 +2131,8 @@ namespace Anycubic { char str_buf[10]; strcat(str_buf, ftostr52sprj(getZOffset_mm()) + 2); - SendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); - //SendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); + sendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); + //sendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); if (isAxisPositionKnown(Z)) { const float currZpos = getAxisPosition_mm(Z); @@ -2150,8 +2150,8 @@ namespace Anycubic { char str_buf[10]; strcat(str_buf, ftostr52sprj(getZOffset_mm()) + 2); - SendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); - //SendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); + sendTxtToTFT(str_buf, TXT_LEVEL_OFFSET); + //sendTxtToTFT(ftostr52sprj(getZOffset_mm()), TXT_LEVEL_OFFSET); if (isAxisPositionKnown(Z)) { // Move Z axis const float currZpos = getAxisPosition_mm(Z); @@ -2173,7 +2173,7 @@ namespace Anycubic { } injectCommands(F("M500")); #endif - ChangePageOfTFT(PAGE_PREPARE); + changePageOfTFT(PAGE_PREPARE); break; } } @@ -2193,19 +2193,19 @@ namespace Anycubic { case 0: break; case 1: // return - ChangePageOfTFT(PAGE_PREPARE); + changePageOfTFT(PAGE_PREPARE); break; case 2: // PLA TERN_(HAS_HOTEND, setTargetTemp_celsius(190, E0)); TERN_(HAS_HEATED_BED, setTargetTemp_celsius(60, BED)); - ChangePageOfTFT(PAGE_PREHEAT); + changePageOfTFT(PAGE_PREHEAT); break; case 3: // ABS TERN_(HAS_HOTEND, setTargetTemp_celsius(240, E0)); TERN_(HAS_HEATED_BED, setTargetTemp_celsius(100, BED)); - ChangePageOfTFT(PAGE_PREHEAT); + changePageOfTFT(PAGE_PREHEAT); break; } @@ -2238,13 +2238,13 @@ namespace Anycubic { case 1: // return filament_status = 0; injectCommands(F("G90")); - ChangePageOfTFT(PAGE_PREPARE); + changePageOfTFT(PAGE_PREPARE); break; case 2: // Filament in if (getActualTemp_celsius(E0) < 220) { filament_status = 0; - ChangePageOfTFT(PAGE_FILAMENT_HEAT); + changePageOfTFT(PAGE_FILAMENT_HEAT); } else { filament_status = 1; @@ -2255,7 +2255,7 @@ namespace Anycubic { case 3: // filament out if (getActualTemp_celsius(E0) < 220) { filament_status = 0; - ChangePageOfTFT(PAGE_FILAMENT_HEAT); + changePageOfTFT(PAGE_FILAMENT_HEAT); } else { filament_status = 2; @@ -2301,7 +2301,7 @@ namespace Anycubic { switch (key_value) { case 0: break; case 1: // return - ChangePageOfTFT(page_index_last); + changePageOfTFT(page_index_last); break; } @@ -2324,7 +2324,7 @@ namespace Anycubic { case 0: break; case 1: // return - ChangePageOfTFT(page_index_last); + changePageOfTFT(page_index_last); break; case 2: break; @@ -2350,7 +2350,7 @@ namespace Anycubic { case 1: // OK to finish TERN_(CASE_LIGHT_ENABLE, setCaseLightState(false)); - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); break; case 2: break; @@ -2373,8 +2373,8 @@ namespace Anycubic { switch (key_value) { case 0: break; - case 1: ChangePageOfTFT(page_index_last); break; // return - case 2: ChangePageOfTFT(page_index_last); break; + case 1: changePageOfTFT(page_index_last); break; // return + case 2: changePageOfTFT(page_index_last); break; } static millis_t flash_time = 0; @@ -2394,8 +2394,8 @@ namespace Anycubic { switch (key_value) { case 0: break; - case 1: ChangePageOfTFT(page_index_last); break; // return - case 2: ChangePageOfTFT(page_index_last); break; + case 1: changePageOfTFT(page_index_last); break; // return + case 2: changePageOfTFT(page_index_last); break; } static millis_t flash_time = 0; @@ -2418,14 +2418,14 @@ namespace Anycubic { case 1: // return #if ACDEBUG(AC_MARLIN) - DEBUG_PRINT_PRINTER_STATE(F("printer_state: "), printer_state); - DEBUG_PRINT_PAUSED_STATE(F("pause_state: "), pause_state); + DEBUG_PRINT_PRINTER_STATE(printer_state); + DEBUG_PRINT_PAUSED_STATE(pause_state); #endif if (AC_printer_printing == printer_state) - ChangePageOfTFT(PAGE_STATUS2); // show pause + changePageOfTFT(PAGE_STATUS2); // show pause else if (AC_printer_paused == printer_state) { //injectCommands(F("M108")); - ChangePageOfTFT(PAGE_STATUS1); // show resume + changePageOfTFT(PAGE_STATUS1); // show resume } break; } @@ -2447,7 +2447,7 @@ namespace Anycubic { switch (key_value) { case 0: break; - case 1: ChangePageOfTFT(page_index_last); break; // return + case 1: changePageOfTFT(page_index_last); break; // return case 2: break; } @@ -2474,7 +2474,7 @@ namespace Anycubic { printer_state = AC_printer_stopping; stopPrint(); message_index = 6; - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); } else { if (printer_state == AC_printer_resuming_from_power_outage) @@ -2485,9 +2485,9 @@ namespace Anycubic { case 2: // return if (AC_printer_printing == printer_state) - ChangePageOfTFT(PAGE_STATUS2); // show pause + changePageOfTFT(PAGE_STATUS2); // show pause else if (AC_printer_paused == printer_state) - ChangePageOfTFT(PAGE_STATUS1); // show print + changePageOfTFT(PAGE_STATUS1); // show print break; } @@ -2508,7 +2508,7 @@ namespace Anycubic { switch (key_value) { case 0: break; - case 1: ChangePageOfTFT(page_index_last); break; // return + case 1: changePageOfTFT(page_index_last); break; // return case 2: break; } @@ -2532,7 +2532,7 @@ namespace Anycubic { case 1: // return TERN_(CASE_LIGHT_ENABLE, setCaseLightState(false)); - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); break; case 2: break; @@ -2558,7 +2558,7 @@ namespace Anycubic { case 1: // return setTargetTemp_celsius(230, E0); - ChangePageOfTFT(PAGE_FILAMENT); + changePageOfTFT(PAGE_FILAMENT); break; } @@ -2629,21 +2629,21 @@ namespace Anycubic { ) { setTargetTemp_celsius(LEVELING_NOZZLE_TEMP, E0); setTargetTemp_celsius(LEVELING_BED_TEMP, BED); - ChangePageOfTFT(PAGE_CHS_PROBE_PREHEATING); + changePageOfTFT(PAGE_CHS_PROBE_PREHEATING); } else - ChangePageOfTFT(PAGE_LEVELING); + changePageOfTFT(PAGE_LEVELING); #else - ChangePageOfTFT(PAGE_LEVELING); + changePageOfTFT(PAGE_LEVELING); #endif #endif - ChangePageOfTFT(PAGE_LEVELING); + changePageOfTFT(PAGE_LEVELING); break; case 2: - ChangePageOfTFT(PAGE_PreLEVEL); + changePageOfTFT(PAGE_PreLEVEL); break; } @@ -2674,7 +2674,7 @@ namespace Anycubic { if (pop_up_index == 25) { pop_up_index = 100; - ChangePageOfTFT(PAGE_PreLEVEL); + changePageOfTFT(PAGE_PreLEVEL); } } @@ -2692,7 +2692,7 @@ namespace Anycubic { switch (key_value) { case 0: break; - case 1: ChangePageOfTFT(PAGE_PreLEVEL); break; + case 1: changePageOfTFT(PAGE_PreLEVEL); break; case 2: { injectCommands(F("M1024 S3")); // -1 @@ -2725,7 +2725,7 @@ namespace Anycubic { case 0: break; case 1: - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); store_changes(); break; @@ -2744,12 +2744,12 @@ namespace Anycubic { char str_ver[32]; //sprintf(str_ver, "%04d-%02d-%02d %02d:%02d:%02d\n", BUILD_YEAR, BUILD_MONTH, BUILD_DAY, BUILD_HOUR, BUILD_MIN, BUILD_SEC); sprintf(str_ver, MAIN_BOARD_FIRMWARE_VER); - SendTxtToTFT(str_ver, TXT_VERSION); - ChangePageOfTFT(PAGE_ABOUT); + sendTxtToTFT(str_ver, TXT_VERSION); + changePageOfTFT(PAGE_ABOUT); break; case 6: - ChangePageOfTFT(PAGE_RECORD); + changePageOfTFT(PAGE_RECORD); break; } } @@ -2763,7 +2763,7 @@ namespace Anycubic { //DEBUG_ECHOLNPGM("update feedrate percent"); } #endif - SendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_NOW); + sendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_NOW); } void DgusTFT::page125() { // first time into page 125 the feedrate percent is not set @@ -2775,7 +2775,7 @@ namespace Anycubic { //DEBUG_ECHOLNPGM("update feedrate percent"); } #endif - SendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_NOW); + sendValueToTFT(uint16_t(getFeedrate_percent()), TXT_PRINT_SPEED_NOW); } void DgusTFT::page170() { // ENG Mute handler @@ -2790,7 +2790,7 @@ namespace Anycubic { case 0: break; case 1: - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); store_changes(); break; @@ -2809,12 +2809,12 @@ namespace Anycubic { char str_ver[32]; //sprintf(str_ver, "%04d-%02d-%02d %02d:%02d:%02d\n", BUILD_YEAR, BUILD_MONTH, BUILD_DAY, BUILD_HOUR, BUILD_MIN, BUILD_SEC); sprintf(str_ver, MAIN_BOARD_FIRMWARE_VER); - SendTxtToTFT(str_ver, TXT_VERSION); - ChangePageOfTFT(PAGE_ABOUT); + sendTxtToTFT(str_ver, TXT_VERSION); + changePageOfTFT(PAGE_ABOUT); break; case 6: - ChangePageOfTFT(PAGE_RECORD); + changePageOfTFT(PAGE_RECORD); break; } } @@ -2836,29 +2836,29 @@ namespace Anycubic { case 0: break; case 1: { // resume - ChangePageOfTFT(PAGE_OUTAGE_RECOVERY); + changePageOfTFT(PAGE_OUTAGE_RECOVERY); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) card.getLongPath(filename, recovery.info.sd_filename); filename[17] = '\0'; - SendTxtToTFT(filename, TXT_OUTAGE_RECOVERY_FILE); + sendTxtToTFT(filename, TXT_OUTAGE_RECOVERY_FILE); #else - SendTxtToTFT(recovery.info.sd_filename, TXT_OUTAGE_RECOVERY_FILE); + sendTxtToTFT(recovery.info.sd_filename, TXT_OUTAGE_RECOVERY_FILE); #endif char str_buf[20] = { '\0' }; sprintf(str_buf, "%u", uint16_t(getFeedrate_percent())); - SendTxtToTFT(str_buf, TXT_PRINT_SPEED); + sendTxtToTFT(str_buf, TXT_PRINT_SPEED); sprintf(str_buf, "%u", uint16_t(getProgress_percent())); - SendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); + sendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); - ChangePageOfTFT(PAGE_STATUS2); // show pause + changePageOfTFT(PAGE_STATUS2); // show pause injectCommands(F("M355 S1\nM1000")); // case light on, home and start recovery } break; case 2: // cancel printer_state = AC_printer_idle; - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); injectCommands(F("M355 S0\nM1000 C")); // cancel recovery break; } @@ -2879,29 +2879,29 @@ namespace Anycubic { case 0: break; case 1: { // resume - ChangePageOfTFT(PAGE_OUTAGE_RECOVERY); + changePageOfTFT(PAGE_OUTAGE_RECOVERY); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) card.getLongPath(filename, recovery.info.sd_filename); filename[17] = '\0'; - SendTxtToTFT(filename, TXT_OUTAGE_RECOVERY_FILE); + sendTxtToTFT(filename, TXT_OUTAGE_RECOVERY_FILE); #else - SendTxtToTFT(recovery.info.sd_filename, TXT_OUTAGE_RECOVERY_FILE); + sendTxtToTFT(recovery.info.sd_filename, TXT_OUTAGE_RECOVERY_FILE); #endif char str_buf[20] = { '\0' }; sprintf(str_buf, "%u", uint16_t(getFeedrate_percent())); - SendTxtToTFT(str_buf, TXT_PRINT_SPEED); + sendTxtToTFT(str_buf, TXT_PRINT_SPEED); sprintf(str_buf, "%u", uint16_t(getProgress_percent())); - SendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); + sendTxtToTFT(str_buf, TXT_PRINT_PROGRESS); - ChangePageOfTFT(PAGE_STATUS2); // show pause + changePageOfTFT(PAGE_STATUS2); // show pause injectCommands(F("M355 S1\nM1000")); // case light on, home and start recovery } break; case 2: // cancel printer_state = AC_printer_idle; - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); injectCommands(F("M355 S0\nM1000 C")); // cancel recovery break; } @@ -2976,14 +2976,14 @@ namespace Anycubic { } if (PAGE_STATUS1 == page_index_last_2 || PAGE_STATUS2 == page_index_last_2 || PAGE_PRINT_FINISH == page_index_last) - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); else - ChangePageOfTFT(page_index_last_2); + changePageOfTFT(page_index_last_2); } else { if (lcd_info.language == ENG && page_index_last > 120) page_index_last -= 120; - ChangePageOfTFT(page_index_last); + changePageOfTFT(page_index_last); } onSurviveInKilled(); @@ -3012,10 +3012,10 @@ namespace Anycubic { if (isPrinting() || isPrintingPaused() || isPrintingFromMedia()) { printer_state = AC_printer_stopping; stopPrint(); - ChangePageOfTFT(PAGE_MAIN); + changePageOfTFT(PAGE_MAIN); } else - ChangePageOfTFT(page_index_last); + changePageOfTFT(page_index_last); onSurviveInKilled(); break; @@ -3041,7 +3041,7 @@ namespace Anycubic { //DEBUG_ECHOLNPGM("page_index_last_2: ", page_index_last_2); #endif onSurviveInKilled(); - ChangePageOfTFT(PAGE_PreLEVEL); + changePageOfTFT(PAGE_PreLEVEL); break; default: break; @@ -3081,7 +3081,7 @@ namespace Anycubic { if (getProbeState()) { // triggered too early probe_check_counter = 0; probe_tare_flag = 0; - ChangePageOfTFT(PAGE_CHS_PROBE_PRECHECK_FAILED); + changePageOfTFT(PAGE_CHS_PROBE_PRECHECK_FAILED); } probe_tare_flag = 1; } @@ -3090,7 +3090,7 @@ namespace Anycubic { case 1: // cancel probe_check_counter = 0; probe_tare_flag = 0; - ChangePageOfTFT(PAGE_PreLEVEL); + changePageOfTFT(PAGE_PreLEVEL); break; default: break; @@ -3102,7 +3102,7 @@ namespace Anycubic { if (!probe_state_last && getProbeState()) { probe_check_counter = 0; probe_tare_flag = 0; - ChangePageOfTFT(PAGE_CHS_PROBE_PRECHECK_OK); + changePageOfTFT(PAGE_CHS_PROBE_PRECHECK_OK); } probe_state_last = getProbeState(); @@ -3110,7 +3110,7 @@ namespace Anycubic { if (probe_check_counter++ >= 200) { // waiting for 1 min probe_check_counter = 0; probe_tare_flag = 0; - ChangePageOfTFT(PAGE_CHS_PROBE_PRECHECK_FAILED); + changePageOfTFT(PAGE_CHS_PROBE_PRECHECK_FAILED); } } @@ -3138,7 +3138,7 @@ namespace Anycubic { injectCommands(F("G28\nG29")); printer_state = AC_printer_probing; - ChangePageOfTFT(PAGE_LEVELING); + changePageOfTFT(PAGE_LEVELING); } void DgusTFT::page203() { // probe precheck failed @@ -3174,29 +3174,24 @@ namespace Anycubic { switch (pop_up_index) { case 10: // T0 error if (page_index_now != PAGE_ABNORMAL) - ChangePageOfTFT(PAGE_ABNORMAL); + changePageOfTFT(PAGE_ABNORMAL); pop_up_index = 100; break; case 15: // filament lack + case 23: if (page_index_now != PAGE_FILAMENT_LACK) - ChangePageOfTFT(PAGE_FILAMENT_LACK); + changePageOfTFT(PAGE_FILAMENT_LACK); pop_up_index = 100; break; case 16: // stop wait - ChangePageOfTFT(PAGE_WAIT_STOP); + changePageOfTFT(PAGE_WAIT_STOP); pop_up_index = 100; break; case 18: - ChangePageOfTFT(PAGE_STATUS1); - pop_up_index = 100; - break; - - case 23: // - if (page_index_now != PAGE_FILAMENT_LACK) - ChangePageOfTFT(PAGE_FILAMENT_LACK); + changePageOfTFT(PAGE_STATUS1); pop_up_index = 100; break; @@ -3205,97 +3200,69 @@ namespace Anycubic { char str_buf[20]; sprintf(str_buf, "%s H ", utostr3(time / 60)); sprintf(str_buf + strlen(str_buf), "%s M", utostr3(time % 60)); - SendTxtToTFT(str_buf, TXT_FINISH_TIME); - ChangePageOfTFT(PAGE_PRINT_FINISH); - //SendtoTFTLN(AC_msg_print_complete); // no idea why this causes a compile error + sendTxtToTFT(str_buf, TXT_FINISH_TIME); + changePageOfTFT(PAGE_PRINT_FINISH); + //tftSendLn(AC_msg_print_complete); // no idea why this causes a compile error pop_up_index = 100; } break; case 25: // LEVEL DONE - ChangePageOfTFT(PAGE_PreLEVEL); + changePageOfTFT(PAGE_PreLEVEL); pop_up_index = 100; break; } } - void DEBUG_PRINT_PAUSED_STATE(FSTR_P const msg, paused_state_t state) { - DEBUG_ECHOPGM(msg, state); + void DEBUG_PRINT_PAUSED_STATE(const paused_state_t state, FSTR_P const msg/*=nullptr*/) { + if (msg) DEBUG_ECHO(msg); + DEBUG_ECHOPGM("Paused state: ", state, " "); switch (state) { - case AC_paused_heater_timed_out: - DEBUG_ECHOLNPGM(" AC_paused_heater_timed_out"); - break; - case AC_paused_filament_lack: - DEBUG_ECHOLNPGM(" AC_paused_filament_lack"); - break; - case AC_paused_purging_filament: - DEBUG_ECHOLNPGM(" AC_paused_purging_filament"); - break; - case AC_paused_idle: - DEBUG_ECHOLNPGM(" AC_paused_idle"); - break; + case AC_paused_heater_timed_out: DEBUG_ECHOPGM("AC_paused_heater_timed_out"); break; + case AC_paused_filament_lack: DEBUG_ECHOPGM("AC_paused_filament_lack"); break; + case AC_paused_purging_filament: DEBUG_ECHOPGM("AC_paused_purging_filament"); break; + case AC_paused_idle: DEBUG_ECHOPGM("AC_paused_idle"); break; } + DEBUG_EOL(); } -// routines to make the debug outputs human readable + // Human-readable debugging - void DEBUG_PRINT_PRINTER_STATE(FSTR_P const msg, printer_state_t state) { - DEBUG_ECHOPGM(msg, state); + void DEBUG_PRINT_PRINTER_STATE(const printer_state_t state, FSTR_P const msg/*=nullptr*/) { + if (msg) DEBUG_ECHO(msg); + DEBUG_ECHOPGM("Printer State: ", state, " "); switch (state) { - case AC_printer_idle: - DEBUG_ECHOLNPGM(" AC_printer_idle"); - break; - case AC_printer_probing: - DEBUG_ECHOLNPGM(" AC_printer_probing"); - break; - case AC_printer_printing: - DEBUG_ECHOLNPGM(" AC_printer_printing"); - break; - case AC_printer_pausing: - DEBUG_ECHOLNPGM(" AC_printer_pausing"); - break; - case AC_printer_paused: - DEBUG_ECHOLNPGM(" AC_printer_paused"); - break; - case AC_printer_stopping: - DEBUG_ECHOLNPGM(" AC_printer_stopping"); - break; - case AC_printer_stopping_from_media_remove: - DEBUG_ECHOLNPGM(" AC_printer_stopping_from_media_remove"); - break; - case AC_printer_resuming_from_power_outage: - DEBUG_ECHOLNPGM(" AC_printer_resuming_from_power_outage"); - break; + case AC_printer_idle: DEBUG_ECHOPGM("AC_printer_idle"); break; + case AC_printer_probing: DEBUG_ECHOPGM("AC_printer_probing"); break; + case AC_printer_printing: DEBUG_ECHOPGM("AC_printer_printing"); break; + case AC_printer_pausing: DEBUG_ECHOPGM("AC_printer_pausing"); break; + case AC_printer_paused: DEBUG_ECHOPGM("AC_printer_paused"); break; + case AC_printer_stopping: DEBUG_ECHOPGM("AC_printer_stopping"); break; + case AC_printer_stopping_from_media_remove: DEBUG_ECHOPGM("AC_printer_stopping_from_media_remove"); break; + case AC_printer_resuming_from_power_outage: DEBUG_ECHOPGM("AC_printer_resuming_from_power_outage"); break; } + DEBUG_EOL(); } - void DEBUG_PRINT_TIMER_EVENT(FSTR_P const msg, timer_event_t event) { - DEBUG_ECHOPGM(msg, event); + void DEBUG_PRINT_TIMER_EVENT(const timer_event_t event, FSTR_P const msg/*=nullptr*/) { + if (msg) DEBUG_ECHOPGM(msg, event); + DEBUG_ECHOPGM("timerEvent() ", event, " "); switch (event) { - case AC_timer_started: - DEBUG_ECHOLNPGM(" AC_timer_started"); - break; - case AC_timer_paused: - DEBUG_ECHOLNPGM(" AC_timer_paused"); - break; - case AC_timer_stopped: - DEBUG_ECHOLNPGM(" AC_timer_stopped"); - break; + case AC_timer_started: DEBUG_ECHOPGM("AC_timer_started"); break; + case AC_timer_paused: DEBUG_ECHOPGM("AC_timer_paused"); break; + case AC_timer_stopped: DEBUG_ECHOPGM("AC_timer_stopped"); break; } + DEBUG_EOL(); } - void DEBUG_PRINT_MEDIA_EVENT(FSTR_P const msg, media_event_t event) { - DEBUG_ECHOPGM(msg, event); + void DEBUG_PRINT_MEDIA_EVENT(const media_event_t event, FSTR_P const msg/*=nullptr*/) { + if (msg) DEBUG_ECHOPGM(msg, event); + DEBUG_ECHOPGM("ProcessMediaStatus() ", event, " "); switch (event) { - case AC_media_inserted: - DEBUG_ECHOLNPGM(" AC_media_inserted"); - break; - case AC_media_removed: - DEBUG_ECHOLNPGM(" AC_media_removed"); - break; - case AC_media_error: - DEBUG_ECHOLNPGM(" AC_media_error"); - break; + case AC_media_inserted: DEBUG_ECHOPGM("AC_media_inserted"); break; + case AC_media_removed: DEBUG_ECHOPGM("AC_media_removed"); break; + case AC_media_error: DEBUG_ECHOPGM("AC_media_error"); break; } + DEBUG_EOL(); } } // namespace diff --git a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.h b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.h index 1903fa1183..371066a569 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.h +++ b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.h @@ -356,19 +356,19 @@ namespace Anycubic { static lcd_info_t lcd_info, lcd_info_back; static uint16_t page_index_now; - static void Startup(); - static void ParamInit(); - static void IdleLoop(); - static void PrinterKilled(FSTR_P,FSTR_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 PowerLoss(); - static void PowerLossRecovery(); - static void HomingStart(); - static void HomingComplete(); + static void startup(); + static void paramInit(); + static void idleLoop(); + static void printerKilled(FSTR_P,FSTR_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 powerLoss(); + static void powerLossRecovery(); + static void homingStart(); + static void homingComplete(); static void set_descript_color(const uint16_t color, const uint8_t index=lcd_txtbox_index); static void set_language(language_t); @@ -450,30 +450,30 @@ namespace Anycubic { static void pop_up_manager(); - static void SendtoTFT(FSTR_P const=nullptr); - static void SendtoTFTLN(FSTR_P const=nullptr); - static bool ReadTFTCommand(); - static int8_t Findcmndpos(const char *, const char); - static void CheckHeaters(); - static void SendFileList(int8_t); - static void SelectFile(); - static void ProcessPanelRequest(); - static void PanelInfo(uint8_t); - static void PanelAction(uint8_t); - static void PanelProcess(uint8_t); + static void tftSend(FSTR_P const=nullptr); + static void tftSendLn(FSTR_P const=nullptr); + static bool readTFTCommand(); + static int8_t findCmdPos(const char *, const char); + static void checkHeaters(); + static void sendFileList(int8_t); + static void selectFile(); + static void processPanelRequest(); + static void panelInfo(uint8_t); + static void panelAction(uint8_t); + static void panelProcess(uint8_t); - static void SendValueToTFT(const uint16_t value, const uint16_t address); - static void RequestValueFromTFT(const uint16_t address); - static void SendTxtToTFT(const char *pdata, const uint16_t address); - static void SendColorToTFT(const uint16_t color, const uint16_t address); - static void SendReadNumOfTxtToTFT(const uint8_t number, const uint16_t address); - static void ChangePageOfTFT(const uint16_t page_index, const bool no_send=false); - static void FakeChangePageOfTFT(const uint16_t page_index); - static void LcdAudioSet(const bool audio_on); + static void sendValueToTFT(const uint16_t value, const uint16_t address); + static void requestValueFromTFT(const uint16_t address); + static void sendTxtToTFT(const char *pdata, const uint16_t address); + static void sendColorToTFT(const uint16_t color, const uint16_t address); + static void sendReadNumOfTxtToTFT(const uint8_t number, const uint16_t address); + static void changePageOfTFT(const uint16_t page_index, const bool no_send=false); + static void fakeChangePageOfTFT(const uint16_t page_index); + static void lcdAudioSet(const bool audio_on); private: }; - extern DgusTFT Dgus; + extern DgusTFT dgus; } diff --git a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp index 142f438861..cf87bacf3b 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/vyper_extui.cpp @@ -37,17 +37,17 @@ using namespace Anycubic; namespace ExtUI { - void onStartup() { Dgus.Startup(); } + void onStartup() { dgus.startup(); } - void onIdle() { Dgus.IdleLoop(); } + void onIdle() { dgus.idleLoop(); } void onPrinterKilled(FSTR_P const error, FSTR_P const component) { - Dgus.PrinterKilled(error, component); + dgus.printerKilled(error, component); } - void onMediaInserted() { Dgus.MediaEvent(AC_media_inserted); } - void onMediaError() { Dgus.MediaEvent(AC_media_error); } - void onMediaRemoved() { Dgus.MediaEvent(AC_media_removed); } + void onMediaInserted() { dgus.mediaEvent(AC_media_inserted); } + void onMediaError() { dgus.mediaEvent(AC_media_error); } + void onMediaRemoved() { dgus.mediaEvent(AC_media_removed); } void onPlayTone(const uint16_t frequency, const uint16_t duration) { #if ENABLED(SPEAKER) @@ -55,22 +55,22 @@ namespace ExtUI { #endif } - void onPrintTimerStarted() { Dgus.TimerEvent(AC_timer_started); } - void onPrintTimerPaused() { Dgus.TimerEvent(AC_timer_paused); } - void onPrintTimerStopped() { Dgus.TimerEvent(AC_timer_stopped); } + void onPrintTimerStarted() { dgus.timerEvent(AC_timer_started); } + void onPrintTimerPaused() { dgus.timerEvent(AC_timer_paused); } + void onPrintTimerStopped() { dgus.timerEvent(AC_timer_stopped); } void onPrintDone() {} - void onFilamentRunout(const extruder_t) { Dgus.FilamentRunout(); } + void onFilamentRunout(const extruder_t) { dgus.filamentRunout(); } - void onUserConfirmRequired(const char * const msg) { Dgus.ConfirmationRequest(msg); } - void onStatusChanged(const char * const msg) { Dgus.StatusChange(msg); } + void onUserConfirmRequired(const char * const msg) { dgus.confirmationRequest(msg); } + void onStatusChanged(const char * const msg) { dgus.statusChange(msg); } - void onHomingStart() { Dgus.HomingStart(); } - void onHomingDone() { Dgus.HomingComplete(); } + void onHomingStart() { dgus.homingStart(); } + void onHomingDone() { dgus.homingComplete(); } void onFactoryReset() { - Dgus.page_index_now = 121; - Dgus.lcd_info.audio_on = DISABLED(SPEAKER); + dgus.page_index_now = 121; + dgus.lcd_info.audio_on = DISABLED(SPEAKER); } void onStoreSettings(char *buff) { @@ -78,8 +78,8 @@ namespace ExtUI { // permanent data to be stored, it can write up to eeprom_data_size bytes // into buff. - static_assert(sizeof(Dgus.lcd_info) <= ExtUI::eeprom_data_size); - memcpy(buff, &Dgus.lcd_info, sizeof(Dgus.lcd_info)); + static_assert(sizeof(dgus.lcd_info) <= ExtUI::eeprom_data_size); + memcpy(buff, &dgus.lcd_info, sizeof(dgus.lcd_info)); } void onLoadSettings(const char *buff) { @@ -87,15 +87,15 @@ namespace ExtUI { // needs to retrieve data, it should copy up to eeprom_data_size bytes // from buff - static_assert(sizeof(Dgus.lcd_info) <= ExtUI::eeprom_data_size); - memcpy(&Dgus.lcd_info, buff, sizeof(Dgus.lcd_info)); - memcpy(&Dgus.lcd_info_back, buff, sizeof(Dgus.lcd_info_back)); + static_assert(sizeof(dgus.lcd_info) <= ExtUI::eeprom_data_size); + memcpy(&dgus.lcd_info, buff, sizeof(dgus.lcd_info)); + memcpy(&dgus.lcd_info_back, buff, sizeof(dgus.lcd_info_back)); } void onPostprocessSettings() { // Called after loading or resetting stored settings - Dgus.ParamInit(); - Dgus.PowerLoss(); + dgus.paramInit(); + dgus.powerLoss(); } void onSettingsStored(const bool success) { @@ -108,10 +108,12 @@ namespace ExtUI { // whether successful or not. } - #if HAS_MESH + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #endif + #if HAS_MESH void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated //SERIAL_ECHOLNPGM("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); @@ -125,11 +127,11 @@ namespace ExtUI { #if ENABLED(POWER_LOSS_RECOVERY) // Called when power-loss is enabled/disabled - void onSetPowerLoss(const bool) { Dgus.PowerLoss(); } + void onSetPowerLoss(const bool) { dgus.powerLoss(); } // Called when power-loss state is detected void onPowerLoss() { /* handled internally */ } // Called on resume from power-loss - void onPowerLossResume() { Dgus.PowerLossRecovery(); } + void onPowerLossResume() { dgus.powerLossRecovery(); } #endif #if HAS_PID_HEATING diff --git a/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp index 2a7d635c6d..8e54b20d99 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSDisplay.cpp @@ -44,9 +44,9 @@ #include "DGUSVPVariable.h" #include "DGUSDisplayDef.h" -DGUSDisplay dgusdisplay; +DGUSDisplay dgus; -#ifdef DEBUG_DGUSLCD_COMM +#ifdef DEBUG_DGUS_COMM #define DEBUGLCDCOMM_ECHOPGM DEBUG_ECHOPGM #else #define DEBUGLCDCOMM_ECHOPGM(...) NOOP @@ -63,7 +63,7 @@ constexpr uint8_t DGUS_CMD_READVAR = 0x83; bool dguslcd_local_debug; // = false; #endif -void DGUSDisplay::InitDisplay() { +void DGUSDisplay::initDisplay() { #ifndef LCD_BAUDRATE #define LCD_BAUDRATE 115200 #endif @@ -73,13 +73,13 @@ void DGUSDisplay::InitDisplay() { 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)); + requestScreen(TERN(SHOW_BOOTSCREEN, DGUS_SCREEN_BOOT, DGUS_SCREEN_MAIN)); } -void DGUSDisplay::WriteVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { +void DGUSDisplay::writeVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { const char* myvalues = static_cast(values); bool strend = !myvalues; - WriteHeader(adr, DGUS_CMD_WRITEVAR, valueslen); + writeHeader(adr, DGUS_CMD_WRITEVAR, valueslen); while (valueslen--) { char x; if (!strend) x = *myvalues++; @@ -91,25 +91,25 @@ void DGUSDisplay::WriteVariable(uint16_t adr, const void *values, uint8_t values } } -void DGUSDisplay::WriteVariable(uint16_t adr, uint16_t value) { +void DGUSDisplay::writeVariable(uint16_t adr, uint16_t value) { value = (value & 0xFFU) << 8U | (value >> 8U); - WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); + writeVariable(adr, static_cast(&value), sizeof(uint16_t)); } -void DGUSDisplay::WriteVariable(uint16_t adr, int16_t value) { +void DGUSDisplay::writeVariable(uint16_t adr, int16_t value) { value = (value & 0xFFU) << 8U | (value >> 8U); - WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); + writeVariable(adr, static_cast(&value), sizeof(uint16_t)); } -void DGUSDisplay::WriteVariable(uint16_t adr, uint8_t value) { - WriteVariable(adr, static_cast(&value), sizeof(uint8_t)); +void DGUSDisplay::writeVariable(uint16_t adr, uint8_t value) { + writeVariable(adr, static_cast(&value), sizeof(uint8_t)); } -void DGUSDisplay::WriteVariable(uint16_t adr, int8_t value) { - WriteVariable(adr, static_cast(&value), sizeof(int8_t)); +void DGUSDisplay::writeVariable(uint16_t adr, int8_t value) { + writeVariable(adr, static_cast(&value), sizeof(int8_t)); } -void DGUSDisplay::WriteVariable(uint16_t adr, long value) { +void DGUSDisplay::writeVariable(uint16_t adr, long value) { union { long l; char lb[4]; } endian; char tmp[4]; endian.l = value; @@ -117,13 +117,13 @@ void DGUSDisplay::WriteVariable(uint16_t adr, long value) { tmp[1] = endian.lb[2]; tmp[2] = endian.lb[1]; tmp[3] = endian.lb[0]; - WriteVariable(adr, static_cast(&tmp), sizeof(long)); + writeVariable(adr, static_cast(&tmp), sizeof(long)); } -void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { +void DGUSDisplay::writeVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr) { const char* myvalues = static_cast(values); bool strend = !myvalues; - WriteHeader(adr, DGUS_CMD_WRITEVAR, valueslen); + writeHeader(adr, DGUS_CMD_WRITEVAR, valueslen); while (valueslen--) { char x; if (!strend) x = pgm_read_byte(myvalues++); @@ -135,7 +135,7 @@ void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void *values, uint8_t val } } -void DGUSDisplay::ProcessRx() { +void DGUSDisplay::processRx() { #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) if (!LCD_SERIAL.available() && LCD_SERIAL.buffer_overruns()) { @@ -174,8 +174,8 @@ void DGUSDisplay::ProcessRx() { case DGUS_WAIT_TELEGRAM: // wait for complete datagram to arrive. if (LCD_SERIAL.available() < rx_datagram_len) return; - Initialized = true; // We've talked to it, so we defined it as initialized. - uint8_t command = LCD_SERIAL.read(); + initialized = true; // We've talked to it, so we defined it as initialized. + const uint8_t command = LCD_SERIAL.read(); //DEBUGLCDCOMM_ECHOPGM("# ", command); @@ -220,9 +220,9 @@ void DGUSDisplay::ProcessRx() { } } -size_t DGUSDisplay::GetFreeTxBuffer() { return SERIAL_GET_TX_BUFFER_FREE(); } +size_t DGUSDisplay::getFreeTxBuffer() { return LCD_SERIAL_TX_BUFFER_FREE(); } -void DGUSDisplay::WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen) { +void DGUSDisplay::writeHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen) { LCD_SERIAL.write(DGUS_HEADER1); LCD_SERIAL.write(DGUS_HEADER2); LCD_SERIAL.write(payloadlen + 3); @@ -231,29 +231,29 @@ void DGUSDisplay::WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen) { LCD_SERIAL.write(adr & 0xFF); } -void DGUSDisplay::WritePGM(const char str[], uint8_t len) { +void DGUSDisplay::writePGM(const char str[], uint8_t len) { while (len--) LCD_SERIAL.write(pgm_read_byte(str++)); } void DGUSDisplay::loop() { - // Protect against recursion. ProcessRx() may indirectly call idle() when injecting G-code commands. + // Protect against recursion. processRx() may indirectly call idle() when injecting G-code commands. if (!no_reentrance) { no_reentrance = true; - ProcessRx(); + processRx(); no_reentrance = false; } } rx_datagram_state_t DGUSDisplay::rx_datagram_state = DGUS_IDLE; uint8_t DGUSDisplay::rx_datagram_len = 0; -bool DGUSDisplay::Initialized = false, +bool DGUSDisplay::initialized = false, DGUSDisplay::no_reentrance = false; // A SW memory barrier, to ensure GCC does not overoptimize loops #define sw_barrier() asm volatile("": : :"memory"); bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy) { - const DGUS_VP_Variable *pvp = DGUSLCD_FindVPVar(VP); + const DGUS_VP_Variable *pvp = findVPVar(VP); if (!pvp) return false; memcpy_P(ramcopy, pvp, sizeof(DGUS_VP_Variable)); return true; diff --git a/Marlin/src/lcd/extui/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/dgus/DGUSDisplay.h index c307ff4478..d65c30fc16 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/dgus/DGUSDisplay.h @@ -30,14 +30,14 @@ #include // size_t //#define DEBUG_DGUSLCD -//#define DEBUG_DGUSLCD_COMM +//#define DEBUG_DGUS_COMM #if HAS_BED_PROBE #include "../../../module/probe.h" #endif #include "DGUSVPVariable.h" -enum DGUSLCD_Screens : uint8_t; +enum DGUS_ScreenID : uint8_t; #define DEBUG_OUT ENABLED(DEBUG_DGUSLCD) #include "../../../core/debug_out.h" @@ -57,25 +57,25 @@ public: DGUSDisplay() = default; - static void InitDisplay(); + static void initDisplay(); // Variable access. - static void WriteVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); - static void WriteVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); - static void WriteVariable(uint16_t adr, int16_t value); - static void WriteVariable(uint16_t adr, uint16_t value); - 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 writeVariable(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); + static void writeVariablePGM(uint16_t adr, const void *values, uint8_t valueslen, bool isstr=false); + static void writeVariable(uint16_t adr, int16_t value); + static void writeVariable(uint16_t adr, uint16_t value); + 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); // Utility functions for bridging ui_api and dbus template - static void SetVariable(DGUS_VP_Variable &var) { - WriteVariable(var.VP, (WireType)Getter(selector)); + static void setVariable(DGUS_VP_Variable &var) { + writeVariable(var.VP, (WireType)Getter(selector)); } template - static void GetVariable(DGUS_VP_Variable &var, void *val_ptr) { + static void getVariable(DGUS_VP_Variable &var, void *val_ptr) { uint16_t newvalue = swap16(*(uint16_t*)val_ptr); Setter(newvalue, selector); } @@ -86,39 +86,39 @@ public: // Force display into another screen. // (And trigger update of containing VPs) // (to implement a pop up message, which may not be nested) - static void RequestScreen(DGUSLCD_Screens screen); + static void requestScreen(const DGUS_ScreenID screenID); // Periodic tasks, eg. Rx-Queue handling. static void loop(); public: // Helper for users of this class to estimate if an interaction would be blocking. - static size_t GetFreeTxBuffer(); + static size_t getFreeTxBuffer(); // Checks two things: Can we confirm the presence of the display and has we initialized it. // (both boils down that the display answered to our chatting) - static bool isInitialized() { return Initialized; } + static bool isInitialized() { return initialized; } private: - static void WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen); - static void WritePGM(const char str[], uint8_t len); - static void ProcessRx(); + static void writeHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen); + static void writePGM(const char str[], uint8_t len); + static void processRx(); static rx_datagram_state_t rx_datagram_state; static uint8_t rx_datagram_len; - static bool Initialized, no_reentrance; + static bool initialized, no_reentrance; }; -extern DGUSDisplay dgusdisplay; +extern DGUSDisplay dgus; // compile-time x^y constexpr float cpow(const float x, const int y) { return y == 0 ? 1.0 : x * cpow(x, y - 1); } /// -const uint16_t* DGUSLCD_FindScreenVPMapList(uint8_t screen); +const uint16_t* findScreenVPMapList(uint8_t screen); /// Find the flash address of a DGUS_VP_Variable for the VP. -const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp); +const DGUS_VP_Variable* findVPVar(const uint16_t vp); /// Helper to populate a DGUS_VP_Variable for a given VP. Return false if not found. bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy); diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp index e8abc259a2..d440ea5375 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp @@ -40,15 +40,15 @@ #include "../../../feature/powerloss.h" #endif -DGUSScreenHandlerClass ScreenHandler; +DGUSScreenHandlerClass screen; -uint16_t DGUSScreenHandler::ConfirmVP; +uint16_t DGUSScreenHandler::confirmVP; -DGUSLCD_Screens DGUSScreenHandler::current_screen; -DGUSLCD_Screens DGUSScreenHandler::past_screens[NUM_PAST_SCREENS]; +DGUS_ScreenID DGUSScreenHandler::current_screenID; +DGUS_ScreenID DGUSScreenHandler::past_screenIDs[NUM_PAST_SCREENS]; uint8_t DGUSScreenHandler::update_ptr; uint16_t DGUSScreenHandler::skipVP; -bool DGUSScreenHandler::ScreenComplete; +bool DGUSScreenHandler::screenComplete; void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; @@ -62,42 +62,42 @@ void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; filament_data_t filament_data; #endif -void DGUSScreenHandler::sendinfoscreen(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { +void DGUSScreenHandler::sendInfoScreen(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { DGUS_VP_Variable ramcopy; if (populate_VPVar(VP_MSGSTR1, &ramcopy)) { ramcopy.memadr = (void*) line1; - l1inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); + l1inflash ? DGUSScreenHandler::sendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::sendStringToDisplay(ramcopy); } if (populate_VPVar(VP_MSGSTR2, &ramcopy)) { ramcopy.memadr = (void*) line2; - l2inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); + l2inflash ? DGUSScreenHandler::sendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::sendStringToDisplay(ramcopy); } if (populate_VPVar(VP_MSGSTR3, &ramcopy)) { ramcopy.memadr = (void*) line3; - l3inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); + l3inflash ? DGUSScreenHandler::sendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::sendStringToDisplay(ramcopy); } #ifdef VP_MSGSTR4 if (populate_VPVar(VP_MSGSTR4, &ramcopy)) { ramcopy.memadr = (void*) line4; - l4inflash ? DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::DGUSLCD_SendStringToDisplay(ramcopy); + l4inflash ? DGUSScreenHandler::sendStringToDisplayPGM(ramcopy) : DGUSScreenHandler::sendStringToDisplay(ramcopy); } #endif } -void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const 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(); +void DGUSScreenHandler::handleUserConfirmationPopUp(uint16_t VP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1, bool l2, bool l3, bool l4) { + if (current_screenID == DGUS_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); - GotoScreen(DGUSLCD_SCREEN_CONFIRM); + confirmVP = VP; + sendInfoScreen(line1, line2, line3, line4, l1, l2, l3, l4); + gotoScreen(DGUS_SCREEN_CONFIRM); } -void DGUSScreenHandler::setstatusmessage(const char *msg) { +void DGUSScreenHandler::setStatusMessage(const char *msg) { DGUS_VP_Variable ramcopy; if (populate_VPVar(VP_M117, &ramcopy)) { ramcopy.memadr = (void*) msg; - DGUSLCD_SendStringToDisplay(ramcopy); + sendStringToDisplay(ramcopy); } } @@ -105,46 +105,46 @@ void DGUSScreenHandler::setstatusmessagePGM(PGM_P const msg) { DGUS_VP_Variable ramcopy; if (populate_VPVar(VP_M117, &ramcopy)) { ramcopy.memadr = (void*) msg; - DGUSLCD_SendStringToDisplayPGM(ramcopy); + sendStringToDisplayPGM(ramcopy); } } // Send an 8 bit or 16 bit value to the display. -void DGUSScreenHandler::DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandler::sendWordValueToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { if (var.size > 1) - dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + dgus.writeVariable(var.VP, *(int16_t*)var.memadr); else - dgusdisplay.WriteVariable(var.VP, *(int8_t*)var.memadr); + dgus.writeVariable(var.VP, *(int8_t*)var.memadr); } } // Send an uint8_t between 0 and 255 to the display, but scale to a percentage (0..100) -void DGUSScreenHandler::DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandler::sendPercentageToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { 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); + dgus.writeVariable(var.VP, tmp); } } // Send the current print progress to the display. -void DGUSScreenHandler::DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandler::sendPrintProgressToDisplay(DGUS_VP_Variable &var) { uint16_t tmp = ExtUI::getProgress_percent(); - dgusdisplay.WriteVariable(var.VP, tmp); + dgus.writeVariable(var.VP, tmp); } // Send the current print time to the display. // It is using a hex display for that: It expects BSD coded data in the format xxyyzz -void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandler::sendPrintTimeToDisplay(DGUS_VP_Variable &var) { duration_t elapsed = print_job_timer.duration(); char buf[32]; elapsed.toString(buf); - dgusdisplay.WriteVariable(VP_PrintTime, buf, var.size, true); + dgus.writeVariable(VP_PrintTime, buf, var.size, true); } // Send an uint8_t between 0 and 100 to a variable scale to 0..255 -void DGUSScreenHandler::DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::percentageToUint8(DGUS_VP_Variable &var, void *val_ptr) { if (var.memadr) { const uint16_t value = BE16_P(val_ptr); *(uint8_t*)var.memadr = map(constrain(value, 0, 100), 0, 100, 0, 255); @@ -154,21 +154,21 @@ void DGUSScreenHandler::DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *v // Sends a (RAM located) string to the DGUS Display // (Note: The DGUS Display does not clear after the \0, you have to // overwrite the remainings with spaces.// var.size has the display buffer size! -void DGUSScreenHandler::DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandler::sendStringToDisplay(DGUS_VP_Variable &var) { char *tmp = (char*) var.memadr; - dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); + dgus.writeVariable(var.VP, tmp, var.size, true); } // Sends a (flash located) string to the DGUS Display // (Note: The DGUS Display does not clear after the \0, you have to // overwrite the remainings with spaces.// var.size has the display buffer size! -void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { +void DGUSScreenHandler::sendStringToDisplayPGM(DGUS_VP_Variable &var) { char *tmp = (char*) var.memadr; - dgusdisplay.WriteVariablePGM(var.VP, tmp, var.size, true); + dgus.writeVariablePGM(var.VP, tmp, var.size, true); } #if HAS_PID_HEATING - void DGUSScreenHandler::DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var) { + void DGUSScreenHandler::sendTemperaturePID(DGUS_VP_Variable &var) { float value = *(float *)var.memadr; value /= 10; float valuesend = 0; @@ -198,7 +198,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { endian.i = valuesend; tmp[0] = endian.lb[1]; tmp[1] = endian.lb[0]; - dgusdisplay.WriteVariable(var.VP, tmp, 2); + dgus.writeVariable(var.VP, tmp, 2); } #endif @@ -206,19 +206,19 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { // Send the accumulate print time to the display. // It is using a hex display for that: It expects BSD coded data in the format xxyyzz - void DGUSScreenHandler::DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var) { + void DGUSScreenHandler::sendPrintAccTimeToDisplay(DGUS_VP_Variable &var) { printStatistics state = print_job_timer.getStats(); char buf[22]; duration_t elapsed = state.printTime; elapsed.toString(buf); - dgusdisplay.WriteVariable(VP_PrintAccTime, buf, var.size, true); + dgus.writeVariable(VP_PrintAccTime, buf, var.size, true); } - void DGUSScreenHandler::DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var) { + void DGUSScreenHandler::sendPrintsTotalToDisplay(DGUS_VP_Variable &var) { printStatistics state = print_job_timer.getStats(); char buf[10]; sprintf_P(buf, PSTR("%u"), state.totalPrints); - dgusdisplay.WriteVariable(VP_PrintsTotal, buf, var.size, true); + dgus.writeVariable(VP_PrintsTotal, buf, var.size, true); } #endif @@ -226,33 +226,33 @@ 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) { + void DGUSScreenHandler::sendFanStatusToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { uint16_t data_to_send = 0; if (*(uint8_t *) var.memadr) data_to_send = 1; - dgusdisplay.WriteVariable(var.VP, data_to_send); + dgus.writeVariable(var.VP, data_to_send); } } #endif // Send heater status value to the display. -void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandler::sendHeaterStatusToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { uint16_t data_to_send = 0; if (*(int16_t *) var.memadr) data_to_send = 1; - dgusdisplay.WriteVariable(var.VP, data_to_send); + dgus.writeVariable(var.VP, data_to_send); } } #if ENABLED(DGUS_UI_WAITING) - void DGUSScreenHandler::DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var) { + void DGUSScreenHandler::sendWaitingStatusToDisplay(DGUS_VP_Variable &var) { // In FYSETC UI design there are 10 statuses to loop static uint16_t period = 0; static uint16_t index = 0; if (period++ > DGUS_UI_WAITING_STATUS_PERIOD) { - dgusdisplay.WriteVariable(var.VP, index); + dgus.writeVariable(var.VP, index); if (++index >= DGUS_UI_WAITING_STATUS) index = 0; period = 0; } @@ -262,11 +262,11 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) #if HAS_MEDIA - void DGUSScreenHandler::ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::screenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr) { // default action executed when there is a SD card, but not printing if (ExtUI::isMediaInserted() && !ExtUI::isPrintingFromMedia()) { - ScreenChangeHook(var, val_ptr); - dgusdisplay.RequestScreen(current_screen); + screenChangeHook(var, val_ptr); + dgus.requestScreen(current_screenID); return; } @@ -274,22 +274,22 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) // This should host e.g a print pause / print abort / print resume dialog. // This concept allows to recycle this hook for other file if (ExtUI::isPrintingFromMedia() && !card.flag.abort_sd_printing) { - GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + gotoScreen(DGUS_SCREEN_SDPRINTMANIPULATION); return; } // Don't let the user in the dark why there is no reaction. if (!ExtUI::isMediaInserted()) { - setstatusmessage(GET_TEXT_F(MSG_NO_MEDIA)); + setStatusMessage(GET_TEXT_F(MSG_NO_MEDIA)); return; } if (card.flag.abort_sd_printing) { - setstatusmessage(GET_TEXT_F(MSG_MEDIA_ABORTING)); + setStatusMessage(GET_TEXT_F(MSG_MEDIA_ABORTING)); return; } } - void DGUSScreenHandler::DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable& var, void *val_ptr) { + void DGUSScreenHandler::sdScrollFilelist(DGUS_VP_Variable& var, void *val_ptr) { auto old_top = top_file; const int16_t scroll = (int16_t)BE16_P(val_ptr); if (scroll) { @@ -306,38 +306,38 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) else if (!filelist.isAtRootDir()) { IF_DISABLED(DGUS_LCD_UI_MKS, filelist.upDir()); top_file = 0; - ForceCompleteUpdate(); + forceCompleteUpdate(); } - if (old_top != top_file) ForceCompleteUpdate(); + if (old_top != top_file) forceCompleteUpdate(); } - void DGUSScreenHandler::DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdReallyAbort(DGUS_VP_Variable &var, void *val_ptr) { ExtUI::stopPrint(); - GotoScreen(DGUSLCD_SCREEN_MAIN); + gotoScreen(DGUS_SCREEN_MAIN); } - void DGUSScreenHandler::DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdPrintTune(DGUS_VP_Variable &var, void *val_ptr) { if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. - GotoScreen(DGUSLCD_SCREEN_SDPRINTTUNE); + gotoScreen(DGUS_SCREEN_SDPRINTTUNE); } - void DGUSScreenHandler::SDCardError() { - DGUSScreenHandler::SDCardRemoved(); - sendinfoscreen(F("NOTICE"), nullptr, F("SD card error"), nullptr, true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); + void DGUSScreenHandler::sdCardError() { + DGUSScreenHandler::sdCardRemoved(); + sendInfoScreen(F("NOTICE"), nullptr, F("SD card error"), nullptr, true, true, true, true); + setupConfirmAction(nullptr); + gotoScreen(DGUS_SCREEN_POPUP); } #endif // HAS_MEDIA -void DGUSScreenHandler::ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::screenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) { DGUS_VP_Variable ramcopy; - if (!populate_VPVar(ConfirmVP, &ramcopy)) return; + if (!populate_VPVar(confirmVP, &ramcopy)) return; if (ramcopy.set_by_display_handler) ramcopy.set_by_display_handler(ramcopy, val_ptr); } -const uint16_t* DGUSLCD_FindScreenVPMapList(uint8_t screen) { +const uint16_t* findScreenVPMapList(uint8_t screen) { const uint16_t *ret; const struct VPMapping *map = VPMap; while ((ret = (uint16_t*) pgm_read_ptr(&(map->VPList)))) { @@ -347,7 +347,7 @@ const uint16_t* DGUSLCD_FindScreenVPMapList(uint8_t screen) { return nullptr; } -const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp) { +const DGUS_VP_Variable* findVPVar(const uint16_t vp) { const DGUS_VP_Variable *ret = ListOfVP; do { const uint16_t vpcheck = pgm_read_word(&(ret->VP)); @@ -359,19 +359,19 @@ const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp) { return nullptr; } -void DGUSScreenHandler::ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::screenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr) { if (!ExtUI::isPrinting()) { - ScreenChangeHook(var, val_ptr); - dgusdisplay.RequestScreen(current_screen); + screenChangeHook(var, val_ptr); + dgus.requestScreen(current_screenID); } } -void DGUSScreenHandler::HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr) { thermalManager.disable_all_heaters(); - ForceCompleteUpdate(); // hint to send all data. + forceCompleteUpdate(); // hint to send all data. } -void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { celsius_t newvalue = BE16_P(val_ptr); celsius_t acceptedvalue; @@ -405,7 +405,7 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va 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) { +void DGUSScreenHandler::handleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_EXTRUDERS const uint16_t newvalue = BE16_P(val_ptr); uint8_t target_extruder; @@ -424,7 +424,7 @@ void DGUSScreenHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_p #endif } -void DGUSScreenHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleManualExtrude(DGUS_VP_Variable &var, void *val_ptr) { const int16_t movevalue = BE16_P(val_ptr); float target = movevalue * 0.01f; ExtUI::extruder_t target_extruder; @@ -445,17 +445,17 @@ void DGUSScreenHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr } #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - void DGUSScreenHandler::HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr) { *(uint16_t*)var.memadr = BE16_P(val_ptr); } #endif -void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) { const int16_t lock = BE16_P(val_ptr); queue.enqueue_one_now(lock ? F("M18") : F("M17")); } -void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleSettings(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t value = BE16_P(val_ptr); switch (value) { default: break; @@ -469,7 +469,7 @@ void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { } } -void DGUSScreenHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t value_raw = BE16_P(val_ptr); const float value = (float)value_raw / 10; ExtUI::axis_t axis; @@ -483,7 +483,7 @@ void DGUSScreenHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t value_raw = BE16_P(val_ptr); const float value = (float)value_raw / 10; ExtUI::extruder_t extruder; @@ -501,7 +501,7 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo } #if HAS_PID_HEATING - void DGUSScreenHandler::HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { char buf[32] = {0}; switch (var.VP) { @@ -528,14 +528,14 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo } #if ENABLED(DGUS_UI_WAITING) - sendinfoscreen(F("PID is autotuning"), F("please wait"), NUL_STR, NUL_STR, true, true, true, true); - GotoScreen(DGUSLCD_SCREEN_WAITING); + sendInfoScreen(F("PID is autotuning"), F("please wait"), NUL_STR, NUL_STR, true, true, true, true); + gotoScreen(DGUS_SCREEN_WAITING); #endif } #endif // HAS_PID_HEATING #if HAS_BED_PROBE - void DGUSScreenHandler::HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr) { const float offset = float(int16_t(BE16_P(val_ptr))) / 100.0f; ExtUI::setZOffset_mm(offset); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel @@ -544,12 +544,12 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo #endif #if HAS_FAN - void DGUSScreenHandler::HandleFanControl(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleFanControl(DGUS_VP_Variable &var, void *val_ptr) { *(uint8_t*)var.memadr = *(uint8_t*)var.memadr > 0 ? 0 : 255; } #endif -void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleHeaterControl(DGUS_VP_Variable &var, void *val_ptr) { uint8_t preheat_temp = 0; switch (var.VP) { #if HAS_HOTEND @@ -576,7 +576,7 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr #if ENABLED(DGUS_PREHEAT_UI) - void DGUSScreenHandler::HandlePreheat(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handlePreheat(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t preheat_option = BE16_P(val_ptr); switch (preheat_option) { default: @@ -592,48 +592,48 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr } // Go to the preheat screen to show the heating progress - GotoScreen(DGUSLCD_SCREEN_PREHEAT); + gotoScreen(DGUS_SCREEN_PREHEAT); } #endif // DGUS_PREHEAT_UI #if ENABLED(POWER_LOSS_RECOVERY) - void DGUSScreenHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value = BE16_P(val_ptr); if (value) { queue.inject(F("M1000")); - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), 32, true); - GotoScreen(PLR_SCREEN_RECOVER); + dgus.writeVariable(VP_SD_Print_Filename, filelist.filename(), 32, true); + gotoScreen(PLR_SCREEN_RECOVER); } else { recovery.cancel(); - GotoScreen(PLR_SCREEN_CANCEL); + gotoScreen(PLR_SCREEN_CANCEL); } } #endif -void DGUSScreenHandler::UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup) { +void DGUSScreenHandler::updateNewScreen(const DGUS_ScreenID screenID, const bool popup) { if (!popup) { - memmove(&past_screens[1], &past_screens[0], sizeof(past_screens) - 1); - past_screens[0] = current_screen; + memmove(&past_screenIDs[1], &past_screenIDs[0], sizeof(past_screenIDs) - 1); + past_screenIDs[0] = current_screenID; } - current_screen = newscreen; + current_screenID = screenID; skipVP = 0; - ForceCompleteUpdate(); + forceCompleteUpdate(); } -void DGUSScreenHandler::PopToOldScreen() { - GotoScreen(past_screens[0], true); - memmove(&past_screens[0], &past_screens[1], sizeof(past_screens) - 1); - past_screens[sizeof(past_screens) - 1] = DGUSLCD_SCREEN_MAIN; +void DGUSScreenHandler::popToOldScreen() { + gotoScreen(past_screenIDs[0], true); + memmove(&past_screenIDs[0], &past_screenIDs[1], sizeof(past_screenIDs) - 1); + past_screenIDs[sizeof(past_screenIDs) - 1] = DGUS_SCREEN_MAIN; } -void DGUSScreenHandler::UpdateScreenVPData() { - const uint16_t *VPList = DGUSLCD_FindScreenVPMapList(current_screen); +void DGUSScreenHandler::updateScreenVPData() { + const uint16_t *VPList = findScreenVPMapList(current_screenID); if (!VPList) { - ScreenComplete = true; + screenComplete = true; return; // nothing to do, likely a bug or boring screen. } @@ -645,7 +645,7 @@ void DGUSScreenHandler::UpdateScreenVPData() { uint16_t VP = pgm_read_word(VPList); if (!VP) { update_ptr = 0; - ScreenComplete = true; + screenComplete = true; return; // Screen completed. } @@ -656,12 +656,12 @@ void DGUSScreenHandler::UpdateScreenVPData() { 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())) { + if (rcpy.send_to_display_handler && (!sent_one || expected_tx <= dgus.getFreeTxBuffer())) { sent_one = true; rcpy.send_to_display_handler(rcpy); } else { - ScreenComplete = false; + screenComplete = false; return; // please call again! } } @@ -669,14 +669,14 @@ void DGUSScreenHandler::UpdateScreenVPData() { } while (++update_ptr, ++VPList, true); } -void DGUSScreenHandler::GotoScreen(DGUSLCD_Screens screen, bool ispopup) { - dgusdisplay.RequestScreen(screen); - UpdateNewScreen(screen, ispopup); +void DGUSScreenHandler::gotoScreen(const DGUS_ScreenID screenID, const bool popup/*=false*/) { + dgus.requestScreen(screenID); + updateNewScreen(screenID, popup); } -void DGUSDisplay::RequestScreen(DGUSLCD_Screens screen) { - const unsigned char gotoscreen[] = { 0x5A, 0x01, (unsigned char) (screen >> 8U), (unsigned char) (screen & 0xFFU) }; - WriteVariable(0x84, gotoscreen, sizeof(gotoscreen)); +void DGUSDisplay::requestScreen(const DGUS_ScreenID screenID) { + const unsigned char gotoscreen[] = { 0x5A, 0x01, (unsigned char) (screenID >> 8U), (unsigned char) (screenID & 0xFFU) }; + writeVariable(0x84, gotoscreen, sizeof(gotoscreen)); } #endif // HAS_DGUS_LCD_CLASSIC diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h index 4486105d3c..cb403dbdad 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.h @@ -56,7 +56,7 @@ #include "hiprecy/DGUSScreenHandler.h" #endif -extern DGUSScreenHandlerClass ScreenHandler; +extern DGUSScreenHandlerClass screen; // Helper to define a DGUS_VP_Variable for common use-cases. #define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR) { \ diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h b/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h index 9ebca87be1..163a095d08 100644 --- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h +++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandlerBase.h @@ -27,7 +27,7 @@ #include "../../../inc/MarlinConfig.h" -enum DGUSLCD_Screens : uint8_t; +enum DGUS_ScreenID : uint8_t; class DGUSScreenHandler { public: @@ -37,154 +37,154 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifying whether the strings are in RAM or FLASH. - static void sendinfoscreen(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void sendinfoscreen(FSTR_P const line1, FSTR_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { - sendinfoscreen(FTOP(line1), FTOP(line2), line3, line4, l1inflash, l2inflash, l3inflash, liinflash); + static void sendInfoScreen(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { + sendInfoScreen(FTOP(line1), FTOP(line2), line3, line4, l1inflash, l2inflash, l3inflash, liinflash); } - static void sendinfoscreen(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, FSTR_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { - sendinfoscreen(FTOP(line1), FTOP(line2), FTOP(line3), FTOP(line4), l1inflash, l2inflash, l3inflash, liinflash); + static void sendInfoScreen(FSTR_P const line1, FSTR_P const line2, FSTR_P const line3, FSTR_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash) { + sendInfoScreen(FTOP(line1), FTOP(line2), FTOP(line3), FTOP(line4), l1inflash, l2inflash, l3inflash, liinflash); } - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void handleUserConfirmationPopUp(uint16_t confirmVP, PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const 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); - static void setstatusmessage(FSTR_P const fmsg) { setstatusmessagePGM(FTOP(fmsg)); } + static void setStatusMessage(FSTR_P const fmsg) { setstatusmessagePGM(FTOP(fmsg)); } // Callback for VP "Display wants to change screen on idle printer" - static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + 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 screenChangeHook(DGUS_VP_Variable &var, void *val_ptr); // Callback for VP "All Heaters Off" - static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + 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); + static void handleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); // Hook for "Change Flowrate" - static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + 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); + 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); + static void handleManualMove(DGUS_VP_Variable &var, void *val_ptr); // Hook for manual extrude. - static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + 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); + 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); + 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 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); + static void handleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); // Hook for PID autotune - static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + 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); + 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); + 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); + 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); + 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); + 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); + 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 handleFilamentLoadUnload(DGUS_VP_Variable &var); #endif #if HAS_MEDIA // Callback for VP "Display wants to change screen when there is a SD card" - static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + 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); + static void sdScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); // File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + static void sdFileSelected(DGUS_VP_Variable &var, void *val_ptr); // start print after confirmation received. - static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + static void sdStartPrint(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); + static void sdResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); // User confirmed the abort action - static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + static void sdReallyAbort(DGUS_VP_Variable &var, void *val_ptr); // User hit the tune button - static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + static void sdPrintTune(DGUS_VP_Variable &var, void *val_ptr); // Send a single filename to the display. - static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + static void sdSendFilename(DGUS_VP_Variable &var); // Marlin informed us that a new SD has been inserted. - static void SDCardInserted(); + static void sdCardInserted(); // Marlin informed us that the SD Card has been removed(). - static void SDCardRemoved(); + static void sdCardRemoved(); // Marlin informed us about a bad SD Card. - static void SDCardError(); + static void sdCardError(); #endif // OK Button on the Confirm screen. - static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + static void screenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); - // Update data after going to a new screen (by display or by GotoScreen) + // Update data after going to a new screen (by display or by gotoScreen) // remember to store the last-displayed screen so it can be restored. // (e.g., for popup messages) - static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + static void updateNewScreen(const DGUS_ScreenID screenID, const bool popup=false); // Recall the remembered screen. - static void PopToOldScreen(); + 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 gotoScreen(const DGUS_ScreenID screenID, const bool popup=false); - static void UpdateScreenVPData(); + 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 sendWordValueToDisplay(DGUS_VP_Variable &var); + static void sendStringToDisplay(DGUS_VP_Variable &var); + static void sendStringToDisplayPGM(DGUS_VP_Variable &var); + static void sendTemperaturePID(DGUS_VP_Variable &var); + static void sendPercentageToDisplay(DGUS_VP_Variable &var); + static void sendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void sendPrintTimeToDisplay(DGUS_VP_Variable &var); #if ENABLED(PRINTCOUNTER) - static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + static void sendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void sendPrintsTotalToDisplay(DGUS_VP_Variable &var); #endif #if HAS_FAN - static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + static void sendFanStatusToDisplay(DGUS_VP_Variable &var); #endif - static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + static void sendHeaterStatusToDisplay(DGUS_VP_Variable &var); #if ENABLED(DGUS_UI_WAITING) - static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + static void 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 percentageToUint8(DGUS_VP_Variable &var, void *val_ptr); template - static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + static void 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]; + for (uint8_t i = 0; i < sizeof(T); ++i) x.tmp[i] = ptr[sizeof(T) - i - 1]; *(T*)var.memadr = x.t; } @@ -192,11 +192,11 @@ public: // 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) { + static void sendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { float f = *(float *)var.memadr; f *= cpow(10, decimals); - dgusdisplay.WriteVariable(var.VP, (long)f); + dgus.writeVariable(var.VP, (long)f); } } @@ -204,34 +204,34 @@ public: // 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) { + static void sendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { float f = *(float *)var.memadr; - DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + DEBUG_ECHOLNPGM(" >> ", p_float_t(f, 6)); f *= cpow(10, decimals); - dgusdisplay.WriteVariable(var.VP, (int16_t)f); + dgus.writeVariable(var.VP, (int16_t)f); } } // Force an update of all VP on the current screen. - static void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + static void forceCompleteUpdate() { update_ptr = 0; screenComplete = false; } // Has all VPs sent to the screen - static bool IsScreenComplete() { return ScreenComplete; } + static bool isScreenComplete() { return screenComplete; } - static DGUSLCD_Screens getCurrentScreen() { return current_screen; } + static DGUS_ScreenID getCurrentScreen() { return current_screenID; } - static void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + static void setupConfirmAction( void (*f)()) { confirm_action_cb = f; } protected: - static DGUSLCD_Screens current_screen; //< currently on screen + static DGUS_ScreenID current_screenID; //< 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 DGUS_ScreenID past_screenIDs[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 bool screenComplete; //< All VPs sent to screen? - static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + static uint16_t confirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). #if HAS_MEDIA static int16_t top_file; //< file on top of file chooser diff --git a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp index 1d86d8bd55..30d1c710b2 100644 --- a/Marlin/src/lcd/extui/dgus/dgus_extui.cpp +++ b/Marlin/src/lcd/extui/dgus/dgus_extui.cpp @@ -36,21 +36,21 @@ namespace ExtUI { void onStartup() { - dgusdisplay.InitDisplay(); - ScreenHandler.UpdateScreenVPData(); + dgus.initDisplay(); + screen.updateScreenVPData(); } - void onIdle() { ScreenHandler.loop(); } + void onIdle() { screen.loop(); } void onPrinterKilled(FSTR_P const error, FSTR_P const) { - ScreenHandler.sendinfoscreen(GET_TEXT_F(MSG_HALTED), error, FPSTR(NUL_STR), GET_TEXT_F(MSG_PLEASE_RESET), true, true, true, true); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_KILL); - while (!ScreenHandler.loop()); // Wait while anything is left to be sent + screen.sendInfoScreen(GET_TEXT_F(MSG_HALTED), error, FPSTR(NUL_STR), GET_TEXT_F(MSG_PLEASE_RESET), true, true, true, true); + screen.gotoScreen(DGUS_SCREEN_KILL); + while (!screen.loop()); // Wait while anything is left to be sent } - void onMediaInserted() { TERN_(HAS_MEDIA, ScreenHandler.SDCardInserted()); } - void onMediaError() { TERN_(HAS_MEDIA, ScreenHandler.SDCardError()); } - void onMediaRemoved() { TERN_(HAS_MEDIA, ScreenHandler.SDCardRemoved()); } + void onMediaInserted() { TERN_(HAS_MEDIA, screen.sdCardInserted()); } + void onMediaError() { TERN_(HAS_MEDIA, screen.sdCardError()); } + void onMediaRemoved() { TERN_(HAS_MEDIA, screen.sdCardRemoved()); } void onPlayTone(const uint16_t frequency, const uint16_t duration) {} void onPrintTimerStarted() {} @@ -60,17 +60,17 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { if (msg) { - ScreenHandler.sendinfoscreen(F("Please confirm."), nullptr, msg, nullptr, true, true, false, true); - ScreenHandler.SetupConfirmAction(setUserConfirmed); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); + screen.sendInfoScreen(F("Please confirm."), nullptr, msg, nullptr, true, true, false, true); + screen.setupConfirmAction(setUserConfirmed); + screen.gotoScreen(DGUS_SCREEN_POPUP); } - else if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_POPUP) { - ScreenHandler.SetupConfirmAction(nullptr); - ScreenHandler.PopToOldScreen(); + else if (screen.getCurrentScreen() == DGUS_SCREEN_POPUP) { + screen.setupConfirmAction(nullptr); + screen.popToOldScreen(); } } - void onStatusChanged(const char * const msg) { ScreenHandler.setstatusmessage(msg); } + void onStatusChanged(const char * const msg) { screen.setStatusMessage(msg); } void onHomingStart() {} void onHomingDone() {} @@ -112,10 +112,12 @@ namespace ExtUI { // whether successful or not. } - #if HAS_MESH + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #endif + #if HAS_MESH void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated } @@ -134,7 +136,7 @@ namespace ExtUI { } void onPowerLossResume() { // Called on resume from power-loss - IF_DISABLED(DGUS_LCD_UI_MKS, ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POWER_LOSS)); + IF_DISABLED(DGUS_LCD_UI_MKS, screen.gotoScreen(DGUS_SCREEN_POWER_LOSS)); } #endif @@ -143,22 +145,22 @@ namespace ExtUI { // Called for temperature PID tuning result switch (rst) { case PID_STARTED: - ScreenHandler.setstatusmessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); + screen.setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case PID_BAD_HEATER_ID: - ScreenHandler.setstatusmessage(GET_TEXT_F(MSG_PID_BAD_HEATER_ID)); + screen.setStatusMessage(GET_TEXT_F(MSG_PID_BAD_HEATER_ID)); break; case PID_TEMP_TOO_HIGH: - ScreenHandler.setstatusmessage(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH)); + screen.setStatusMessage(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH)); break; case PID_TUNING_TIMEOUT: - ScreenHandler.setstatusmessage(GET_TEXT_F(MSG_PID_TIMEOUT)); + screen.setStatusMessage(GET_TEXT_F(MSG_PID_TIMEOUT)); break; case PID_DONE: - ScreenHandler.setstatusmessage(GET_TEXT_F(MSG_PID_AUTOTUNE_DONE)); + screen.setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE_DONE)); break; } - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN); + screen.gotoScreen(DGUS_SCREEN_MAIN); } #endif diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp index 6b670368b6..08d5387cef 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp @@ -289,28 +289,28 @@ const uint16_t VPList_Z_Offset[] PROGMEM = { }; const struct VPMapping VPMap[] PROGMEM = { - { DGUSLCD_SCREEN_BOOT, VPList_Boot }, - { DGUSLCD_SCREEN_MAIN, VPList_Main }, - { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, - { DGUSLCD_SCREEN_STATUS, VPList_Status }, - { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, - { DGUSLCD_SCREEN_PREHEAT, VPList_Preheat }, - { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, - { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, - { DGUSLCD_SCREEN_FILAMENT_HEATING, VPList_Filament_heating }, - { DGUSLCD_SCREEN_FILAMENT_LOADING, VPList_Filament_load_unload }, - { DGUSLCD_SCREEN_FILAMENT_UNLOADING, VPList_Filament_load_unload }, - { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, - { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, - { DGUSLCD_SCREEN_SDPRINTTUNE, VPList_SDPrintTune }, - { DGUSLCD_SCREEN_WAITING, VPList_PIDTuningWaiting }, - { DGUSLCD_SCREEN_FLC_PREHEAT, VPList_FLCPreheat }, - { DGUSLCD_SCREEN_FLC_PRINTING, VPList_FLCPrinting }, - { DGUSLCD_SCREEN_Z_OFFSET, VPList_Z_Offset }, - { DGUSLCD_SCREEN_STEPPERMM, VPList_StepPerMM }, - { DGUSLCD_SCREEN_PID_E, VPList_PIDE0 }, - { DGUSLCD_SCREEN_PID_BED, VPList_PIDBED }, - { DGUSLCD_SCREEN_INFOS, VPList_Infos }, + { DGUS_SCREEN_BOOT, VPList_Boot }, + { DGUS_SCREEN_MAIN, VPList_Main }, + { DGUS_SCREEN_TEMPERATURE, VPList_Temp }, + { DGUS_SCREEN_STATUS, VPList_Status }, + { DGUS_SCREEN_STATUS2, VPList_Status2 }, + { DGUS_SCREEN_PREHEAT, VPList_Preheat }, + { DGUS_SCREEN_MANUALMOVE, VPList_ManualMove }, + { DGUS_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, + { DGUS_SCREEN_FILAMENT_HEATING, VPList_Filament_heating }, + { DGUS_SCREEN_FILAMENT_LOADING, VPList_Filament_load_unload }, + { DGUS_SCREEN_FILAMENT_UNLOADING, VPList_Filament_load_unload }, + { DGUS_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, + { DGUS_SCREEN_SDFILELIST, VPList_SDFileList }, + { DGUS_SCREEN_SDPRINTTUNE, VPList_SDPrintTune }, + { DGUS_SCREEN_WAITING, VPList_PIDTuningWaiting }, + { DGUS_SCREEN_FLC_PREHEAT, VPList_FLCPreheat }, + { DGUS_SCREEN_FLC_PRINTING, VPList_FLCPrinting }, + { DGUS_SCREEN_Z_OFFSET, VPList_Z_Offset }, + { DGUS_SCREEN_STEPPERMM, VPList_StepPerMM }, + { DGUS_SCREEN_PID_E, VPList_PIDE0 }, + { DGUS_SCREEN_PID_BED, VPList_PIDBED }, + { DGUS_SCREEN_INFOS, VPList_Infos }, { 0 , nullptr } // List is terminated with an nullptr as table entry. }; @@ -318,159 +318,159 @@ const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; 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), + VPHELPER(VP_SCREENCHANGE, nullptr, screen.screenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, screen.screenChangeHookIfIdle, nullptr), #if HAS_MEDIA - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, screen.screenChangeHookIfSD, nullptr), #endif - VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + VPHELPER(VP_CONFIRMED, nullptr, screen.screenConfirmedOK, nullptr), - VPHELPER(VP_TEMP_ALL_OFF, nullptr, ScreenHandler.HandleAllHeatersOff, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, screen.handleAllHeatersOff, nullptr), #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, ScreenHandler.HandleManualMoveOption, nullptr), + VPHELPER(VP_MOVE_OPTION, &distanceToMove, screen.handleManualMoveOption, nullptr), #endif #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, &distanceToMove, screen.handleManualMove, nullptr), #else - 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_MOVE_X, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, ScreenHandler.HandleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, ScreenHandler.HandlePowerLossRecovery, nullptr), + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif - VPHELPER(VP_SETTINGS, nullptr, ScreenHandler.HandleSettings, nullptr), + VPHELPER(VP_SETTINGS, nullptr, screen.handleSettings, nullptr), #if ENABLED(SINGLE_Z_CALIBRATION) - VPHELPER(VP_Z_CALIBRATE, nullptr, ScreenHandler.HandleZCalibration, nullptr), + VPHELPER(VP_Z_CALIBRATE, nullptr, screen.handleZCalibration, nullptr), #endif #if ENABLED(FIRST_LAYER_CAL) - VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, ScreenHandler.HandleFirstLayerCal, nullptr), + VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, screen.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 = screen.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 = screen.sendStringToDisplay }, // Temperature Data #if HAS_HOTEND - 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), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, screen.sendHeaterStatusToDisplay), #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, ScreenHandler.HandlePreheat, nullptr), + VPHELPER(VP_E0_BED_PREHEAT, nullptr, screen.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), + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, screen.handlePIDAutotune, nullptr), #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload), + VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, screen.handleFilamentOption, screen.handleFilamentLoadUnload), #endif #endif #if HAS_MULTI_HOTEND - 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), // ERROR: Flow is per-extruder, not per-hotend - 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), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), // ERROR: Flow is per-extruder, not per-hotend + VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), #if ENABLED(PIDTEMP) - VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, ScreenHandler.HandlePIDAutotune, nullptr), + VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, screen.handlePIDAutotune, nullptr), #endif - VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload), + VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, screen.handleFilamentOption, screen.handleFilamentLoadUnload), #endif #if HAS_HEATED_BED - 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), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, screen.sendWordValueToDisplay), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, screen.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), + VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, screen.handlePIDAutotune, nullptr), #endif #endif // Fan Data #if HAS_FAN #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ - 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), + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], screen.percentageToUint8, screen.sendPercentageToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], screen.handleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, screen.sendFanStatusToDisplay), REPEAT(FAN_COUNT, FAN_VPHELPER) #endif // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, screen.setValueDirectly, screen.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>), + VPHELPER(VP_XPos, ¤t_position.x, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, screen.sendFloatAsLongValueToDisplay<2>), // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay), + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, screen.sendPrintProgressToDisplay), // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay), + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, screen.sendPrintTimeToDisplay), #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), + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, screen.sendPrintAccTimeToDisplay), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, screen.sendPrintsTotalToDisplay), #endif - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), #if HAS_EXTRUDERS - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<1>), #if HAS_MULTI_EXTRUDER - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<1>), #endif #endif // SDCard File listing. #if HAS_MEDIA - 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(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), + VPHELPER(VP_SD_ScrollEvent, nullptr, screen.sdScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, screen.sdFileSelected, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, screen.sdStartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, screen.sdResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, screen.sdReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, screen.sdPrintTune, nullptr), #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, screen.handleProbeOffsetZChanged, screen.sendFloatAsIntValueToDisplay<2>), #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, screen.handleLiveAdjustZ, nullptr), #endif #endif #endif #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, screen.sendWaitingStatusToDisplay), #endif // Messages for the User, shared by the popup and the kill screen. They can't 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 = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, VPHELPER(0, 0, 0, 0) // must be last entry. }; diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h index 5deedc0450..70559f9031 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.h @@ -23,35 +23,35 @@ #include "../DGUSDisplayDef.h" -enum DGUSLCD_Screens : uint8_t { - DGUSLCD_SCREEN_BOOT = 0, - DGUSLCD_SCREEN_MAIN = 1, - DGUSLCD_SCREEN_STATUS = 1, - DGUSLCD_SCREEN_STATUS2 = 1, - DGUSLCD_SCREEN_TEMPERATURE = 10, - DGUSLCD_SCREEN_PREHEAT = 18, - DGUSLCD_SCREEN_POWER_LOSS = 100, - DGUSLCD_SCREEN_MANUALMOVE = 192, - DGUSLCD_SCREEN_UTILITY = 120, - DGUSLCD_SCREEN_FILAMENT_HEATING = 146, - DGUSLCD_SCREEN_FILAMENT_LOADING = 148, - DGUSLCD_SCREEN_FILAMENT_UNLOADING = 158, - DGUSLCD_SCREEN_MANUALEXTRUDE = 160, - DGUSLCD_SCREEN_SDFILELIST = 71, - DGUSLCD_SCREEN_SDPRINTMANIPULATION = 73, - DGUSLCD_SCREEN_SDPRINTTUNE = 75, - DGUSLCD_SCREEN_FLC_PREHEAT = 94, - DGUSLCD_SCREEN_FLC_PRINTING = 96, - DGUSLCD_SCREEN_STEPPERMM = 212, - DGUSLCD_SCREEN_PID_E = 214, - DGUSLCD_SCREEN_PID_BED = 218, - DGUSLCD_SCREEN_Z_OFFSET = 222, - DGUSLCD_SCREEN_INFOS = 36, - 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" - DGUSLCD_SCREEN_UNUSED = 255 +enum DGUS_ScreenID : uint8_t { + DGUS_SCREEN_BOOT = 0, + DGUS_SCREEN_MAIN = 1, + DGUS_SCREEN_STATUS = 1, + DGUS_SCREEN_STATUS2 = 1, + DGUS_SCREEN_TEMPERATURE = 10, + DGUS_SCREEN_PREHEAT = 18, + DGUS_SCREEN_POWER_LOSS = 100, + DGUS_SCREEN_MANUALMOVE = 192, + DGUS_SCREEN_UTILITY = 120, + DGUS_SCREEN_FILAMENT_HEATING = 146, + DGUS_SCREEN_FILAMENT_LOADING = 148, + DGUS_SCREEN_FILAMENT_UNLOADING = 158, + DGUS_SCREEN_MANUALEXTRUDE = 160, + DGUS_SCREEN_SDFILELIST = 71, + DGUS_SCREEN_SDPRINTMANIPULATION = 73, + DGUS_SCREEN_SDPRINTTUNE = 75, + DGUS_SCREEN_FLC_PREHEAT = 94, + DGUS_SCREEN_FLC_PRINTING = 96, + DGUS_SCREEN_STEPPERMM = 212, + DGUS_SCREEN_PID_E = 214, + DGUS_SCREEN_PID_BED = 218, + DGUS_SCREEN_Z_OFFSET = 222, + DGUS_SCREEN_INFOS = 36, + DGUS_SCREEN_CONFIRM = 240, + DGUS_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUS_SCREEN_WAITING = 251, + DGUS_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUS_SCREEN_UNUSED = 255 }; // Display Memory layout used (T5UID) diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp index 0c76454d74..768092633e 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp @@ -44,7 +44,7 @@ extern ExtUI::FileList filelist; - void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdFileSelected(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; @@ -52,28 +52,28 @@ if (filelist.isDir()) { filelist.changeDir(filelist.filename()); top_file = 0; - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } #if ENABLED(DGUS_PRINT_FILENAME) // Send print filename - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + dgus.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); + 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) { + void DGUSScreenHandler::sdStartPrint(DGUS_VP_Variable &var, void *val_ptr) { if (!filelist.seek(file_to_print)) return; ExtUI::printFile(filelist.shortFilename()); - GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + gotoScreen(DGUS_SCREEN_SDPRINTMANIPULATION); } - void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdResumePauseAbort(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)) { @@ -85,19 +85,19 @@ case 1: // Pause - GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + gotoScreen(DGUS_SCREEN_SDPRINTMANIPULATION); 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); + 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) { + void DGUSScreenHandler::sdSendFilename(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] = ""; @@ -106,49 +106,49 @@ 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); + sendStringToDisplay(var); } - void DGUSScreenHandler::SDCardInserted() { + void DGUSScreenHandler::sdCardInserted() { top_file = 0; filelist.refresh(); auto cs = getCurrentScreen(); - if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) - GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + if (cs == DGUS_SCREEN_MAIN || cs == DGUS_SCREEN_STATUS) + gotoScreen(DGUS_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); + void DGUSScreenHandler::sdCardRemoved() { + if (current_screenID == DGUS_SCREEN_SDFILELIST + || (current_screenID == DGUS_SCREEN_CONFIRM && (confirmVP == VP_SD_AbortPrintConfirmed || confirmVP == VP_SD_FileSelectConfirm)) + || current_screenID == DGUS_SCREEN_SDPRINTMANIPULATION + ) gotoScreen(DGUS_SCREEN_MAIN); } #endif // HAS_MEDIA -void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { +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, + // from screen 1 (main) to 10 (temperature). DGUS_SCREEN_POPUP is special, // meaning "return to previous screen" - DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + DGUS_ScreenID target = (DGUS_ScreenID)tmp[1]; - if (target == DGUSLCD_SCREEN_POPUP) { + if (target == DGUS_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(); + if (current_screenID == DGUS_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + popToOldScreen(); return; } - UpdateNewScreen(target); + updateNewScreen(target); #ifdef DEBUG_DGUSLCD - if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); + if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } -void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { int16_t movevalue = swap16(*(uint16_t*)val_ptr); #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) if (movevalue) { @@ -157,20 +157,22 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } #endif char axiscode; - uint16_t speed = manual_feedrate_mm_m[X_AXIS]; // Default feedrate for manual moves + uint16_t speed = manual_feedrate_mm_m.x; // Default feedrate for manual moves switch (var.VP) { default: return; - case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; - break; + #if HAS_X_AXIS + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + #endif #if HAS_Y_AXIS case VP_MOVE_Y: axiscode = 'Y'; - speed = manual_feedrate_mm_m[Y_AXIS]; + speed = manual_feedrate_mm_m.y; if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; break; #endif @@ -178,7 +180,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_Z_AXIS case VP_MOVE_Z: axiscode = 'Z'; - speed = manual_feedrate_mm_m[Z_AXIS]; + speed = manual_feedrate_mm_m.z; if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; break; #endif @@ -194,7 +196,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { char buf[6] = "G28 X"; buf[4] = axiscode; queue.enqueue_one_now(buf); - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } else { @@ -217,14 +219,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!old_relative_mode) queue.enqueue_now(F("G90")); } - ForceCompleteUpdate(); + forceCompleteUpdate(); cannotmove: return; } #if HAS_PID_HEATING - void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); float value = (float)rawvalue / 10; float newvalue = 0; @@ -255,17 +257,17 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif // HAS_PID_HEATING #if ENABLED(BABYSTEPPING) - void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { int16_t flag = swap16(*(uint16_t*)val_ptr), steps = flag ? -20 : 20; ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); - ForceCompleteUpdate(); + forceCompleteUpdate(); } #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleFilamentOption(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); @@ -313,7 +315,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif #endif - GotoScreen(DGUSLCD_SCREEN_UTILITY); + gotoScreen(DGUS_SCREEN_UTILITY); } else { // Go to the preheat screen to show the heating progress switch (var.VP) { @@ -331,11 +333,11 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { break; #endif } - GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + gotoScreen(DGUS_SCREEN_FILAMENT_HEATING); } } - void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + void DGUSScreenHandler::handleFilamentLoadUnload(DGUS_VP_Variable &var) { if (filament_data.action <= 0) return; // If we close to the target temperature, we can start load or unload the filament @@ -345,14 +347,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 1) { // load filament if (!filament_data.heated) { - //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + //gotoScreen(DGUS_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); + gotoScreen(DGUS_SCREEN_FILAMENT_UNLOADING); filament_data.heated = true; } // Before unloading extrude to prevent jamming @@ -370,14 +372,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif // DGUS_FILAMENT_LOADUNLOAD bool DGUSScreenHandler::loop() { - dgusdisplay.loop(); + dgus.loop(); const millis_t ms = millis(); static millis_t next_event_ms = 0; - if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + if (!isScreenComplete() || ELAPSED(ms, next_event_ms)) { next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - UpdateScreenVPData(); + updateScreenVPData(); } #if ENABLED(SHOW_BOOTSCREEN) @@ -388,11 +390,11 @@ bool DGUSScreenHandler::loop() { if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) { booted = true; - GotoScreen(TERN0(POWER_LOSS_RECOVERY, recovery.valid()) ? DGUSLCD_SCREEN_POWER_LOSS : DGUSLCD_SCREEN_MAIN); + gotoScreen(TERN0(POWER_LOSS_RECOVERY, recovery.valid()) ? DGUS_SCREEN_POWER_LOSS : DGUS_SCREEN_MAIN); } #endif - return IsScreenComplete(); + return isScreenComplete(); } #endif // DGUS_LCD_UI_FYSETC diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.h index 73e3527d7e..16c5dec408 100644 --- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.h @@ -26,6 +26,6 @@ typedef DGUSScreenHandler DGUSScreenHandlerClass; #if ENABLED(POWER_LOSS_RECOVERY) - #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION - #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS + #define PLR_SCREEN_RECOVER DGUS_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUS_SCREEN_STATUS #endif diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp index c278179e3f..d99a4fe4f6 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp @@ -286,28 +286,28 @@ const uint16_t VPList_Z_Offset[] PROGMEM = { }; const struct VPMapping VPMap[] PROGMEM = { - { DGUSLCD_SCREEN_BOOT, VPList_Boot }, - { DGUSLCD_SCREEN_MAIN, VPList_Main }, - { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, - { DGUSLCD_SCREEN_STATUS, VPList_Status }, - { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, - { DGUSLCD_SCREEN_PREHEAT, VPList_Preheat }, - { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, - { DGUSLCD_SCREEN_Z_OFFSET, VPList_Z_Offset }, - { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, - { DGUSLCD_SCREEN_FILAMENT_HEATING, VPList_Filament_heating }, - { DGUSLCD_SCREEN_FILAMENT_LOADING, VPList_Filament_load_unload }, - { DGUSLCD_SCREEN_FILAMENT_UNLOADING, VPList_Filament_load_unload }, - { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, - { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, - { DGUSLCD_SCREEN_SDPRINTTUNE, VPList_SDPrintTune }, - { DGUSLCD_SCREEN_WAITING, VPList_PIDTuningWaiting }, - { DGUSLCD_SCREEN_FLC_PREHEAT, VPList_FLCPreheat }, - { DGUSLCD_SCREEN_FLC_PRINTING, VPList_FLCPrinting }, - { DGUSLCD_SCREEN_STEPPERMM, VPList_StepPerMM }, - { DGUSLCD_SCREEN_PID_E, VPList_PIDE0 }, - { DGUSLCD_SCREEN_PID_BED, VPList_PIDBED }, - { DGUSLCD_SCREEN_INFOS, VPList_Infos }, + { DGUS_SCREEN_BOOT, VPList_Boot }, + { DGUS_SCREEN_MAIN, VPList_Main }, + { DGUS_SCREEN_TEMPERATURE, VPList_Temp }, + { DGUS_SCREEN_STATUS, VPList_Status }, + { DGUS_SCREEN_STATUS2, VPList_Status2 }, + { DGUS_SCREEN_PREHEAT, VPList_Preheat }, + { DGUS_SCREEN_MANUALMOVE, VPList_ManualMove }, + { DGUS_SCREEN_Z_OFFSET, VPList_Z_Offset }, + { DGUS_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, + { DGUS_SCREEN_FILAMENT_HEATING, VPList_Filament_heating }, + { DGUS_SCREEN_FILAMENT_LOADING, VPList_Filament_load_unload }, + { DGUS_SCREEN_FILAMENT_UNLOADING, VPList_Filament_load_unload }, + { DGUS_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, + { DGUS_SCREEN_SDFILELIST, VPList_SDFileList }, + { DGUS_SCREEN_SDPRINTTUNE, VPList_SDPrintTune }, + { DGUS_SCREEN_WAITING, VPList_PIDTuningWaiting }, + { DGUS_SCREEN_FLC_PREHEAT, VPList_FLCPreheat }, + { DGUS_SCREEN_FLC_PRINTING, VPList_FLCPrinting }, + { DGUS_SCREEN_STEPPERMM, VPList_StepPerMM }, + { DGUS_SCREEN_PID_E, VPList_PIDE0 }, + { DGUS_SCREEN_PID_BED, VPList_PIDBED }, + { DGUS_SCREEN_INFOS, VPList_Infos }, { 0 , nullptr } // List is terminated with an nullptr as table entry. }; @@ -315,155 +315,155 @@ const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; 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), + VPHELPER(VP_SCREENCHANGE, nullptr, screen.screenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, screen.screenChangeHookIfIdle, nullptr), #if HAS_MEDIA - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, screen.screenChangeHookIfSD, nullptr), #endif - VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + VPHELPER(VP_CONFIRMED, nullptr, screen.screenConfirmedOK, nullptr), - VPHELPER(VP_TEMP_ALL_OFF, nullptr, ScreenHandler.HandleAllHeatersOff, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, screen.handleAllHeatersOff, nullptr), #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, ScreenHandler.HandleManualMoveOption, nullptr), + VPHELPER(VP_MOVE_OPTION, &distanceToMove, screen.handleManualMoveOption, nullptr), #endif #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, &distanceToMove, screen.handleManualMove, nullptr), #else - 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_MOVE_X, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, ScreenHandler.HandleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, ScreenHandler.HandlePowerLossRecovery, nullptr), + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif - VPHELPER(VP_SETTINGS, nullptr, ScreenHandler.HandleSettings, nullptr), + VPHELPER(VP_SETTINGS, nullptr, screen.handleSettings, nullptr), #if ENABLED(SINGLE_Z_CALIBRATION) - VPHELPER(VP_Z_CALIBRATE, nullptr, ScreenHandler.HandleZCalibration, nullptr), + VPHELPER(VP_Z_CALIBRATE, nullptr, screen.handleZCalibration, nullptr), #endif #if ENABLED(FIRST_LAYER_CAL) - VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, ScreenHandler.HandleFirstLayerCal, nullptr), + VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, screen.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 = screen.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 = screen.sendStringToDisplay }, // Temperature Data #if HAS_HOTEND - 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), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, screen.sendHeaterStatusToDisplay), #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, ScreenHandler.HandlePreheat, nullptr), + VPHELPER(VP_E0_BED_PREHEAT, nullptr, screen.handlePreheat, nullptr), #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload), + VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, screen.handleFilamentOption, screen.handleFilamentLoadUnload), #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), + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, screen.handlePIDAutotune, nullptr), #endif #endif #if HAS_MULTI_HOTEND - 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, nullptr, 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), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, nullptr, screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), #endif #if HAS_HEATED_BED - 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), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, screen.sendWordValueToDisplay), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, screen.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), + VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, screen.handlePIDAutotune, nullptr), #endif #endif // Fan Data #if HAS_FAN #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ - 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), + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], screen.percentageToUint8, screen.sendPercentageToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], screen.handleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, screen.sendFanStatusToDisplay), REPEAT(FAN_COUNT, FAN_VPHELPER) #endif // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, screen.setValueDirectly, screen.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>), + VPHELPER(VP_XPos, ¤t_position.x, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, screen.sendFloatAsLongValueToDisplay<2>), // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay), + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, screen.sendPrintProgressToDisplay), // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay), + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, screen.sendPrintTimeToDisplay), #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), + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, screen.sendPrintAccTimeToDisplay), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, screen.sendPrintsTotalToDisplay), #endif - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), #if HAS_HOTEND - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<1>), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<1>), #endif #endif // SDCard File listing. #if HAS_MEDIA - 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(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), + VPHELPER(VP_SD_ScrollEvent, nullptr, screen.sdScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, screen.sdFileSelected, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, screen.sdStartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, screen.sdResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, screen.sdReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, screen.sdPrintTune, nullptr), #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, screen.handleProbeOffsetZChanged, screen.sendFloatAsIntValueToDisplay<2>), #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, screen.handleLiveAdjustZ, nullptr), #endif #endif #endif #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, screen.sendWaitingStatusToDisplay), #endif // Messages for the User, shared by the popup and the kill screen. They can't 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 = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, VPHELPER(0, 0, 0, 0) // must be last entry. }; diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h index 3b7199f07e..6270207990 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.h @@ -23,35 +23,35 @@ #include "../DGUSDisplayDef.h" -enum DGUSLCD_Screens : uint8_t { - DGUSLCD_SCREEN_BOOT = 160, - DGUSLCD_SCREEN_MAIN = 1, - DGUSLCD_SCREEN_STATUS = 1, - DGUSLCD_SCREEN_STATUS2 = 1, - DGUSLCD_SCREEN_POWER_LOSS = 17, - DGUSLCD_SCREEN_TEMPERATURE = 40, - DGUSLCD_SCREEN_MANUALMOVE = 86, - DGUSLCD_SCREEN_PREHEAT = 48, - DGUSLCD_SCREEN_UTILITY = 70, - DGUSLCD_SCREEN_FILAMENT_HEATING = 80, - DGUSLCD_SCREEN_FILAMENT_LOADING = 76, - DGUSLCD_SCREEN_FILAMENT_UNLOADING = 82, - DGUSLCD_SCREEN_MANUALEXTRUDE = 84, - DGUSLCD_SCREEN_Z_OFFSET = 88, - DGUSLCD_SCREEN_SDFILELIST = 3, - DGUSLCD_SCREEN_SDPRINTMANIPULATION = 7, - DGUSLCD_SCREEN_SDPRINTTUNE = 9, - DGUSLCD_SCREEN_FLC_PREHEAT = 94, - DGUSLCD_SCREEN_FLC_PRINTING = 96, - DGUSLCD_SCREEN_STEPPERMM = 122, - DGUSLCD_SCREEN_PID_E = 126, - DGUSLCD_SCREEN_PID_BED = 128, - DGUSLCD_SCREEN_INFOS = 131, - 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" - DGUSLCD_SCREEN_UNUSED = 255 +enum DGUS_ScreenID : uint8_t { + DGUS_SCREEN_BOOT = 160, + DGUS_SCREEN_MAIN = 1, + DGUS_SCREEN_STATUS = 1, + DGUS_SCREEN_STATUS2 = 1, + DGUS_SCREEN_POWER_LOSS = 17, + DGUS_SCREEN_TEMPERATURE = 40, + DGUS_SCREEN_MANUALMOVE = 86, + DGUS_SCREEN_PREHEAT = 48, + DGUS_SCREEN_UTILITY = 70, + DGUS_SCREEN_FILAMENT_HEATING = 80, + DGUS_SCREEN_FILAMENT_LOADING = 76, + DGUS_SCREEN_FILAMENT_UNLOADING = 82, + DGUS_SCREEN_MANUALEXTRUDE = 84, + DGUS_SCREEN_Z_OFFSET = 88, + DGUS_SCREEN_SDFILELIST = 3, + DGUS_SCREEN_SDPRINTMANIPULATION = 7, + DGUS_SCREEN_SDPRINTTUNE = 9, + DGUS_SCREEN_FLC_PREHEAT = 94, + DGUS_SCREEN_FLC_PRINTING = 96, + DGUS_SCREEN_STEPPERMM = 122, + DGUS_SCREEN_PID_E = 126, + DGUS_SCREEN_PID_BED = 128, + DGUS_SCREEN_INFOS = 131, + DGUS_SCREEN_CONFIRM = 240, + DGUS_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUS_SCREEN_WAITING = 251, + DGUS_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUS_SCREEN_UNUSED = 255 }; // Display Memory layout used (T5UID) diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp index 83658cc8c0..f817453f1b 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp @@ -44,7 +44,7 @@ extern ExtUI::FileList filelist; - void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdFileSelected(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; @@ -52,28 +52,28 @@ if (filelist.isDir()) { filelist.changeDir(filelist.filename()); top_file = 0; - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } #if ENABLED(DGUS_PRINT_FILENAME) // Send print filename - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + dgus.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); + 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) { + void DGUSScreenHandler::sdStartPrint(DGUS_VP_Variable &var, void *val_ptr) { if (!filelist.seek(file_to_print)) return; ExtUI::printFile(filelist.shortFilename()); - GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + gotoScreen(DGUS_SCREEN_SDPRINTMANIPULATION); } - void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdResumePauseAbort(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)) { @@ -85,19 +85,19 @@ case 1: // Pause - GotoScreen(MKSLCD_SCREEN_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); + 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) { + void DGUSScreenHandler::sdSendFilename(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] = ""; @@ -106,49 +106,49 @@ 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); + sendStringToDisplay(var); } - void DGUSScreenHandler::SDCardInserted() { + void DGUSScreenHandler::sdCardInserted() { top_file = 0; filelist.refresh(); auto cs = getCurrentScreen(); - if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) - GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + if (cs == DGUS_SCREEN_MAIN || cs == DGUS_SCREEN_STATUS) + gotoScreen(DGUS_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); + void DGUSScreenHandler::sdCardRemoved() { + if (current_screenID == DGUS_SCREEN_SDFILELIST + || (current_screenID == DGUS_SCREEN_CONFIRM && (confirmVP == VP_SD_AbortPrintConfirmed || confirmVP == VP_SD_FileSelectConfirm)) + || current_screenID == DGUS_SCREEN_SDPRINTMANIPULATION + ) gotoScreen(DGUS_SCREEN_MAIN); } #endif // HAS_MEDIA -void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { +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, + // from screen 1 (main) to 10 (temperature). DGUS_SCREEN_POPUP is special, // meaning "return to previous screen" - DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + DGUS_ScreenID target = (DGUS_ScreenID)tmp[1]; - if (target == DGUSLCD_SCREEN_POPUP) { + if (target == DGUS_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(); + if (current_screenID == DGUS_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + popToOldScreen(); return; } - UpdateNewScreen(target); + updateNewScreen(target); #ifdef DEBUG_DGUSLCD - if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); + if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } -void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { int16_t movevalue = swap16(*(uint16_t*)val_ptr); #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) if (movevalue) { @@ -157,20 +157,22 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } #endif char axiscode; - uint16_t speed = manual_feedrate_mm_m[X_AXIS]; // Default feedrate for manual moves + uint16_t speed = manual_feedrate_mm_m.x; // Default feedrate for manual moves switch (var.VP) { default: return; - case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; - break; + #if HAS_X_AXIS + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + #endif #if HAS_Y_AXIS case VP_MOVE_Y: axiscode = 'Y'; - speed = manual_feedrate_mm_m[Y_AXIS]; + speed = manual_feedrate_mm_m.y; if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; break; #endif @@ -178,7 +180,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_Z_AXIS case VP_MOVE_Z: axiscode = 'Z'; - speed = manual_feedrate_mm_m[Z_AXIS]; + speed = manual_feedrate_mm_m.z; if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; break; #endif @@ -194,7 +196,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { char buf[6] = "G28 X"; buf[4] = axiscode; queue.enqueue_one_now(buf); - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } else { @@ -217,14 +219,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!old_relative_mode) queue.enqueue_now(F("G90")); } - ForceCompleteUpdate(); + forceCompleteUpdate(); cannotmove: return; } #if HAS_PID_HEATING - void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); float value = (float)rawvalue / 10; float newvalue = 0; @@ -255,17 +257,17 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif // HAS_PID_HEATING #if ENABLED(BABYSTEPPING) - void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { int16_t flag = swap16(*(uint16_t*)val_ptr), steps = flag ? -20 : 20; ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); - ForceCompleteUpdate(); + forceCompleteUpdate(); } #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleFilamentOption(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); @@ -313,7 +315,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif #endif - GotoScreen(DGUSLCD_SCREEN_UTILITY); + gotoScreen(DGUS_SCREEN_UTILITY); } else { // Go to the preheat screen to show the heating progress switch (var.VP) { @@ -331,11 +333,11 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { break; #endif } - GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + gotoScreen(DGUS_SCREEN_FILAMENT_HEATING); } } - void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + void DGUSScreenHandler::handleFilamentLoadUnload(DGUS_VP_Variable &var) { if (filament_data.action <= 0) return; // If we close to the target temperature, we can start load or unload the filament @@ -345,14 +347,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 1) { // load filament if (!filament_data.heated) { - //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + //gotoScreen(DGUS_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); + gotoScreen(DGUS_SCREEN_FILAMENT_UNLOADING); filament_data.heated = true; } // Before unloading extrude to prevent jamming @@ -370,14 +372,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif // DGUS_FILAMENT_LOADUNLOAD bool DGUSScreenHandler::loop() { - dgusdisplay.loop(); + dgus.loop(); const millis_t ms = millis(); static millis_t next_event_ms = 0; - if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + if (!isScreenComplete() || ELAPSED(ms, next_event_ms)) { next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - UpdateScreenVPData(); + updateScreenVPData(); } #if ENABLED(SHOW_BOOTSCREEN) @@ -388,11 +390,11 @@ bool DGUSScreenHandler::loop() { if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) { booted = true; - GotoScreen(TERN0(POWER_LOSS_RECOVERY, recovery.valid()) ? DGUSLCD_SCREEN_POWER_LOSS : DGUSLCD_SCREEN_MAIN); + gotoScreen(TERN0(POWER_LOSS_RECOVERY, recovery.valid()) ? DGUS_SCREEN_POWER_LOSS : DGUS_SCREEN_MAIN); } #endif - return IsScreenComplete(); + return isScreenComplete(); } #endif // DGUS_LCD_UI_HIPRECY diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.h index 73e3527d7e..16c5dec408 100644 --- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.h @@ -26,6 +26,6 @@ typedef DGUSScreenHandler DGUSScreenHandlerClass; #if ENABLED(POWER_LOSS_RECOVERY) - #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION - #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS + #define PLR_SCREEN_RECOVER DGUS_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUS_SCREEN_STATUS #endif diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp index 8dee8e26d7..2b5b6d956e 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp @@ -500,301 +500,301 @@ const char Updata_Time[] PROGMEM = STRING_DISTRIBUTION_DATE; 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), + VPHELPER(VP_SCREENCHANGE, nullptr, screen.screenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, screen.screenChangeHookIfIdle, nullptr), #if HAS_MEDIA - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, screen.screenChangeHookIfSD, nullptr), #endif - VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + VPHELPER(VP_CONFIRMED, nullptr, screen.screenConfirmedOK, nullptr), // Back Button - VPHELPER(VP_BACK_PAGE, nullptr, ScreenHandler.ScreenBackChange, nullptr), - VPHELPER(VP_TEMP_ALL_OFF, nullptr, ScreenHandler.HandleAllHeatersOff, nullptr), + VPHELPER(VP_BACK_PAGE, nullptr, screen.screenBackChange, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, screen.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_MOVE_X, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, screen.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_X_HOME, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_Y_HOME, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_Z_HOME, nullptr, screen.handleManualMove, nullptr), - VPHELPER(VP_MOVE_DISTANCE, &manualMoveStep, ScreenHandler.GetManualMovestep, nullptr), + VPHELPER(VP_MOVE_DISTANCE, &manualMoveStep, screen.getManualMovestep, nullptr), - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_LEVEL_POINT, nullptr, ScreenHandler.ManualAssistLeveling, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_LEVEL_POINT, nullptr, screen.manualAssistLeveling, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, ScreenHandler.HandlePowerLossRecovery, nullptr), + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif - VPHELPER(VP_SETTINGS, nullptr, ScreenHandler.HandleSettings, nullptr), + VPHELPER(VP_SETTINGS, nullptr, screen.handleSettings, nullptr), #if ENABLED(SINGLE_Z_CALIBRATION) - VPHELPER(VP_Z_CALIBRATE, nullptr, ScreenHandler.HandleZCalibration, nullptr), + VPHELPER(VP_Z_CALIBRATE, nullptr, screen.handleZCalibration, nullptr), #endif #if ENABLED(FIRST_LAYER_CAL) - VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, ScreenHandler.HandleFirstLayerCal, nullptr), + VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, screen.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 = screen.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}, + {.VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplay}, + {.VP = VP_MKS_H43_VERSION, .memadr = (void *)H43Version, .size = VP_MKS_H43_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.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 = screen.sendStringToDisplayPGM}, // Temperature Data #if HAS_HOTEND - 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), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, screen.sendHeaterStatusToDisplay), #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, ScreenHandler.HandlePreheat, nullptr), + VPHELPER(VP_E0_BED_PREHEAT, nullptr, screen.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), + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, screen.handlePIDAutotune, nullptr), #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_LOAD_Filament, nullptr, ScreenHandler.FilamentLoad, nullptr), - VPHELPER(VP_UNLOAD_Filament, nullptr, ScreenHandler.FilamentUnLoad, nullptr), - VPHELPER(VP_Filament_distance, &distanceFilament, ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Filament_speed, &filamentSpeed_mm_s, ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_LOAD_Filament, nullptr, screen.filamentLoad, nullptr), + VPHELPER(VP_UNLOAD_Filament, nullptr, screen.filamentUnload, nullptr), + VPHELPER(VP_Filament_distance, &distanceFilament, screen.getManualFilament, screen.sendWordValueToDisplay), + VPHELPER(VP_Filament_speed, &filamentSpeed_mm_s, screen.getManualFilamentSpeed, screen.sendWordValueToDisplay), #endif #endif #if HAS_MULTI_HOTEND - 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), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_Filament_distance, &distanceFilament, ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_Filament_speed, &filamentSpeed_mm_s, ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Filament_distance, &distanceFilament, screen.getManualFilament, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Filament_speed, &filamentSpeed_mm_s, screen.getManualFilamentSpeed, screen.sendWordValueToDisplay), #endif #if ENABLED(PIDTEMP) - VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, ScreenHandler.HandlePIDAutotune, nullptr), + VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, screen.handlePIDAutotune, nullptr), #endif - VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload), + VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, screen.handleFilamentOption, screen.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), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, screen.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), + VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, screen.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), + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], screen.setUint8, screen.sendFanToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], screen.handleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, screen.sendFanStatusToDisplay), REPEAT(FAN_COUNT, FAN_VPHELPER) #endif // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, screen.setValueDirectly, screen.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>), + VPHELPER(VP_XPos, ¤t_position.x, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, screen.sendFloatAsLongValueToDisplay<2>), // Level Point Set - VPHELPER(VP_Level_Point_One_X, &mks_corner_offsets[0].x, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_One_Y, &mks_corner_offsets[0].y, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Two_X, &mks_corner_offsets[1].x, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Two_Y, &mks_corner_offsets[1].y, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Three_X, &mks_corner_offsets[2].x, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Three_Y, &mks_corner_offsets[2].y, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Four_X, &mks_corner_offsets[3].x, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Four_Y, &mks_corner_offsets[3].y, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Five_X, &mks_corner_offsets[4].x, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Five_Y, &mks_corner_offsets[4].y, ScreenHandler.HandleChangeLevelPoint, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_One_X, &mks_corner_offsets[0].x, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_One_Y, &mks_corner_offsets[0].y, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_X, &mks_corner_offsets[1].x, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_Y, &mks_corner_offsets[1].y, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_X, &mks_corner_offsets[2].x, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_Y, &mks_corner_offsets[2].y, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_X, &mks_corner_offsets[3].x, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_Y, &mks_corner_offsets[3].y, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_X, &mks_corner_offsets[4].x, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_Y, &mks_corner_offsets[4].y, screen.handleChangeLevelPoint, screen.sendWordValueToDisplay), // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay), + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, screen.sendPrintProgressToDisplay), // LCD Control - VPHELPER(VP_LCD_BLK, &lcd_default_light, ScreenHandler.LCD_BLK_Adjust, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_LCD_BLK, &lcd_default_light, screen.lcdBLKAdjust, screen.sendWordValueToDisplay), // SD File - Back - VPHELPER(VP_SD_FileSelect_Back, nullptr, ScreenHandler.SD_FileBack, nullptr), + VPHELPER(VP_SD_FileSelect_Back, nullptr, screen.sdFileBack, nullptr), // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay), + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, screen.sendPrintTimeToDisplay), #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), + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, screen.sendPrintAccTimeToDisplay), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, screen.sendPrintsTotalToDisplay), #endif - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_X_MAX_SPEED, &planner.settings.max_feedrate_mm_s[X_AXIS], ScreenHandler.HandleMaxSpeedChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_Y_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Y_AXIS], ScreenHandler.HandleMaxSpeedChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_Z_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Z_AXIS], ScreenHandler.HandleMaxSpeedChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_X_MAX_SPEED, &planner.settings.max_feedrate_mm_s[X_AXIS], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Y_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Y_AXIS], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Z_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Z_AXIS], screen.handleMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_HOTEND - VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(0)], ScreenHandler.HandleExtruderMaxSpeedChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(0)], screen.handleExtruderMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], ScreenHandler.HandleExtruderMaxSpeedChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], screen.handleExtruderMaxSpeedChange, screen.sendFloatAsIntValueToDisplay<0>), #endif #endif - VPHELPER(VP_X_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[X_AXIS], ScreenHandler.HandleMaxAccChange, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Y_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Y_AXIS], ScreenHandler.HandleMaxAccChange, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Z_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Z_AXIS], ScreenHandler.HandleMaxAccChange, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_X_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[X_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_Y_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Y_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), + VPHELPER(VP_Z_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Z_AXIS], screen.handleMaxAccChange, screen.sendWordValueToDisplay), #if HAS_HOTEND - VPHELPER(VP_E0_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(0)], ScreenHandler.HandleExtruderAccChange, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_E0_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(0)], screen.handleExtruderAccChange, screen.sendWordValueToDisplay), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], ScreenHandler.HandleExtruderAccChange, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_E1_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], screen.handleExtruderAccChange, screen.sendWordValueToDisplay), #endif #endif - VPHELPER(VP_TRAVEL_SPEED, (uint16_t *)&planner.settings.travel_acceleration, ScreenHandler.HandleTravelAccChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_FEEDRATE_MIN_SPEED, (uint16_t *)&planner.settings.min_feedrate_mm_s, ScreenHandler.HandleFeedRateMinChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_T_F_SPEED, (uint16_t *)&planner.settings.min_travel_feedrate_mm_s, ScreenHandler.HandleMin_T_F, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), - VPHELPER(VP_ACC_SPEED, (uint16_t *)&planner.settings.acceleration, ScreenHandler.HandleAccChange, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_TRAVEL_SPEED, (uint16_t *)&planner.settings.travel_acceleration, screen.handleTravelAccChange, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_FEEDRATE_MIN_SPEED, (uint16_t *)&planner.settings.min_feedrate_mm_s, screen.handleFeedRateMinChange, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_T_F_SPEED, (uint16_t *)&planner.settings.min_travel_feedrate_mm_s, screen.handleMin_T_F, screen.sendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_ACC_SPEED, (uint16_t *)&planner.settings.acceleration, screen.handleAccChange, screen.sendWordValueToDisplay), - VPHELPER(VP_X_PARK_POS, &mks_park_pos.x, ScreenHandler.GetParkPos, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Y_PARK_POS, &mks_park_pos.y, ScreenHandler.GetParkPos, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Z_PARK_POS, &mks_park_pos.z, ScreenHandler.GetParkPos, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_X_PARK_POS, &mks_park_pos.x, screen.getParkPos, screen.sendWordValueToDisplay), + VPHELPER(VP_Y_PARK_POS, &mks_park_pos.y, screen.getParkPos, screen.sendWordValueToDisplay), + VPHELPER(VP_Z_PARK_POS, &mks_park_pos.z, screen.getParkPos, screen.sendWordValueToDisplay), #if ENABLED(PREVENT_COLD_EXTRUSION) - VPHELPER(VP_MIN_EX_T, &thermalManager.extrude_min_temp, ScreenHandler.HandleGetExMinTemp, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MIN_EX_T, &thermalManager.extrude_min_temp, screen.handleGetExMinTemp, screen.sendWordValueToDisplay), #endif #if ENABLED(SENSORLESS_HOMING) // TMC SENSORLESS Setting #if X_HAS_STEALTHCHOP - VPHELPER(VP_TMC_X_STEP, &tmc_step.x, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_X_STEP, &tmc_step.x, screen.tmcChangeConfig, screen.sendTMCStepValue), #endif #if Y_HAS_STEALTHCHOP - VPHELPER(VP_TMC_Y_STEP, &tmc_step.y, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_Y_STEP, &tmc_step.y, screen.tmcChangeConfig, screen.sendTMCStepValue), #endif #if Z_HAS_STEALTHCHOP - VPHELPER(VP_TMC_Z_STEP, &tmc_step.z, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_Z_STEP, &tmc_step.z, screen.tmcChangeConfig, screen.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), + VPHELPER(VP_TMC_X_Current, &stepperX.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #if AXIS_IS_TMC(Y) - VPHELPER(VP_TMC_Y_Current, &stepperY.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_TMC_Y_Current, &stepperY.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #if AXIS_IS_TMC(Z) - VPHELPER(VP_TMC_Z_Current, &stepperZ.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_TMC_Z_Current, &stepperZ.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #if AXIS_IS_TMC(E0) - VPHELPER(VP_TMC_E0_Current, &stepperE0.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_TMC_E0_Current, &stepperE0.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #if AXIS_IS_TMC(E1) - VPHELPER(VP_TMC_E1_Current, &stepperE1.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_TMC_E1_Current, &stepperE1.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #if AXIS_IS_TMC(X2) - VPHELPER(VP_TMC_X1_Current, &stepperX2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_TMC_X1_Current, &stepperX2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #if AXIS_IS_TMC(Y2) - VPHELPER(VP_TMC_Y1_Current, &stepperY2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_TMC_Y1_Current, &stepperY2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #if AXIS_IS_TMC(Z2) - VPHELPER(VP_TMC_Z1_Current, &stepperZ2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_TMC_Z1_Current, &stepperZ2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #endif - VPHELPER(VP_EEPROM_CTRL, nullptr, ScreenHandler.EEPROM_CTRL, nullptr), - VPHELPER(VP_LEVEL_BUTTON, nullptr, ScreenHandler.Level_Ctrl, nullptr), - VPHELPER(VP_LANGUAGE_CHANGE, nullptr, ScreenHandler.LanguageChange, nullptr), + VPHELPER(VP_EEPROM_CTRL, nullptr, screen.eepromControl, nullptr), + VPHELPER(VP_LEVEL_BUTTON, nullptr, screen.levelControl, nullptr), + VPHELPER(VP_LANGUAGE_CHANGE, nullptr, screen.languageChange, nullptr), - //VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + //VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, screen.handleLiveAdjustZ, nullptr), - VPHELPER(VP_SD_Print_LiveAdjustZ_Confirm, nullptr, ScreenHandler.ZoffsetConfirm, nullptr), + VPHELPER(VP_SD_Print_LiveAdjustZ_Confirm, nullptr, screen.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_ZOffset_Distance,nullptr ,screen.getZoffsetDistance, nullptr), + VPHELPER(VP_MESH_LEVEL_ADJUST, nullptr, screen.meshLevelDistanceConfig, nullptr), + VPHELPER(VP_MESH_LEVEL_POINT,nullptr, screen.meshLevel, nullptr), #if ENABLED(PREVENT_COLD_EXTRUSION) - VPHELPER(VP_Min_EX_T_E, &thermalManager.extrude_min_temp, ScreenHandler.GetMinExtrudeTemp, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Min_EX_T_E, &thermalManager.extrude_min_temp, screen.getMinExtrudeTemp, screen.sendWordValueToDisplay), #endif - VPHELPER(VP_AutoTurnOffSw, nullptr, ScreenHandler.GetTurnOffCtrl, nullptr), + VPHELPER(VP_AutoTurnOffSw, nullptr, screen.getTurnOffCtrl, nullptr), #if HAS_HOTEND - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<0>), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<0>), #endif #endif // SDCard File listing #if HAS_MEDIA - 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), - 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), + VPHELPER(VP_SD_FileSelected, nullptr, screen.sdFileSelected, nullptr), + VPHELPER(VP_SD_ScrollEvent, nullptr, screen.sdScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, screen.sdStartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName5, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName6, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName7, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName8, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName9, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, screen.sdResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, screen.sdReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, screen.sdPrintTune, 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, screen.handleLiveAdjustZ, screen.sendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_ZOffset_DE_DIS, &z_offset_add, nullptr, screen.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>), + VPHELPER(VP_OFFSET_X, &probe.offset.x, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Y, &probe.offset.y, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Z, &probe.offset.z, screen.getOffsetValue,screen.sendFloatAsLongValueToDisplay<2>), #endif #else - VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.PrintReturn, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, screen.printReturn, nullptr), #endif #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, screen.sendWaitingStatusToDisplay), #endif // Messages for the User, shared by the popup and the kill screen. They can't 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 = screen.sendStringToDisplayPGM}, + //{.VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM}, + //{.VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM}, + //{.VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM}, - {.VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplay_Language}, - {.VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplay_Language}, - {.VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplay_Language}, - {.VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = ScreenHandler.DGUSLCD_SendStringToDisplay_Language}, + {.VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplay_Language}, + {.VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplay_Language}, + {.VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplay_Language}, + {.VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplay_Language}, VPHELPER(0, 0, 0, 0) // must be last entry. }; diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h index 63586e7fe5..53e57e1c65 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.h @@ -124,21 +124,21 @@ typedef struct { extern NOZZLE_PARK_DEF nozzle_park_mks; -enum DGUSLCD_Screens : uint8_t { +enum DGUS_ScreenID : 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, + DGUS_SCREEN_BOOT = 33, + DGUS_SCREEN_MAIN = 60, + DGUS_SCREEN_STATUS = 60, + DGUS_SCREEN_STATUS2 = 60, + DGUS_SCREEN_PREHEAT = 18, + DGUS_SCREEN_POWER_LOSS = 100, + DGUS_SCREEN_MANUALMOVE = 192, + DGUS_SCREEN_UTILITY = 120, + DGUS_SCREEN_FILAMENT_UNLOADING = 158, + DGUS_SCREEN_SDFILELIST = 15, + DGUS_SCREEN_SDPRINTMANIPULATION = 15, + DGUS_SCREEN_SDPRINTTUNE = 17, MKSLCD_SCREEN_BOOT = 33, MKSLCD_SCREEN_HOME = 60, // MKS main page @@ -178,19 +178,19 @@ enum DGUSLCD_Screens : uint8_t { #else - DGUSLCD_SCREEN_BOOT = 120, - DGUSLCD_SCREEN_MAIN = 1, + DGUS_SCREEN_BOOT = 120, + DGUS_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, + DGUS_SCREEN_STATUS = 1, + DGUS_SCREEN_STATUS2 = 1, + DGUS_SCREEN_PREHEAT = 18, + DGUS_SCREEN_POWER_LOSS = 100, + DGUS_SCREEN_MANUALMOVE = 192, + DGUS_SCREEN_UTILITY = 120, + DGUS_SCREEN_FILAMENT_UNLOADING = 158, + DGUS_SCREEN_SDFILELIST = 15, + DGUS_SCREEN_SDPRINTMANIPULATION = 15, + DGUS_SCREEN_SDPRINTTUNE = 17, MKSLCD_SCREEN_BOOT = 0, MKSLCD_SCREEN_HOME = 1, // MKS main page @@ -234,11 +234,11 @@ enum DGUSLCD_Screens : uint8_t { #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" - DGUSLCD_SCREEN_UNUSED = 255 + DGUS_SCREEN_CONFIRM = 240, + DGUS_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUS_SCREEN_WAITING = 251, + DGUS_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUS_SCREEN_UNUSED = 255 }; diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp index 8cddcb074e..4c1995cebc 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp @@ -56,20 +56,20 @@ MKS_Language mks_language_index; // Initialized by settings.load() #if 0 void DGUSScreenHandlerMKS::sendinfoscreen_ch(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); + dgus.writeVariable(VP_MSGSTR1, line1, 32, true); + dgus.writeVariable(VP_MSGSTR2, line2, 32, true); + dgus.writeVariable(VP_MSGSTR3, line3, 32, true); + dgus.writeVariable(VP_MSGSTR4, line4, 32, true); } void DGUSScreenHandlerMKS::sendinfoscreen_en(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const 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); + dgus.writeVariable(VP_MSGSTR1, line1, 32, true); + dgus.writeVariable(VP_MSGSTR2, line2, 32, true); + dgus.writeVariable(VP_MSGSTR3, line3, 32, true); + dgus.writeVariable(VP_MSGSTR4, line4, 32, true); } -void DGUSScreenHandlerMKS::sendinfoscreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language) { +void DGUSScreenHandlerMKS::sendInfoScreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language) { if (language == MKS_English) DGUSScreenHandlerMKS::sendinfoscreen_en((char *)line1, (char *)line2, (char *)line3, (char *)line4); else if (language == MKS_SimpleChinese) @@ -78,78 +78,78 @@ void DGUSScreenHandlerMKS::sendinfoscreen(const void *line1, const void *line2, #endif -void DGUSScreenHandlerMKS::DGUSLCD_SendFanToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandlerMKS::sendFanToDisplay(DGUS_VP_Variable &var) { if (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); + dgus.writeVariable(var.VP, tmp); } } -void DGUSScreenHandlerMKS::DGUSLCD_SendBabyStepToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandlerMKS::sendBabyStepToDisplay(DGUS_VP_Variable &var) { float value = current_position.z; value *= cpow(10, 2); - dgusdisplay.WriteVariable(VP_SD_Print_Baby, (uint16_t)value); + dgus.writeVariable(VP_SD_Print_Baby, (uint16_t)value); } -void DGUSScreenHandlerMKS::DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandlerMKS::sendPrintTimeToDisplay(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)); + dgus.writeVariable(VP_PrintTime_H, uint16_t(time / 3600)); + dgus.writeVariable(VP_PrintTime_M, uint16_t(time % 3600 / 60)); + dgus.writeVariable(VP_PrintTime_S, uint16_t((time % 3600) % 60)); } -void DGUSScreenHandlerMKS::DGUSLCD_SetUint8(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::setUint8(DGUS_VP_Variable &var, void *val_ptr) { if (var.memadr) { const uint16_t value = BE16_P(val_ptr); *(uint8_t*)var.memadr = map(constrain(value, 0, 255), 0, 255, 0, 255); } } -void DGUSScreenHandlerMKS::DGUSLCD_SendGbkToDisplay(DGUS_VP_Variable &var) { +void DGUSScreenHandlerMKS::sendGbkToDisplay(DGUS_VP_Variable &var) { uint16_t *tmp = (uint16_t*) var.memadr; - dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); + dgus.writeVariable(var.VP, tmp, var.size, true); } -void DGUSScreenHandlerMKS::DGUSLCD_SendStringToDisplay_Language(DGUS_VP_Variable &var) { +void DGUSScreenHandlerMKS::sendStringToDisplay_Language(DGUS_VP_Variable &var) { if (mks_language_index == MKS_English) { char *tmp = (char*) var.memadr; - dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); + dgus.writeVariable(var.VP, tmp, var.size, true); } else if (mks_language_index == MKS_SimpleChinese) { uint16_t *tmp = (uint16_t *)var.memadr; - dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); + dgus.writeVariable(var.VP, tmp, var.size, true); } } -void DGUSScreenHandlerMKS::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { +void DGUSScreenHandlerMKS::sendTMCStepValue(DGUS_VP_Variable &var) { #if ENABLED(SENSORLESS_HOMING) #if X_HAS_STEALTHCHOP tmc_step.x = stepperX.homing_threshold(); - dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #if Y_HAS_STEALTHCHOP tmc_step.y = stepperY.homing_threshold(); - dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #if Z_HAS_STEALTHCHOP tmc_step.z = stepperZ.homing_threshold(); - dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + dgus.writeVariable(var.VP, *(int16_t*)var.memadr); #endif #endif } #if HAS_MEDIA - void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdFileSelected(DGUS_VP_Variable &var, void *val_ptr) { uint16_t touched_nr = (int16_t)BE16_P(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); + gotoScreen(DGUS_SCREEN_MAIN); else filelist.upDir(); return; @@ -158,28 +158,28 @@ void DGUSScreenHandlerMKS::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { if (filelist.isDir()) { filelist.changeDir(filelist.filename()); top_file = 0; - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } #if ENABLED(DGUS_PRINT_FILENAME) // Send print filename - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + dgus.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); + gotoScreen(MKSLCD_SCREEN_PRINT_CONFIRM); } - void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdStartPrint(DGUS_VP_Variable &var, void *val_ptr) { if (!filelist.seek(file_to_print)) return; ExtUI::printFile(filelist.shortFilename()); - GotoScreen(MKSLCD_SCREEN_PRINT); + gotoScreen(MKSLCD_SCREEN_PRINT); z_offset_add = 0; } - void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. switch (BE16_P(val_ptr)) { @@ -187,13 +187,13 @@ void DGUSScreenHandlerMKS::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { auto cs = getCurrentScreen(); if (runout_mks.runout_status != RUNOUT_WAITING_STATUS && runout_mks.runout_status != UNRUNOUT_STATUS) { if (cs == MKSLCD_SCREEN_PRINT || cs == MKSLCD_SCREEN_PAUSE) - GotoScreen(MKSLCD_SCREEN_PAUSE); + gotoScreen(MKSLCD_SCREEN_PAUSE); return; } else runout_mks.runout_status = UNRUNOUT_STATUS; - GotoScreen(MKSLCD_SCREEN_PRINT); + gotoScreen(MKSLCD_SCREEN_PRINT); if (ExtUI::isPrintingFromMediaPaused()) { nozzle_park_mks.print_pause_start_flag = 0; @@ -203,7 +203,7 @@ void DGUSScreenHandlerMKS::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { } break; case 1: // Pause - GotoScreen(MKSLCD_SCREEN_PAUSE); + gotoScreen(MKSLCD_SCREEN_PAUSE); if (!ExtUI::isPrintingFromMediaPaused()) { nozzle_park_mks.print_pause_start_flag = 1; nozzle_park_mks.blstatus = true; @@ -213,12 +213,12 @@ void DGUSScreenHandlerMKS::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { break; case 2: // Abort - HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + 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) { + void DGUSScreenHandler::sdSendFilename(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] = ""; @@ -229,50 +229,50 @@ void DGUSScreenHandlerMKS::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { 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); + sendStringToDisplay(var); - dgusdisplay.WriteVariable(VP_File_Pictutr0 + target_line * 2, dir_icon_val); + dgus.writeVariable(VP_File_Pictutr0 + target_line * 2, dir_icon_val); } - void DGUSScreenHandler::SDCardInserted() { + 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); + if (cs == DGUS_SCREEN_MAIN || cs == DGUS_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 + void DGUSScreenHandler::sdCardRemoved() { + if (current_screenID == DGUS_SCREEN_SDFILELIST + || (current_screenID == DGUS_SCREEN_CONFIRM && (confirmVP == VP_SD_AbortPrintConfirmed || confirmVP == VP_SD_FileSelectConfirm)) + || current_screenID == DGUS_SCREEN_SDPRINTMANIPULATION ) filelist.refresh(); } - void DGUSScreenHandlerMKS::SDPrintingFinished() { + void DGUSScreenHandlerMKS::sdPrintingFinished() { if (DGUSAutoTurnOff) { queue.exhaust(); gcode.process_subcommands_now(F("M81")); } - GotoScreen(MKSLCD_SCREEN_PrintDone); + gotoScreen(MKSLCD_SCREEN_PrintDone); } #else - void DGUSScreenHandlerMKS::PrintReturn(DGUS_VP_Variable& var, void *val_ptr) { + void DGUSScreenHandlerMKS::printReturn(DGUS_VP_Variable& var, void *val_ptr) { const uint16_t value = BE16_P(val_ptr); - if (value == 0x0F) GotoScreen(DGUSLCD_SCREEN_MAIN); + if (value == 0x0F) gotoScreen(DGUS_SCREEN_MAIN); } #endif // HAS_MEDIA -void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { +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, + // from screen 1 (main) to 10 (temperature). DGUS_SCREEN_POPUP is special, // meaning "return to previous screen" - DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + DGUS_ScreenID target = (DGUS_ScreenID)tmp[1]; - // when the dgus had reboot, it will enter the DGUSLCD_SCREEN_MAIN page, + // when the dgus had reboot, it will enter the DGUS_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; @@ -283,41 +283,41 @@ void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { // ) { // } // else - // GotoScreen(MKSLCD_SCREEN_PRINT); + // gotoScreen(MKSLCD_SCREEN_PRINT); // return; //} - if (target == DGUSLCD_SCREEN_POPUP) { - SetupConfirmAction(ExtUI::setUserConfirmed); + if (target == DGUS_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(); + if (current_screenID == DGUS_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + popToOldScreen(); return; } - UpdateNewScreen(target); + updateNewScreen(target); #ifdef DEBUG_DGUSLCD - if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); + if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } -void DGUSScreenHandlerMKS::ScreenBackChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::screenBackChange(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t target = BE16_P(val_ptr); switch (target) { } } -void DGUSScreenHandlerMKS::ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::zOffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) { settings.save(); if (printJobOngoing()) - GotoScreen(MKSLCD_SCREEN_PRINT); + gotoScreen(MKSLCD_SCREEN_PRINT); else if (print_job_timer.isPaused) - GotoScreen(MKSLCD_SCREEN_PAUSE); + gotoScreen(MKSLCD_SCREEN_PAUSE); } -void DGUSScreenHandlerMKS::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::getTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t value = BE16_P(val_ptr); switch (value) { case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; @@ -325,14 +325,14 @@ void DGUSScreenHandlerMKS::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) } } -void DGUSScreenHandlerMKS::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::getMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t value = BE16_P(val_ptr); TERN_(PREVENT_COLD_EXTRUSION, thermalManager.extrude_min_temp = value); mks_min_extrusion_temp = value; settings.save(); } -void DGUSScreenHandlerMKS::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::getZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t value = BE16_P(val_ptr); float val_distance = 0; switch (value) { @@ -345,29 +345,29 @@ void DGUSScreenHandlerMKS::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_p ZOffset_distance = val_distance; } -void DGUSScreenHandlerMKS::GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::getManualMovestep(DGUS_VP_Variable &var, void *val_ptr) { *(uint16_t *)var.memadr = BE16_P(val_ptr); } -void DGUSScreenHandlerMKS::EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::eepromControl(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t eep_flag = BE16_P(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); + gotoScreen(MKSLCD_SCREEN_EEP_Config); break; case 1: settings.reset(); - GotoScreen(MKSLCD_SCREEN_EEP_Config); + gotoScreen(MKSLCD_SCREEN_EEP_Config); break; default: break; } } -void DGUSScreenHandlerMKS::Z_offset_select(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::zOffsetSelect(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t z = BE16_P(val_ptr); switch (z) { case 0: Z_distance = 0.01; break; @@ -377,7 +377,7 @@ void DGUSScreenHandlerMKS::Z_offset_select(DGUS_VP_Variable &var, void *val_ptr) } } -void DGUSScreenHandlerMKS::GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::getOffsetValue(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_BED_PROBE const int32_t value = BE32_P(val_ptr); @@ -393,21 +393,21 @@ void DGUSScreenHandlerMKS::GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr) #endif } -void DGUSScreenHandlerMKS::LanguageChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::languageChange(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t lag_flag = BE16_P(val_ptr); switch (lag_flag) { case MKS_SimpleChinese: - DGUS_LanguageDisplay(MKS_SimpleChinese); + languageDisplay(MKS_SimpleChinese); mks_language_index = MKS_SimpleChinese; - dgusdisplay.WriteVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_Choose); - dgusdisplay.WriteVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_NoChoose); + dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_Choose); + dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_NoChoose); settings.save(); break; case MKS_English: - DGUS_LanguageDisplay(MKS_English); + languageDisplay(MKS_English); mks_language_index = MKS_English; - dgusdisplay.WriteVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_NoChoose); - dgusdisplay.WriteVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_Choose); + dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_NoChoose); + dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_Choose); settings.save(); break; default: break; @@ -415,10 +415,10 @@ void DGUSScreenHandlerMKS::LanguageChange(DGUS_VP_Variable &var, void *val_ptr) } #if ENABLED(MESH_BED_LEVELING) - uint8_t mesh_point_count = GRID_MAX_POINTS; + grid_count_t mesh_point_count = GRID_MAX_POINTS; #endif -void DGUSScreenHandlerMKS::Level_Ctrl(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::levelControl(DGUS_VP_Variable &var, void *val_ptr) { #if ENABLED(MESH_BED_LEVELING) auto cs = getCurrentScreen(); #endif @@ -440,32 +440,32 @@ void DGUSScreenHandlerMKS::Level_Ctrl(DGUS_VP_Variable &var, void *val_ptr) { if (mks_language_index == MKS_English) { const char level_buf_en[] = "Start Level"; - dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en, 32, true); + dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en, 32, true); } 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); + dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch, 32, true); } cs = getCurrentScreen(); - if (cs != MKSLCD_AUTO_LEVEL) GotoScreen(MKSLCD_AUTO_LEVEL); + if (cs != MKSLCD_AUTO_LEVEL) gotoScreen(MKSLCD_AUTO_LEVEL); #else - GotoScreen(MKSLCD_SCREEN_LEVEL); + gotoScreen(MKSLCD_SCREEN_LEVEL); #endif break; case 1: soft_endstop._enabled = true; - GotoScreen(MKSLCD_SCREEM_TOOL); + gotoScreen(MKSLCD_SCREEM_TOOL); break; default: break; } } -void DGUSScreenHandlerMKS::MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::meshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t mesh_dist = BE16_P(val_ptr); switch (mesh_dist) { case 0: mesh_adj_distance = 0.01; break; @@ -475,7 +475,7 @@ void DGUSScreenHandlerMKS::MeshLevelDistanceConfig(DGUS_VP_Variable &var, void * } } -void DGUSScreenHandlerMKS::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::meshLevel(DGUS_VP_Variable &var, void *val_ptr) { #if ENABLED(MESH_BED_LEVELING) const uint16_t mesh_val = BE16_P(val_ptr); // static uint8_t a_first_level = 1; @@ -524,11 +524,11 @@ void DGUSScreenHandlerMKS::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { if (mks_language_index == MKS_English) { const char level_buf_en1[] = "Next Point"; - dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en1, 32, true); + dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en1, 32, true); } 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); + dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch1, 32, true); } } else if (mesh_point_count > 1) { // 倒数第二个点 @@ -536,11 +536,11 @@ void DGUSScreenHandlerMKS::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { mesh_point_count--; if (mks_language_index == MKS_English) { const char level_buf_en2[] = "Next Point"; - dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); + dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); } 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); + dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); } } else if (mesh_point_count == 1) { @@ -548,11 +548,11 @@ void DGUSScreenHandlerMKS::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { mesh_point_count--; if (mks_language_index == MKS_English) { const char level_buf_en2[] = "Leveling Done"; - dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); + dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); } 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); + dgus.writeVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); } settings.save(); } @@ -560,7 +560,7 @@ void DGUSScreenHandlerMKS::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { mesh_point_count = GRID_MAX_POINTS; soft_endstop._enabled = true; settings.save(); - GotoScreen(MKSLCD_SCREEM_TOOL); + gotoScreen(MKSLCD_SCREEM_TOOL); } break; @@ -570,19 +570,19 @@ void DGUSScreenHandlerMKS::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { #endif // MESH_BED_LEVELING } -void DGUSScreenHandlerMKS::SD_FileBack(DGUS_VP_Variable&, void*) { - GotoScreen(MKSLCD_SCREEN_HOME); +void DGUSScreenHandlerMKS::sdFileBack(DGUS_VP_Variable&, void*) { + gotoScreen(MKSLCD_SCREEN_HOME); } -void DGUSScreenHandlerMKS::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::lcdBLKAdjust(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t lcd_val = BE16_P(val_ptr); lcd_default_light = constrain(lcd_val, 10, 100); const uint16_t lcd_data[2] = { lcd_default_light, lcd_default_light }; - dgusdisplay.WriteVariable(0x0082, &lcd_data, 5, true); + dgus.writeVariable(0x0082, &lcd_data, 5, true); } -void DGUSScreenHandlerMKS::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::manualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr) { const int16_t point_val = BE16_P(val_ptr); // Insist on leveling first time at this screen @@ -635,8 +635,8 @@ void DGUSScreenHandlerMKS::ManualAssistLeveling(DGUS_VP_Variable &var, void *val #define mks_min(a, b) ((a) < (b)) ? (a) : (b) #define mks_max(a, b) ((a) > (b)) ? (a) : (b) -void DGUSScreenHandlerMKS::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { - #if EITHER(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) +void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { + #if ANY(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) const uint16_t tmc_val = BE16_P(val_ptr); #endif @@ -727,7 +727,7 @@ void DGUSScreenHandlerMKS::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr #endif } -void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { int16_t movevalue = BE16_P(val_ptr); // Choose Move distance @@ -739,19 +739,21 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { return; char axiscode; - uint16_t speed = manual_feedrate_mm_m[X_AXIS]; // Default feedrate for manual moves + uint16_t speed = manual_feedrate_mm_m.x; // Default feedrate for manual moves switch (var.VP) { // switch X Y Z or Home default: return; - case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; - break; + #if HAS_X_AXIS + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + #endif #if HAS_Y_AXIS case VP_MOVE_Y: axiscode = 'Y'; - speed = manual_feedrate_mm_m[Y_AXIS]; + speed = manual_feedrate_mm_m.y; if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; break; #endif @@ -759,7 +761,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_Z_AXIS case VP_MOVE_Z: axiscode = 'Z'; - speed = manual_feedrate_mm_m[Z_AXIS]; + speed = manual_feedrate_mm_m.z; if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; break; #endif @@ -773,10 +775,12 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. break; - case VP_X_HOME: - axiscode = 'X'; - movevalue = 0; - break; + #if HAS_X_AXIS + case VP_X_HOME: + axiscode = 'X'; + movevalue = 0; + break; + #endif #if HAS_Y_AXIS case VP_Y_HOME: @@ -808,14 +812,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { char buf[6]; sprintf(buf, "G28 %c", axiscode); queue.enqueue_one_now(buf); - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } else if (movevalue == 5) { char buf[6]; snprintf_P(buf,6,PSTR("M84 %c"), axiscode); queue.enqueue_one_now(buf); - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } else { @@ -841,13 +845,13 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!old_relative_mode) queue.enqueue_now(F("G90")); } - ForceCompleteUpdate(); + forceCompleteUpdate(); cannotmove: return; } -void DGUSScreenHandlerMKS::GetParkPos(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::getParkPos(DGUS_VP_Variable &var, void *val_ptr) { const int16_t pos = BE16_P(val_ptr); switch (var.VP) { @@ -859,7 +863,7 @@ void DGUSScreenHandlerMKS::GetParkPos(DGUS_VP_Variable &var, void *val_ptr) { skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleChangeLevelPoint(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleChangeLevelPoint(DGUS_VP_Variable &var, void *val_ptr) { const int16_t raw = BE16_P(val_ptr); *(int16_t*)var.memadr = raw; @@ -868,7 +872,7 @@ void DGUSScreenHandlerMKS::HandleChangeLevelPoint(DGUS_VP_Variable &var, void *v skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t raw = BE16_P(val_ptr); const float value = (float)raw; @@ -884,7 +888,7 @@ void DGUSScreenHandlerMKS::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *v skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t raw = BE16_P(val_ptr); const float value = (float)raw; @@ -903,7 +907,7 @@ void DGUSScreenHandlerMKS::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t raw = BE16_P(val_ptr); const float value = (float)raw; @@ -919,7 +923,7 @@ void DGUSScreenHandlerMKS::HandleMaxSpeedChange(DGUS_VP_Variable &var, void *val skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleExtruderMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleExtruderMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t raw = BE16_P(val_ptr); const float value = (float)raw; @@ -938,7 +942,7 @@ void DGUSScreenHandlerMKS::HandleExtruderMaxSpeedChange(DGUS_VP_Variable &var, v skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t raw = BE16_P(val_ptr); const float value = (float)raw; @@ -954,7 +958,7 @@ void DGUSScreenHandlerMKS::HandleMaxAccChange(DGUS_VP_Variable &var, void *val_p skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleExtruderAccChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleExtruderAccChange(DGUS_VP_Variable &var, void *val_ptr) { uint16_t raw = BE16_P(val_ptr); float value = (float)raw; ExtUI::extruder_t extruder; @@ -972,32 +976,32 @@ void DGUSScreenHandlerMKS::HandleExtruderAccChange(DGUS_VP_Variable &var, void * skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleTravelAccChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleTravelAccChange(DGUS_VP_Variable &var, void *val_ptr) { uint16_t travel = BE16_P(val_ptr); planner.settings.travel_acceleration = (float)travel; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleFeedRateMinChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleFeedRateMinChange(DGUS_VP_Variable &var, void *val_ptr) { uint16_t t = BE16_P(val_ptr); planner.settings.min_feedrate_mm_s = (float)t; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleMin_T_F(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleMin_T_F(DGUS_VP_Variable &var, void *val_ptr) { uint16_t t_f = BE16_P(val_ptr); planner.settings.min_travel_feedrate_mm_s = (float)t_f; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::HandleAccChange(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::handleAccChange(DGUS_VP_Variable &var, void *val_ptr) { uint16_t acc = BE16_P(val_ptr); planner.settings.acceleration = (float)acc; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } #if ENABLED(PREVENT_COLD_EXTRUSION) - void DGUSScreenHandlerMKS::HandleGetExMinTemp(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandlerMKS::handleGetExMinTemp(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t ex_min_temp = BE16_P(val_ptr); thermalManager.extrude_min_temp = ex_min_temp; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel @@ -1005,7 +1009,7 @@ void DGUSScreenHandlerMKS::HandleAccChange(DGUS_VP_Variable &var, void *val_ptr) #endif #if HAS_PID_HEATING - void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t rawvalue = BE16_P(val_ptr); const float value = float(rawvalue); float newvalue = 0; @@ -1037,7 +1041,7 @@ void DGUSScreenHandlerMKS::HandleAccChange(DGUS_VP_Variable &var, void *val_ptr) #endif // HAS_PID_HEATING #if ENABLED(BABYSTEPPING) - void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { const float step = ZOffset_distance; const uint16_t flag = BE16_P(val_ptr); @@ -1074,11 +1078,11 @@ void DGUSScreenHandlerMKS::HandleAccChange(DGUS_VP_Variable &var, void *val_ptr) default: break; } - ForceCompleteUpdate(); + forceCompleteUpdate(); } #endif // BABYSTEPPING -void DGUSScreenHandlerMKS::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::getManualFilament(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t len = BE16_P(val_ptr); const float value = (float)len; @@ -1087,15 +1091,15 @@ void DGUSScreenHandlerMKS::GetManualFilament(DGUS_VP_Variable &var, void *val_pt skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandlerMKS::getManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { const uint16_t len = BE16_P(val_ptr); filamentSpeed_mm_s = len; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } -void DGUSScreenHandlerMKS::FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { - #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) +void DGUSScreenHandlerMKS::filamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { + #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) uint8_t swap_tool = 0; #else constexpr uint8_t swap_tool = 1; // T0 (or none at all) @@ -1116,7 +1120,7 @@ void DGUSScreenHandlerMKS::FilamentLoadUnload(DGUS_VP_Variable &var, void *val_p if (thermalManager.tooColdToExtrude(0)) hotend_too_cold = 1; else { - #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) swap_tool = 1; #endif } @@ -1131,19 +1135,19 @@ void DGUSScreenHandlerMKS::FilamentLoadUnload(DGUS_VP_Variable &var, void *val_p break; } - #if BOTH(HAS_HOTEND, PREVENT_COLD_EXTRUSION) + #if ALL(HAS_HOTEND, PREVENT_COLD_EXTRUSION) if (hotend_too_cold) { if (thermalManager.targetTooColdToExtrude(hotend_too_cold - 1)) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, hotend_too_cold - 1); - sendinfoscreen(F("NOTICE"), nullptr, F("Please wait."), F("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); + sendInfoScreen(F("NOTICE"), nullptr, F("Please wait."), F("Nozzle heating!"), true, true, true, true); + setupConfirmAction(nullptr); + gotoScreen(DGUS_SCREEN_POPUP); } #endif if (swap_tool) { char buf[30]; snprintf_P(buf, 30 - #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) , PSTR("M1002T%cE%dF%d"), char('0' + swap_tool - 1) #else , PSTR("M1002E%dF%d") @@ -1155,11 +1159,11 @@ void DGUSScreenHandlerMKS::FilamentLoadUnload(DGUS_VP_Variable &var, void *val_p } /** - * M1002: Do a tool-change and relative move for FilamentLoadUnload + * M1002: Do a tool-change and relative move for filamentLoadUnload * within the G-code execution window for best concurrency. */ void GcodeSuite::M1002() { - #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + #if ANY(HAS_MULTI_HOTEND, SINGLENOZZLE) { char buf[3]; sprintf_P(buf, PSTR("T%c"), char('0' + parser.intval('T'))); @@ -1177,17 +1181,17 @@ void GcodeSuite::M1002() { axis_relative = old_axis_relative; } -void DGUSScreenHandlerMKS::FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { - FilamentLoadUnload(var, val_ptr, 1); +void DGUSScreenHandlerMKS::filamentLoad(DGUS_VP_Variable &var, void *val_ptr) { + filamentLoadUnload(var, val_ptr, 1); } -void DGUSScreenHandlerMKS::FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) { - FilamentLoadUnload(var, val_ptr, -1); +void DGUSScreenHandlerMKS::filamentUnload(DGUS_VP_Variable &var, void *val_ptr) { + filamentLoadUnload(var, val_ptr, -1); } #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { uint8_t e_temp = 0; filament_data.heated = false; uint16_t preheat_option = BE16_P(val_ptr); @@ -1233,7 +1237,7 @@ void DGUSScreenHandlerMKS::FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) #if HAS_MULTI_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif - GotoScreen(DGUSLCD_SCREEN_UTILITY); + gotoScreen(DGUS_SCREEN_UTILITY); } else { // Go to the preheat screen to show the heating progress switch (var.VP) { @@ -1254,7 +1258,7 @@ void DGUSScreenHandlerMKS::FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) } } - void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + void DGUSScreenHandler::handleFilamentLoadUnload(DGUS_VP_Variable &var) { if (filament_data.action <= 0) return; // If we close to the target temperature, we can start load or unload the filament @@ -1270,7 +1274,7 @@ void DGUSScreenHandlerMKS::FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) } else { // unload filament if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + gotoScreen(DGUS_SCREEN_FILAMENT_UNLOADING); filament_data.heated = true; } // Before unloading extrude to prevent jamming @@ -1289,21 +1293,21 @@ void DGUSScreenHandlerMKS::FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) #endif // DGUS_FILAMENT_LOADUNLOAD bool DGUSScreenHandlerMKS::loop() { - dgusdisplay.loop(); + dgus.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)) { + if (!isScreenComplete() || ELAPSED(ms, next_event_ms)) { next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - UpdateScreenVPData(); + updateScreenVPData(); } if (language_times != 0) { - LanguagePInit(); - DGUS_LanguageDisplay(mks_language_index); + languagePInit(); + languageDisplay(mks_language_index); language_times--; } @@ -1322,40 +1326,40 @@ bool DGUSScreenHandlerMKS::loop() { thermalManager.extrude_min_temp = mks_min_extrusion_temp; #endif - DGUS_ExtrudeLoadInit(); + extrudeLoadInit(); - TERN_(DGUS_MKS_RUNOUT_SENSOR, DGUS_RunoutInit()); + TERN_(DGUS_MKS_RUNOUT_SENSOR, runoutInit()); if (TERN0(POWER_LOSS_RECOVERY, recovery.valid())) - GotoScreen(DGUSLCD_SCREEN_POWER_LOSS); + gotoScreen(DGUS_SCREEN_POWER_LOSS); else - GotoScreen(DGUSLCD_SCREEN_MAIN); + gotoScreen(DGUS_SCREEN_MAIN); } #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) - if (booted && printingIsActive()) DGUS_Runout_Idle(); + if (booted && printingIsActive()) runoutIdle(); #endif #endif // SHOW_BOOTSCREEN - return IsScreenComplete(); + return isScreenComplete(); } -void DGUSScreenHandlerMKS::LanguagePInit() { +void DGUSScreenHandlerMKS::languagePInit() { switch (mks_language_index) { case MKS_SimpleChinese: - dgusdisplay.WriteVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_Choose); - dgusdisplay.WriteVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_NoChoose); + dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_Choose); + dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_NoChoose); break; case MKS_English: - dgusdisplay.WriteVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_NoChoose); - dgusdisplay.WriteVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_Choose); + dgus.writeVariable(VP_LANGUAGE_CHANGE1, (uint8_t)MKS_Language_NoChoose); + dgus.writeVariable(VP_LANGUAGE_CHANGE2, (uint8_t)MKS_Language_Choose); break; default: break; } } -void DGUSScreenHandlerMKS::DGUS_ExtrudeLoadInit() { +void DGUSScreenHandlerMKS::extrudeLoadInit() { ex_filament.ex_length = distanceFilament; ex_filament.ex_load_unload_flag = 0; ex_filament.ex_need_time = filamentSpeed_mm_s; @@ -1365,7 +1369,7 @@ void DGUSScreenHandlerMKS::DGUS_ExtrudeLoadInit() { ex_filament.ex_tick_start = 0; } -void DGUSScreenHandlerMKS::DGUS_RunoutInit() { +void DGUSScreenHandlerMKS::runoutInit() { #if PIN_EXISTS(MT_DET_1) SET_INPUT_PULLUP(MT_DET_1_PIN); #endif @@ -1375,7 +1379,7 @@ void DGUSScreenHandlerMKS::DGUS_RunoutInit() { runout_mks.runout_status = UNRUNOUT_STATUS; } -void DGUSScreenHandlerMKS::DGUS_Runout_Idle() { +void DGUSScreenHandlerMKS::runoutIdle() { #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) // scanf runout pin switch (runout_mks.runout_status) { @@ -1383,11 +1387,11 @@ void DGUSScreenHandlerMKS::DGUS_Runout_Idle() { case RUNOUT_STATUS: runout_mks.runout_status = RUNOUT_BEGIN_STATUS; queue.inject(F("M25")); - GotoScreen(MKSLCD_SCREEN_PAUSE); + gotoScreen(MKSLCD_SCREEN_PAUSE); - sendinfoscreen(F("NOTICE"), nullptr, F("Please change filament!"), nullptr, true, true, true, true); - //SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); + sendInfoScreen(F("NOTICE"), nullptr, F("Please change filament!"), nullptr, true, true, true, true); + //setupConfirmAction(nullptr); + gotoScreen(DGUS_SCREEN_POPUP); break; case UNRUNOUT_STATUS: @@ -1410,516 +1414,516 @@ void DGUSScreenHandlerMKS::DGUS_Runout_Idle() { #endif } -void DGUSScreenHandlerMKS::DGUS_LanguageDisplay(uint8_t var) { +void DGUSScreenHandlerMKS::languageDisplay(uint8_t var) { if (var == MKS_English) { const char home_buf_en[] = "Home"; - dgusdisplay.WriteVariable(VP_HOME_Dis, home_buf_en, 32, true); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.writeVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en, 32, true); const char Info_PrintFinish_1_buf_en[] = "Print Done"; - dgusdisplay.WriteVariable(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_en, 32, true); + dgus.writeVariable(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.writeVariable(VP_Setting_Dis, Setting_Dis, 7, true); const uint16_t Tool_Dis[] = { 0xA4B9, 0xDFBE }; - dgusdisplay.WriteVariable(VP_Tool_Dis, Tool_Dis, 4, true); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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, 0xBFA3, 0x2000 }; - dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32, true); + dgus.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); + dgus.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); + dgus.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); + dgus.writeVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_ch, 16, true); const uint16_t Info_PrintFinish_1_buf_ch[] = { 0xF2B4, 0xA1D3, 0xEACD, 0xC9B3, 0x2000 }; - dgusdisplay.WriteVariable(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_1_buf_ch, 32, true); + dgus.writeVariable(VP_Info_PrintFinish_1_Dis, Info_PrintFinish_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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.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); + dgus.writeVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_ch, 32, true); } } diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h index 69ded29ffb..9527badb5a 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.h @@ -23,7 +23,7 @@ #include "../DGUSScreenHandlerBase.h" -enum DGUSLCD_Screens : uint8_t; +enum DGUS_ScreenID : uint8_t; class DGUSScreenHandlerMKS : public DGUSScreenHandler { public: @@ -32,72 +32,72 @@ public: #if 0 static void sendinfoscreen_ch(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); static void sendinfoscreen_en(PGM_P const line1, PGM_P const line2, PGM_P const line3, PGM_P const line4); - static void sendinfoscreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language); + static void sendInfoScreen(const void *line1, const void *line2, const void *line3, const void *line4, uint16_t language); #endif - static void ScreenBackChange(DGUS_VP_Variable &var, void *val_ptr); + static void screenBackChange(DGUS_VP_Variable &var, void *val_ptr); - static void EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr); - static void LanguageChange(DGUS_VP_Variable &var, void *val_ptr); - static void GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr); - static void Level_Ctrl(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(DGUS_VP_Variable &var, void *val_ptr); + static void eepromControl(DGUS_VP_Variable &var, void *val_ptr); + static void languageChange(DGUS_VP_Variable &var, void *val_ptr); + static void getOffsetValue(DGUS_VP_Variable &var, void *val_ptr); + static void levelControl(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 zOffsetSelect(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(DGUS_VP_Variable &var, void *val_ptr); #if ENABLED(PREVENT_COLD_EXTRUSION) - static void HandleGetExMinTemp(DGUS_VP_Variable &var, void *val_ptr); + static void handleGetExMinTemp(DGUS_VP_Variable &var, void *val_ptr); #endif - 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(); - static void DGUS_Runout_Idle(); - static void DGUS_RunoutInit(); - static void DGUS_ExtrudeLoadInit(); - static void LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr); - static void SD_FileBack(DGUS_VP_Variable &var, void *val_ptr); + static void languageDisplay(uint8_t var); + static void tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr); + static void getTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr); + static void languagePInit(); + static void runoutIdle(); + static void runoutInit(); + static void extrudeLoadInit(); + static void lcdBLKAdjust(DGUS_VP_Variable &var, void *val_ptr); + static void sdFileBack(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 HandleMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr); - static void HandleExtruderMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr); - static void HandleAccChange(DGUS_VP_Variable &var, void *val_ptr); - static void HandleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr); - static void HandleExtruderAccChange(DGUS_VP_Variable &var, void *val_ptr); - static void HandleChangeLevelPoint(DGUS_VP_Variable &var, void *val_ptr); - static void HandleTravelAccChange(DGUS_VP_Variable &var, void *val_ptr); - static void HandleFeedRateMinChange(DGUS_VP_Variable &var, void *val_ptr); - static void HandleMin_T_F(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 handleMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr); + static void handleExtruderMaxSpeedChange(DGUS_VP_Variable &var, void *val_ptr); + static void handleAccChange(DGUS_VP_Variable &var, void *val_ptr); + static void handleMaxAccChange(DGUS_VP_Variable &var, void *val_ptr); + static void handleExtruderAccChange(DGUS_VP_Variable &var, void *val_ptr); + static void handleChangeLevelPoint(DGUS_VP_Variable &var, void *val_ptr); + static void handleTravelAccChange(DGUS_VP_Variable &var, void *val_ptr); + static void handleFeedRateMinChange(DGUS_VP_Variable &var, void *val_ptr); + static void handleMin_T_F(DGUS_VP_Variable &var, void *val_ptr); #if HAS_PID_HEATING - static void FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir); - static void FilamentLoad(DGUS_VP_Variable &var, void *val_ptr); - static void FilamentUnLoad(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); + static void filamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir); + static void filamentLoad(DGUS_VP_Variable &var, void *val_ptr); + static void filamentUnload(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 HAS_MEDIA // Marlin informed us about SD print completion. - static void SDPrintingFinished(); + static void sdPrintingFinished(); #else - static void PrintReturn(DGUS_VP_Variable &var, void *val_ptr); + static void printReturn(DGUS_VP_Variable &var, void *val_ptr); #endif - static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendBabyStepToDisplay(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(DGUS_VP_Variable &var); - static void DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var); + static void sendPrintTimeToDisplay(DGUS_VP_Variable &var); + static void sendBabyStepToDisplay(DGUS_VP_Variable &var); + static void sendFanToDisplay(DGUS_VP_Variable &var); + static void sendGbkToDisplay(DGUS_VP_Variable &var); + static void sendStringToDisplay_Language(DGUS_VP_Variable &var); + static void sendTMCStepValue(DGUS_VP_Variable &var); - static void DGUSLCD_SetUint8(DGUS_VP_Variable &var, void *val_ptr); + static void setUint8(DGUS_VP_Variable &var, void *val_ptr); static bool loop(); }; diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp index c5711320ec..d69041ebc5 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp @@ -108,17 +108,17 @@ const uint16_t VPList_SDFileList[] PROGMEM = { VP_SD_FileName0, VP_SD_ const uint16_t VPList_SD_PrintManipulation[] PROGMEM = { VP_PrintProgress_Percentage, VP_PrintTime, 0x0000 }; const struct VPMapping VPMap[] PROGMEM = { - { DGUSLCD_SCREEN_BOOT, VPList_Boot }, - { DGUSLCD_SCREEN_MAIN, VPList_Main }, - { DGUSLCD_SCREEN_TEMPERATURE, VPList_Temp }, - { DGUSLCD_SCREEN_STATUS, VPList_Status }, - { DGUSLCD_SCREEN_STATUS2, VPList_Status2 }, - { DGUSLCD_SCREEN_MANUALMOVE, VPList_ManualMove }, - { DGUSLCD_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, - { DGUSLCD_SCREEN_FANANDFEEDRATE, VPList_FanAndFeedrate }, - { DGUSLCD_SCREEN_FLOWRATES, VPList_SD_FlowRates }, - { DGUSLCD_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, - { DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList }, + { DGUS_SCREEN_BOOT, VPList_Boot }, + { DGUS_SCREEN_MAIN, VPList_Main }, + { DGUS_SCREEN_TEMPERATURE, VPList_Temp }, + { DGUS_SCREEN_STATUS, VPList_Status }, + { DGUS_SCREEN_STATUS2, VPList_Status2 }, + { DGUS_SCREEN_MANUALMOVE, VPList_ManualMove }, + { DGUS_SCREEN_MANUALEXTRUDE, VPList_ManualExtrude }, + { DGUS_SCREEN_FANANDFEEDRATE, VPList_FanAndFeedrate }, + { DGUS_SCREEN_FLOWRATES, VPList_SD_FlowRates }, + { DGUS_SCREEN_SDPRINTMANIPULATION, VPList_SD_PrintManipulation }, + { DGUS_SCREEN_SDFILELIST, VPList_SDFileList }, { 0 , nullptr } // List is terminated with an nullptr as table entry. }; @@ -126,152 +126,152 @@ const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; 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), + VPHELPER(VP_SCREENCHANGE, nullptr, screen.screenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, screen.screenChangeHookIfIdle, nullptr), #if HAS_MEDIA - VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, screen.screenChangeHookIfSD, nullptr), #endif - VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + VPHELPER(VP_CONFIRMED, nullptr, screen.screenConfirmedOK, nullptr), - VPHELPER(VP_TEMP_ALL_OFF, nullptr, ScreenHandler.HandleAllHeatersOff, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, screen.handleAllHeatersOff, nullptr), #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_OPTION, &distanceToMove, ScreenHandler.HandleManualMoveOption, nullptr), + VPHELPER(VP_MOVE_OPTION, &distanceToMove, screen.handleManualMoveOption, nullptr), #endif #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - VPHELPER(VP_MOVE_X, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Y, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_Z, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_HOME_ALL, &distanceToMove, ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_X, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, &distanceToMove, screen.handleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, &distanceToMove, screen.handleManualMove, nullptr), #else - 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_MOVE_X, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, screen.handleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, screen.handleManualMove, nullptr), #endif - VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, ScreenHandler.HandleMotorLockUnlock, nullptr), + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, screen.handleMotorLockUnlock, nullptr), #if ENABLED(POWER_LOSS_RECOVERY) - VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, ScreenHandler.HandlePowerLossRecovery, nullptr), + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, screen.handlePowerLossRecovery, nullptr), #endif - VPHELPER(VP_SETTINGS, nullptr, ScreenHandler.HandleSettings, nullptr), + VPHELPER(VP_SETTINGS, nullptr, screen.handleSettings, nullptr), - { .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 = screen.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 = screen.sendStringToDisplay }, // Temperature Data #if HAS_HOTEND - 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, nullptr, 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), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, screen.handleTemperatureChanged, &screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, nullptr, screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, screen.handleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, screen.sendHeaterStatusToDisplay), #if ENABLED(DGUS_PREHEAT_UI) - VPHELPER(VP_E0_BED_PREHEAT, nullptr, ScreenHandler.HandlePreheat, nullptr), + VPHELPER(VP_E0_BED_PREHEAT, nullptr, screen.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), + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, screen.handlePIDAutotune, nullptr), #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload), + VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, screen.handleFilamentOption, screen.handleFilamentLoadUnload), #endif #endif #if HAS_MULTI_HOTEND - 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, nullptr, 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), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, nullptr, screen.handleFlowRateChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, screen.handleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, screen.sendHeaterStatusToDisplay), #if ENABLED(PIDTEMP) - VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, ScreenHandler.HandlePIDAutotune, nullptr), + VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, screen.handlePIDAutotune, nullptr), #endif #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), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, screen.sendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, screen.handleTemperatureChanged, screen.sendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, screen.handleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, screen.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_BED_PID_P, &thermalManager.temp_bed.pid.Kp, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, screen.handleTemperaturePIDChanged, screen.sendTemperaturePID), #endif #endif // Fan Data #if HAS_FAN #define FAN_VPHELPER(N) \ - VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_PercentageToUint8, ScreenHandler.DGUSLCD_SendPercentageToDisplay), \ - 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), + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], screen.percentageToUint8, screen.sendPercentageToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], screen.handleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, screen.sendFanStatusToDisplay), REPEAT(FAN_COUNT, FAN_VPHELPER) #endif // Feedrate - VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, screen.setValueDirectly, screen.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>), + VPHELPER(VP_XPos, ¤t_position.x, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, screen.sendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, screen.sendFloatAsLongValueToDisplay<2>), // Print Progress - VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay), + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, screen.sendPrintProgressToDisplay), // Print Time - VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay), + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, screen.sendPrintTimeToDisplay), #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), + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, screen.sendPrintAccTimeToDisplay), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, screen.sendPrintsTotalToDisplay), #endif - VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), - VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], screen.handleStepPerMMChanged, screen.sendFloatAsIntValueToDisplay<1>), #if HAS_HOTEND - VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<1>), #if HAS_MULTI_HOTEND - VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>), + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], screen.handleStepPerMMExtruderChanged, screen.sendFloatAsIntValueToDisplay<1>), #endif #endif // SDCard File listing. #if HAS_MEDIA - 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(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), + VPHELPER(VP_SD_ScrollEvent, nullptr, screen.sdScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, screen.sdFileSelected, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, screen.sdStartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, screen.sdSendFilename), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, screen.sdResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, screen.sdReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, screen.sdPrintTune, nullptr), #if HAS_BED_PROBE - VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, ScreenHandler.HandleProbeOffsetZChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_SD_Print_ProbeOffsetZ, &probe.offset.z, screen.handleProbeOffsetZChanged, screen.sendFloatAsIntValueToDisplay<2>), #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, screen.handleLiveAdjustZ, nullptr), #endif #endif #endif #if ENABLED(DGUS_UI_WAITING) - VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, screen.sendWaitingStatusToDisplay), #endif // Messages for the User, shared by the popup and the kill screen. They can't 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 = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, + { .VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = screen.sendStringToDisplayPGM }, VPHELPER(0, 0, 0, 0) // must be last entry. }; diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h index d529b0adfe..e601abd255 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.h @@ -23,30 +23,30 @@ #include "../DGUSDisplayDef.h" -enum DGUSLCD_Screens : uint8_t { - DGUSLCD_SCREEN_BOOT = 0, - DGUSLCD_SCREEN_MAIN = 10, - DGUSLCD_SCREEN_TEMPERATURE = 20, - DGUSLCD_SCREEN_STATUS = 30, - DGUSLCD_SCREEN_STATUS2 = 32, - DGUSLCD_SCREEN_MANUALMOVE = 40, - DGUSLCD_SCREEN_MANUALEXTRUDE = 42, - DGUSLCD_SCREEN_FANANDFEEDRATE = 44, - DGUSLCD_SCREEN_FLOWRATES = 46, - DGUSLCD_SCREEN_SDFILELIST = 50, - DGUSLCD_SCREEN_SDPRINTMANIPULATION = 52, - DGUSLCD_SCREEN_POWER_LOSS = 100, - DGUSLCD_SCREEN_PREHEAT = 120, - DGUSLCD_SCREEN_UTILITY = 110, - DGUSLCD_SCREEN_FILAMENT_HEATING = 146, - DGUSLCD_SCREEN_FILAMENT_LOADING = 148, - DGUSLCD_SCREEN_FILAMENT_UNLOADING = 158, - DGUSLCD_SCREEN_SDPRINTTUNE = 170, - 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" - DGUSLCD_SCREEN_UNUSED = 255 +enum DGUS_ScreenID : uint8_t { + DGUS_SCREEN_BOOT = 0, + DGUS_SCREEN_MAIN = 10, + DGUS_SCREEN_TEMPERATURE = 20, + DGUS_SCREEN_STATUS = 30, + DGUS_SCREEN_STATUS2 = 32, + DGUS_SCREEN_MANUALMOVE = 40, + DGUS_SCREEN_MANUALEXTRUDE = 42, + DGUS_SCREEN_FANANDFEEDRATE = 44, + DGUS_SCREEN_FLOWRATES = 46, + DGUS_SCREEN_SDFILELIST = 50, + DGUS_SCREEN_SDPRINTMANIPULATION = 52, + DGUS_SCREEN_POWER_LOSS = 100, + DGUS_SCREEN_PREHEAT = 120, + DGUS_SCREEN_UTILITY = 110, + DGUS_SCREEN_FILAMENT_HEATING = 146, + DGUS_SCREEN_FILAMENT_LOADING = 148, + DGUS_SCREEN_FILAMENT_UNLOADING = 158, + DGUS_SCREEN_SDPRINTTUNE = 170, + DGUS_SCREEN_CONFIRM = 240, + DGUS_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUS_SCREEN_WAITING = 251, + DGUS_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUS_SCREEN_UNUSED = 255 }; // Display Memory layout used (T5UID) diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp index 6921cdc737..943d8c50a5 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp @@ -44,7 +44,7 @@ extern ExtUI::FileList filelist; - void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdFileSelected(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; @@ -52,28 +52,28 @@ if (filelist.isDir()) { filelist.changeDir(filelist.filename()); top_file = 0; - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } #if ENABLED(DGUS_PRINT_FILENAME) // Send print filename - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + dgus.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); + 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) { + void DGUSScreenHandler::sdStartPrint(DGUS_VP_Variable &var, void *val_ptr) { if (!filelist.seek(file_to_print)) return; ExtUI::printFile(filelist.shortFilename()); - GotoScreen(DGUSLCD_SCREEN_STATUS); + gotoScreen(DGUS_SCREEN_STATUS); } - void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::sdResumePauseAbort(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)) { @@ -85,19 +85,19 @@ case 1: // Pause - GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + gotoScreen(DGUS_SCREEN_SDPRINTMANIPULATION); 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); + 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) { + void DGUSScreenHandler::sdSendFilename(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] = ""; @@ -106,49 +106,49 @@ 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); + sendStringToDisplay(var); } - void DGUSScreenHandler::SDCardInserted() { + void DGUSScreenHandler::sdCardInserted() { top_file = 0; filelist.refresh(); auto cs = getCurrentScreen(); - if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) - GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + if (cs == DGUS_SCREEN_MAIN || cs == DGUS_SCREEN_STATUS) + gotoScreen(DGUS_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); + void DGUSScreenHandler::sdCardRemoved() { + if (current_screenID == DGUS_SCREEN_SDFILELIST + || (current_screenID == DGUS_SCREEN_CONFIRM && (confirmVP == VP_SD_AbortPrintConfirmed || confirmVP == VP_SD_FileSelectConfirm)) + || current_screenID == DGUS_SCREEN_SDPRINTMANIPULATION + ) gotoScreen(DGUS_SCREEN_MAIN); } #endif // HAS_MEDIA -void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { +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, + // from screen 1 (main) to 10 (temperature). DGUS_SCREEN_POPUP is special, // meaning "return to previous screen" - DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + DGUS_ScreenID target = (DGUS_ScreenID)tmp[1]; - if (target == DGUSLCD_SCREEN_POPUP) { + if (target == DGUS_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(); + if (current_screenID == DGUS_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + popToOldScreen(); return; } - UpdateNewScreen(target); + updateNewScreen(target); #ifdef DEBUG_DGUSLCD - if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); + if (!findScreenVPMapList(target)) DEBUG_ECHOLNPGM("WARNING: No screen Mapping found for ", target); #endif } -void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { +void DGUSScreenHandler::handleManualMove(DGUS_VP_Variable &var, void *val_ptr) { int16_t movevalue = swap16(*(uint16_t*)val_ptr); #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) if (movevalue) { @@ -157,20 +157,22 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } #endif char axiscode; - uint16_t speed = manual_feedrate_mm_m[X_AXIS]; // Default feedrate for manual moves + uint16_t speed = manual_feedrate_mm_m.x; // Default feedrate for manual moves switch (var.VP) { default: return; - case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; - break; + #if HAS_X_AXIS + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + #endif #if HAS_Y_AXIS case VP_MOVE_Y: axiscode = 'Y'; - speed = manual_feedrate_mm_m[Y_AXIS]; + speed = manual_feedrate_mm_m.y; if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; break; #endif @@ -178,7 +180,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #if HAS_Z_AXIS case VP_MOVE_Z: axiscode = 'Z'; - speed = manual_feedrate_mm_m[Z_AXIS]; + speed = manual_feedrate_mm_m.z; if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; break; #endif @@ -194,7 +196,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { char buf[6] = "G28 X"; buf[4] = axiscode; queue.enqueue_one_now(buf); - ForceCompleteUpdate(); + forceCompleteUpdate(); return; } else { @@ -217,14 +219,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (!old_relative_mode) queue.enqueue_now(F("G90")); } - ForceCompleteUpdate(); + forceCompleteUpdate(); cannotmove: return; } #if HAS_PID_HEATING - void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); float value = (float)rawvalue / 10; float newvalue = 0; @@ -255,17 +257,17 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif // HAS_PID_HEATING #if ENABLED(BABYSTEPPING) - void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { int16_t flag = swap16(*(uint16_t*)val_ptr), steps = flag ? -20 : 20; ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); - ForceCompleteUpdate(); + forceCompleteUpdate(); } #endif #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + void DGUSScreenHandler::handleFilamentOption(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); @@ -313,7 +315,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif #endif - GotoScreen(DGUSLCD_SCREEN_UTILITY); + gotoScreen(DGUS_SCREEN_UTILITY); } else { // Go to the preheat screen to show the heating progress switch (var.VP) { @@ -331,11 +333,11 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { break; #endif } - GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + gotoScreen(DGUS_SCREEN_FILAMENT_HEATING); } } - void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + void DGUSScreenHandler::handleFilamentLoadUnload(DGUS_VP_Variable &var) { if (filament_data.action <= 0) return; // If we close to the target temperature, we can start load or unload the filament @@ -345,14 +347,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { if (filament_data.action == 1) { // load filament if (!filament_data.heated) { - //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + //gotoScreen(DGUS_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); + gotoScreen(DGUS_SCREEN_FILAMENT_UNLOADING); filament_data.heated = true; } // Before unloading extrude to prevent jamming @@ -370,14 +372,14 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { #endif // DGUS_FILAMENT_LOADUNLOAD bool DGUSScreenHandler::loop() { - dgusdisplay.loop(); + dgus.loop(); const millis_t ms = millis(); static millis_t next_event_ms = 0; - if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + if (!isScreenComplete() || ELAPSED(ms, next_event_ms)) { next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - UpdateScreenVPData(); + updateScreenVPData(); } #if ENABLED(SHOW_BOOTSCREEN) @@ -388,11 +390,11 @@ bool DGUSScreenHandler::loop() { if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) { booted = true; - GotoScreen(TERN0(POWER_LOSS_RECOVERY, recovery.valid()) ? DGUSLCD_SCREEN_POWER_LOSS : DGUSLCD_SCREEN_MAIN); + gotoScreen(TERN0(POWER_LOSS_RECOVERY, recovery.valid()) ? DGUS_SCREEN_POWER_LOSS : DGUS_SCREEN_MAIN); } #endif - return IsScreenComplete(); + return isScreenComplete(); } #endif // DGUS_LCD_UI_ORIGIN diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.h index 73e3527d7e..16c5dec408 100644 --- a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.h @@ -26,6 +26,6 @@ typedef DGUSScreenHandler DGUSScreenHandlerClass; #if ENABLED(POWER_LOSS_RECOVERY) - #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION - #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS + #define PLR_SCREEN_RECOVER DGUS_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUS_SCREEN_STATUS #endif diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSDisplay.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSDisplay.cpp index 7e215f887c..3127268180 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSDisplay.cpp @@ -50,26 +50,26 @@ uint8_t DGUSDisplay::rx_datagram_len = 0; bool DGUSDisplay::initialized = false; -void DGUSDisplay::Loop() { - ProcessRx(); +void DGUSDisplay::loop() { + processRx(); } -void DGUSDisplay::Init() { +void DGUSDisplay::init() { LCD_SERIAL.begin(LCD_BAUDRATE); - ReadVersions(); + readVersions(); } -void DGUSDisplay::Read(uint16_t addr, uint8_t size) { - WriteHeader(addr, DGUS_READVAR, size); +void DGUSDisplay::read(uint16_t addr, uint8_t size) { + writeHeader(addr, DGUS_READVAR, size); LCD_SERIAL.write(size); } -void DGUSDisplay::Write(uint16_t addr, const void* data_ptr, uint8_t size) { +void DGUSDisplay::write(uint16_t addr, const void* data_ptr, uint8_t size) { if (!data_ptr) return; - WriteHeader(addr, DGUS_WRITEVAR, size); + writeHeader(addr, DGUS_WRITEVAR, size); const char* data = static_cast(data_ptr); @@ -78,10 +78,10 @@ void DGUSDisplay::Write(uint16_t addr, const void* data_ptr, uint8_t size) { } } -void DGUSDisplay::WriteString(uint16_t addr, const void* data_ptr, uint8_t size, bool left, bool right, bool use_space) { +void DGUSDisplay::writeString(uint16_t addr, const void* data_ptr, uint8_t size, bool left, bool right, bool use_space) { if (!data_ptr) return; - WriteHeader(addr, DGUS_WRITEVAR, size); + writeHeader(addr, DGUS_WRITEVAR, size); const char* data = static_cast(data_ptr); size_t len = strlen(data); @@ -118,10 +118,10 @@ void DGUSDisplay::WriteString(uint16_t addr, const void* data_ptr, uint8_t size, } } -void DGUSDisplay::WriteStringPGM(uint16_t addr, const void* data_ptr, uint8_t size, bool left, bool right, bool use_space) { +void DGUSDisplay::writeStringPGM(uint16_t addr, const void* data_ptr, uint8_t size, bool left, bool right, bool use_space) { if (!data_ptr) return; - WriteHeader(addr, DGUS_WRITEVAR, size); + writeHeader(addr, DGUS_WRITEVAR, size); const char* data = static_cast(data_ptr); size_t len = strlen_P(data); @@ -151,61 +151,61 @@ void DGUSDisplay::WriteStringPGM(uint16_t addr, const void* data_ptr, uint8_t si while (right_spaces--) LCD_SERIAL.write(use_space ? ' ' : '\0'); } -void DGUSDisplay::ReadVersions() { +void DGUSDisplay::readVersions() { if (gui_version != 0 && os_version != 0) return; - Read(DGUS_VERSION, 1); + read(DGUS_VERSION, 1); } -void DGUSDisplay::SwitchScreen(DGUS_Screen screen) { - const uint8_t command[] = { 0x5A, 0x01, 0x00, (uint8_t)screen }; - Write(0x84, command, sizeof(command)); +void DGUSDisplay::switchScreen(const DGUS_ScreenID screenID) { + const uint8_t command[] = { 0x5A, 0x01, 0x00, (uint8_t)screenID }; + write(0x84, command, sizeof(command)); } -void DGUSDisplay::PlaySound(uint8_t start, uint8_t len, uint8_t volume) { +void DGUSDisplay::playSound(uint8_t start, uint8_t len, uint8_t volume) { if (volume == 0) volume = DGUSDisplay::volume; if (volume == 0) return; const uint8_t command[] = { start, len, volume, 0x00 }; - Write(0xA0, command, sizeof(command)); + write(0xA0, command, sizeof(command)); } -void DGUSDisplay::EnableControl(DGUS_Screen screen, DGUS_ControlType type, DGUS_Control control) { - const uint8_t command[] = { 0x5A, 0xA5, 0x00, (uint8_t)screen, (uint8_t)control, type, 0x00, 0x01 }; - Write(0xB0, command, sizeof(command)); +void DGUSDisplay::enableControl(const DGUS_ScreenID screenID, DGUS_ControlType type, DGUS_Control control) { + const uint8_t command[] = { 0x5A, 0xA5, 0x00, (uint8_t)screenID, (uint8_t)control, type, 0x00, 0x01 }; + write(0xB0, command, sizeof(command)); - FlushTx(); + flushTx(); delay(50); } -void DGUSDisplay::DisableControl(DGUS_Screen screen, DGUS_ControlType type, DGUS_Control control) { - const uint8_t command[] = { 0x5A, 0xA5, 0x00, (uint8_t)screen, (uint8_t)control, type, 0x00, 0x00 }; - Write(0xB0, command, sizeof(command)); +void DGUSDisplay::disableControl(const DGUS_ScreenID screenID, DGUS_ControlType type, DGUS_Control control) { + const uint8_t command[] = { 0x5A, 0xA5, 0x00, (uint8_t)screenID, (uint8_t)control, type, 0x00, 0x00 }; + write(0xB0, command, sizeof(command)); - FlushTx(); + flushTx(); delay(50); } -uint8_t DGUSDisplay::GetBrightness() { +uint8_t DGUSDisplay::getBrightness() { return brightness; } -uint8_t DGUSDisplay::GetVolume() { +uint8_t DGUSDisplay::getVolume() { return map_precise(volume, 0, 255, 0, 100); } -void DGUSDisplay::SetBrightness(uint8_t new_brightness) { +void DGUSDisplay::setBrightness(uint8_t new_brightness) { brightness = constrain(new_brightness, 0, 100); new_brightness = map_precise(brightness, 0, 100, 5, 100); const uint8_t command[] = { new_brightness, new_brightness }; - Write(0x82, command, sizeof(command)); + write(0x82, command, sizeof(command)); } -void DGUSDisplay::SetVolume(uint8_t new_volume) { +void DGUSDisplay::setVolume(uint8_t new_volume) { volume = map_precise(constrain(new_volume, 0, 100), 0, 100, 0, 255); const uint8_t command[] = { volume, 0x00 }; - Write(0xA1, command, sizeof(command)); + write(0xA1, command, sizeof(command)); } -void DGUSDisplay::ProcessRx() { +void DGUSDisplay::processRx() { #if ENABLED(LCD_SERIAL_STATS_RX_BUFFER_OVERRUNS) if (!LCD_SERIAL.available() && LCD_SERIAL.buffer_overruns()) { @@ -274,7 +274,7 @@ void DGUSDisplay::ProcessRx() { } DGUS_VP vp; - if (!DGUS_PopulateVP((DGUS_Addr)addr, &vp)) { + if (!populateVP((DGUS_Addr)addr, &vp)) { rx_datagram_state = DGUS_IDLE; break; } @@ -332,7 +332,7 @@ void DGUSDisplay::ProcessRx() { } } -size_t DGUSDisplay::GetFreeTxBuffer() { +size_t DGUSDisplay::getFreeTxBuffer() { return ( #ifdef LCD_SERIAL_GET_TX_BUFFER_FREE LCD_SERIAL_GET_TX_BUFFER_FREE() @@ -342,7 +342,7 @@ size_t DGUSDisplay::GetFreeTxBuffer() { ); } -void DGUSDisplay::FlushTx() { +void DGUSDisplay::flushTx() { #ifdef ARDUINO_ARCH_STM32 LCD_SERIAL.flush(); #else @@ -350,7 +350,7 @@ void DGUSDisplay::FlushTx() { #endif } -void DGUSDisplay::WriteHeader(uint16_t addr, uint8_t command, uint8_t len) { +void DGUSDisplay::writeHeader(uint16_t addr, uint8_t command, uint8_t len) { LCD_SERIAL.write(DGUS_HEADER1); LCD_SERIAL.write(DGUS_HEADER2); LCD_SERIAL.write(len + 3); @@ -359,7 +359,7 @@ void DGUSDisplay::WriteHeader(uint16_t addr, uint8_t command, uint8_t len) { LCD_SERIAL.write(addr & 0xFF); } -bool DGUS_PopulateVP(const DGUS_Addr addr, DGUS_VP * const buffer) { +bool populateVP(const DGUS_Addr addr, DGUS_VP * const buffer) { const DGUS_VP *ret = vp_list; do { diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSDisplay.h b/Marlin/src/lcd/extui/dgus_reloaded/DGUSDisplay.h index bfea5780a1..7c27162ce6 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSDisplay.h @@ -26,7 +26,7 @@ * Updated for STM32G0B1RE by Protomosh in 2022. */ -#include "config/DGUS_Screen.h" +#include "config/DGUS_ScreenID.h" #include "config/DGUS_Control.h" #include "definition/DGUS_VP.h" @@ -58,58 +58,58 @@ public: DGUSDisplay() = default; - static void Init(); + static void init(); - static void Read(uint16_t addr, uint8_t size); - static void Write(uint16_t addr, const void* data_ptr, uint8_t size); + static void read(uint16_t addr, uint8_t size); + static void write(uint16_t addr, const void* data_ptr, uint8_t size); - static void WriteString(uint16_t addr, const void* data_ptr, uint8_t size, bool left=true, bool right=false, bool use_space=true); - static void WriteStringPGM(uint16_t addr, const void* data_ptr, uint8_t size, bool left=true, bool right=false, bool use_space=true); - static void WriteString(uint16_t addr, FSTR_P const fstr, uint8_t size, bool left=true, bool right=false, bool use_space=true) { - WriteStringPGM(addr, FTOP(fstr), size, left, right, use_space); + static void writeString(uint16_t addr, const void* data_ptr, uint8_t size, bool left=true, bool right=false, bool use_space=true); + static void writeStringPGM(uint16_t addr, const void* data_ptr, uint8_t size, bool left=true, bool right=false, bool use_space=true); + static void writeString(uint16_t addr, FSTR_P const fstr, uint8_t size, bool left=true, bool right=false, bool use_space=true) { + writeStringPGM(addr, FTOP(fstr), size, left, right, use_space); } template - static void Write(uint16_t addr, T data) { - Write(addr, static_cast(&data), sizeof(T)); + static void write(uint16_t addr, T data) { + write(addr, static_cast(&data), sizeof(T)); } // Until now I did not need to actively read from the display. That's why there is no ReadVariable // (I extensively use the auto upload of the display) // Read GUI and OS version from screen - static void ReadVersions(); + static void readVersions(); // Force display into another screen. - static void SwitchScreen(DGUS_Screen screen); + static void switchScreen(const DGUS_ScreenID screenID); // Play sounds using the display speaker. // start: position at which the sound was stored on the display. // len: how many sounds to play. Sounds will play consecutively from start to start+len-1. // volume: playback volume. 0 keeps the current volume. - static void PlaySound(uint8_t start, uint8_t len=1, uint8_t volume=0); + static void playSound(uint8_t start, uint8_t len=1, uint8_t volume=0); // Enable/disable a specific touch control. // type: control type. // control: index of the control on the page (set during screen development). - static void EnableControl(DGUS_Screen screen, DGUS_ControlType type, DGUS_Control control); - static void DisableControl(DGUS_Screen screen, DGUS_ControlType type, DGUS_Control control); + static void enableControl(const DGUS_ScreenID screenID, DGUS_ControlType type, DGUS_Control control); + static void disableControl(const DGUS_ScreenID screenID, DGUS_ControlType type, DGUS_Control control); - static uint8_t GetBrightness(); - static uint8_t GetVolume(); + static uint8_t getBrightness(); + static uint8_t getVolume(); // Set the display brightness/volume, ranging 0 - 100 - static void SetBrightness(uint8_t brightness); - static void SetVolume(uint8_t volume); + static void setBrightness(uint8_t brightness); + static void setVolume(uint8_t volume); // Periodic tasks, eg. Rx-Queue handling. - static void Loop(); + static void loop(); // Helper for users of this class to estimate if an interaction would be blocking. - static size_t GetFreeTxBuffer(); - static void FlushTx(); + static size_t getFreeTxBuffer(); + static void flushTx(); // Checks two things: Can we confirm the presence of the display and has we initialized it. // (both boils down that the display answered to our chatting) - static bool IsInitialized() { + static bool isInitialized() { return initialized; } @@ -117,24 +117,24 @@ public: static uint8_t os_version; template - static T SwapBytes(const T value) { + static T swapBytes(const T value) { union { T val; char byte[sizeof(T)]; } src, dst; src.val = value; - LOOP_L_N(i, sizeof(T)) dst.byte[i] = src.byte[sizeof(T) - i - 1]; + for (uint8_t i = 0; i < sizeof(T); ++i) dst.byte[i] = src.byte[sizeof(T) - i - 1]; return dst.val; } template - T_out FromFixedPoint(const T_in value) { + T_out fromFixedPoint(const T_in value) { return (T_out)((float)value / POW(10, decimals)); } template - T_out ToFixedPoint(const T_in value) { + T_out toFixedPoint(const T_in value) { return (T_out)LROUND((float)value * POW(10, decimals)); } @@ -160,8 +160,8 @@ private: DGUS_VERSION = 0x000F // OS/GUI version }; - static void WriteHeader(uint16_t addr, uint8_t command, uint8_t len); - static void ProcessRx(); + static void writeHeader(uint16_t addr, uint8_t command, uint8_t len); + static void processRx(); static uint8_t volume; static uint8_t brightness; @@ -172,11 +172,11 @@ private: static bool initialized; }; -template<> inline uint16_t DGUSDisplay::SwapBytes(const uint16_t value) { +template<> inline uint16_t DGUSDisplay::swapBytes(const uint16_t value) { return ((value << 8) | (value >> 8)); } -extern DGUSDisplay dgus_display; +extern DGUSDisplay dgus; /// Helper to populate a DGUS_VP for a given VP. Return false if not found. -extern bool DGUS_PopulateVP(const DGUS_Addr addr, DGUS_VP * const buffer); +extern bool populateVP(const DGUS_Addr addr, DGUS_VP * const buffer); diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp index 40f3bbf1d5..aa58e85692 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp @@ -27,7 +27,7 @@ #include "DGUSRxHandler.h" #include "DGUSScreenHandler.h" -#include "config/DGUS_Screen.h" +#include "config/DGUS_ScreenID.h" #include "../ui_api.h" #include "../../../core/language.h" @@ -42,121 +42,121 @@ #include "../../../feature/powerloss.h" #endif -void DGUSRxHandler::ScreenChange(DGUS_VP &vp, void *data_ptr) { - const DGUS_Screen screen = (DGUS_Screen)((uint8_t*)data_ptr)[1]; +void DGUSRxHandler::screenChange(DGUS_VP &vp, void *data_ptr) { + const DGUS_ScreenID screenID = (DGUS_ScreenID)((uint8_t*)data_ptr)[1]; if (vp.addr == DGUS_Addr::SCREENCHANGE_SD) { #if HAS_MEDIA IF_DISABLED(HAS_SD_DETECT, card.mount()); if (!ExtUI::isMediaInserted()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(MSG_NO_MEDIA)); + screen.setStatusMessage(GET_TEXT_F(MSG_NO_MEDIA)); return; } card.cdroot(); #else - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(MSG_NO_MEDIA)); + screen.setStatusMessage(GET_TEXT_F(MSG_NO_MEDIA)); return; #endif } if (vp.addr == DGUS_Addr::SCREENCHANGE_Idle && (ExtUI::isPrinting() || ExtUI::isPrintingPaused())) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_NOT_WHILE_PRINTING)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_NOT_WHILE_PRINTING)); return; } if (vp.addr == DGUS_Addr::SCREENCHANGE_Printing && (!ExtUI::isPrinting() && !ExtUI::isPrintingPaused())) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_NOT_WHILE_IDLE)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_NOT_WHILE_IDLE)); return; } - dgus_screen_handler.TriggerScreenChange(screen); + screen.triggerScreenChange(screenID); } #if HAS_MEDIA - void DGUSRxHandler::Scroll(DGUS_VP &vp, void *data_ptr) { + void DGUSRxHandler::scroll(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Scroll scroll = (DGUS_Data::Scroll)((uint8_t*)data_ptr)[1]; switch (scroll) { case DGUS_Data::Scroll::GO_BACK: - if (dgus_screen_handler.filelist.isAtRootDir()) { + if (screen.filelist.isAtRootDir()) { return; } - dgus_screen_handler.filelist_offset = 0; - dgus_screen_handler.filelist_selected = -1; - dgus_screen_handler.filelist.upDir(); + screen.filelist_offset = 0; + screen.filelist_selected = -1; + screen.filelist.upDir(); break; case DGUS_Data::Scroll::UP: - if (dgus_screen_handler.filelist_offset < 1) { + if (screen.filelist_offset < 1) { return; } - --dgus_screen_handler.filelist_offset; + --screen.filelist_offset; break; case DGUS_Data::Scroll::DOWN: - if (dgus_screen_handler.filelist_offset + 1 + DGUS_FILE_COUNT > dgus_screen_handler.filelist.count()) { + if (screen.filelist_offset + 1 + DGUS_FILE_COUNT > screen.filelist.count()) { return; } - ++dgus_screen_handler.filelist_offset; + ++screen.filelist_offset; break; } - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } - void DGUSRxHandler::SelectFile(DGUS_VP &vp, void *data_ptr) { + void DGUSRxHandler::selectFile(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const uint8_t index = ((uint8_t*)data_ptr)[1]; - if (!dgus_screen_handler.filelist.seek(dgus_screen_handler.filelist_offset + index)) { + if (!screen.filelist.seek(screen.filelist_offset + index)) { return; } - if (dgus_screen_handler.filelist.isDir()) { - dgus_screen_handler.filelist_offset = 0; - dgus_screen_handler.filelist_selected = -1; - dgus_screen_handler.filelist.changeDir(dgus_screen_handler.filelist.filename()); + if (screen.filelist.isDir()) { + screen.filelist_offset = 0; + screen.filelist_selected = -1; + screen.filelist.changeDir(screen.filelist.filename()); } else { - dgus_screen_handler.filelist_selected = dgus_screen_handler.filelist_offset + index; + screen.filelist_selected = screen.filelist_offset + index; } - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } - void DGUSRxHandler::PrintFile(DGUS_VP &vp, void *data_ptr) { + void DGUSRxHandler::printFile(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); UNUSED(data_ptr); - if (dgus_screen_handler.filelist_selected < 0) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_NO_FILE_SELECTED)); + if (screen.filelist_selected < 0) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_NO_FILE_SELECTED)); return; } - if (!dgus_screen_handler.filelist.seek(dgus_screen_handler.filelist_selected) - || dgus_screen_handler.filelist.isDir()) { + if (!screen.filelist.seek(screen.filelist_selected) + || screen.filelist.isDir()) { return; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } - ExtUI::printFile(dgus_screen_handler.filelist.shortFilename()); - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::PRINT_STATUS); + ExtUI::printFile(screen.filelist.shortFilename()); + screen.triggerScreenChange(DGUS_ScreenID::PRINT_STATUS); } #endif // HAS_MEDIA -void DGUSRxHandler::PrintAbort(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::printAbort(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1]; @@ -166,14 +166,14 @@ void DGUSRxHandler::PrintAbort(DGUS_VP &vp, void *data_ptr) { } if (!ExtUI::isPrinting() && !ExtUI::isPrintingPaused()) { - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); return; } ExtUI::stopPrint(); } -void DGUSRxHandler::PrintPause(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::printPause(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1]; @@ -183,14 +183,14 @@ void DGUSRxHandler::PrintPause(DGUS_VP &vp, void *data_ptr) { } if (!ExtUI::isPrinting()) { - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); return; } ExtUI::pausePrint(); } -void DGUSRxHandler::PrintResume(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::printResume(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1]; @@ -200,29 +200,29 @@ void DGUSRxHandler::PrintResume(DGUS_VP &vp, void *data_ptr) { } if (!ExtUI::isPrintingPaused()) { - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); return; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } ExtUI::resumePrint(); } -void DGUSRxHandler::Feedrate(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::feedrate(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const int16_t feedrate = BE16_P(data_ptr); ExtUI::setFeedrate_percent(feedrate); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::Flowrate(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::flowrate(DGUS_VP &vp, void *data_ptr) { const int16_t flowrate = BE16_P(data_ptr); switch (vp.addr) { @@ -240,24 +240,24 @@ void DGUSRxHandler::Flowrate(DGUS_VP &vp, void *data_ptr) { #endif } - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::BabystepSet(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::babystepSet(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const int16_t data = BE16_P(data_ptr); - const float offset = dgus_display.FromFixedPoint(data); + const float offset = dgus.fromFixedPoint(data); const int16_t steps = ExtUI::mmToWholeSteps(offset - ExtUI::getZOffset_mm(), ExtUI::Z); ExtUI::smartAdjustAxis_steps(steps, ExtUI::Z, true); - dgus_screen_handler.TriggerEEPROMSave(); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerEEPROMSave(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::Babystep(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::babystep(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Adjust adjust = (DGUS_Data::Adjust)((uint8_t*)data_ptr)[1]; @@ -275,11 +275,11 @@ void DGUSRxHandler::Babystep(DGUS_VP &vp, void *data_ptr) { ExtUI::smartAdjustAxis_steps(steps, ExtUI::Z, true); - dgus_screen_handler.TriggerEEPROMSave(); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerEEPROMSave(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::TempPreset(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::tempPreset(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::TempPreset preset = (DGUS_Data::TempPreset)((uint8_t*)data_ptr)[1]; @@ -311,10 +311,10 @@ void DGUSRxHandler::TempPreset(DGUS_VP &vp, void *data_ptr) { break; } - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::TempTarget(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::tempTarget(DGUS_VP &vp, void *data_ptr) { const int16_t temp = BE16_P(data_ptr); switch (vp.addr) { @@ -332,10 +332,10 @@ void DGUSRxHandler::TempTarget(DGUS_VP &vp, void *data_ptr) { #endif } - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::TempCool(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::tempCool(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Heater heater = (DGUS_Data::Heater)BE16_P(data_ptr); @@ -362,12 +362,12 @@ void DGUSRxHandler::TempCool(DGUS_VP &vp, void *data_ptr) { #endif } - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(MSG_COOLING)); + screen.setStatusMessage(GET_TEXT_F(MSG_COOLING)); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::Steppers(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::steppers(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Control control = (DGUS_Data::Control)((uint8_t*)data_ptr)[1]; @@ -381,50 +381,50 @@ void DGUSRxHandler::Steppers(DGUS_VP &vp, void *data_ptr) { break; } - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::ZOffset(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::zOffset(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); if (TERN0(NO_MOTION_BEFORE_HOMING, !ExtUI::isAxisPositionKnown(ExtUI::Z))) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); return; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } const int16_t data = BE16_P(data_ptr); - const float offset = dgus_display.FromFixedPoint(data); + const float offset = dgus.fromFixedPoint(data); const int16_t steps = ExtUI::mmToWholeSteps(offset - ExtUI::getZOffset_mm(), ExtUI::Z); ExtUI::smartAdjustAxis_steps(steps, ExtUI::Z, true); - dgus_screen_handler.TriggerEEPROMSave(); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerEEPROMSave(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::ZOffsetStep(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::zOffsetStep(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); if (TERN0(NO_MOTION_BEFORE_HOMING, !ExtUI::isAxisPositionKnown(ExtUI::Z))) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); return; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } const DGUS_Data::Adjust adjust = (DGUS_Data::Adjust)((uint8_t*)data_ptr)[1]; int16_t steps; - switch (dgus_screen_handler.offset_steps) { + switch (screen.offset_steps) { default: return; case DGUS_Data::StepSize::MMP1: steps = ExtUI::mmToWholeSteps((adjust == DGUS_Data::Adjust::INCREMENT ? 0.1f : -0.1f), ExtUI::Z); @@ -436,30 +436,30 @@ void DGUSRxHandler::ZOffsetStep(DGUS_VP &vp, void *data_ptr) { ExtUI::smartAdjustAxis_steps(steps, ExtUI::Z, true); - dgus_screen_handler.TriggerEEPROMSave(); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerEEPROMSave(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::ZOffsetSetStep(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::zOffsetSetStep(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::StepSize size = (DGUS_Data::StepSize)((uint8_t*)data_ptr)[1]; - dgus_screen_handler.offset_steps = size; + screen.offset_steps = size; - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::MoveToPoint(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::moveToPoint(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); if (!ExtUI::isPositionKnown()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); return; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } @@ -499,26 +499,26 @@ void DGUSRxHandler::MoveToPoint(DGUS_VP &vp, void *data_ptr) { ExtUI::setAxisPosition_mm(Z_MIN_POS + BED_TRAMMING_HEIGHT, ExtUI::Z); } -void DGUSRxHandler::Probe(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::probe(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); UNUSED(data_ptr); #if ENABLED(MESH_BED_LEVELING) - dgus_screen_handler.SetStatusMessage(FPSTR(DGUS_MSG_ABL_REQUIRED)); + screen.setStatusMessage(FPSTR(DGUS_MSG_ABL_REQUIRED)); return; #endif if (!ExtUI::isPositionKnown()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); return; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::LEVELING_PROBING); + screen.triggerScreenChange(DGUS_ScreenID::LEVELING_PROBING); #if ENABLED(AUTO_BED_LEVELING_UBL) queue.enqueue_now(F("G29P1\nG29P3\nG29P5C")); @@ -528,22 +528,22 @@ void DGUSRxHandler::Probe(DGUS_VP &vp, void *data_ptr) { queue.enqueue_now(F("M500")); } -void DGUSRxHandler::DisableABL(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::disableABL(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); UNUSED(data_ptr); - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } ExtUI::setLevelingActive(false); - dgus_screen_handler.TriggerEEPROMSave(); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerEEPROMSave(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::FilamentSelect(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::filamentSelect(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Extruder extruder = (DGUS_Data::Extruder)BE16_P(data_ptr); @@ -553,34 +553,34 @@ void DGUSRxHandler::FilamentSelect(DGUS_VP &vp, void *data_ptr) { case DGUS_Data::Extruder::CURRENT: case DGUS_Data::Extruder::E0: E_TERN_(case DGUS_Data::Extruder::E1:) - dgus_screen_handler.filament_extruder = extruder; + screen.filament_extruder = extruder; break; } - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::FilamentLength(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::filamentLength(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const uint16_t length = BE16_P(data_ptr); - dgus_screen_handler.filament_length = constrain(length, 0, EXTRUDE_MAXLENGTH); + screen.filament_length = constrain(length, 0, EXTRUDE_MAXLENGTH); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::FilamentMove(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::filamentMove(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } ExtUI::extruder_t extruder; - switch (dgus_screen_handler.filament_extruder) { + switch (screen.filament_extruder) { default: return; case DGUS_Data::Extruder::CURRENT: #if HAS_MULTI_EXTRUDER @@ -598,7 +598,7 @@ void DGUSRxHandler::FilamentMove(DGUS_VP &vp, void *data_ptr) { } if (ExtUI::getActualTemp_celsius(extruder) < (float)EXTRUDE_MINTEMP) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_TEMP_TOO_LOW)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_TEMP_TOO_LOW)); return; } @@ -606,25 +606,25 @@ void DGUSRxHandler::FilamentMove(DGUS_VP &vp, void *data_ptr) { switch (move) { case DGUS_Data::FilamentMove::RETRACT: - UI_DECREMENT_BY(AxisPosition_mm, (float)dgus_screen_handler.filament_length, extruder); + UI_DECREMENT_BY(AxisPosition_mm, (float)screen.filament_length, extruder); break; case DGUS_Data::FilamentMove::EXTRUDE: - UI_INCREMENT_BY(AxisPosition_mm, (float)dgus_screen_handler.filament_length, extruder); + UI_INCREMENT_BY(AxisPosition_mm, (float)screen.filament_length, extruder); break; } } -void DGUSRxHandler::Home(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::home(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } DGUS_Data::Axis axis = (DGUS_Data::Axis)((uint8_t*)data_ptr)[1]; - dgus_screen_handler.ShowWaitScreen(GET_TEXT_F(DGUS_MSG_HOMING), dgus_screen_handler.GetCurrentScreen()); + screen.showWaitScreen(GET_TEXT_F(DGUS_MSG_HOMING), screen.getCurrentScreen()); switch (axis) { case DGUS_Data::Axis::X_Y_Z: @@ -639,9 +639,9 @@ void DGUSRxHandler::Home(DGUS_VP &vp, void *data_ptr) { } } -void DGUSRxHandler::Move(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::move(DGUS_VP &vp, void *data_ptr) { const int16_t data = BE16_P(data_ptr); - const float position = dgus_display.FromFixedPoint(data); + const float position = dgus.fromFixedPoint(data); ExtUI::axis_t axis; switch (vp.addr) { @@ -652,20 +652,20 @@ void DGUSRxHandler::Move(DGUS_VP &vp, void *data_ptr) { } if (TERN0(NO_MOTION_BEFORE_HOMING, !ExtUI::isAxisPositionKnown(axis))) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); return; } ExtUI::setAxisPosition_mm(position, axis); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::MoveStep(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::moveStep(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); float offset; - switch (dgus_screen_handler.move_steps) { + switch (screen.move_steps) { default: return; case DGUS_Data::StepSize::MM10: offset = 10.0f; break; case DGUS_Data::StepSize::MM1: offset = 1.0f; break; @@ -686,58 +686,58 @@ void DGUSRxHandler::MoveStep(DGUS_VP &vp, void *data_ptr) { } if (TERN0(NO_MOTION_BEFORE_HOMING, !ExtUI::isAxisPositionKnown(axis))) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_HOMING_REQUIRED)); return; } UI_INCREMENT_BY(AxisPosition_mm, offset, axis); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::MoveSetStep(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::moveSetStep(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::StepSize size = (DGUS_Data::StepSize)((uint8_t*)data_ptr)[1]; - dgus_screen_handler.move_steps = size; + screen.move_steps = size; - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::GcodeClear(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::gcodeClear(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); UNUSED(data_ptr); - ZERO(dgus_screen_handler.gcode); + ZERO(screen.gcode); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::GcodeExecute(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::gcodeExecute(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); UNUSED(data_ptr); - if (!strlen(dgus_screen_handler.gcode)) return; + if (!strlen(screen.gcode)) return; - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } - dgus_screen_handler.ShowWaitScreen(GET_TEXT_F(DGUS_MSG_EXECUTING_COMMAND), DGUS_Screen::GCODE); + screen.showWaitScreen(GET_TEXT_F(DGUS_MSG_EXECUTING_COMMAND), DGUS_ScreenID::GCODE); - queue.enqueue_one_now(dgus_screen_handler.gcode); + queue.enqueue_one_now(screen.gcode); } -void DGUSRxHandler::ResetEEPROM(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::resetEEPROM(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1]; if (result != DGUS_Data::Popup::CONFIRMED) return; - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } @@ -745,7 +745,7 @@ void DGUSRxHandler::ResetEEPROM(DGUS_VP &vp, void *data_ptr) { queue.enqueue_now(F("M500")); } -void DGUSRxHandler::SettingsExtra(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::settingsExtra(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Extra extra = (DGUS_Data::Extra)((uint8_t*)data_ptr)[1]; @@ -754,25 +754,25 @@ void DGUSRxHandler::SettingsExtra(DGUS_VP &vp, void *data_ptr) { default: return; case DGUS_Data::Extra::BUTTON1: #if ENABLED(BLTOUCH) - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } queue.enqueue_now(F(DGUS_RESET_BLTOUCH)); #else - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::INFOS); + screen.triggerScreenChange(DGUS_ScreenID::INFOS); #endif break; #if ENABLED(BLTOUCH) case DGUS_Data::Extra::BUTTON2: - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::INFOS); + screen.triggerScreenChange(DGUS_ScreenID::INFOS); break; #endif } } -void DGUSRxHandler::PIDSelect(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::pidSelect(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Heater heater = (DGUS_Data::Heater)BE16_P(data_ptr); @@ -780,34 +780,34 @@ void DGUSRxHandler::PIDSelect(DGUS_VP &vp, void *data_ptr) { switch (heater) { default: return; case DGUS_Data::Heater::BED: - dgus_screen_handler.pid_temp = DGUS_PLA_TEMP_BED; - dgus_screen_handler.pid_heater = heater; + screen.pid_temp = DGUS_PLA_TEMP_BED; + screen.pid_heater = heater; break; case DGUS_Data::Heater::H0: #if HAS_MULTI_HOTEND case DGUS_Data::Heater::H1: #endif - dgus_screen_handler.pid_temp = DGUS_PLA_TEMP_HOTEND; - dgus_screen_handler.pid_heater = heater; + screen.pid_temp = DGUS_PLA_TEMP_HOTEND; + screen.pid_heater = heater; break; } - dgus_screen_handler.pid_cycles = 5; + screen.pid_cycles = 5; - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::PIDSetTemp(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::pidSetTemp(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } uint16_t temp = BE16_P(data_ptr); - switch (dgus_screen_handler.pid_heater) { + switch (screen.pid_heater) { default: return; case DGUS_Data::Heater::BED: temp = constrain(temp, BED_MINTEMP, BED_MAX_TARGET); @@ -822,31 +822,31 @@ void DGUSRxHandler::PIDSetTemp(DGUS_VP &vp, void *data_ptr) { #endif } - dgus_screen_handler.pid_temp = temp; + screen.pid_temp = temp; - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::PIDRun(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::pidRun(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); UNUSED(data_ptr); - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } heater_id_t heater; - uint8_t cycles = constrain(dgus_screen_handler.pid_cycles, 3, 10); + uint8_t cycles = constrain(screen.pid_cycles, 3, 10); - switch (dgus_screen_handler.pid_heater) { + switch (screen.pid_heater) { default: return; case DGUS_Data::Heater::BED: #if ENABLED(PIDTEMPBED) heater = H_BED; break; #else - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BED_PID_DISABLED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BED_PID_DISABLED)); return; #endif case DGUS_Data::Heater::H0: @@ -854,7 +854,7 @@ void DGUSRxHandler::PIDRun(DGUS_VP &vp, void *data_ptr) { heater = H_E0; break; #else - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_PID_DISABLED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_PID_DISABLED)); return; #endif #if HAS_MULTI_HOTEND @@ -863,23 +863,23 @@ void DGUSRxHandler::PIDRun(DGUS_VP &vp, void *data_ptr) { heater = H_E1; break; #else - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_PID_DISABLED)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_PID_DISABLED)); return; #endif #endif } char buffer[24]; - snprintf_P(buffer, sizeof(buffer), PSTR("M303C%dE%dS%dU1"), cycles, heater, dgus_screen_handler.pid_temp); + snprintf_P(buffer, sizeof(buffer), PSTR("M303C%dE%dS%dU1"), cycles, heater, screen.pid_temp); - dgus_screen_handler.ShowWaitScreen(GET_TEXT_F(DGUS_MSG_PID_AUTOTUNING), DGUS_Screen::PID); + screen.showWaitScreen(GET_TEXT_F(DGUS_MSG_PID_AUTOTUNING), DGUS_ScreenID::PID); queue.enqueue_one_now(buffer); queue.enqueue_now(F("M500")); } #if ENABLED(POWER_LOSS_RECOVERY) - void DGUSRxHandler::PowerLossAbort(DGUS_VP &vp, void *data_ptr) { + void DGUSRxHandler::powerLossAbort(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1]; @@ -888,17 +888,17 @@ void DGUSRxHandler::PIDRun(DGUS_VP &vp, void *data_ptr) { return; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::HOME); + screen.triggerScreenChange(DGUS_ScreenID::HOME); queue.enqueue_now(F("M1000C")); } - void DGUSRxHandler::PowerLossResume(DGUS_VP &vp, void *data_ptr) { + void DGUSRxHandler::powerLossResume(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1]; @@ -907,23 +907,23 @@ void DGUSRxHandler::PIDRun(DGUS_VP &vp, void *data_ptr) { return; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return; } if (!recovery.valid()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_INVALID_RECOVERY_DATA)); + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_INVALID_RECOVERY_DATA)); return; } - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::PRINT_STATUS); + screen.triggerScreenChange(DGUS_ScreenID::PRINT_STATUS); queue.enqueue_now(F("M1000")); } #endif // POWER_LOSS_RECOVERY -void DGUSRxHandler::WaitAbort(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::waitAbort(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); const DGUS_Data::Popup result = (DGUS_Data::Popup)((uint8_t*)data_ptr)[1]; @@ -933,25 +933,25 @@ void DGUSRxHandler::WaitAbort(DGUS_VP &vp, void *data_ptr) { } if (!ExtUI::isPrintingPaused()) { - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); return; } ExtUI::stopPrint(); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::WaitContinue(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::waitContinue(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); UNUSED(data_ptr); ExtUI::setUserConfirmed(); - dgus_screen_handler.TriggerFullUpdate(); + screen.triggerFullUpdate(); } -void DGUSRxHandler::FanSpeed(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::fanSpeed(DGUS_VP &vp, void *data_ptr) { uint8_t speed = ((uint8_t*)data_ptr)[1]; switch (vp.addr) { default: return; @@ -961,36 +961,36 @@ void DGUSRxHandler::FanSpeed(DGUS_VP &vp, void *data_ptr) { } } -void DGUSRxHandler::Volume(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::volume(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); uint8_t volume = ((uint8_t*)data_ptr)[1]; - dgus_display.SetVolume(volume); + dgus.setVolume(volume); - dgus_screen_handler.TriggerEEPROMSave(); + screen.triggerEEPROMSave(); } -void DGUSRxHandler::Brightness(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::brightness(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); uint8_t brightness = ((uint8_t*)data_ptr)[1]; - dgus_display.SetBrightness(brightness); + dgus.setBrightness(brightness); - dgus_screen_handler.TriggerEEPROMSave(); + screen.triggerEEPROMSave(); } -void DGUSRxHandler::Debug(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::debug(DGUS_VP &vp, void *data_ptr) { UNUSED(vp); UNUSED(data_ptr); - ++dgus_screen_handler.debug_count; + ++screen.debug_count; - if (dgus_screen_handler.debug_count >= 10) { - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::DEBUG); + if (screen.debug_count >= 10) { + screen.triggerScreenChange(DGUS_ScreenID::DEBUG); } } -void DGUSRxHandler::StringToExtra(DGUS_VP &vp, void *data_ptr) { +void DGUSRxHandler::stringToExtra(DGUS_VP &vp, void *data_ptr) { if (!vp.size || !vp.extra) return; memcpy(vp.extra, data_ptr, vp.size); } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.h b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.h index d6d5855b9d..9143b83554 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.h @@ -26,78 +26,78 @@ namespace DGUSRxHandler { - void ScreenChange(DGUS_VP &, void *); + void screenChange(DGUS_VP &, void *); #if HAS_MEDIA - void Scroll(DGUS_VP &, void *); - void SelectFile(DGUS_VP &, void *); - void PrintFile(DGUS_VP &, void *); + void scroll(DGUS_VP &, void *); + void selectFile(DGUS_VP &, void *); + void printFile(DGUS_VP &, void *); #endif - void PrintAbort(DGUS_VP &, void *); - void PrintPause(DGUS_VP &, void *); - void PrintResume(DGUS_VP &, void *); + void printAbort(DGUS_VP &, void *); + void printPause(DGUS_VP &, void *); + void printResume(DGUS_VP &, void *); - void Feedrate(DGUS_VP &, void *); - void Flowrate(DGUS_VP &, void *); - void BabystepSet(DGUS_VP &, void *); - void Babystep(DGUS_VP &, void *); + void feedrate(DGUS_VP &, void *); + void flowrate(DGUS_VP &, void *); + void babystepSet(DGUS_VP &, void *); + void babystep(DGUS_VP &, void *); - void TempPreset(DGUS_VP &, void *); - void TempTarget(DGUS_VP &, void *); - void TempCool(DGUS_VP &, void *); + void tempPreset(DGUS_VP &, void *); + void tempTarget(DGUS_VP &, void *); + void tempCool(DGUS_VP &, void *); - void Steppers(DGUS_VP &, void *); + void steppers(DGUS_VP &, void *); - void ZOffset(DGUS_VP &, void *); - void ZOffsetStep(DGUS_VP &, void *); - void ZOffsetSetStep(DGUS_VP &, void *); + void zOffset(DGUS_VP &, void *); + void zOffsetStep(DGUS_VP &, void *); + void zOffsetSetStep(DGUS_VP &, void *); - void MoveToPoint(DGUS_VP &, void *); + void moveToPoint(DGUS_VP &, void *); - void Probe(DGUS_VP &, void *); - void DisableABL(DGUS_VP &, void *); + void probe(DGUS_VP &, void *); + void disableABL(DGUS_VP &, void *); - void FilamentSelect(DGUS_VP &, void *); - void FilamentLength(DGUS_VP &, void *); - void FilamentMove(DGUS_VP &, void *); + void filamentSelect(DGUS_VP &, void *); + void filamentLength(DGUS_VP &, void *); + void filamentMove(DGUS_VP &, void *); - void Home(DGUS_VP &, void *); - void Move(DGUS_VP &, void *); - void MoveStep(DGUS_VP &, void *); - void MoveSetStep(DGUS_VP &, void *); + void home(DGUS_VP &, void *); + void move(DGUS_VP &, void *); + void moveStep(DGUS_VP &, void *); + void moveSetStep(DGUS_VP &, void *); - void GcodeClear(DGUS_VP &, void *); - void GcodeExecute(DGUS_VP &, void *); + void gcodeClear(DGUS_VP &, void *); + void gcodeExecute(DGUS_VP &, void *); - void ResetEEPROM(DGUS_VP &, void *); + void resetEEPROM(DGUS_VP &, void *); - void SettingsExtra(DGUS_VP &, void *); + void settingsExtra(DGUS_VP &, void *); - void PIDSelect(DGUS_VP &, void *); - void PIDSetTemp(DGUS_VP &, void *); - void PIDRun(DGUS_VP &, void *); + void pidSelect(DGUS_VP &, void *); + void pidSetTemp(DGUS_VP &, void *); + void pidRun(DGUS_VP &, void *); #if ENABLED(POWER_LOSS_RECOVERY) - void PowerLossAbort(DGUS_VP &, void *); - void PowerLossResume(DGUS_VP &, void *); + void powerLossAbort(DGUS_VP &, void *); + void powerLossResume(DGUS_VP &, void *); #endif - void WaitAbort(DGUS_VP &, void *); - void WaitContinue(DGUS_VP &, void *); + void waitAbort(DGUS_VP &, void *); + void waitContinue(DGUS_VP &, void *); - void FanSpeed(DGUS_VP &, void *); + void fanSpeed(DGUS_VP &, void *); - void Volume(DGUS_VP &, void *); + void volume(DGUS_VP &, void *); - void Brightness(DGUS_VP &, void *); + void brightness(DGUS_VP &, void *); - void Debug(DGUS_VP &, void *); + void debug(DGUS_VP &, void *); - void StringToExtra(DGUS_VP &, void *); + void stringToExtra(DGUS_VP &, void *); template - void IntegerToExtra(DGUS_VP &vp, void *data_ptr) { + void integerToExtra(DGUS_VP &vp, void *data_ptr) { if (!vp.size || !vp.extra) return; switch (vp.size) { default: return; @@ -112,7 +112,7 @@ namespace DGUSRxHandler { break; } case 4: { - const uint32_t data = dgus_display.SwapBytes(*(uint32_t*)data_ptr); + const uint32_t data = dgus.swapBytes(*(uint32_t*)data_ptr); *(T*)vp.extra = (T)data; break; } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp index e8c23b3226..793a2c1579 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.cpp @@ -57,11 +57,11 @@ uint8_t DGUSScreenHandler::pid_cycles = 5; bool DGUSScreenHandler::settings_ready = false; bool DGUSScreenHandler::booted = false; -DGUS_Screen DGUSScreenHandler::current_screen = DGUS_Screen::BOOT; -DGUS_Screen DGUSScreenHandler::new_screen = DGUS_Screen::BOOT; +DGUS_ScreenID DGUSScreenHandler::current_screenID = DGUS_ScreenID::BOOT; +DGUS_ScreenID DGUSScreenHandler::new_screenID = DGUS_ScreenID::BOOT; bool DGUSScreenHandler::full_update = false; -DGUS_Screen DGUSScreenHandler::wait_return_screen = DGUS_Screen::HOME; +DGUS_ScreenID DGUSScreenHandler::wait_return_screenID = DGUS_ScreenID::HOME; bool DGUSScreenHandler::wait_continue = false; bool DGUSScreenHandler::leveling_active = false; @@ -69,41 +69,41 @@ bool DGUSScreenHandler::leveling_active = false; millis_t DGUSScreenHandler::status_expire = 0; millis_t DGUSScreenHandler::eeprom_save = 0; -void DGUSScreenHandler::Init() { - dgus_display.Init(); +void DGUSScreenHandler::init() { + dgus.init(); - MoveToScreen(DGUS_Screen::BOOT, true); + moveToScreen(DGUS_ScreenID::BOOT, true); } -void DGUSScreenHandler::Ready() { - dgus_display.PlaySound(1); +void DGUSScreenHandler::ready() { + dgus.playSound(1); } -void DGUSScreenHandler::Loop() { - if (!settings_ready || current_screen == DGUS_Screen::KILL) { +void DGUSScreenHandler::loop() { + if (!settings_ready || current_screenID == DGUS_ScreenID::KILL) { return; } const millis_t ms = ExtUI::safe_millis(); static millis_t next_event_ms = 0; - if (new_screen != DGUS_Screen::BOOT) { - const DGUS_Screen screen = new_screen; - new_screen = DGUS_Screen::BOOT; - if (current_screen == screen) - TriggerFullUpdate(); + if (new_screenID != DGUS_ScreenID::BOOT) { + const DGUS_ScreenID screenID = new_screenID; + new_screenID = DGUS_ScreenID::BOOT; + if (current_screenID == screenID) + triggerFullUpdate(); else - MoveToScreen(screen); + moveToScreen(screenID); return; } if (!booted && ELAPSED(ms, 3000)) { booted = true; - dgus_display.ReadVersions(); + dgus.readVersions(); - if (current_screen == DGUS_Screen::BOOT) - MoveToScreen(DGUS_Screen::HOME); + if (current_screenID == DGUS_ScreenID::BOOT) + moveToScreen(DGUS_ScreenID::HOME); return; } @@ -111,326 +111,325 @@ void DGUSScreenHandler::Loop() { if (ELAPSED(ms, next_event_ms) || full_update) { next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - if (!SendScreenVPData(current_screen, full_update)) - DEBUG_ECHOLNPGM("SendScreenVPData failed"); + if (!sendScreenVPData(current_screenID, full_update)) + DEBUG_ECHOLNPGM("sendScreenVPData failed"); return; } - if (current_screen == DGUS_Screen::WAIT - && ((wait_continue && !wait_for_user) - || (!wait_continue && IsPrinterIdle())) + if (current_screenID == DGUS_ScreenID::WAIT + && ((wait_continue && !wait_for_user) || (!wait_continue && isPrinterIdle())) ) { - MoveToScreen(wait_return_screen, true); + moveToScreen(wait_return_screenID, true); return; } - if (current_screen == DGUS_Screen::LEVELING_PROBING && IsPrinterIdle()) { - dgus_display.PlaySound(3); + if (current_screenID == DGUS_ScreenID::LEVELING_PROBING && isPrinterIdle()) { + dgus.playSound(3); - SetStatusMessage(ExtUI::getMeshValid() ? GET_TEXT_F(DGUS_MSG_PROBING_SUCCESS) : GET_TEXT_F(DGUS_MSG_PROBING_FAILED)); + setStatusMessage(ExtUI::getLevelingIsValid() ? GET_TEXT_F(DGUS_MSG_PROBING_SUCCESS) : GET_TEXT_F(DGUS_MSG_PROBING_FAILED)); - MoveToScreen(DGUS_Screen::LEVELING_AUTOMATIC); + moveToScreen(DGUS_ScreenID::LEVELING_AUTOMATIC); return; } if (status_expire > 0 && ELAPSED(ms, status_expire)) { - SetStatusMessage(FPSTR(NUL_STR), 0); + setStatusMessage(FPSTR(NUL_STR), 0); return; } - if (eeprom_save > 0 && ELAPSED(ms, eeprom_save) && IsPrinterIdle()) { + if (eeprom_save > 0 && ELAPSED(ms, eeprom_save) && isPrinterIdle()) { eeprom_save = 0; queue.enqueue_now(F("M500")); return; } - dgus_display.Loop(); + dgus.loop(); } -void DGUSScreenHandler::PrinterKilled(FSTR_P const error, FSTR_P const component) { - SetMessageLine(error, 1); - SetMessageLine(component, 2); - SetMessageLinePGM(NUL_STR, 3); - SetMessageLine(GET_TEXT_F(MSG_PLEASE_RESET), 4); +void DGUSScreenHandler::printerKilled(FSTR_P const error, FSTR_P const component) { + setMessageLine(error, 1); + setMessageLine(component, 2); + setMessageLinePGM(NUL_STR, 3); + setMessageLine(GET_TEXT_F(MSG_PLEASE_RESET), 4); - dgus_display.PlaySound(3, 1, 200); + dgus.playSound(3, 1, 200); - MoveToScreen(DGUS_Screen::KILL, true); + moveToScreen(DGUS_ScreenID::KILL, true); } -void DGUSScreenHandler::UserConfirmRequired(const char * const msg) { - SetMessageLinePGM(NUL_STR, 1); - SetMessageLine(msg, 2); - SetMessageLinePGM(NUL_STR, 3); - SetMessageLinePGM(NUL_STR, 4); +void DGUSScreenHandler::userConfirmRequired(const char * const msg) { + setMessageLinePGM(NUL_STR, 1); + setMessageLine(msg, 2); + setMessageLinePGM(NUL_STR, 3); + setMessageLinePGM(NUL_STR, 4); - dgus_display.PlaySound(3); + dgus.playSound(3); - ShowWaitScreen(current_screen, true); + showWaitScreen(current_screenID, true); } -void DGUSScreenHandler::SettingsReset() { - dgus_display.SetVolume(DGUS_DEFAULT_VOLUME); - dgus_display.SetBrightness(DGUS_DEFAULT_BRIGHTNESS); +void DGUSScreenHandler::settingsReset() { + dgus.setVolume(DGUS_DEFAULT_VOLUME); + dgus.setBrightness(DGUS_DEFAULT_BRIGHTNESS); if (!settings_ready) { settings_ready = true; - Ready(); + ready(); } - SetStatusMessage(GET_TEXT_F(DGUS_MSG_RESET_EEPROM)); + setStatusMessage(GET_TEXT_F(DGUS_MSG_RESET_EEPROM)); } -void DGUSScreenHandler::StoreSettings(char *buff) { +void DGUSScreenHandler::storeSettings(char *buff) { eeprom_data_t data; static_assert(sizeof(data) <= ExtUI::eeprom_data_size, "sizeof(eeprom_data_t) > eeprom_data_size."); data.initialized = true; - data.volume = dgus_display.GetVolume(); - data.brightness = dgus_display.GetBrightness(); - data.abl_okay = (ExtUI::getLevelingActive() && ExtUI::getMeshValid()); + data.volume = dgus.getVolume(); + data.brightness = dgus.getBrightness(); + data.abl_okay = (ExtUI::getLevelingActive() && ExtUI::getLevelingIsValid()); memcpy(buff, &data, sizeof(data)); } -void DGUSScreenHandler::LoadSettings(const char *buff) { +void DGUSScreenHandler::loadSettings(const char *buff) { eeprom_data_t data; static_assert(sizeof(data) <= ExtUI::eeprom_data_size, "sizeof(eeprom_data_t) > eeprom_data_size."); memcpy(&data, buff, sizeof(data)); - dgus_display.SetVolume(data.initialized ? data.volume : DGUS_DEFAULT_VOLUME); - dgus_display.SetBrightness(data.initialized ? data.brightness : DGUS_DEFAULT_BRIGHTNESS); + dgus.setVolume(data.initialized ? data.volume : DGUS_DEFAULT_VOLUME); + dgus.setBrightness(data.initialized ? data.brightness : DGUS_DEFAULT_BRIGHTNESS); if (data.initialized) { - leveling_active = (data.abl_okay && ExtUI::getMeshValid()); + leveling_active = (data.abl_okay && ExtUI::getLevelingIsValid()); ExtUI::setLevelingActive(leveling_active); } } -void DGUSScreenHandler::ConfigurationStoreWritten(bool success) { +void DGUSScreenHandler::configurationStoreWritten(bool success) { if (!success) - SetStatusMessage(GET_TEXT_F(DGUS_MSG_WRITE_EEPROM_FAILED)); + setStatusMessage(GET_TEXT_F(DGUS_MSG_WRITE_EEPROM_FAILED)); } -void DGUSScreenHandler::ConfigurationStoreRead(bool success) { +void DGUSScreenHandler::configurationStoreRead(bool success) { if (!success) { - SetStatusMessage(GET_TEXT_F(DGUS_MSG_READ_EEPROM_FAILED)); + setStatusMessage(GET_TEXT_F(DGUS_MSG_READ_EEPROM_FAILED)); } else if (!settings_ready) { settings_ready = true; - Ready(); + ready(); } } -void DGUSScreenHandler::PlayTone(const uint16_t frequency, const uint16_t duration) { +void DGUSScreenHandler::playTone(const uint16_t frequency, const uint16_t duration) { UNUSED(duration); if (frequency >= 1 && frequency <= 255) { if (duration >= 1 && duration <= 255) - dgus_display.PlaySound((uint8_t)frequency, (uint8_t)duration); + dgus.playSound((uint8_t)frequency, (uint8_t)duration); else - dgus_display.PlaySound((uint8_t)frequency); + dgus.playSound((uint8_t)frequency); } } -void DGUSScreenHandler::MeshUpdate(const int8_t xpos, const int8_t ypos) { - if (current_screen != DGUS_Screen::LEVELING_PROBING) { - if (current_screen == DGUS_Screen::LEVELING_AUTOMATIC) - TriggerFullUpdate(); +void DGUSScreenHandler::meshUpdate(const int8_t xpos, const int8_t ypos) { + if (current_screenID != DGUS_ScreenID::LEVELING_PROBING) { + if (current_screenID == DGUS_ScreenID::LEVELING_AUTOMATIC) + triggerFullUpdate(); return; } uint8_t point = ypos * GRID_MAX_POINTS_X + xpos; probing_icons[point < 16 ? 0 : 1] |= (1U << (point % 16)); - if (xpos >= GRID_MAX_POINTS_X - 1 && ypos >= GRID_MAX_POINTS_Y - 1 && !ExtUI::getMeshValid()) + if (xpos >= GRID_MAX_POINTS_X - 1 && ypos >= GRID_MAX_POINTS_Y - 1 && !ExtUI::getLevelingIsValid()) probing_icons[0] = probing_icons[1] = 0; - TriggerFullUpdate(); + triggerFullUpdate(); } -void DGUSScreenHandler::PrintTimerStarted() { - TriggerScreenChange(DGUS_Screen::PRINT_STATUS); +void DGUSScreenHandler::printTimerStarted() { + triggerScreenChange(DGUS_ScreenID::PRINT_STATUS); } -void DGUSScreenHandler::PrintTimerPaused() { - dgus_display.PlaySound(3); - TriggerFullUpdate(); +void DGUSScreenHandler::printTimerPaused() { + dgus.playSound(3); + triggerFullUpdate(); } -void DGUSScreenHandler::PrintTimerStopped() { - if (current_screen != DGUS_Screen::PRINT_STATUS && current_screen != DGUS_Screen::PRINT_ADJUST) +void DGUSScreenHandler::printTimerStopped() { + if (current_screenID != DGUS_ScreenID::PRINT_STATUS && current_screenID != DGUS_ScreenID::PRINT_ADJUST) return; - dgus_display.PlaySound(3); + dgus.playSound(3); - TriggerScreenChange(DGUS_Screen::PRINT_FINISHED); + triggerScreenChange(DGUS_ScreenID::PRINT_FINISHED); } -void DGUSScreenHandler::FilamentRunout(const ExtUI::extruder_t extruder) { +void DGUSScreenHandler::filamentRunout(const ExtUI::extruder_t extruder) { char buffer[21]; snprintf_P(buffer, sizeof(buffer), GET_TEXT(DGUS_MSG_FILAMENT_RUNOUT), extruder); - SetStatusMessage(buffer); + setStatusMessage(buffer); - dgus_display.PlaySound(3); + dgus.playSound(3); } #if HAS_MEDIA - void DGUSScreenHandler::SDCardInserted() { - if (current_screen == DGUS_Screen::HOME) - TriggerScreenChange(DGUS_Screen::PRINT); + void DGUSScreenHandler::sdCardInserted() { + if (current_screenID == DGUS_ScreenID::HOME) + triggerScreenChange(DGUS_ScreenID::PRINT); } - void DGUSScreenHandler::SDCardRemoved() { - if (current_screen == DGUS_Screen::PRINT) - TriggerScreenChange(DGUS_Screen::HOME); + void DGUSScreenHandler::sdCardRemoved() { + if (current_screenID == DGUS_ScreenID::PRINT) + triggerScreenChange(DGUS_ScreenID::HOME); } - void DGUSScreenHandler::SDCardError() { - SetStatusMessage(GET_TEXT_F(MSG_MEDIA_READ_ERROR)); - if (current_screen == DGUS_Screen::PRINT) - TriggerScreenChange(DGUS_Screen::HOME); + void DGUSScreenHandler::sdCardError() { + setStatusMessage(GET_TEXT_F(MSG_MEDIA_READ_ERROR)); + if (current_screenID == DGUS_ScreenID::PRINT) + triggerScreenChange(DGUS_ScreenID::HOME); } #endif // HAS_MEDIA #if ENABLED(POWER_LOSS_RECOVERY) - void DGUSScreenHandler::PowerLossResume() { - MoveToScreen(DGUS_Screen::POWERLOSS, true); + void DGUSScreenHandler::powerLossResume() { + moveToScreen(DGUS_ScreenID::POWERLOSS, true); } #endif // POWER_LOSS_RECOVERY #if HAS_PID_HEATING - void DGUSScreenHandler::PidTuning(const ExtUI::result_t rst) { + void DGUSScreenHandler::pidTuning(const ExtUI::result_t rst) { switch (rst) { case ExtUI::PID_STARTED: - SetStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); + setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE)); break; case ExtUI::PID_BAD_HEATER_ID: - SetStatusMessage(GET_TEXT_F(MSG_PID_BAD_HEATER_ID)); + setStatusMessage(GET_TEXT_F(MSG_PID_BAD_HEATER_ID)); break; case ExtUI::PID_TEMP_TOO_HIGH: - SetStatusMessage(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH)); + setStatusMessage(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH)); break; case ExtUI::PID_TUNING_TIMEOUT: - SetStatusMessage(GET_TEXT_F(MSG_PID_TIMEOUT)); + setStatusMessage(GET_TEXT_F(MSG_PID_TIMEOUT)); break; case ExtUI::PID_DONE: - SetStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE_DONE)); + setStatusMessage(GET_TEXT_F(MSG_PID_AUTOTUNE_DONE)); break; default: return; } - dgus_display.PlaySound(3); + dgus.playSound(3); } #endif // HAS_PID_HEATING -void DGUSScreenHandler::SetMessageLine(const char * const msg, const uint8_t line) { +void DGUSScreenHandler::setMessageLine(const char * const msg, const uint8_t line) { switch (line) { default: return; case 1: - dgus_display.WriteString((uint16_t)DGUS_Addr::MESSAGE_Line1, msg, DGUS_LINE_LEN, true, true); + dgus.writeString((uint16_t)DGUS_Addr::MESSAGE_Line1, msg, DGUS_LINE_LEN, true, true); break; case 2: - dgus_display.WriteString((uint16_t)DGUS_Addr::MESSAGE_Line2, msg, DGUS_LINE_LEN, true, true); + dgus.writeString((uint16_t)DGUS_Addr::MESSAGE_Line2, msg, DGUS_LINE_LEN, true, true); break; case 3: - dgus_display.WriteString((uint16_t)DGUS_Addr::MESSAGE_Line3, msg, DGUS_LINE_LEN, true, true); + dgus.writeString((uint16_t)DGUS_Addr::MESSAGE_Line3, msg, DGUS_LINE_LEN, true, true); break; case 4: - dgus_display.WriteString((uint16_t)DGUS_Addr::MESSAGE_Line4, msg, DGUS_LINE_LEN, true, true); + dgus.writeString((uint16_t)DGUS_Addr::MESSAGE_Line4, msg, DGUS_LINE_LEN, true, true); break; } } -void DGUSScreenHandler::SetMessageLinePGM(PGM_P const msg, const uint8_t line) { +void DGUSScreenHandler::setMessageLinePGM(PGM_P const msg, const uint8_t line) { switch (line) { default: return; case 1: - dgus_display.WriteStringPGM((uint16_t)DGUS_Addr::MESSAGE_Line1, msg, DGUS_LINE_LEN, true, true); + dgus.writeStringPGM((uint16_t)DGUS_Addr::MESSAGE_Line1, msg, DGUS_LINE_LEN, true, true); break; case 2: - dgus_display.WriteStringPGM((uint16_t)DGUS_Addr::MESSAGE_Line2, msg, DGUS_LINE_LEN, true, true); + dgus.writeStringPGM((uint16_t)DGUS_Addr::MESSAGE_Line2, msg, DGUS_LINE_LEN, true, true); break; case 3: - dgus_display.WriteStringPGM((uint16_t)DGUS_Addr::MESSAGE_Line3, msg, DGUS_LINE_LEN, true, true); + dgus.writeStringPGM((uint16_t)DGUS_Addr::MESSAGE_Line3, msg, DGUS_LINE_LEN, true, true); break; case 4: - dgus_display.WriteStringPGM((uint16_t)DGUS_Addr::MESSAGE_Line4, msg, DGUS_LINE_LEN, true, true); + dgus.writeStringPGM((uint16_t)DGUS_Addr::MESSAGE_Line4, msg, DGUS_LINE_LEN, true, true); break; } } -void DGUSScreenHandler::SetStatusMessage(const char* msg, const millis_t duration) { - dgus_display.WriteString((uint16_t)DGUS_Addr::MESSAGE_Status, msg, DGUS_STATUS_LEN, false, true); +void DGUSScreenHandler::setStatusMessage(const char* msg, const millis_t duration) { + dgus.writeString((uint16_t)DGUS_Addr::MESSAGE_Status, msg, DGUS_STATUS_LEN, false, true); status_expire = (duration > 0 ? ExtUI::safe_millis() + duration : 0); } -void DGUSScreenHandler::SetStatusMessage(FSTR_P const fmsg, const millis_t duration) { - dgus_display.WriteString((uint16_t)DGUS_Addr::MESSAGE_Status, fmsg, DGUS_STATUS_LEN, false, true); +void DGUSScreenHandler::setStatusMessage(FSTR_P const fmsg, const millis_t duration) { + dgus.writeString((uint16_t)DGUS_Addr::MESSAGE_Status, fmsg, DGUS_STATUS_LEN, false, true); status_expire = (duration > 0 ? ExtUI::safe_millis() + duration : 0); } -void DGUSScreenHandler::ShowWaitScreen(const DGUS_Screen return_screen, const bool has_continue/*=false*/) { - if (return_screen != DGUS_Screen::WAIT) { - wait_return_screen = return_screen; +void DGUSScreenHandler::showWaitScreen(const DGUS_ScreenID return_screenID, const bool has_continue/*=false*/) { + if (return_screenID != DGUS_ScreenID::WAIT) { + wait_return_screenID = return_screenID; } wait_continue = has_continue; - TriggerScreenChange(DGUS_Screen::WAIT); + triggerScreenChange(DGUS_ScreenID::WAIT); } -void DGUSScreenHandler::ShowWaitScreen(FSTR_P const msg, const DGUS_Screen return_screen, const bool has_continue/*=false*/) { - SetMessageLinePGM(NUL_STR, 1); - SetMessageLine(msg, 2); - SetMessageLinePGM(NUL_STR, 3); - SetMessageLinePGM(NUL_STR, 4); - ShowWaitScreen(return_screen, has_continue); +void DGUSScreenHandler::showWaitScreen(FSTR_P const msg, const DGUS_ScreenID return_screenID, const bool has_continue/*=false*/) { + setMessageLinePGM(NUL_STR, 1); + setMessageLine(msg, 2); + setMessageLinePGM(NUL_STR, 3); + setMessageLinePGM(NUL_STR, 4); + showWaitScreen(return_screenID, has_continue); } -DGUS_Screen DGUSScreenHandler::GetCurrentScreen() { - return current_screen; +DGUS_ScreenID DGUSScreenHandler::getCurrentScreen() { + return current_screenID; } -void DGUSScreenHandler::TriggerScreenChange(DGUS_Screen screen) { - new_screen = screen; +void DGUSScreenHandler::triggerScreenChange(const DGUS_ScreenID screenID) { + new_screenID = screenID; } -void DGUSScreenHandler::TriggerFullUpdate() { +void DGUSScreenHandler::triggerFullUpdate() { full_update = true; } -void DGUSScreenHandler::TriggerEEPROMSave() { +void DGUSScreenHandler::triggerEEPROMSave() { eeprom_save = ExtUI::safe_millis() + 500; } -bool DGUSScreenHandler::IsPrinterIdle() { +bool DGUSScreenHandler::isPrinterIdle() { return (!ExtUI::commandsInQueue() && !ExtUI::isMoving()); } -const DGUS_Addr* DGUSScreenHandler::FindScreenAddrList(DGUS_Screen screen) { +const DGUS_Addr* DGUSScreenHandler::findScreenAddrList(const DGUS_ScreenID screenID) { DGUS_ScreenAddrList list; const DGUS_ScreenAddrList *map = screen_addr_list_map; do { memcpy_P(&list, map, sizeof(*map)); if (!list.addr_list) break; - if (list.screen == screen) { + if (list.screenID == screenID) { return list.addr_list; } } while (++map); @@ -438,14 +437,14 @@ const DGUS_Addr* DGUSScreenHandler::FindScreenAddrList(DGUS_Screen screen) { return nullptr; } -bool DGUSScreenHandler::CallScreenSetup(DGUS_Screen screen) { +bool DGUSScreenHandler::callScreenSetup(const DGUS_ScreenID screenID) { DGUS_ScreenSetup setup; const DGUS_ScreenSetup *list = screen_setup_list; do { memcpy_P(&setup, list, sizeof(*list)); if (!setup.setup_fn) break; - if (setup.screen == screen) { + if (setup.screenID == screenID) { return setup.setup_fn(); } } while (++list); @@ -453,14 +452,14 @@ bool DGUSScreenHandler::CallScreenSetup(DGUS_Screen screen) { return true; } -void DGUSScreenHandler::MoveToScreen(DGUS_Screen screen, bool abort_wait) { - if (current_screen == DGUS_Screen::KILL) { +void DGUSScreenHandler::moveToScreen(const DGUS_ScreenID screenID, bool abort_wait) { + if (current_screenID == DGUS_ScreenID::KILL) { return; } - if (current_screen == DGUS_Screen::WAIT) { - if (screen != DGUS_Screen::WAIT) { - wait_return_screen = screen; + if (current_screenID == DGUS_ScreenID::WAIT) { + if (screenID != DGUS_ScreenID::WAIT) { + wait_return_screenID = screenID; } if (!abort_wait) return; @@ -470,18 +469,18 @@ void DGUSScreenHandler::MoveToScreen(DGUS_Screen screen, bool abort_wait) { } } - if (!CallScreenSetup(screen)) return; + if (!callScreenSetup(screenID)) return; - if (!SendScreenVPData(screen, true)) return; + if (!sendScreenVPData(screenID, true)) return; - current_screen = screen; - dgus_display.SwitchScreen(current_screen); + current_screenID = screenID; + dgus.switchScreen(current_screenID); } -bool DGUSScreenHandler::SendScreenVPData(DGUS_Screen screen, bool complete_update) { +bool DGUSScreenHandler::sendScreenVPData(const DGUS_ScreenID screenID, bool complete_update) { if (complete_update) full_update = false; - const DGUS_Addr *list = FindScreenAddrList(screen); + const DGUS_Addr *list = findScreenAddrList(screenID); while (true) { if (!list) return true; // Nothing left to send @@ -490,17 +489,17 @@ bool DGUSScreenHandler::SendScreenVPData(DGUS_Screen screen, bool complete_updat if (!addr) return true; // Nothing left to send DGUS_VP vp; - if (!DGUS_PopulateVP((DGUS_Addr)addr, &vp)) continue; // Invalid VP + if (!populateVP((DGUS_Addr)addr, &vp)) continue; // Invalid VP if (!vp.tx_handler) continue; // Nothing to send if (!complete_update && !(vp.flags & VPFLAG_AUTOUPLOAD)) continue; // Unnecessary VP uint8_t expected_tx = 6 + vp.size; // 6 bytes header + payload. const millis_t try_until = ExtUI::safe_millis() + 1000; - while (expected_tx > dgus_display.GetFreeTxBuffer()) { + while (expected_tx > dgus.getFreeTxBuffer()) { if (ELAPSED(ExtUI::safe_millis(), try_until)) return false; // Stop trying after 1 second - dgus_display.FlushTx(); // Flush the TX buffer + dgus.flushTx(); // Flush the TX buffer delay(50); } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h index 0f71ebdc3d..27f7f92517 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSScreenHandler.h @@ -23,7 +23,7 @@ #include "config/DGUS_Addr.h" #include "config/DGUS_Data.h" -#include "config/DGUS_Screen.h" +#include "config/DGUS_ScreenID.h" #include "config/DGUS_Constants.h" #include "../ui_api.h" @@ -33,59 +33,59 @@ class DGUSScreenHandler { public: DGUSScreenHandler() = default; - static void Init(); - static void Ready(); - static void Loop(); + static void init(); + static void ready(); + static void loop(); - static void PrinterKilled(FSTR_P const error, FSTR_P const component); - static void UserConfirmRequired(const char * const msg); - static void SettingsReset(); - static void StoreSettings(char *buff); - static void LoadSettings(const char *buff); - static void ConfigurationStoreWritten(bool success); - static void ConfigurationStoreRead(bool success); + static void printerKilled(FSTR_P const error, FSTR_P const component); + static void userConfirmRequired(const char * const msg); + static void settingsReset(); + static void storeSettings(char *buff); + static void loadSettings(const char *buff); + static void configurationStoreWritten(bool success); + static void configurationStoreRead(bool success); - static void PlayTone(const uint16_t frequency, const uint16_t duration); - static void MeshUpdate(const int8_t xpos, const int8_t ypos); - static void PrintTimerStarted(); - static void PrintTimerPaused(); - static void PrintTimerStopped(); - static void FilamentRunout(const ExtUI::extruder_t extruder); + static void playTone(const uint16_t frequency, const uint16_t duration); + static void meshUpdate(const int8_t xpos, const int8_t ypos); + static void printTimerStarted(); + static void printTimerPaused(); + static void printTimerStopped(); + static void filamentRunout(const ExtUI::extruder_t extruder); #if HAS_MEDIA /// Marlin informed us that a new SD has been inserted. - static void SDCardInserted(); + static void sdCardInserted(); /// Marlin informed us that the SD Card has been removed(). - static void SDCardRemoved(); + static void sdCardRemoved(); /// Marlin informed us about a bad SD Card. - static void SDCardError(); + static void sdCardError(); #endif #if ENABLED(POWER_LOSS_RECOVERY) - static void PowerLossResume(); + static void powerLossResume(); #endif #if HAS_PID_HEATING - static void PidTuning(const ExtUI::result_t rst); + static void pidTuning(const ExtUI::result_t rst); #endif - static void SetMessageLine(const char * const msg, const uint8_t line); - static void SetMessageLinePGM(PGM_P const msg, const uint8_t line); - static void SetMessageLine(FSTR_P const msg, const uint8_t line) { SetMessageLinePGM(FTOP(msg), line); } + static void setMessageLine(const char * const msg, const uint8_t line); + static void setMessageLinePGM(PGM_P const msg, const uint8_t line); + static void setMessageLine(FSTR_P const msg, const uint8_t line) { setMessageLinePGM(FTOP(msg), line); } - static void SetStatusMessage(const char* msg, const millis_t duration=DGUS_STATUS_EXPIRATION_MS); - static void SetStatusMessage(FSTR_P const msg, const millis_t duration=DGUS_STATUS_EXPIRATION_MS); + static void setStatusMessage(const char* msg, const millis_t duration=DGUS_STATUS_EXPIRATION_MS); + static void setStatusMessage(FSTR_P const msg, const millis_t duration=DGUS_STATUS_EXPIRATION_MS); - static void ShowWaitScreen(const DGUS_Screen return_screen, const bool has_continue=false); - static void ShowWaitScreen(FSTR_P const msg, const DGUS_Screen return_screen, const bool has_continue=false); + static void showWaitScreen(const DGUS_ScreenID return_screenID, const bool has_continue=false); + static void showWaitScreen(FSTR_P const msg, const DGUS_ScreenID return_screenID, const bool has_continue=false); - static DGUS_Screen GetCurrentScreen(); - static void TriggerScreenChange(DGUS_Screen screen); - static void TriggerFullUpdate(); + static DGUS_ScreenID getCurrentScreen(); + static void triggerScreenChange(const DGUS_ScreenID screenID); + static void triggerFullUpdate(); - static void TriggerEEPROMSave(); + static void triggerEEPROMSave(); - static bool IsPrinterIdle(); + static bool isPrinterIdle(); static uint8_t debug_count; @@ -114,20 +114,20 @@ public: static bool leveling_active; private: - static const DGUS_Addr* FindScreenAddrList(DGUS_Screen screen); - static bool CallScreenSetup(DGUS_Screen screen); + static const DGUS_Addr* findScreenAddrList(const DGUS_ScreenID screenID); + static bool callScreenSetup(const DGUS_ScreenID screenID); - static void MoveToScreen(DGUS_Screen screen, bool abort_wait=false); - static bool SendScreenVPData(DGUS_Screen screen, bool complete_update); + static void moveToScreen(const DGUS_ScreenID screenID, bool abort_wait=false); + static bool sendScreenVPData(const DGUS_ScreenID screenID, bool complete_update); static bool settings_ready; static bool booted; - static DGUS_Screen current_screen; - static DGUS_Screen new_screen; + static DGUS_ScreenID current_screenID; + static DGUS_ScreenID new_screenID; static bool full_update; - static DGUS_Screen wait_return_screen; + static DGUS_ScreenID wait_return_screenID; static millis_t status_expire; static millis_t eeprom_save; @@ -140,4 +140,4 @@ private: } eeprom_data_t; }; -extern DGUSScreenHandler dgus_screen_handler; +extern DGUSScreenHandler screen; diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.cpp index 3b1a38502d..8f970e094f 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.cpp @@ -32,43 +32,43 @@ #include "../../../gcode/queue.h" #if HAS_MEDIA - bool DGUSSetupHandler::Print() { - dgus_screen_handler.filelist.refresh(); + bool DGUSSetupHandler::print() { + screen.filelist.refresh(); - while (!dgus_screen_handler.filelist.isAtRootDir()) { - dgus_screen_handler.filelist.upDir(); + while (!screen.filelist.isAtRootDir()) { + screen.filelist.upDir(); } - dgus_screen_handler.filelist_offset = 0; - dgus_screen_handler.filelist_selected = -1; + screen.filelist_offset = 0; + screen.filelist_selected = -1; return true; } #endif -bool DGUSSetupHandler::PrintStatus() { +bool DGUSSetupHandler::printStatus() { if (ExtUI::isPrinting() || ExtUI::isPrintingPaused()) { return true; } - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::PRINT_FINISHED); + screen.triggerScreenChange(DGUS_ScreenID::PRINT_FINISHED); return false; } -bool DGUSSetupHandler::PrintAdjust() { +bool DGUSSetupHandler::printAdjust() { if (ExtUI::isPrinting() || ExtUI::isPrintingPaused()) { return true; } - dgus_screen_handler.TriggerScreenChange(DGUS_Screen::PRINT_FINISHED); + screen.triggerScreenChange(DGUS_ScreenID::PRINT_FINISHED); return false; } -bool DGUSSetupHandler::LevelingMenu() { - ExtUI::setLevelingActive(dgus_screen_handler.leveling_active); +bool DGUSSetupHandler::levelingMenu() { + ExtUI::setLevelingActive(screen.leveling_active); - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return false; } @@ -80,37 +80,37 @@ bool DGUSSetupHandler::LevelingMenu() { return true; } - dgus_screen_handler.ShowWaitScreen(GET_TEXT_F(DGUS_MSG_HOMING), DGUS_Screen::LEVELING_MENU); + screen.showWaitScreen(GET_TEXT_F(DGUS_MSG_HOMING), DGUS_ScreenID::LEVELING_MENU); queue.enqueue_now(F("G28")); return false; } -bool DGUSSetupHandler::LevelingManual() { +bool DGUSSetupHandler::levelingManual() { ExtUI::setLevelingActive(false); if (ExtUI::isPositionKnown()) { return true; } - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return false; } - dgus_screen_handler.ShowWaitScreen(GET_TEXT_F(DGUS_MSG_HOMING), DGUS_Screen::LEVELING_MANUAL); + screen.showWaitScreen(GET_TEXT_F(DGUS_MSG_HOMING), DGUS_ScreenID::LEVELING_MANUAL); queue.enqueue_now(F("G28")); return false; } -bool DGUSSetupHandler::LevelingOffset() { - dgus_screen_handler.offset_steps = DGUS_Data::StepSize::MMP1; +bool DGUSSetupHandler::levelingOffset() { + screen.offset_steps = DGUS_Data::StepSize::MMP1; - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return false; } @@ -128,16 +128,16 @@ bool DGUSSetupHandler::LevelingOffset() { return true; } - dgus_screen_handler.ShowWaitScreen(GET_TEXT_F(DGUS_MSG_HOMING), DGUS_Screen::LEVELING_OFFSET); + screen.showWaitScreen(GET_TEXT_F(DGUS_MSG_HOMING), DGUS_ScreenID::LEVELING_OFFSET); queue.enqueue_now(F("G28")); return false; } -bool DGUSSetupHandler::LevelingAutomatic() { - if (ExtUI::getMeshValid()) { - dgus_screen_handler.leveling_active = true; +bool DGUSSetupHandler::levelingAutomatic() { + if (ExtUI::getLevelingIsValid()) { + screen.leveling_active = true; ExtUI::setLevelingActive(true); } @@ -145,51 +145,51 @@ bool DGUSSetupHandler::LevelingAutomatic() { return true; } -bool DGUSSetupHandler::LevelingProbing() { - dgus_screen_handler.probing_icons[0] = 0; - dgus_screen_handler.probing_icons[1] = 0; +bool DGUSSetupHandler::levelingProbing() { + screen.probing_icons[0] = 0; + screen.probing_icons[1] = 0; return true; } -bool DGUSSetupHandler::Filament() { - dgus_screen_handler.filament_extruder = DGUS_Data::Extruder::CURRENT; - dgus_screen_handler.filament_length = DGUS_DEFAULT_FILAMENT_LEN; +bool DGUSSetupHandler::filament() { + screen.filament_extruder = DGUS_Data::Extruder::CURRENT; + screen.filament_length = DGUS_DEFAULT_FILAMENT_LEN; return true; } -bool DGUSSetupHandler::Move() { - dgus_screen_handler.move_steps = DGUS_Data::StepSize::MM10; +bool DGUSSetupHandler::move() { + screen.move_steps = DGUS_Data::StepSize::MM10; - if (!dgus_screen_handler.IsPrinterIdle()) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); + if (!screen.isPrinterIdle()) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_BUSY)); return false; } return true; } -bool DGUSSetupHandler::Gcode() { - ZERO(dgus_screen_handler.gcode); +bool DGUSSetupHandler::gcode() { + ZERO(screen.gcode); - if (dgus_display.gui_version < 0x30 || dgus_display.os_version < 0x21) { - dgus_screen_handler.SetStatusMessage(GET_TEXT_F(DGUS_MSG_FW_OUTDATED)); + if (dgus.gui_version < 0x30 || dgus.os_version < 0x21) { + screen.setStatusMessage(GET_TEXT_F(DGUS_MSG_FW_OUTDATED)); return false; } return true; } -bool DGUSSetupHandler::PID() { - dgus_screen_handler.pid_heater = DGUS_Data::Heater::H0; - dgus_screen_handler.pid_temp = DGUS_PLA_TEMP_HOTEND; +bool DGUSSetupHandler::pid() { + screen.pid_heater = DGUS_Data::Heater::H0; + screen.pid_temp = DGUS_PLA_TEMP_HOTEND; return true; } -bool DGUSSetupHandler::Infos() { - dgus_screen_handler.debug_count = 0; +bool DGUSSetupHandler::infos() { + screen.debug_count = 0; return true; } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.h b/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.h index 10063446b7..67edfee484 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.h @@ -24,19 +24,19 @@ namespace DGUSSetupHandler { #if HAS_MEDIA - bool Print(); + bool print(); #endif - bool PrintStatus(); - bool PrintAdjust(); - bool LevelingMenu(); - bool LevelingOffset(); - bool LevelingManual(); - bool LevelingAutomatic(); - bool LevelingProbing(); - bool Filament(); - bool Move(); - bool Gcode(); - bool PID(); - bool Infos(); + bool printStatus(); + bool printAdjust(); + bool levelingMenu(); + bool levelingOffset(); + bool levelingManual(); + bool levelingAutomatic(); + bool levelingProbing(); + bool filament(); + bool move(); + bool gcode(); + bool pid(); + bool infos(); } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp index c7d650c03e..037eafcc94 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp @@ -37,7 +37,7 @@ #endif #if HAS_MEDIA - void DGUSTxHandler::SetFileControlState(int16_t file, bool state) { + void DGUSTxHandler::setFileControlState(int16_t file, bool state) { DGUS_Control control; switch (file) { @@ -60,40 +60,40 @@ } if (state) { - dgus_display.EnableControl(DGUS_Screen::PRINT, + dgus.enableControl(DGUS_ScreenID::PRINT, DGUSDisplay::RETURN_KEY_CODE, control); } else { - dgus_display.DisableControl(DGUS_Screen::PRINT, + dgus.disableControl(DGUS_ScreenID::PRINT, DGUSDisplay::RETURN_KEY_CODE, control); } } - void DGUSTxHandler::FileType(DGUS_VP &vp) { + void DGUSTxHandler::fileType(DGUS_VP &vp) { // Batch send uint16_t data[DGUS_FILE_COUNT]; for (int16_t i = 0; i < DGUS_FILE_COUNT; i++) { - if (!dgus_screen_handler.filelist.seek(dgus_screen_handler.filelist_offset + i)) { + if (!screen.filelist.seek(screen.filelist_offset + i)) { data[i] = Swap16(DGUS_Data::SDType::NONE); - SetFileControlState(i, false); + setFileControlState(i, false); continue; } - data[i] = dgus_screen_handler.filelist.isDir() ? + data[i] = screen.filelist.isDir() ? Swap16(DGUS_Data::SDType::DIRECTORY) : Swap16(DGUS_Data::SDType::FILE); - SetFileControlState(i, true); + setFileControlState(i, true); } - dgus_display.Write((uint16_t)vp.addr, data, sizeof(*data) * DGUS_FILE_COUNT); + dgus.write((uint16_t)vp.addr, data, sizeof(*data) * DGUS_FILE_COUNT); } - void DGUSTxHandler::FileName(DGUS_VP &vp) { + void DGUSTxHandler::fileName(DGUS_VP &vp) { uint8_t offset; switch (vp.addr) { @@ -115,84 +115,84 @@ break; } - if (dgus_screen_handler.filelist.seek(dgus_screen_handler.filelist_offset + offset)) { - dgus_display.WriteString((uint16_t)vp.addr, dgus_screen_handler.filelist.filename(), vp.size); + if (screen.filelist.seek(screen.filelist_offset + offset)) { + dgus.writeString((uint16_t)vp.addr, screen.filelist.filename(), vp.size); } else { - dgus_display.WriteStringPGM((uint16_t)vp.addr, NUL_STR, vp.size); + dgus.writeStringPGM((uint16_t)vp.addr, NUL_STR, vp.size); } } - void DGUSTxHandler::ScrollIcons(DGUS_VP &vp) { + void DGUSTxHandler::scrollIcons(DGUS_VP &vp) { uint16_t icons = 0; - if (!dgus_screen_handler.filelist.isAtRootDir()) { + if (!screen.filelist.isAtRootDir()) { icons |= (uint16_t)DGUS_Data::ScrollIcon::GO_BACK; - dgus_display.EnableControl(DGUS_Screen::PRINT, + dgus.enableControl(DGUS_ScreenID::PRINT, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::GO_BACK); } else { - dgus_display.DisableControl(DGUS_Screen::PRINT, + dgus.disableControl(DGUS_ScreenID::PRINT, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::GO_BACK); } - if (dgus_screen_handler.filelist_offset > 0) { + if (screen.filelist_offset > 0) { icons |= (uint16_t)DGUS_Data::ScrollIcon::UP; - dgus_display.EnableControl(DGUS_Screen::PRINT, + dgus.enableControl(DGUS_ScreenID::PRINT, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::SCROLL_UP); } else { - dgus_display.DisableControl(DGUS_Screen::PRINT, + dgus.disableControl(DGUS_ScreenID::PRINT, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::SCROLL_UP); } - if (dgus_screen_handler.filelist_offset + DGUS_FILE_COUNT < dgus_screen_handler.filelist.count()) { + if (screen.filelist_offset + DGUS_FILE_COUNT < screen.filelist.count()) { icons |= (uint16_t)DGUS_Data::ScrollIcon::DOWN; - dgus_display.EnableControl(DGUS_Screen::PRINT, + dgus.enableControl(DGUS_ScreenID::PRINT, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::SCROLL_DOWN); } else { - dgus_display.DisableControl(DGUS_Screen::PRINT, + dgus.disableControl(DGUS_ScreenID::PRINT, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::SCROLL_DOWN); } - dgus_display.Write((uint16_t)vp.addr, Swap16(icons)); + dgus.write((uint16_t)vp.addr, Swap16(icons)); } - void DGUSTxHandler::SelectedFileName(DGUS_VP &vp) { - if (dgus_screen_handler.filelist_selected < 0 - || !dgus_screen_handler.filelist.seek(dgus_screen_handler.filelist_selected)) { - dgus_display.WriteStringPGM((uint16_t)vp.addr, NUL_STR, vp.size); + void DGUSTxHandler::selectedFileName(DGUS_VP &vp) { + if (screen.filelist_selected < 0 + || !screen.filelist.seek(screen.filelist_selected)) { + dgus.writeStringPGM((uint16_t)vp.addr, NUL_STR, vp.size); return; } - dgus_display.WriteString((uint16_t)vp.addr, dgus_screen_handler.filelist.filename(), vp.size); + dgus.writeString((uint16_t)vp.addr, screen.filelist.filename(), vp.size); } #endif // HAS_MEDIA -void DGUSTxHandler::PositionZ(DGUS_VP &vp) { +void DGUSTxHandler::zPosition(DGUS_VP &vp) { const float position = ExtUI::isAxisPositionKnown(ExtUI::Z) ? planner.get_axis_position_mm(Z_AXIS) : 0; - const int32_t data = dgus_display.ToFixedPoint(int32_t(position * 50.0f) / 50.0f); // Round to 0.02 - dgus_display.Write((uint16_t)vp.addr, dgus_display.SwapBytes(data)); + const int32_t data = dgus.toFixedPoint(int32_t(position * 50.0f) / 50.0f); // Round to 0.02 + dgus.write((uint16_t)vp.addr, dgus.swapBytes(data)); } -void DGUSTxHandler::Elapsed(DGUS_VP &vp) { +void DGUSTxHandler::elapsed(DGUS_VP &vp) { char buffer[21]; duration_t(print_job_timer.duration()).toString(buffer); - dgus_display.WriteString((uint16_t)vp.addr, buffer, vp.size); + dgus.writeString((uint16_t)vp.addr, buffer, vp.size); } -void DGUSTxHandler::Percent(DGUS_VP &vp) { +void DGUSTxHandler::percent(DGUS_VP &vp) { uint16_t progress; switch (vp.addr) { @@ -205,21 +205,21 @@ void DGUSTxHandler::Percent(DGUS_VP &vp) { break; } - dgus_display.Write((uint16_t)DGUS_Addr::STATUS_Percent, Swap16(progress)); + dgus.write((uint16_t)DGUS_Addr::STATUS_Percent, Swap16(progress)); } -void DGUSTxHandler::StatusIcons(DGUS_VP &vp) { +void DGUSTxHandler::statusIcons(DGUS_VP &vp) { uint16_t icons = 0; if (ExtUI::isPrinting()) { icons |= (uint16_t)DGUS_Data::StatusIcon::PAUSE; - dgus_display.EnableControl(DGUS_Screen::PRINT_STATUS, + dgus.enableControl(DGUS_ScreenID::PRINT_STATUS, DGUSDisplay::POPUP_WINDOW, DGUS_Control::PAUSE); } else { - dgus_display.DisableControl(DGUS_Screen::PRINT_STATUS, + dgus.disableControl(DGUS_ScreenID::PRINT_STATUS, DGUSDisplay::POPUP_WINDOW, DGUS_Control::PAUSE); } @@ -227,20 +227,20 @@ void DGUSTxHandler::StatusIcons(DGUS_VP &vp) { if (ExtUI::isPrintingPaused()) { icons |= (uint16_t)DGUS_Data::StatusIcon::RESUME; - dgus_display.EnableControl(DGUS_Screen::PRINT_STATUS, + dgus.enableControl(DGUS_ScreenID::PRINT_STATUS, DGUSDisplay::POPUP_WINDOW, DGUS_Control::RESUME); } else { - dgus_display.DisableControl(DGUS_Screen::PRINT_STATUS, + dgus.disableControl(DGUS_ScreenID::PRINT_STATUS, DGUSDisplay::POPUP_WINDOW, DGUS_Control::RESUME); } - dgus_display.Write((uint16_t)vp.addr, Swap16(icons)); + dgus.write((uint16_t)vp.addr, Swap16(icons)); } -void DGUSTxHandler::Flowrate(DGUS_VP &vp) { +void DGUSTxHandler::flowrate(DGUS_VP &vp) { int16_t flowrate; switch (vp.addr) { @@ -258,10 +258,10 @@ void DGUSTxHandler::Flowrate(DGUS_VP &vp) { #endif } - dgus_display.Write((uint16_t)vp.addr, Swap16(flowrate)); + dgus.write((uint16_t)vp.addr, Swap16(flowrate)); } -void DGUSTxHandler::TempMax(DGUS_VP &vp) { +void DGUSTxHandler::tempMax(DGUS_VP &vp) { uint16_t temp; switch (vp.addr) { @@ -279,15 +279,15 @@ void DGUSTxHandler::TempMax(DGUS_VP &vp) { #endif } - dgus_display.Write((uint16_t)vp.addr, Swap16(temp)); + dgus.write((uint16_t)vp.addr, Swap16(temp)); } -void DGUSTxHandler::StepperStatus(DGUS_VP &vp) { +void DGUSTxHandler::stepperStatus(DGUS_VP &vp) { const bool motor_on = stepper.axis_enabled.bits & (_BV(NUM_AXES) - 1); - dgus_display.Write((uint16_t)vp.addr, Swap16(motor_on ? DGUS_Data::Status::ENABLED : DGUS_Data::Status::DISABLED)); + dgus.write((uint16_t)vp.addr, Swap16(motor_on ? DGUS_Data::Status::ENABLED : DGUS_Data::Status::DISABLED)); } -void DGUSTxHandler::StepIcons(DGUS_VP &vp) { +void DGUSTxHandler::stepIcons(DGUS_VP &vp) { if (!vp.extra) return; uint16_t icons = 0; DGUS_Data::StepSize size = *(DGUS_Data::StepSize*)vp.extra; @@ -307,31 +307,31 @@ void DGUSTxHandler::StepIcons(DGUS_VP &vp) { break; } - dgus_display.Write((uint16_t)vp.addr, Swap16(icons)); + dgus.write((uint16_t)vp.addr, Swap16(icons)); } -void DGUSTxHandler::ABLDisableIcon(DGUS_VP &vp) { +void DGUSTxHandler::ablDisableIcon(DGUS_VP &vp) { uint16_t data; if (ExtUI::getLevelingActive()) { data = (uint16_t)DGUS_Data::Status::ENABLED; - dgus_display.EnableControl(DGUS_Screen::LEVELING_AUTOMATIC, + dgus.enableControl(DGUS_ScreenID::LEVELING_AUTOMATIC, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::DISABLE); } else { data = (uint16_t)DGUS_Data::Status::DISABLED; - dgus_display.DisableControl(DGUS_Screen::LEVELING_AUTOMATIC, + dgus.disableControl(DGUS_ScreenID::LEVELING_AUTOMATIC, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::DISABLE); } - dgus_display.Write((uint16_t)vp.addr, Swap16(data)); + dgus.write((uint16_t)vp.addr, Swap16(data)); } -void DGUSTxHandler::ABLGrid(DGUS_VP &vp) { +void DGUSTxHandler::ablGrid(DGUS_VP &vp) { // Batch send int16_t data[DGUS_LEVEL_GRID_SIZE]; xy_uint8_t point; @@ -340,17 +340,17 @@ void DGUSTxHandler::ABLGrid(DGUS_VP &vp) { for (int16_t i = 0; i < DGUS_LEVEL_GRID_SIZE; i++) { point.x = i % (GRID_MAX_POINTS_X); point.y = i / (GRID_MAX_POINTS_X); - fixed = dgus_display.ToFixedPoint(ExtUI::getMeshPoint(point)); + fixed = dgus.toFixedPoint(ExtUI::getMeshPoint(point)); data[i] = Swap16(fixed); } - dgus_display.Write((uint16_t)vp.addr, data, sizeof(*data) * DGUS_LEVEL_GRID_SIZE); + dgus.write((uint16_t)vp.addr, data, sizeof(*data) * DGUS_LEVEL_GRID_SIZE); } -void DGUSTxHandler::FilamentIcons(DGUS_VP &vp) { +void DGUSTxHandler::filamentIcons(DGUS_VP &vp) { uint16_t icons = 0; - switch (dgus_screen_handler.filament_extruder) { + switch (screen.filament_extruder) { default: return; case DGUS_Data::Extruder::CURRENT: #if HAS_MULTI_EXTRUDER @@ -373,29 +373,29 @@ void DGUSTxHandler::FilamentIcons(DGUS_VP &vp) { break; } - dgus_display.Write((uint16_t)vp.addr, Swap16(icons)); + dgus.write((uint16_t)vp.addr, Swap16(icons)); } -void DGUSTxHandler::BLTouch(DGUS_VP &vp) { +void DGUSTxHandler::blTouch(DGUS_VP &vp) { #if ENABLED(BLTOUCH) - dgus_display.EnableControl(DGUS_Screen::SETTINGS_MENU2, + dgus.enableControl(DGUS_ScreenID::SETTINGS_MENU2, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::EXTRA2); - dgus_display.Write((uint16_t)vp.addr, Swap16(DGUS_Data::Status::ENABLED)); + dgus.write((uint16_t)vp.addr, Swap16(DGUS_Data::Status::ENABLED)); #else - dgus_display.DisableControl(DGUS_Screen::SETTINGS_MENU2, + dgus.disableControl(DGUS_ScreenID::SETTINGS_MENU2, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::EXTRA2); - dgus_display.Write((uint16_t)vp.addr, Swap16(DGUS_Data::Status::DISABLED)); + dgus.write((uint16_t)vp.addr, Swap16(DGUS_Data::Status::DISABLED)); #endif } -void DGUSTxHandler::PIDIcons(DGUS_VP &vp) { +void DGUSTxHandler::pidIcons(DGUS_VP &vp) { uint16_t icons = 0; - switch (dgus_screen_handler.pid_heater) { + switch (screen.pid_heater) { default: return; case DGUS_Data::Heater::BED: icons |= (uint16_t)DGUS_Data::HeaterIcon::BED; @@ -408,13 +408,13 @@ void DGUSTxHandler::PIDIcons(DGUS_VP &vp) { break; } - dgus_display.Write((uint16_t)vp.addr, Swap16(icons)); + dgus.write((uint16_t)vp.addr, Swap16(icons)); } -void DGUSTxHandler::PIDKp(DGUS_VP &vp) { +void DGUSTxHandler::pidKp(DGUS_VP &vp) { float value; - switch (dgus_screen_handler.pid_heater) { + switch (screen.pid_heater) { default: return; #if ENABLED(PIDTEMPBED) case DGUS_Data::Heater::BED: @@ -433,14 +433,14 @@ void DGUSTxHandler::PIDKp(DGUS_VP &vp) { #endif } - const int32_t data = dgus_display.ToFixedPoint(value); - dgus_display.Write((uint16_t)vp.addr, dgus_display.SwapBytes(data)); + const int32_t data = dgus.toFixedPoint(value); + dgus.write((uint16_t)vp.addr, dgus.swapBytes(data)); } -void DGUSTxHandler::PIDKi(DGUS_VP &vp) { +void DGUSTxHandler::pidKi(DGUS_VP &vp) { float value; - switch (dgus_screen_handler.pid_heater) { + switch (screen.pid_heater) { default: return; #if ENABLED(PIDTEMPBED) case DGUS_Data::Heater::BED: @@ -459,14 +459,14 @@ void DGUSTxHandler::PIDKi(DGUS_VP &vp) { #endif } - const int32_t data = dgus_display.ToFixedPoint(value); - dgus_display.Write((uint16_t)vp.addr, dgus_display.SwapBytes(data)); + const int32_t data = dgus.toFixedPoint(value); + dgus.write((uint16_t)vp.addr, dgus.swapBytes(data)); } -void DGUSTxHandler::PIDKd(DGUS_VP &vp) { +void DGUSTxHandler::pidKd(DGUS_VP &vp) { float value; - switch (dgus_screen_handler.pid_heater) { + switch (screen.pid_heater) { default: return; #if ENABLED(PIDTEMPBED) case DGUS_Data::Heater::BED: @@ -485,99 +485,99 @@ void DGUSTxHandler::PIDKd(DGUS_VP &vp) { #endif } - const int32_t data = dgus_display.ToFixedPoint(value); - dgus_display.Write((uint16_t)vp.addr, dgus_display.SwapBytes(data)); + const int32_t data = dgus.toFixedPoint(value); + dgus.write((uint16_t)vp.addr, dgus.swapBytes(data)); } -void DGUSTxHandler::BuildVolume(DGUS_VP &vp) { +void DGUSTxHandler::buildVolume(DGUS_VP &vp) { char buffer[vp.size]; snprintf_P(buffer, vp.size, PSTR("%dx%dx%d"), X_BED_SIZE, Y_BED_SIZE, (Z_MAX_POS - Z_MIN_POS)); - dgus_display.WriteString((uint16_t)vp.addr, buffer, vp.size); + dgus.writeString((uint16_t)vp.addr, buffer, vp.size); } -void DGUSTxHandler::TotalPrints(DGUS_VP &vp) { +void DGUSTxHandler::totalPrints(DGUS_VP &vp) { #if ENABLED(PRINTCOUNTER) - dgus_display.Write((uint16_t)vp.addr, dgus_display.SwapBytes(print_job_timer.getStats().totalPrints)); + dgus.write((uint16_t)vp.addr, dgus.swapBytes(print_job_timer.getStats().totalPrints)); #else UNUSED(vp); #endif } -void DGUSTxHandler::FinishedPrints(DGUS_VP &vp) { +void DGUSTxHandler::finishedPrints(DGUS_VP &vp) { #if ENABLED(PRINTCOUNTER) - dgus_display.Write((uint16_t)vp.addr, dgus_display.SwapBytes(print_job_timer.getStats().finishedPrints)); + dgus.write((uint16_t)vp.addr, dgus.swapBytes(print_job_timer.getStats().finishedPrints)); #else UNUSED(vp); #endif } -void DGUSTxHandler::PrintTime(DGUS_VP &vp) { +void DGUSTxHandler::printTime(DGUS_VP &vp) { #if ENABLED(PRINTCOUNTER) char buffer[21]; ExtUI::getTotalPrintTime_str(buffer); - dgus_display.WriteString((uint16_t)vp.addr, buffer, vp.size); + dgus.writeString((uint16_t)vp.addr, buffer, vp.size); #else - dgus_display.WriteString((uint16_t)vp.addr, F("-"), vp.size); + dgus.writeString((uint16_t)vp.addr, F("-"), vp.size); #endif } -void DGUSTxHandler::LongestPrint(DGUS_VP &vp) { +void DGUSTxHandler::longestPrint(DGUS_VP &vp) { #if ENABLED(PRINTCOUNTER) char buffer[21]; ExtUI::getLongestPrint_str(buffer); - dgus_display.WriteString((uint16_t)vp.addr, buffer, vp.size); + dgus.writeString((uint16_t)vp.addr, buffer, vp.size); #else - dgus_display.WriteString((uint16_t)vp.addr, F("-"), vp.size); + dgus.writeString((uint16_t)vp.addr, F("-"), vp.size); #endif } -void DGUSTxHandler::FilamentUsed(DGUS_VP &vp) { +void DGUSTxHandler::filamentUsed(DGUS_VP &vp) { #if ENABLED(PRINTCOUNTER) char buffer[21]; ExtUI::getFilamentUsed_str(buffer); - dgus_display.WriteString((uint16_t)vp.addr, buffer, vp.size); + dgus.writeString((uint16_t)vp.addr, buffer, vp.size); #else - dgus_display.WriteString((uint16_t)vp.addr, F("-"), vp.size); + dgus.writeString((uint16_t)vp.addr, F("-"), vp.size); #endif } -void DGUSTxHandler::WaitIcons(DGUS_VP &vp) { +void DGUSTxHandler::waitIcons(DGUS_VP &vp) { uint16_t icons = 0; if (ExtUI::isPrintingPaused()) { icons |= (uint16_t)DGUS_Data::WaitIcon::ABORT; - dgus_display.EnableControl(DGUS_Screen::WAIT, + dgus.enableControl(DGUS_ScreenID::WAIT, DGUSDisplay::POPUP_WINDOW, DGUS_Control::ABORT); } else { - dgus_display.DisableControl(DGUS_Screen::WAIT, + dgus.disableControl(DGUS_ScreenID::WAIT, DGUSDisplay::POPUP_WINDOW, DGUS_Control::ABORT); } - if (dgus_screen_handler.wait_continue) { + if (screen.wait_continue) { icons |= (uint16_t)DGUS_Data::WaitIcon::CONTINUE; - dgus_display.EnableControl(DGUS_Screen::WAIT, + dgus.enableControl(DGUS_ScreenID::WAIT, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::CONTINUE); } else { - dgus_display.DisableControl(DGUS_Screen::WAIT, + dgus.disableControl(DGUS_ScreenID::WAIT, DGUSDisplay::RETURN_KEY_CODE, DGUS_Control::CONTINUE); } - dgus_display.Write((uint16_t)vp.addr, Swap16(icons)); + dgus.write((uint16_t)vp.addr, Swap16(icons)); } -void DGUSTxHandler::FanSpeed(DGUS_VP &vp) { +void DGUSTxHandler::fanSpeed(DGUS_VP &vp) { uint16_t fan_speed; switch (vp.addr) { @@ -585,31 +585,31 @@ void DGUSTxHandler::FanSpeed(DGUS_VP &vp) { case DGUS_Addr::FAN0_Speed: fan_speed = ExtUI::getTargetFan_percent(ExtUI::FAN0); break; } - dgus_display.Write((uint16_t)vp.addr, Swap16(fan_speed)); + dgus.write((uint16_t)vp.addr, Swap16(fan_speed)); } -void DGUSTxHandler::Volume(DGUS_VP &vp) { - const uint16_t volume = dgus_display.GetVolume(); +void DGUSTxHandler::volume(DGUS_VP &vp) { + const uint16_t volume = dgus.getVolume(); - dgus_display.Write((uint16_t)vp.addr, Swap16(volume)); + dgus.write((uint16_t)vp.addr, Swap16(volume)); } -void DGUSTxHandler::Brightness(DGUS_VP &vp) { - const uint16_t brightness = dgus_display.GetBrightness(); +void DGUSTxHandler::brightness(DGUS_VP &vp) { + const uint16_t brightness = dgus.getBrightness(); - dgus_display.Write((uint16_t)vp.addr, Swap16(brightness)); + dgus.write((uint16_t)vp.addr, Swap16(brightness)); } -void DGUSTxHandler::ExtraToString(DGUS_VP &vp) { +void DGUSTxHandler::extraToString(DGUS_VP &vp) { if (!vp.size || !vp.extra) return; - dgus_display.WriteString((uint16_t)vp.addr, vp.extra, vp.size, true, false, false); + dgus.writeString((uint16_t)vp.addr, vp.extra, vp.size, true, false, false); } -void DGUSTxHandler::ExtraPGMToString(DGUS_VP &vp) { +void DGUSTxHandler::extraPGMToString(DGUS_VP &vp) { if (!vp.size || !vp.extra) return; - dgus_display.WriteStringPGM((uint16_t)vp.addr, vp.extra, vp.size, true, false, false); + dgus.writeStringPGM((uint16_t)vp.addr, vp.extra, vp.size, true, false, false); } #endif // DGUS_LCD_UI_RELOADED diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.h b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.h index 6e4f1db5dc..c82f4c80da 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.h @@ -29,97 +29,97 @@ namespace DGUSTxHandler { #if HAS_MEDIA - void SetFileControlState(int16_t, bool); - void FileType(DGUS_VP &); - void FileName(DGUS_VP &); - void ScrollIcons(DGUS_VP &); - void SelectedFileName(DGUS_VP &); + void setFileControlState(int16_t, bool); + void fileType(DGUS_VP &); + void fileName(DGUS_VP &); + void scrollIcons(DGUS_VP &); + void selectedFileName(DGUS_VP &); #endif - void PositionZ(DGUS_VP &); - void Elapsed(DGUS_VP &); - void Percent(DGUS_VP &); - void StatusIcons(DGUS_VP &); + void zPosition(DGUS_VP &); + void elapsed(DGUS_VP &); + void percent(DGUS_VP &); + void statusIcons(DGUS_VP &); - void Flowrate(DGUS_VP &); + void flowrate(DGUS_VP &); - void TempMax(DGUS_VP &); + void tempMax(DGUS_VP &); - void StepperStatus(DGUS_VP &); + void stepperStatus(DGUS_VP &); - void StepIcons(DGUS_VP &); + void stepIcons(DGUS_VP &); - void ABLDisableIcon(DGUS_VP &); - void ABLGrid(DGUS_VP &); + void ablDisableIcon(DGUS_VP &); + void ablGrid(DGUS_VP &); - void FilamentIcons(DGUS_VP &); + void filamentIcons(DGUS_VP &); - void BLTouch(DGUS_VP &); + void blTouch(DGUS_VP &); - void PIDIcons(DGUS_VP &); - void PIDKp(DGUS_VP &); - void PIDKi(DGUS_VP &); - void PIDKd(DGUS_VP &); + void pidIcons(DGUS_VP &); + void pidKp(DGUS_VP &); + void pidKi(DGUS_VP &); + void pidKd(DGUS_VP &); - void BuildVolume(DGUS_VP &); - void TotalPrints(DGUS_VP &); - void FinishedPrints(DGUS_VP &); - void PrintTime(DGUS_VP &); - void LongestPrint(DGUS_VP &); - void FilamentUsed(DGUS_VP &); + void buildVolume(DGUS_VP &); + void totalPrints(DGUS_VP &); + void finishedPrints(DGUS_VP &); + void printTime(DGUS_VP &); + void longestPrint(DGUS_VP &); + void filamentUsed(DGUS_VP &); - void WaitIcons(DGUS_VP &); + void waitIcons(DGUS_VP &); - void FanSpeed(DGUS_VP &); + void fanSpeed(DGUS_VP &); - void Volume(DGUS_VP &); + void volume(DGUS_VP &); - void Brightness(DGUS_VP &); + void brightness(DGUS_VP &); - void ExtraToString(DGUS_VP &); - void ExtraPGMToString(DGUS_VP &); + void extraToString(DGUS_VP &); + void extraPGMToString(DGUS_VP &); template - void ExtraToInteger(DGUS_VP &vp) { + void extraToInteger(DGUS_VP &vp) { if (!vp.size || !vp.extra) return; switch (vp.size) { default: return; case 1: { const uint8_t data = uint8_t(*(T*)vp.extra); - dgus_display.Write(uint16_t(vp.addr), data); + dgus.write(uint16_t(vp.addr), data); break; } case 2: { const uint16_t data = uint16_t(*(T*)vp.extra); - dgus_display.Write(uint16_t(vp.addr), Swap16(data)); + dgus.write(uint16_t(vp.addr), Swap16(data)); break; } case 4: { const uint32_t data = uint32_t(*(T*)vp.extra); - dgus_display.Write(uint16_t(vp.addr), dgus_display.SwapBytes(data)); + dgus.write(uint16_t(vp.addr), dgus.swapBytes(data)); break; } } } template - void ExtraToFixedPoint(DGUS_VP &vp) { + void extraToFixedPoint(DGUS_VP &vp) { if (!vp.size || !vp.extra) return; switch (vp.size) { default: return; case 1: { - const uint8_t data = dgus_display.ToFixedPoint(*(T*)vp.extra); - dgus_display.Write(uint16_t(vp.addr), data); + const uint8_t data = dgus.toFixedPoint(*(T*)vp.extra); + dgus.write(uint16_t(vp.addr), data); break; } case 2: { - const uint16_t data = dgus_display.ToFixedPoint(*(T*)vp.extra); - dgus_display.Write(uint16_t(vp.addr), Swap16(data)); + const uint16_t data = dgus.toFixedPoint(*(T*)vp.extra); + dgus.write(uint16_t(vp.addr), Swap16(data)); break; } case 4: { - const uint32_t data = dgus_display.ToFixedPoint(*(T*)vp.extra); - dgus_display.Write(uint16_t(vp.addr), dgus_display.SwapBytes(data)); + const uint32_t data = dgus.toFixedPoint(*(T*)vp.extra); + dgus.write(uint16_t(vp.addr), dgus.swapBytes(data)); break; } } diff --git a/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Screen.h b/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_ScreenID.h similarity index 97% rename from Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Screen.h rename to Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_ScreenID.h index 0a738223ce..546ebb4666 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Screen.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_ScreenID.h @@ -21,7 +21,7 @@ */ #pragma once -enum class DGUS_Screen : uint8_t { +enum class DGUS_ScreenID : uint8_t { BOOT = 0, HOME = 1, PRINT = 2, diff --git a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenAddrList.cpp b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenAddrList.cpp index 4c99ff6a00..1a99eceeff 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenAddrList.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenAddrList.cpp @@ -204,37 +204,35 @@ constexpr DGUS_Addr LIST_WAIT[] PROGMEM = { (DGUS_Addr)0 }; -#define MAP_HELPER(SCREEN, LIST) \ - { .screen = SCREEN, \ - .addr_list = LIST } +#define MAP_HELPER(SCREEN, LIST) { .screenID = SCREEN, .addr_list = LIST } const struct DGUS_ScreenAddrList screen_addr_list_map[] PROGMEM = { - MAP_HELPER(DGUS_Screen::HOME, LIST_HOME), + MAP_HELPER(DGUS_ScreenID::HOME, LIST_HOME), #if HAS_MEDIA - MAP_HELPER(DGUS_Screen::PRINT, LIST_PRINT), + MAP_HELPER(DGUS_ScreenID::PRINT, LIST_PRINT), #endif - MAP_HELPER(DGUS_Screen::PRINT_STATUS, LIST_PRINT_STATUS), - MAP_HELPER(DGUS_Screen::PRINT_ADJUST, LIST_PRINT_ADJUST), - MAP_HELPER(DGUS_Screen::PRINT_FINISHED, LIST_PRINT_FINISHED), - MAP_HELPER(DGUS_Screen::TEMP_MENU, LIST_TEMP_MENU), - MAP_HELPER(DGUS_Screen::TEMP_MANUAL, LIST_TEMP_MANUAL), - MAP_HELPER(DGUS_Screen::FAN, LIST_FAN), - MAP_HELPER(DGUS_Screen::SETTINGS_MENU, LIST_SETTINGS_MENU), - MAP_HELPER(DGUS_Screen::LEVELING_OFFSET, LIST_LEVELING_OFFSET), - MAP_HELPER(DGUS_Screen::LEVELING_MANUAL, LIST_LEVELING_MANUAL), - MAP_HELPER(DGUS_Screen::LEVELING_AUTOMATIC, LIST_LEVELING_AUTOMATIC), - MAP_HELPER(DGUS_Screen::LEVELING_PROBING, LIST_LEVELING_PROBING), - MAP_HELPER(DGUS_Screen::FILAMENT, LIST_FILAMENT), - MAP_HELPER(DGUS_Screen::MOVE, LIST_MOVE), - MAP_HELPER(DGUS_Screen::GCODE, LIST_GCODE), - MAP_HELPER(DGUS_Screen::SETTINGS_MENU2, LIST_SETTINGS_MENU2), - MAP_HELPER(DGUS_Screen::PID, LIST_PID), - MAP_HELPER(DGUS_Screen::VOLUME, LIST_VOLUME), - MAP_HELPER(DGUS_Screen::BRIGHTNESS, LIST_BRIGHTNESS), - MAP_HELPER(DGUS_Screen::INFOS, LIST_INFOS), - MAP_HELPER(DGUS_Screen::WAIT, LIST_WAIT), + MAP_HELPER(DGUS_ScreenID::PRINT_STATUS, LIST_PRINT_STATUS), + MAP_HELPER(DGUS_ScreenID::PRINT_ADJUST, LIST_PRINT_ADJUST), + MAP_HELPER(DGUS_ScreenID::PRINT_FINISHED, LIST_PRINT_FINISHED), + MAP_HELPER(DGUS_ScreenID::TEMP_MENU, LIST_TEMP_MENU), + MAP_HELPER(DGUS_ScreenID::TEMP_MANUAL, LIST_TEMP_MANUAL), + MAP_HELPER(DGUS_ScreenID::FAN, LIST_FAN), + MAP_HELPER(DGUS_ScreenID::SETTINGS_MENU, LIST_SETTINGS_MENU), + MAP_HELPER(DGUS_ScreenID::LEVELING_OFFSET, LIST_LEVELING_OFFSET), + MAP_HELPER(DGUS_ScreenID::LEVELING_MANUAL, LIST_LEVELING_MANUAL), + MAP_HELPER(DGUS_ScreenID::LEVELING_AUTOMATIC, LIST_LEVELING_AUTOMATIC), + MAP_HELPER(DGUS_ScreenID::LEVELING_PROBING, LIST_LEVELING_PROBING), + MAP_HELPER(DGUS_ScreenID::FILAMENT, LIST_FILAMENT), + MAP_HELPER(DGUS_ScreenID::MOVE, LIST_MOVE), + MAP_HELPER(DGUS_ScreenID::GCODE, LIST_GCODE), + MAP_HELPER(DGUS_ScreenID::SETTINGS_MENU2, LIST_SETTINGS_MENU2), + MAP_HELPER(DGUS_ScreenID::PID, LIST_PID), + MAP_HELPER(DGUS_ScreenID::VOLUME, LIST_VOLUME), + MAP_HELPER(DGUS_ScreenID::BRIGHTNESS, LIST_BRIGHTNESS), + MAP_HELPER(DGUS_ScreenID::INFOS, LIST_INFOS), + MAP_HELPER(DGUS_ScreenID::WAIT, LIST_WAIT), - MAP_HELPER((DGUS_Screen)0, nullptr) + MAP_HELPER((DGUS_ScreenID)0, nullptr) }; #endif // DGUS_LCD_UI_RELOADED diff --git a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenAddrList.h b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenAddrList.h index 1e481ef3cc..dea39ed145 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenAddrList.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenAddrList.h @@ -21,12 +21,12 @@ */ #pragma once -#include "../config/DGUS_Screen.h" +#include "../config/DGUS_ScreenID.h" #include "../config/DGUS_Addr.h" struct DGUS_ScreenAddrList { - DGUS_Screen screen; - const DGUS_Addr *addr_list; + DGUS_ScreenID screenID; + const DGUS_Addr *addr_list; }; extern const struct DGUS_ScreenAddrList screen_addr_list_map[]; diff --git a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenSetup.cpp b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenSetup.cpp index e3ba393af2..502ac2a6af 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenSetup.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenSetup.cpp @@ -30,28 +30,26 @@ #include "../../ui_api.h" -#define SETUP_HELPER(SCREEN, SETUP) \ - { .screen = SCREEN, \ - .setup_fn = SETUP } +#define SETUP_HELPER(SCREEN, SETUP) { .screenID = SCREEN, .setup_fn = SETUP } const struct DGUS_ScreenSetup screen_setup_list[] PROGMEM = { #if HAS_MEDIA - SETUP_HELPER(DGUS_Screen::PRINT, &DGUSSetupHandler::Print), + SETUP_HELPER(DGUS_ScreenID::PRINT, &DGUSSetupHandler::print), #endif - SETUP_HELPER(DGUS_Screen::PRINT_STATUS, &DGUSSetupHandler::PrintStatus), - SETUP_HELPER(DGUS_Screen::PRINT_ADJUST, &DGUSSetupHandler::PrintAdjust), - SETUP_HELPER(DGUS_Screen::LEVELING_MENU, &DGUSSetupHandler::LevelingMenu), - SETUP_HELPER(DGUS_Screen::LEVELING_OFFSET, &DGUSSetupHandler::LevelingOffset), - SETUP_HELPER(DGUS_Screen::LEVELING_MANUAL, &DGUSSetupHandler::LevelingManual), - SETUP_HELPER(DGUS_Screen::LEVELING_AUTOMATIC, &DGUSSetupHandler::LevelingAutomatic), - SETUP_HELPER(DGUS_Screen::LEVELING_PROBING, &DGUSSetupHandler::LevelingProbing), - SETUP_HELPER(DGUS_Screen::FILAMENT, &DGUSSetupHandler::Filament), - SETUP_HELPER(DGUS_Screen::MOVE, &DGUSSetupHandler::Move), - SETUP_HELPER(DGUS_Screen::GCODE, &DGUSSetupHandler::Gcode), - SETUP_HELPER(DGUS_Screen::PID, &DGUSSetupHandler::PID), - SETUP_HELPER(DGUS_Screen::INFOS, &DGUSSetupHandler::Infos), + SETUP_HELPER(DGUS_ScreenID::PRINT_STATUS, &DGUSSetupHandler::printStatus), + SETUP_HELPER(DGUS_ScreenID::PRINT_ADJUST, &DGUSSetupHandler::printAdjust), + SETUP_HELPER(DGUS_ScreenID::LEVELING_MENU, &DGUSSetupHandler::levelingMenu), + SETUP_HELPER(DGUS_ScreenID::LEVELING_OFFSET, &DGUSSetupHandler::levelingOffset), + SETUP_HELPER(DGUS_ScreenID::LEVELING_MANUAL, &DGUSSetupHandler::levelingManual), + SETUP_HELPER(DGUS_ScreenID::LEVELING_AUTOMATIC, &DGUSSetupHandler::levelingAutomatic), + SETUP_HELPER(DGUS_ScreenID::LEVELING_PROBING, &DGUSSetupHandler::levelingProbing), + SETUP_HELPER(DGUS_ScreenID::FILAMENT, &DGUSSetupHandler::filament), + SETUP_HELPER(DGUS_ScreenID::MOVE, &DGUSSetupHandler::move), + SETUP_HELPER(DGUS_ScreenID::GCODE, &DGUSSetupHandler::gcode), + SETUP_HELPER(DGUS_ScreenID::PID, &DGUSSetupHandler::pid), + SETUP_HELPER(DGUS_ScreenID::INFOS, &DGUSSetupHandler::infos), - SETUP_HELPER((DGUS_Screen)0, nullptr) + SETUP_HELPER((DGUS_ScreenID)0, nullptr) }; #endif // DGUS_LCD_UI_RELOADED diff --git a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenSetup.h b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenSetup.h index 93df5ad90a..e740997ad4 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenSetup.h +++ b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_ScreenSetup.h @@ -21,10 +21,10 @@ */ #pragma once -#include "../config/DGUS_Screen.h" +#include "../config/DGUS_ScreenID.h" struct DGUS_ScreenSetup { - DGUS_Screen screen; + DGUS_ScreenID screenID; bool (*setup_fn)(void); }; diff --git a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp index cd5408e190..172cf98fe6 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp @@ -75,248 +75,248 @@ const struct DGUS_VP vp_list[] PROGMEM = { // READ-ONLY VARIABLES - VP_HELPER_RX(DGUS_Addr::SCREENCHANGE, &DGUSRxHandler::ScreenChange), - VP_HELPER_RX(DGUS_Addr::SCREENCHANGE_SD, &DGUSRxHandler::ScreenChange), - VP_HELPER_RX(DGUS_Addr::SCREENCHANGE_Idle, &DGUSRxHandler::ScreenChange), - VP_HELPER_RX(DGUS_Addr::SCREENCHANGE_Printing, &DGUSRxHandler::ScreenChange), + VP_HELPER_RX(DGUS_Addr::SCREENCHANGE, &DGUSRxHandler::screenChange), + VP_HELPER_RX(DGUS_Addr::SCREENCHANGE_SD, &DGUSRxHandler::screenChange), + VP_HELPER_RX(DGUS_Addr::SCREENCHANGE_Idle, &DGUSRxHandler::screenChange), + VP_HELPER_RX(DGUS_Addr::SCREENCHANGE_Printing, &DGUSRxHandler::screenChange), #if HAS_MEDIA - VP_HELPER_RX(DGUS_Addr::SD_SelectFile, &DGUSRxHandler::SelectFile), - VP_HELPER_RX(DGUS_Addr::SD_Scroll, &DGUSRxHandler::Scroll), - VP_HELPER_RX_NODATA(DGUS_Addr::SD_Print, &DGUSRxHandler::PrintFile), + VP_HELPER_RX(DGUS_Addr::SD_SelectFile, &DGUSRxHandler::selectFile), + VP_HELPER_RX(DGUS_Addr::SD_Scroll, &DGUSRxHandler::scroll), + VP_HELPER_RX_NODATA(DGUS_Addr::SD_Print, &DGUSRxHandler::printFile), #endif - VP_HELPER_RX(DGUS_Addr::STATUS_Abort, &DGUSRxHandler::PrintAbort), - VP_HELPER_RX(DGUS_Addr::STATUS_Pause, &DGUSRxHandler::PrintPause), - VP_HELPER_RX(DGUS_Addr::STATUS_Resume, &DGUSRxHandler::PrintResume), + VP_HELPER_RX(DGUS_Addr::STATUS_Abort, &DGUSRxHandler::printAbort), + VP_HELPER_RX(DGUS_Addr::STATUS_Pause, &DGUSRxHandler::printPause), + VP_HELPER_RX(DGUS_Addr::STATUS_Resume, &DGUSRxHandler::printResume), - VP_HELPER_RX(DGUS_Addr::ADJUST_SetFeedrate, &DGUSRxHandler::Feedrate), - VP_HELPER_RX(DGUS_Addr::ADJUST_SetFlowrate_CUR, &DGUSRxHandler::Flowrate), + VP_HELPER_RX(DGUS_Addr::ADJUST_SetFeedrate, &DGUSRxHandler::feedrate), + VP_HELPER_RX(DGUS_Addr::ADJUST_SetFlowrate_CUR, &DGUSRxHandler::flowrate), #if HAS_MULTI_EXTRUDER - VP_HELPER_RX(DGUS_Addr::ADJUST_SetFlowrate_E0, &DGUSRxHandler::Flowrate), - VP_HELPER_RX(DGUS_Addr::ADJUST_SetFlowrate_E1, &DGUSRxHandler::Flowrate), + VP_HELPER_RX(DGUS_Addr::ADJUST_SetFlowrate_E0, &DGUSRxHandler::flowrate), + VP_HELPER_RX(DGUS_Addr::ADJUST_SetFlowrate_E1, &DGUSRxHandler::flowrate), #endif - VP_HELPER_RX(DGUS_Addr::ADJUST_SetBabystep, &DGUSRxHandler::BabystepSet), - VP_HELPER_RX(DGUS_Addr::ADJUST_Babystep, &DGUSRxHandler::Babystep), + VP_HELPER_RX(DGUS_Addr::ADJUST_SetBabystep, &DGUSRxHandler::babystepSet), + VP_HELPER_RX(DGUS_Addr::ADJUST_Babystep, &DGUSRxHandler::babystep), - VP_HELPER_RX(DGUS_Addr::TEMP_Preset, &DGUSRxHandler::TempPreset), - VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_Bed, &DGUSRxHandler::TempTarget), - VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_H0, &DGUSRxHandler::TempTarget), + VP_HELPER_RX(DGUS_Addr::TEMP_Preset, &DGUSRxHandler::tempPreset), + VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_Bed, &DGUSRxHandler::tempTarget), + VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_H0, &DGUSRxHandler::tempTarget), #if HAS_MULTI_HOTEND - VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_H1, &DGUSRxHandler::TempTarget), + VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_H1, &DGUSRxHandler::tempTarget), #endif - VP_HELPER_RX(DGUS_Addr::TEMP_Cool, &DGUSRxHandler::TempCool), + VP_HELPER_RX(DGUS_Addr::TEMP_Cool, &DGUSRxHandler::tempCool), - VP_HELPER_RX(DGUS_Addr::STEPPER_Control, &DGUSRxHandler::Steppers), + VP_HELPER_RX(DGUS_Addr::STEPPER_Control, &DGUSRxHandler::steppers), - VP_HELPER_RX(DGUS_Addr::LEVEL_OFFSET_Set, &DGUSRxHandler::ZOffset), - VP_HELPER_RX(DGUS_Addr::LEVEL_OFFSET_Step, &DGUSRxHandler::ZOffsetStep), - VP_HELPER_RX(DGUS_Addr::LEVEL_OFFSET_SetStep, &DGUSRxHandler::ZOffsetSetStep), + VP_HELPER_RX(DGUS_Addr::LEVEL_OFFSET_Set, &DGUSRxHandler::zOffset), + VP_HELPER_RX(DGUS_Addr::LEVEL_OFFSET_Step, &DGUSRxHandler::zOffsetStep), + VP_HELPER_RX(DGUS_Addr::LEVEL_OFFSET_SetStep, &DGUSRxHandler::zOffsetSetStep), - VP_HELPER_RX(DGUS_Addr::LEVEL_MANUAL_Point, &DGUSRxHandler::MoveToPoint), + VP_HELPER_RX(DGUS_Addr::LEVEL_MANUAL_Point, &DGUSRxHandler::moveToPoint), - VP_HELPER_RX_NODATA(DGUS_Addr::LEVEL_AUTO_Probe, &DGUSRxHandler::Probe), - VP_HELPER_RX_NODATA(DGUS_Addr::LEVEL_AUTO_Disable, &DGUSRxHandler::DisableABL), + VP_HELPER_RX_NODATA(DGUS_Addr::LEVEL_AUTO_Probe, &DGUSRxHandler::probe), + VP_HELPER_RX_NODATA(DGUS_Addr::LEVEL_AUTO_Disable, &DGUSRxHandler::disableABL), - VP_HELPER_RX(DGUS_Addr::FILAMENT_Select, &DGUSRxHandler::FilamentSelect), - VP_HELPER_RX(DGUS_Addr::FILAMENT_SetLength, &DGUSRxHandler::FilamentLength), - VP_HELPER_RX(DGUS_Addr::FILAMENT_Move, &DGUSRxHandler::FilamentMove), + VP_HELPER_RX(DGUS_Addr::FILAMENT_Select, &DGUSRxHandler::filamentSelect), + VP_HELPER_RX(DGUS_Addr::FILAMENT_SetLength, &DGUSRxHandler::filamentLength), + VP_HELPER_RX(DGUS_Addr::FILAMENT_Move, &DGUSRxHandler::filamentMove), - VP_HELPER_RX(DGUS_Addr::MOVE_Home, &DGUSRxHandler::Home), - VP_HELPER_RX(DGUS_Addr::MOVE_SetX, &DGUSRxHandler::Move), - VP_HELPER_RX(DGUS_Addr::MOVE_SetY, &DGUSRxHandler::Move), - VP_HELPER_RX(DGUS_Addr::MOVE_SetZ, &DGUSRxHandler::Move), - VP_HELPER_RX(DGUS_Addr::MOVE_Step, &DGUSRxHandler::MoveStep), - VP_HELPER_RX(DGUS_Addr::MOVE_SetStep, &DGUSRxHandler::MoveSetStep), + VP_HELPER_RX(DGUS_Addr::MOVE_Home, &DGUSRxHandler::home), + VP_HELPER_RX(DGUS_Addr::MOVE_SetX, &DGUSRxHandler::move), + VP_HELPER_RX(DGUS_Addr::MOVE_SetY, &DGUSRxHandler::move), + VP_HELPER_RX(DGUS_Addr::MOVE_SetZ, &DGUSRxHandler::move), + VP_HELPER_RX(DGUS_Addr::MOVE_Step, &DGUSRxHandler::moveStep), + VP_HELPER_RX(DGUS_Addr::MOVE_SetStep, &DGUSRxHandler::moveSetStep), - VP_HELPER_RX_NODATA(DGUS_Addr::GCODE_Clear, &DGUSRxHandler::GcodeClear), - VP_HELPER_RX_NODATA(DGUS_Addr::GCODE_Execute, &DGUSRxHandler::GcodeExecute), + VP_HELPER_RX_NODATA(DGUS_Addr::GCODE_Clear, &DGUSRxHandler::gcodeClear), + VP_HELPER_RX_NODATA(DGUS_Addr::GCODE_Execute, &DGUSRxHandler::gcodeExecute), - VP_HELPER_RX(DGUS_Addr::EEPROM_Reset, &DGUSRxHandler::ResetEEPROM), + VP_HELPER_RX(DGUS_Addr::EEPROM_Reset, &DGUSRxHandler::resetEEPROM), - VP_HELPER_RX(DGUS_Addr::SETTINGS2_Extra, &DGUSRxHandler::SettingsExtra), + VP_HELPER_RX(DGUS_Addr::SETTINGS2_Extra, &DGUSRxHandler::settingsExtra), - VP_HELPER_RX(DGUS_Addr::PID_Select, &DGUSRxHandler::PIDSelect), - VP_HELPER_RX(DGUS_Addr::PID_SetTemp, &DGUSRxHandler::PIDSetTemp), - VP_HELPER_RX_NODATA(DGUS_Addr::PID_Run, &DGUSRxHandler::PIDRun), + VP_HELPER_RX(DGUS_Addr::PID_Select, &DGUSRxHandler::pidSelect), + VP_HELPER_RX(DGUS_Addr::PID_SetTemp, &DGUSRxHandler::pidSetTemp), + VP_HELPER_RX_NODATA(DGUS_Addr::PID_Run, &DGUSRxHandler::pidRun), #if ENABLED(POWER_LOSS_RECOVERY) - VP_HELPER_RX(DGUS_Addr::POWERLOSS_Abort, &DGUSRxHandler::PowerLossAbort), - VP_HELPER_RX(DGUS_Addr::POWERLOSS_Resume, &DGUSRxHandler::PowerLossResume), + VP_HELPER_RX(DGUS_Addr::POWERLOSS_Abort, &DGUSRxHandler::powerLossAbort), + VP_HELPER_RX(DGUS_Addr::POWERLOSS_Resume, &DGUSRxHandler::powerLossResume), #endif - VP_HELPER_RX(DGUS_Addr::WAIT_Abort, &DGUSRxHandler::WaitAbort), - VP_HELPER_RX_NODATA(DGUS_Addr::WAIT_Continue, &DGUSRxHandler::WaitContinue), + VP_HELPER_RX(DGUS_Addr::WAIT_Abort, &DGUSRxHandler::waitAbort), + VP_HELPER_RX_NODATA(DGUS_Addr::WAIT_Continue, &DGUSRxHandler::waitContinue), // WRITE-ONLY VARIABLES #if HAS_MEDIA - VP_HELPER_TX(DGUS_Addr::SD_Type, &DGUSTxHandler::FileType), + VP_HELPER_TX(DGUS_Addr::SD_Type, &DGUSTxHandler::fileType), VP_HELPER_TX_SIZE(DGUS_Addr::SD_FileName0, DGUS_FILENAME_LEN, - &DGUSTxHandler::FileName), + &DGUSTxHandler::fileName), VP_HELPER_TX_SIZE(DGUS_Addr::SD_FileName1, DGUS_FILENAME_LEN, - &DGUSTxHandler::FileName), + &DGUSTxHandler::fileName), VP_HELPER_TX_SIZE(DGUS_Addr::SD_FileName2, DGUS_FILENAME_LEN, - &DGUSTxHandler::FileName), + &DGUSTxHandler::fileName), VP_HELPER_TX_SIZE(DGUS_Addr::SD_FileName3, DGUS_FILENAME_LEN, - &DGUSTxHandler::FileName), + &DGUSTxHandler::fileName), VP_HELPER_TX_SIZE(DGUS_Addr::SD_FileName4, DGUS_FILENAME_LEN, - &DGUSTxHandler::FileName), - VP_HELPER_TX(DGUS_Addr::SD_ScrollIcons, &DGUSTxHandler::ScrollIcons), + &DGUSTxHandler::fileName), + VP_HELPER_TX(DGUS_Addr::SD_ScrollIcons, &DGUSTxHandler::scrollIcons), VP_HELPER_TX_SIZE(DGUS_Addr::SD_SelectedFileName, DGUS_FILENAME_LEN, - &DGUSTxHandler::SelectedFileName), + &DGUSTxHandler::selectedFileName), #endif VP_HELPER_TX_AUTO(DGUS_Addr::STATUS_PositionZ, nullptr, - &DGUSTxHandler::PositionZ), + &DGUSTxHandler::zPosition), VP_HELPER(DGUS_Addr::STATUS_Elapsed, DGUS_ELAPSED_LEN, VPFLAG_AUTOUPLOAD, nullptr, nullptr, - &DGUSTxHandler::Elapsed), + &DGUSTxHandler::elapsed), VP_HELPER_TX_AUTO(DGUS_Addr::STATUS_Percent, nullptr, - &DGUSTxHandler::Percent), - VP_HELPER_TX(DGUS_Addr::STATUS_Icons, &DGUSTxHandler::StatusIcons), + &DGUSTxHandler::percent), + VP_HELPER_TX(DGUS_Addr::STATUS_Icons, &DGUSTxHandler::statusIcons), VP_HELPER_TX_AUTO(DGUS_Addr::ADJUST_Feedrate, &feedrate_percentage, - &DGUSTxHandler::ExtraToInteger), + &DGUSTxHandler::extraToInteger), VP_HELPER_TX_AUTO(DGUS_Addr::ADJUST_Flowrate_CUR, nullptr, - &DGUSTxHandler::Flowrate), + &DGUSTxHandler::flowrate), #if HAS_MULTI_EXTRUDER VP_HELPER_TX_AUTO(DGUS_Addr::ADJUST_Flowrate_E0, nullptr, - &DGUSTxHandler::Flowrate), + &DGUSTxHandler::flowrate), VP_HELPER_TX_AUTO(DGUS_Addr::ADJUST_Flowrate_E1, nullptr, - &DGUSTxHandler::Flowrate), + &DGUSTxHandler::flowrate), #endif VP_HELPER_TX_AUTO(DGUS_Addr::TEMP_Current_Bed, &thermalManager.temp_bed.celsius, - (&DGUSTxHandler::ExtraToFixedPoint)), + (&DGUSTxHandler::extraToFixedPoint)), VP_HELPER_TX_AUTO(DGUS_Addr::TEMP_Target_Bed, &thermalManager.temp_bed.target, - &DGUSTxHandler::ExtraToInteger), - VP_HELPER_TX(DGUS_Addr::TEMP_Max_Bed, &DGUSTxHandler::TempMax), + &DGUSTxHandler::extraToInteger), + VP_HELPER_TX(DGUS_Addr::TEMP_Max_Bed, &DGUSTxHandler::tempMax), VP_HELPER_TX_AUTO(DGUS_Addr::TEMP_Current_H0, &thermalManager.temp_hotend[ExtUI::heater_t::H0].celsius, - (&DGUSTxHandler::ExtraToFixedPoint)), + (&DGUSTxHandler::extraToFixedPoint)), VP_HELPER_TX_AUTO(DGUS_Addr::TEMP_Target_H0, &thermalManager.temp_hotend[ExtUI::heater_t::H0].target, - &DGUSTxHandler::ExtraToInteger), - VP_HELPER_TX(DGUS_Addr::TEMP_Max_H0, &DGUSTxHandler::TempMax), + &DGUSTxHandler::extraToInteger), + VP_HELPER_TX(DGUS_Addr::TEMP_Max_H0, &DGUSTxHandler::tempMax), #if HAS_MULTI_HOTEND VP_HELPER_TX_AUTO(DGUS_Addr::TEMP_Current_H1, &thermalManager.temp_hotend[ExtUI::heater_t::H1].celsius, - (&DGUSTxHandler::ExtraToFixedPoint)), + (&DGUSTxHandler::extraToFixedPoint)), VP_HELPER_TX_AUTO(DGUS_Addr::TEMP_Target_H1, &thermalManager.temp_hotend[ExtUI::heater_t::H1].target, - &DGUSTxHandler::ExtraToInteger), - VP_HELPER_TX(DGUS_Addr::TEMP_Max_H1, &DGUSTxHandler::TempMax), + &DGUSTxHandler::extraToInteger), + VP_HELPER_TX(DGUS_Addr::TEMP_Max_H1, &DGUSTxHandler::tempMax), #endif VP_HELPER_TX_AUTO(DGUS_Addr::STEPPER_Status, nullptr, - &DGUSTxHandler::StepperStatus), + &DGUSTxHandler::stepperStatus), VP_HELPER_TX_AUTO(DGUS_Addr::LEVEL_OFFSET_Current, &probe.offset.z, - (&DGUSTxHandler::ExtraToFixedPoint)), + (&DGUSTxHandler::extraToFixedPoint)), VP_HELPER_TX_EXTRA(DGUS_Addr::LEVEL_OFFSET_StepIcons, &DGUSScreenHandler::offset_steps, - &DGUSTxHandler::StepIcons), + &DGUSTxHandler::stepIcons), VP_HELPER_TX_AUTO(DGUS_Addr::LEVEL_AUTO_DisableIcon, nullptr, - &DGUSTxHandler::ABLDisableIcon), - VP_HELPER_TX(DGUS_Addr::LEVEL_AUTO_Grid, &DGUSTxHandler::ABLGrid), + &DGUSTxHandler::ablDisableIcon), + VP_HELPER_TX(DGUS_Addr::LEVEL_AUTO_Grid, &DGUSTxHandler::ablGrid), VP_HELPER_TX_EXTRA(DGUS_Addr::LEVEL_PROBING_Icons1, &DGUSScreenHandler::probing_icons[0], - &DGUSTxHandler::ExtraToInteger), + &DGUSTxHandler::extraToInteger), VP_HELPER_TX_EXTRA(DGUS_Addr::LEVEL_PROBING_Icons2, &DGUSScreenHandler::probing_icons[1], - &DGUSTxHandler::ExtraToInteger), + &DGUSTxHandler::extraToInteger), - VP_HELPER_TX(DGUS_Addr::FILAMENT_ExtruderIcons, &DGUSTxHandler::FilamentIcons), + VP_HELPER_TX(DGUS_Addr::FILAMENT_ExtruderIcons, &DGUSTxHandler::filamentIcons), VP_HELPER_TX_EXTRA(DGUS_Addr::FILAMENT_Length, &DGUSScreenHandler::filament_length, - &DGUSTxHandler::ExtraToInteger), + &DGUSTxHandler::extraToInteger), VP_HELPER_TX_AUTO(DGUS_Addr::MOVE_CurrentX, ¤t_position.x, - (&DGUSTxHandler::ExtraToFixedPoint)), + (&DGUSTxHandler::extraToFixedPoint)), VP_HELPER_TX_AUTO(DGUS_Addr::MOVE_CurrentY, ¤t_position.y, - (&DGUSTxHandler::ExtraToFixedPoint)), + (&DGUSTxHandler::extraToFixedPoint)), VP_HELPER_TX_AUTO(DGUS_Addr::MOVE_CurrentZ, ¤t_position.z, - (&DGUSTxHandler::ExtraToFixedPoint)), + (&DGUSTxHandler::extraToFixedPoint)), VP_HELPER_TX_EXTRA(DGUS_Addr::MOVE_StepIcons, &DGUSScreenHandler::move_steps, - &DGUSTxHandler::StepIcons), + &DGUSTxHandler::stepIcons), - VP_HELPER_TX(DGUS_Addr::SETTINGS2_BLTouch, &DGUSTxHandler::BLTouch), + VP_HELPER_TX(DGUS_Addr::SETTINGS2_BLTouch, &DGUSTxHandler::blTouch), - VP_HELPER_TX(DGUS_Addr::PID_HeaterIcons, &DGUSTxHandler::PIDIcons), + VP_HELPER_TX(DGUS_Addr::PID_HeaterIcons, &DGUSTxHandler::pidIcons), VP_HELPER_TX_EXTRA(DGUS_Addr::PID_Temp, &DGUSScreenHandler::pid_temp, - &DGUSTxHandler::ExtraToInteger), + &DGUSTxHandler::extraToInteger), VP_HELPER_DWORD(DGUS_Addr::PID_Kp, VPFLAG_AUTOUPLOAD, nullptr, nullptr, - &DGUSTxHandler::PIDKp), + &DGUSTxHandler::pidKp), VP_HELPER_DWORD(DGUS_Addr::PID_Ki, VPFLAG_AUTOUPLOAD, nullptr, nullptr, - &DGUSTxHandler::PIDKi), + &DGUSTxHandler::pidKi), VP_HELPER_DWORD(DGUS_Addr::PID_Kd, VPFLAG_AUTOUPLOAD, nullptr, nullptr, - &DGUSTxHandler::PIDKd), + &DGUSTxHandler::pidKd), VP_HELPER(DGUS_Addr::INFOS_Machine, DGUS_MACHINE_LEN, VPFLAG_NONE, (void*)DGUS_MACHINENAME, nullptr, - &DGUSTxHandler::ExtraPGMToString), + &DGUSTxHandler::extraPGMToString), VP_HELPER_TX_SIZE(DGUS_Addr::INFOS_BuildVolume, DGUS_BUILDVOLUME_LEN, - &DGUSTxHandler::BuildVolume), + &DGUSTxHandler::buildVolume), VP_HELPER(DGUS_Addr::INFOS_Version, DGUS_VERSION_LEN, VPFLAG_NONE, (void*)DGUS_MARLINVERSION, nullptr, - &DGUSTxHandler::ExtraPGMToString), - VP_HELPER_TX(DGUS_Addr::INFOS_TotalPrints, &DGUSTxHandler::TotalPrints), - VP_HELPER_TX(DGUS_Addr::INFOS_FinishedPrints, &DGUSTxHandler::FinishedPrints), + &DGUSTxHandler::extraPGMToString), + VP_HELPER_TX(DGUS_Addr::INFOS_TotalPrints, &DGUSTxHandler::totalPrints), + VP_HELPER_TX(DGUS_Addr::INFOS_FinishedPrints, &DGUSTxHandler::finishedPrints), VP_HELPER_TX_SIZE(DGUS_Addr::INFOS_PrintTime, DGUS_PRINTTIME_LEN, - &DGUSTxHandler::PrintTime), + &DGUSTxHandler::printTime), VP_HELPER_TX_SIZE(DGUS_Addr::INFOS_LongestPrint, DGUS_LONGESTPRINT_LEN, - &DGUSTxHandler::LongestPrint), + &DGUSTxHandler::longestPrint), VP_HELPER_TX_SIZE(DGUS_Addr::INFOS_FilamentUsed, DGUS_FILAMENTUSED_LEN, - &DGUSTxHandler::FilamentUsed), + &DGUSTxHandler::filamentUsed), - VP_HELPER_TX(DGUS_Addr::WAIT_Icons, &DGUSTxHandler::WaitIcons), + VP_HELPER_TX(DGUS_Addr::WAIT_Icons, &DGUSTxHandler::waitIcons), // READ-WRITE VARIABLES @@ -324,41 +324,41 @@ const struct DGUS_VP vp_list[] PROGMEM = { 2, VPFLAG_AUTOUPLOAD, nullptr, - &DGUSRxHandler::FanSpeed, - &DGUSTxHandler::FanSpeed), + &DGUSRxHandler::fanSpeed, + &DGUSTxHandler::fanSpeed), VP_HELPER(DGUS_Addr::GCODE_Data, DGUS_GCODE_LEN, VPFLAG_RXSTRING, (void*)DGUSScreenHandler::gcode, - &DGUSRxHandler::StringToExtra, - &DGUSTxHandler::ExtraToString), + &DGUSRxHandler::stringToExtra, + &DGUSTxHandler::extraToString), VP_HELPER(DGUS_Addr::PID_Cycles, 2, VPFLAG_NONE, &DGUSScreenHandler::pid_cycles, - &DGUSRxHandler::IntegerToExtra, - &DGUSTxHandler::ExtraToInteger), + &DGUSRxHandler::integerToExtra, + &DGUSTxHandler::extraToInteger), VP_HELPER(DGUS_Addr::VOLUME_Level, 2, VPFLAG_NONE, nullptr, - &DGUSRxHandler::Volume, - &DGUSTxHandler::Volume), + &DGUSRxHandler::volume, + &DGUSTxHandler::volume), VP_HELPER(DGUS_Addr::BRIGHTNESS_Level, 2, VPFLAG_NONE, nullptr, - &DGUSRxHandler::Brightness, - &DGUSTxHandler::Brightness), + &DGUSRxHandler::brightness, + &DGUSTxHandler::brightness), // SPECIAL CASES - VP_HELPER_TX(DGUS_Addr::STATUS_Percent_Complete, &DGUSTxHandler::Percent), - VP_HELPER_RX_NODATA(DGUS_Addr::INFOS_Debug, &DGUSRxHandler::Debug), + VP_HELPER_TX(DGUS_Addr::STATUS_Percent_Complete, &DGUSTxHandler::percent), + VP_HELPER_RX_NODATA(DGUS_Addr::INFOS_Debug, &DGUSRxHandler::debug), VP_HELPER((DGUS_Addr)0, 0, VPFLAG_NONE, nullptr, nullptr, nullptr) diff --git a/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp b/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp index 75ef5f5d66..68e405776e 100644 --- a/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp +++ b/Marlin/src/lcd/extui/dgus_reloaded/dgus_reloaded_extui.cpp @@ -33,7 +33,7 @@ namespace ExtUI { - void onStartup() { dgus_screen_handler.Init(); } + void onStartup() { screen.init(); } void onIdle() { static bool processing = false; @@ -41,45 +41,45 @@ namespace ExtUI { // Prevent recursion if (!processing) { processing = true; - dgus_screen_handler.Loop(); + screen.loop(); processing = false; } } void onPrinterKilled(FSTR_P const error, FSTR_P const component) { - dgus_screen_handler.PrinterKilled(error, component); + screen.printerKilled(error, component); } - void onMediaInserted() { TERN_(HAS_MEDIA, dgus_screen_handler.SDCardInserted()); } - void onMediaError() { TERN_(HAS_MEDIA, dgus_screen_handler.SDCardError()); } - void onMediaRemoved() { TERN_(HAS_MEDIA, dgus_screen_handler.SDCardRemoved()); } + void onMediaInserted() { TERN_(HAS_MEDIA, screen.sdCardInserted()); } + void onMediaError() { TERN_(HAS_MEDIA, screen.sdCardError()); } + void onMediaRemoved() { TERN_(HAS_MEDIA, screen.sdCardRemoved()); } void onPlayTone(const uint16_t frequency, const uint16_t duration) { - dgus_screen_handler.PlayTone(frequency, duration); + screen.playTone(frequency, duration); } void onPrintTimerStarted() { - dgus_screen_handler.PrintTimerStarted(); + screen.printTimerStarted(); } void onPrintTimerPaused() { - dgus_screen_handler.PrintTimerPaused(); + screen.printTimerPaused(); } void onPrintTimerStopped() { - dgus_screen_handler.PrintTimerStopped(); + screen.printTimerStopped(); } void onFilamentRunout(const extruder_t extruder) { - dgus_screen_handler.FilamentRunout(extruder); + screen.filamentRunout(extruder); } void onUserConfirmRequired(const char * const msg) { - dgus_screen_handler.UserConfirmRequired(msg); + screen.userConfirmRequired(msg); } void onStatusChanged(const char * const msg) { - dgus_screen_handler.SetStatusMessage(msg); + screen.setStatusMessage(msg); } void onHomingStart() {} @@ -87,38 +87,40 @@ namespace ExtUI { void onPrintDone() {} void onFactoryReset() { - dgus_screen_handler.SettingsReset(); + screen.settingsReset(); } void onStoreSettings(char *buff) { - dgus_screen_handler.StoreSettings(buff); + screen.storeSettings(buff); } void onLoadSettings(const char *buff) { - dgus_screen_handler.LoadSettings(buff); + screen.loadSettings(buff); } void onPostprocessSettings() {} void onSettingsStored(const bool success) { - dgus_screen_handler.ConfigurationStoreWritten(success); + screen.configurationStoreWritten(success); } void onSettingsLoaded(const bool success) { - dgus_screen_handler.ConfigurationStoreRead(success); + screen.configurationStoreRead(success); } - #if HAS_MESH + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #endif + #if HAS_MESH void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { - dgus_screen_handler.MeshUpdate(xpos, ypos); + screen.meshUpdate(xpos, ypos); } void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { if (state == G29_POINT_FINISH) - dgus_screen_handler.MeshUpdate(xpos, ypos); + screen.meshUpdate(xpos, ypos); } #endif @@ -131,14 +133,14 @@ namespace ExtUI { } void onPowerLossResume() { // Called on resume from power-loss - dgus_screen_handler.PowerLossResume(); + screen.powerLossResume(); } #endif #if HAS_PID_HEATING void onPidTuning(const result_t rst) { // Called for temperature PID tuning result - dgus_screen_handler.PidTuning(rst); + screen.pidTuning(rst); } #endif diff --git a/Marlin/src/lcd/extui/example/example.cpp b/Marlin/src/lcd/extui/example/example.cpp index 83b7a0a3ca..e78e4b9679 100644 --- a/Marlin/src/lcd/extui/example/example.cpp +++ b/Marlin/src/lcd/extui/example/example.cpp @@ -21,7 +21,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(EXTUI_EXAMPLE, EXTENSIBLE_UI) +#if ALL(EXTUI_EXAMPLE, EXTENSIBLE_UI) #include "../ui_api.h" @@ -98,10 +98,12 @@ namespace ExtUI { // whether successful or not. } - #if HAS_MESH + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #endif + #if HAS_MESH 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/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp index be18c03483..fa31ce1553 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/leveling_menu.cpp @@ -25,7 +25,7 @@ #if ENABLED(COCOA_LEVELING_MENU) -#if BOTH(HAS_BED_PROBE, BLTOUCH) +#if ALL(HAS_BED_PROBE, BLTOUCH) #include "../../../../feature/bltouch.h" #endif diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.cpp index ee299a7f64..2f231278f2 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/cocoa_press/main_menu.cpp @@ -57,7 +57,7 @@ void MainMenu::onRedraw(draw_mode_t what) { .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)) - .enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE)) + .enabled(ALL(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)) @@ -79,7 +79,7 @@ bool MainMenu::onTouchEnd(uint8_t tag) { case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; case 2: GOTO_SCREEN(MoveXYZScreen); break; case 3: GOTO_SCREEN(TemperatureScreen); break; - #if BOTH(HAS_LEVELING, HAS_BED_PROBE) + #if ALL(HAS_LEVELING, HAS_BED_PROBE) case 4: GOTO_SCREEN(ZOffsetScreen); break; #endif case 5: GOTO_SCREEN(MoveEScreen); break; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp index 86f470ee19..dc49a77ff8 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp @@ -117,9 +117,12 @@ namespace ExtUI { ConfirmUserRequestAlertBox::hide(); } - #if HAS_LEVELING && HAS_MESH + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #endif + + #if HAS_MESH void onMeshUpdate(const int8_t x, const int8_t y, const_float_t val) { BedMeshViewScreen::onMeshUpdate(x, y, val); } void onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { BedMeshViewScreen::onMeshUpdate(x, y, state); } #endif diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index 662753a154..a796c8edcf 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -1208,7 +1208,7 @@ void CLCD::default_display_orientation() { + ENABLED(TOUCH_UI_INVERTED) * 1 ); cmd.execute(); - #elif EITHER(TOUCH_UI_PORTRAIT, TOUCH_UI_MIRRORED) + #elif ANY(TOUCH_UI_PORTRAIT, TOUCH_UI_MIRRORED) #error "PORTRAIT or MIRRORED orientation not supported on the FT800." #elif ENABLED(TOUCH_UI_INVERTED) mem_write_32(REG::ROTATE, 1); diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h index 6b2dc9eb44..a9f77a518b 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h @@ -305,14 +305,11 @@ #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. - #define IF_ENABLED TERN_ #define IF_DISABLED(O,A) _TERN(_ENA_1(O),,A) #define ANY(V...) !DISABLED(V) - #define NONE(V...) DISABLED(V) - #define ALL(V...) ENABLED(V) - #define BOTH(V1,V2) ALL(V1,V2) - #define EITHER(V1,V2) ANY(V1,V2) + #define NONE DISABLED + #define ALL ENABLED // Remove compiler warning on an unused variable #ifndef UNUSED diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp index 32cc37d2e2..7849b1e461 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp @@ -27,11 +27,11 @@ 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 float a = percent/100.0*2.0*M_PI; + const float a1 = min(M_PI/2, a); + const float a2 = min(M_PI/2, a-a1); + const float a3 = min(M_PI/2, a-a1-a2); + const float a4 = min(M_PI/2, a-a1-a2-a3); const int ro = min(w,h) * 8; const int rr = ro * rim; @@ -69,21 +69,21 @@ namespace FTDI { cmd.cmd(VERTEX2F(cx + ro*sin(a1) + 16,cy - ro*cos(a1) + 8)); // Paint lower-right quadrant - if (a > PI/2) { + if (a > M_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) { + if (a > M_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) { + if (a > 1.5*M_PI) { cmd.cmd(BEGIN(EDGE_STRIP_L)); cmd.cmd(VERTEX2F(cx, cy)); cmd.cmd(VERTEX2F(cx - ro*cos(a4),cy - ro*sin(a4))); diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp index 1c193ade4b..2faa1c72e6 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/cyrillic_char_set.cpp @@ -58,11 +58,11 @@ cyrillic_fm.stride = 20; cyrillic_fm.width = 40; cyrillic_fm.height = 49; - LOOP_L_N(i, 127) + for (uint8_t i = 0; i < 127; ++i) cyrillic_fm.char_widths[i] = 0; // For cyrillic characters, copy the character widths from the widths tables - LOOP_L_N(i, NUM_ELEMENTS(cyrillic_font_widths)) { + for (uint8_t i = 0; i < NUM_ELEMENTS(cyrillic_font_widths); ++i) { cyrillic_fm.char_widths[i] = cyrillic_font_widths[i]; } CLCD::mem_write_bulk(addr, &cyrillic_fm, 148); diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp index 0e251f7bb1..b229154e82 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/font_size_t.cpp @@ -21,7 +21,7 @@ #include "../ftdi_extended.h" -#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) +#if ALL(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) namespace FTDI { // Returns the height of a standard FTDI romfont diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp index d12bf97119..5171ee508a 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/standard_char_set.cpp @@ -21,7 +21,7 @@ #include "../ftdi_extended.h" -#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) +#if ALL(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) constexpr static uint8_t std_font = 31; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp index 6f189155f5..d7f4d31bdc 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp @@ -21,7 +21,7 @@ #include "../ftdi_extended.h" -#if BOTH(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) +#if ALL(FTDI_EXTENDED, TOUCH_UI_USE_UTF8) using namespace FTDI; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp index 4fb2f8fdbf..02a39cd01c 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/western_char_set.cpp @@ -342,11 +342,11 @@ alt_fm.stride = 19; alt_fm.width = 38; alt_fm.height = 49; - LOOP_L_N(i, 127) + for (uint8_t i = 0; i < 127; ++i) alt_fm.char_widths[i] = 0; // For special characters, copy the character widths from the char tables - LOOP_L_N(i, NUM_ELEMENTS(char_recipe)) { + for (uint8_t i = 0; i < NUM_ELEMENTS(char_recipe); ++i) { uint8_t std_char, alt_char, alt_data; get_char_data(i, std_char, alt_char, alt_data); if (std_char == 0) diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/about_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/about_screen.cpp index 43e5c33365..698f0d47b7 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/about_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/about_screen.cpp @@ -76,7 +76,7 @@ void AboutScreen::onRedraw(draw_mode_t) { #endif , OPT_CENTER, font_xlarge ); - #if BOTH(TOUCH_UI_DEVELOPER_MENU, FTDI_DEVELOPER_MENU) + #if ALL(TOUCH_UI_DEVELOPER_MENU, FTDI_DEVELOPER_MENU) cmd.tag(3); #endif draw_text_box(cmd, FW_VERS_POS, @@ -91,7 +91,7 @@ void AboutScreen::onRedraw(draw_mode_t) { draw_text_box(cmd, LICENSE_POS, GET_TEXT_F(MSG_LICENSE), OPT_CENTER, font_tiny); cmd.font(font_medium); - #if BOTH(PRINTCOUNTER, FTDI_STATISTICS_SCREEN) + #if ALL(PRINTCOUNTER, FTDI_STATISTICS_SCREEN) cmd.colors(normal_btn) .tag(2).button(STATS_POS, GET_TEXT_F(MSG_INFO_STATS_MENU)); #endif @@ -102,10 +102,10 @@ void AboutScreen::onRedraw(draw_mode_t) { bool AboutScreen::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); break; - #if BOTH(PRINTCOUNTER, FTDI_STATISTICS_SCREEN) + #if ALL(PRINTCOUNTER, FTDI_STATISTICS_SCREEN) case 2: GOTO_SCREEN(StatisticsScreen); break; #endif - #if BOTH(TOUCH_UI_DEVELOPER_MENU, FTDI_DEVELOPER_MENU) + #if ALL(TOUCH_UI_DEVELOPER_MENU, FTDI_DEVELOPER_MENU) case 3: GOTO_SCREEN(DeveloperMenu); break; #endif default: return false; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/advanced_settings_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/advanced_settings_menu.cpp index 8753b44e70..4745ff99dc 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/advanced_settings_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/advanced_settings_menu.cpp @@ -37,7 +37,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { } #if ENABLED(TOUCH_UI_PORTRAIT) - #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING) + #if ANY(HAS_MULTI_HOTEND, SENSORLESS_HOMING) #define GRID_ROWS 9 #else #define GRID_ROWS 8 @@ -58,7 +58,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { #define BACKLASH_POS BTN_POS(2,7), BTN_SIZE(1,1) #define OFFSETS_POS BTN_POS(1,8), BTN_SIZE(1,1) #define TMC_HOMING_THRS_POS BTN_POS(2,8), BTN_SIZE(1,1) - #if EITHER(HAS_MULTI_HOTEND, SENSORLESS_HOMING) + #if ANY(HAS_MULTI_HOTEND, SENSORLESS_HOMING) #define BACK_POS BTN_POS(1,9), BTN_SIZE(2,1) #else #define BACK_POS BTN_POS(1,8), BTN_SIZE(2,1) @@ -99,7 +99,7 @@ void AdvancedSettingsMenu::onRedraw(draw_mode_t what) { .tag(14).button(TMC_HOMING_THRS_POS, GET_TEXT_F(MSG_TMC_HOMING_THRS)) .enabled(ENABLED(HAS_MULTI_HOTEND)) .tag(4) .button(OFFSETS_POS, GET_TEXT_F(MSG_OFFSETS_MENU)) - .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) + .enabled(ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) .tag(11).button(FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) .tag(12).button(ENDSTOPS_POS, GET_TEXT_F(MSG_LCD_ENDSTOPS)) .tag(15).button(DISPLAY_POS, GET_TEXT_F(MSG_DISPLAY_MENU)) @@ -133,7 +133,7 @@ bool AdvancedSettingsMenu::onTouchEnd(uint8_t tag) { #endif case 9: GOTO_SCREEN(InterfaceSettingsScreen); LockScreen::check_passcode(); break; case 10: GOTO_SCREEN(RestoreFailsafeDialogBox); LockScreen::check_passcode(); break; - #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + #if ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) case 11: GOTO_SCREEN(FilamentMenu); break; #endif case 12: GOTO_SCREEN(EndstopStatesScreen); break; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_edit_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_edit_screen.cpp index 37eb29a99d..ab6d8a8902 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_edit_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_edit_screen.cpp @@ -95,7 +95,7 @@ void BedMeshEditScreen::setHighlightedValue(float value) { } void BedMeshEditScreen::moveToHighlightedValue() { - if (ExtUI::getMeshValid()) { + if (ExtUI::getLevelingIsValid()) { ExtUI::setLevelingActive(true); ExtUI::setSoftEndstopState(false); ExtUI::moveToMeshPoint(mydata.highlight, gaugeThickness + mydata.zAdjustment); diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.cpp index 7b4195ff5c..86eab54d85 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.cpp @@ -125,7 +125,7 @@ void BedMeshViewScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI mydata.count = 0; break; case ExtUI::G29_FINISH: - if (mydata.count == GRID_MAX_POINTS && ExtUI::getMeshValid()) + if (mydata.count == GRID_MAX_POINTS && ExtUI::getLevelingIsValid()) mydata.message = GET_TEXT_F(MSG_BED_MAPPING_DONE); else mydata.message = GET_TEXT_F(MSG_BED_MAPPING_INCOMPLETE); diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.h index b9791fff7a..3ec8e06adf 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.h +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/bed_mesh_view_screen.h @@ -26,7 +26,7 @@ struct BedMeshViewScreenData { FSTR_P message; - uint8_t count; + grid_count_t count; xy_uint8_t highlight; }; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/boot_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/boot_screen.cpp index c0940bed5c..b01e45948c 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/boot_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/boot_screen.cpp @@ -30,7 +30,7 @@ #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) #if ENABLED(TOUCH_UI_PORTRAIT) - #include "../theme/bootscreen_logo_portrait.h" + #include "../theme/_bootscreen_portrait.h" #else #include "../theme/_bootscreen_landscape.h" #endif diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/endstop_state_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/endstop_state_screen.cpp index b52904fe8f..1d81649444 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/endstop_state_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/endstop_state_screen.cpp @@ -54,32 +54,32 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { cmd.font(TERN(TOUCH_UI_PORTRAIT, font_large, font_medium)) .text(BTN_POS(1,1), BTN_SIZE(6,1), GET_TEXT_F(MSG_LCD_ENDSTOPS)) .font(font_tiny); - #if HAS_X_MAX + #if USE_X_MAX PIN_ENABLED (1, 2, PSTR(STR_X_MAX), X_MAX, X_MAX_ENDSTOP_HIT_STATE) #else PIN_DISABLED(1, 2, PSTR(STR_X_MAX), X_MAX) #endif - #if HAS_Y_MAX + #if USE_Y_MAX PIN_ENABLED (3, 2, PSTR(STR_Y_MAX), Y_MAX, Y_MAX_ENDSTOP_HIT_STATE) #else PIN_DISABLED(3, 2, PSTR(STR_Y_MAX), Y_MAX) #endif - #if HAS_Z_MAX + #if USE_Z_MAX PIN_ENABLED (5, 2, PSTR(STR_Z_MAX), Z_MAX, Z_MAX_ENDSTOP_HIT_STATE) #else PIN_DISABLED(5, 2, PSTR(STR_Z_MAX), Z_MAX) #endif - #if HAS_X_MIN + #if USE_X_MIN PIN_ENABLED (1, 3, PSTR(STR_X_MIN), X_MIN, X_MIN_ENDSTOP_HIT_STATE) #else PIN_DISABLED(1, 3, PSTR(STR_X_MIN), X_MIN) #endif - #if HAS_Y_MIN + #if USE_Y_MIN PIN_ENABLED (3, 3, PSTR(STR_Y_MIN), Y_MIN, Y_MIN_ENDSTOP_HIT_STATE) #else PIN_DISABLED(3, 3, PSTR(STR_Y_MIN), Y_MIN) #endif - #if HAS_Z_MIN + #if HAS_Z_MIN_PIN PIN_ENABLED (5, 3, PSTR(STR_Z_MIN), Z_MIN, Z_MIN_ENDSTOP_HIT_STATE) #else PIN_DISABLED(5, 3, PSTR(STR_Z_MIN), Z_MIN) @@ -89,7 +89,7 @@ void EndstopStatesScreen::onRedraw(draw_mode_t) { #else PIN_DISABLED(1, 4, GET_TEXT_F(MSG_RUNOUT_1), FIL_RUNOUT) #endif - #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) + #if ALL(HAS_MULTI_EXTRUDER, FILAMENT_RUNOUT_SENSOR) && PIN_EXISTS(FIL_RUNOUT2) PIN_ENABLED (3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2, FIL_RUNOUT2_STATE) #else PIN_DISABLED(3, 4, GET_TEXT_F(MSG_RUNOUT_2), FIL_RUNOUT2) diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/language_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/language_menu.cpp index 499f741540..5d797f44df 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/language_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/language_menu.cpp @@ -56,7 +56,7 @@ void LanguageMenu::onRedraw(draw_mode_t) { bool LanguageMenu::onTouchEnd(uint8_t tag) { if (tag > 0 && tag <= NUM_LANGUAGES) { - lang = tag - 1; + ftdi_language = tag - 1; GOTO_SCREEN(StatusScreen); return true; } diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp index 2fb9d18498..47540b0f55 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp @@ -25,7 +25,7 @@ #ifdef FTDI_LEVELING_MENU -#if BOTH(HAS_BED_PROBE,BLTOUCH) +#if ALL(HAS_BED_PROBE,BLTOUCH) #include "../../../../feature/bltouch.h" #endif @@ -81,7 +81,7 @@ void LevelingMenu::onRedraw(draw_mode_t what) { .text(BLTOUCH_TITLE_POS, GET_TEXT_F(MSG_BLTOUCH)) #endif .font(font_medium).colors(normal_btn) - .enabled(EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION)) + .enabled(ANY(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION)) .tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_LEVEL_X_AXIS)) .enabled(ENABLED(HAS_BED_PROBE)) .tag(3).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED)) @@ -103,7 +103,7 @@ void LevelingMenu::onRedraw(draw_mode_t what) { bool LevelingMenu::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); break; - #if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION) + #if ANY(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION) case 2: SpinnerDialogBox::enqueueAndWait(F("G34")); break; #endif #if HAS_BED_PROBE diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/move_axis_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/move_axis_screen.cpp index c15ff1173f..95fe023cda 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/move_axis_screen.cpp @@ -37,7 +37,7 @@ void BaseMoveAxisScreen::onEntry() { // ourselves. The relative distances are reset to zero whenever this // screen is entered. - LOOP_L_N(i, ExtUI::extruderCount) { + for (uint8_t i = 0; i < ExtUI::extruderCount; ++i) { mydata.e_rel[i] = 0; } BaseNumericAdjustmentScreen::onEntry(); @@ -77,8 +77,10 @@ bool BaseMoveAxisScreen::onTouchHeld(const uint8_t tag) { #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; - case 3: UI_INCREMENT_AXIS(X); break; + #if HAS_X_AXIS + case 2: UI_DECREMENT_AXIS(X); break; + case 3: UI_INCREMENT_AXIS(X); break; + #endif #if HAS_EXTRUDERS // For extruders, also update relative distances. case 8: UI_DECREMENT_AXIS(E0); mydata.e_rel[0] -= increment; break; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/screens.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/screens.h index e2df29cb83..c200931eec 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/screens.h +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/screens.h @@ -74,7 +74,7 @@ enum { #if ENABLED(CASE_LIGHT_ENABLE) CASE_LIGHT_SCREEN_CACHE, #endif - #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + #if ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) FILAMENT_MENU_CACHE, #endif #if ENABLED(LIN_ADVANCE) @@ -192,7 +192,7 @@ enum { #include "case_light_screen.h" #endif -#if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) +#if ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) #include "filament_menu.h" #endif diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/tune_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/tune_menu.cpp index 0370c44174..259f6d5b89 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/tune_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/tune_menu.cpp @@ -74,11 +74,11 @@ void TuneMenu::onRedraw(draw_mode_t what) { .tag(2).button(TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) .enabled(!sdOrHostPrinting || sdOrHostPaused) .tag(3).button(FIL_CHANGE_POS, GET_TEXT_F(MSG_FILAMENTCHANGE)) - .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) + .enabled(ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) .tag(9).button(FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) #if ENABLED(BABYSTEPPING) && HAS_MULTI_HOTEND .tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(MSG_NUDGE_NOZZLE)) - #elif BOTH(HAS_LEVELING, HAS_BED_PROBE) + #elif ALL(HAS_LEVELING, HAS_BED_PROBE) .tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) #endif .tag(5).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) @@ -105,7 +105,7 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { case 4: #if ENABLED(BABYSTEPPING) && HAS_MULTI_HOTEND GOTO_SCREEN(NudgeNozzleScreen); - #elif BOTH(HAS_LEVELING, HAS_BED_PROBE) + #elif ALL(HAS_LEVELING, HAS_BED_PROBE) GOTO_SCREEN(ZOffsetScreen); #endif break; @@ -117,7 +117,7 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { current_screen.forget(); PUSH_SCREEN(StatusScreen); break; - #if EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) + #if ANY(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR) case 9: GOTO_SCREEN(FilamentMenu); break; #endif #if ENABLED(CASE_LIGHT_ENABLE) diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language.cpp index bf684e43f9..9ff738e45c 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language.cpp @@ -23,5 +23,5 @@ #include "../../../../MarlinCore.h" #if ENABLED(TOUCH_UI_FTDI_EVE) #include "language.h" - uint8_t lang = 0; + uint8_t ftdi_language = 0; #endif diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h index 05e625842a..9c069d9d24 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/language/language_en.h @@ -91,7 +91,6 @@ namespace Language_en { LSTR MSG_IDLE = u8"idle"; LSTR MSG_SET_MAXIMUM = u8"Set Maximum"; LSTR MSG_PRINT_SPEED = u8"Print Speed"; - LSTR MSG_LINEAR_ADVANCE = u8"Linear Advance"; LSTR MSG_LINEAR_ADVANCE_K = u8"K"; LSTR MSG_LINEAR_ADVANCE_K1 = u8"K E1"; LSTR MSG_LINEAR_ADVANCE_K2 = u8"K E2"; diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/colors.h index 70c2be4ec2..0e145e39f2 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/theme/colors.h @@ -37,7 +37,7 @@ namespace Theme { #else // Use linear accent colors - #if EITHER(TOUCH_UI_ROYAL_THEME, TOUCH_UI_FROZEN_THEME) + #if ANY(TOUCH_UI_ROYAL_THEME, TOUCH_UI_FROZEN_THEME) // Dark blue accent colors constexpr int accent_hue = 216; constexpr float accent_sat = 0.7; @@ -88,7 +88,7 @@ namespace Theme { constexpr uint32_t bed_mesh_lines_rgb = 0xFFFFFF; constexpr uint32_t bed_mesh_shadow_rgb = 0x444444; - #elif EITHER(TOUCH_UI_COCOA_THEME, TOUCH_UI_FROZEN_THEME) + #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; diff --git a/Marlin/src/lcd/extui/ia_creality/FileNavigator.cpp b/Marlin/src/lcd/extui/ia_creality/FileNavigator.cpp index 4e2d294a9b..f16bdde29a 100644 --- a/Marlin/src/lcd/extui/ia_creality/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/ia_creality/FileNavigator.cpp @@ -33,23 +33,23 @@ #if DGUS_LCD_UI_IA_CREALITY -#include "ia_creality_extui.h" +#include "ia_creality_rts.h" #include "FileNavigator.h" -using namespace ExtUI; +#include -FileList FileNavigator::filelist; // Instance of the Marlin file API -char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path +ExtUI::FileList FileNavigator::filelist; // ExtUI file API +char FileNavigator::currentDirPath[MAX_PATH_LEN]; // Current folder path uint16_t FileNavigator::lastindex; uint8_t FileNavigator::folderdepth; -uint16_t FileNavigator::currentindex; // override the panel request +uint16_t FileNavigator::currentindex; // override the panel request FileNavigator filenavigator; FileNavigator::FileNavigator() { reset(); } void FileNavigator::reset() { - currentfoldername[0] = '\0'; + currentDirPath[0] = '\0'; folderdepth = 0; currentindex = 0; lastindex = 0; @@ -95,23 +95,23 @@ void FileNavigator::getFiles(uint16_t index) { // Clear currently drawn screen for (int i = 0; i < DISPLAY_FILES; i++) { for (int j = 0; j < 20; j++) - rtscheck.RTS_SndData(0, SDFILE_ADDR + (i * 20) + j); + rts.sendData(0, SDFILE_ADDR + (i * 20) + j); } for (int j = 0; j < 10; j++) { - rtscheck.RTS_SndData(0, Printfilename + j); // clear screen. - rtscheck.RTS_SndData(0, Choosefilename + j); // clear filename + rts.sendData(0, Printfilename + j); // clear screen. + rts.sendData(0, Choosefilename + j); // clear filename } for (int j = 0; j < 8; j++) - rtscheck.RTS_SndData(0, FilenameCount + j); + rts.sendData(0, FilenameCount + j); for (int j = 1; j <= DISPLAY_FILES; j++) { - rtscheck.RTS_SndData(10, FilenameIcon + j); - rtscheck.RTS_SndData(10, FilenameIcon1 + j); + rts.sendData(10, FilenameIcon + j); + rts.sendData(10, FilenameIcon1 + j); } if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder files--; - rtscheck.RTS_SndData("Up Directory", SDFILE_ADDR); + rts.sendData("Up Directory", SDFILE_ADDR); fcnt++; } else if (currentindex == DISPLAY_FILES && folderdepth > 0) @@ -123,20 +123,20 @@ void FileNavigator::getFiles(uint16_t index) { if (filelen > 20) { char *buf = (char *)filelist.filename(); buf[18] = '\0'; // cutoff at screen edge - rtscheck.RTS_SndData(buf, (SDFILE_ADDR + (fcnt * 20))); + rts.sendData(buf, (SDFILE_ADDR + (fcnt * 20))); } else - rtscheck.RTS_SndData(filelist.filename(), (SDFILE_ADDR + (fcnt * 20))); + rts.sendData(filelist.filename(), (SDFILE_ADDR + (fcnt * 20))); if (filelist.isDir()) { - rtscheck.RTS_SndData((uint8_t)4, FilenameIcon + (fcnt+1)); - rtscheck.RTS_SndData((unsigned long)0x041F, (FilenameNature + ((1+fcnt) * 16))); // Change BG of selected line to Blue + rts.sendData((uint8_t)4, FilenameIcon + (fcnt+1)); + rts.sendData((unsigned long)0x041F, (FilenameNature + ((1+fcnt) * 16))); // Change BG of selected line to Blue } else { - rtscheck.RTS_SndData((uint8_t)0, FilenameIcon + (fcnt+1)); - rtscheck.RTS_SndData((unsigned long)0xFFFF, (FilenameNature + ((1+fcnt) * 16))); // white + rts.sendData((uint8_t)0, FilenameIcon + (fcnt+1)); + rts.sendData((unsigned long)0xFFFF, (FilenameNature + ((1+fcnt) * 16))); // white } - SERIAL_ECHOLNPGM("-", seek, " '", filelist.filename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); + SERIAL_ECHOLNPGM("-", seek, " '", filelist.filename(), "' '", currentDirPath, "", filelist.shortFilename(), "'\n"); fcnt++; } } @@ -144,8 +144,8 @@ void FileNavigator::getFiles(uint16_t index) { void FileNavigator::changeDIR(char *folder) { if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth - strcat(currentfoldername, folder); - strcat(currentfoldername, "/"); + strcat(currentDirPath, folder); + strcat(currentDirPath, "/"); filelist.changeDir(folder); refresh(); folderdepth++; @@ -159,17 +159,17 @@ void FileNavigator::upDIR() { currentindex = 0; // Remove the last child folder from the stored path if (folderdepth == 0) { - currentfoldername[0] = '\0'; + currentDirPath[0] = '\0'; reset(); } else { char *pos = nullptr; for (uint8_t f = 0; f < folderdepth; f++) - pos = strchr(currentfoldername, '/'); + pos = strchr(currentDirPath, '/'); pos[1] = '\0'; } } -char* FileNavigator::getCurrentFolderName() { return currentfoldername; } +char* FileNavigator::getCurrentDirPath() { return currentDirPath; } #endif // DGUS_LCD_UI_IA_CREALITY diff --git a/Marlin/src/lcd/extui/ia_creality/FileNavigator.h b/Marlin/src/lcd/extui/ia_creality/FileNavigator.h index 28d97c6746..af98210a9f 100644 --- a/Marlin/src/lcd/extui/ia_creality/FileNavigator.h +++ b/Marlin/src/lcd/extui/ia_creality/FileNavigator.h @@ -30,13 +30,12 @@ * Written by Insanity Automation * ***************************************/ +#include "../ui_api.h" + #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 #define DISPLAY_FILES 4 -using namespace ExtUI; - class FileNavigator { public: FileNavigator(); @@ -45,15 +44,15 @@ class FileNavigator { static void upDIR(); static void changeDIR(char *); static void refresh(); - static char* getCurrentFolderName(); + static char* getCurrentDirPath(); static uint8_t folderdepth; static uint16_t currentindex; static bool getIndexisDir(uint16_t); const char *getIndexName(uint16_t); static uint16_t maxFiles(); private: - static FileList filelist; - static char currentfoldername[MAX_PATH_LEN]; + static ExtUI::FileList filelist; + static char currentDirPath[MAX_PATH_LEN]; static uint16_t lastindex; }; diff --git a/Marlin/src/lcd/extui/ia_creality/creality_extui.cpp b/Marlin/src/lcd/extui/ia_creality/creality_extui.cpp deleted file mode 100644 index 1f40f2a037..0000000000 --- a/Marlin/src/lcd/extui/ia_creality/creality_extui.cpp +++ /dev/null @@ -1,2094 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2022 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/ia_creality/creality_extui.cpp - * **************************************** - * Extensible_UI implementation for Creality DWIN - * 10SPro, Max, CRX, and others - * Based original Creality release, ported to ExtUI for Marlin 2.0 - * Written by Insanity Automation, sponsored by Tiny Machines 3D - * - * ***************************************/ - -#include "../../../inc/MarlinConfigPre.h" - -#if DGUS_LCD_UI_IA_CREALITY - -#include "ia_creality_extui.h" -#include "FileNavigator.h" - -namespace ExtUI { - static uint16_t fileIndex = 0; - uint8_t recordcount = 0; - uint8_t waitway_lock = 0; - const float manual_feedrate_mm_m[] = MANUAL_FEEDRATE; - uint8_t startprogress = 0; - - char waitway = 0; - int16_t recnum = 0; - float ChangeMaterialbuf[2] = {0}; - - char NozzleTempStatus[3] = {0}; - - char PrinterStatusKey[2] = {0}; // PrinterStatusKey[1] value: 0 represents to keep temperature, 1 represents to heating , 2 stands for cooling , 3 stands for printing - // PrinterStatusKey[0] value: 0 reprensents 3D printer ready - - uint8_t AxisPagenum = 0; // 0 for 10mm, 1 for 1mm, 2 for 0.1mm - bool InforShowStatus = true; - bool TPShowStatus = false; // true for only opening time and percentage, false for closing time and percentage. - bool AutohomeKey = false; - uint8_t AutoHomeIconNum; - int16_t userConfValidation = 0; - - uint8_t lastPauseMsgState = 0; - - creality_dwin_settings_t Settings; - uint8_t dwin_settings_version = 1; - - bool reEntryPrevent = false; - uint8_t reEntryCount = 0; - uint16_t idleThrottling = 0; - - bool pause_resume_selected = false; - - #if HAS_PID_HEATING - uint16_t pid_hotendAutoTemp = 150; - uint16_t pid_bedAutoTemp = 70; - #endif - - #ifndef CUSTOM_MACHINE_NAME - #define CUSTOM_MACHINE_NAME MACHINE_NAME - #endif - #ifndef IA_CREALITY_BOOT_DELAY - #define IA_CREALITY_BOOT_DELAY 500 - #endif - - void onStartup() { - DWIN_SERIAL.begin(115200); - rtscheck.recdat.head[0] = rtscheck.snddat.head[0] = FHONE; - rtscheck.recdat.head[1] = rtscheck.snddat.head[1] = FHTWO; - ZERO(rtscheck.databuf); - - delay_ms(IA_CREALITY_BOOT_DELAY); // Delay to allow screen startup - SetTouchScreenConfiguration(); - rtscheck.RTS_SndData(StartSoundSet, SoundAddr); - delay_ms(400); // Delay to allow screen to configure - - onStatusChanged(CUSTOM_MACHINE_NAME " Ready"); - - rtscheck.RTS_SndData(100, FeedrateDisplay); - - /***************turn off motor*****************/ - rtscheck.RTS_SndData(11, FilenameIcon); - - /***************transmit temperature to screen*****************/ - rtscheck.RTS_SndData(0, NozzlePreheat); - rtscheck.RTS_SndData(0, BedPreheat); - rtscheck.RTS_SndData(getActualTemp_celsius(H0), NozzleTemp); - rtscheck.RTS_SndData(TERN0(HAS_MULTI_HOTEND, getActualTemp_celsius(H1)), e2Temp); - rtscheck.RTS_SndData(getActualTemp_celsius(BED), Bedtemp); - /***************transmit Fan speed to screen*****************/ - rtscheck.RTS_SndData(getActualFan_percent((fan_t)getActiveTool()), FanKeyIcon); - - /***************transmit Printer information to screen*****************/ - for (int16_t j = 0; j < 20; j++) // clean filename - rtscheck.RTS_SndData(0, MacVersion + j); - char sizebuf[20] = {0}; - sprintf(sizebuf, "%d X %d X %d", Y_BED_SIZE, X_BED_SIZE, Z_MAX_POS); - rtscheck.RTS_SndData(CUSTOM_MACHINE_NAME, MacVersion); - rtscheck.RTS_SndData(SHORT_BUILD_VERSION, SoftVersion); - rtscheck.RTS_SndData(sizebuf, PrinterSize); - rtscheck.RTS_SndData(WEBSITE_URL, CorpWebsite); - - /**************************some info init*******************************/ - rtscheck.RTS_SndData(0, PrintscheduleIcon); - rtscheck.RTS_SndData(0, PrintscheduleIcon + 1); - - /************************clean screen*******************************/ - for (int16_t i = 0; i < MaxFileNumber; i++) - for (int16_t j = 0; j < 10; j++) rtscheck.RTS_SndData(0, SDFILE_ADDR + i * 10 + j); - - for (int16_t j = 0; j < 10; j++) { - rtscheck.RTS_SndData(0, Printfilename + j); // clean screen. - rtscheck.RTS_SndData(0, Choosefilename + j); // clean filename - } - for (int16_t j = 0; j < 8; j++) rtscheck.RTS_SndData(0, FilenameCount + j); - for (int16_t j = 1; j <= MaxFileNumber; j++) { - rtscheck.RTS_SndData(10, FilenameIcon + j); - rtscheck.RTS_SndData(10, FilenameIcon1 + j); - } - } - - void onIdle() { - - while (rtscheck.RTS_RecData() > 0 && (rtscheck.recdat.data[0] != 0 || rtscheck.recdat.addr != 0)) rtscheck.RTS_HandleData(); - - if (reEntryPrevent && reEntryCount < 120) { - reEntryCount++; - return; - } - reEntryCount = 0; - - if (idleThrottling++ < 750) return; - - // Always send temperature data - rtscheck.RTS_SndData(getActualTemp_celsius(getActiveTool()), NozzleTemp); - rtscheck.RTS_SndData(getActualTemp_celsius(BED), Bedtemp); - rtscheck.RTS_SndData(getTargetTemp_celsius(getActiveTool()), NozzlePreheat); - rtscheck.RTS_SndData(getTargetTemp_celsius(BED), BedPreheat); - rtscheck.RTS_SndData(TERN0(HAS_MULTI_HOTEND, getActualTemp_celsius(H1)), e2Temp); - rtscheck.RTS_SndData(TERN0(HAS_MULTI_HOTEND, getTargetTemp_celsius(H1)), e2Preheat); - TERN_(HAS_MULTI_HOTEND, rtscheck.RTS_SndData(uint8_t(getActiveTool() + 1), ActiveToolVP)); - - if (awaitingUserConfirm() && (lastPauseMsgState != ExtUI::pauseModeStatus || userConfValidation > 99)) { - switch (ExtUI::pauseModeStatus) { - case PAUSE_MESSAGE_PARKING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; - case PAUSE_MESSAGE_CHANGING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; - case PAUSE_MESSAGE_UNLOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; - case PAUSE_MESSAGE_WAITING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); break; - case PAUSE_MESSAGE_INSERT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); break; - case PAUSE_MESSAGE_LOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; - case PAUSE_MESSAGE_PURGE: ExtUI::onUserConfirmRequired(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); break; - case PAUSE_MESSAGE_RESUME: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; - case PAUSE_MESSAGE_HEAT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); break; - case PAUSE_MESSAGE_HEATING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; - case PAUSE_MESSAGE_OPTION: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_OPTION_HEADER)); break; - case PAUSE_MESSAGE_STATUS: break; - default: onUserConfirmRequired(PSTR("Confirm Continue")); break; - } - userConfValidation = 0; - } - else if (pause_resume_selected && !awaitingUserConfirm()) { - rtscheck.RTS_SndData(ExchangePageBase + 53, ExchangepageAddr); - pause_resume_selected = false; - userConfValidation = 0; - } - else if (awaitingUserConfirm()) { - if (pause_resume_selected) { - pause_resume_selected = false; - userConfValidation = 100; - } - else - userConfValidation++; - } - - reEntryPrevent = true; - idleThrottling = 0; - if (waitway && !commandsInQueue()) - waitway_lock++; - else - waitway_lock = 0; - - if (waitway_lock > 100) { - waitway_lock = 0; - waitway = 0; // clear waitway if nothing is going on - } - - switch (waitway) { - case 1: - if (isPositionKnown()) { - InforShowStatus = true; - rtscheck.RTS_SndData(ExchangePageBase + 54, ExchangepageAddr); - waitway = 0; - } - break; - - case 2: - if (isPositionKnown() && !commandsInQueue()) waitway = 0; - break; - - case 3: - //if(isPositionKnown() && (getActualTemp_celsius(BED) >= (getTargetTemp_celsius(BED)-1))) { - rtscheck.RTS_SndData(ExchangePageBase + 64, ExchangepageAddr); - waitway = 7; - //return; - //} - break; - - case 4: - if (AutohomeKey && isPositionKnown() && !commandsInQueue()) { // Manual Move Home Done - //rtscheck.RTS_SndData(ExchangePageBase + 71 + AxisPagenum, ExchangepageAddr); - AutohomeKey = false; - waitway = 0; - } - break; - case 5: - if (isPositionKnown() && !commandsInQueue()) { - InforShowStatus = true; - waitway = 0; - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); // exchange to 78 page - } - break; - case 6: - if (!commandsInQueue()) { - setAxisPosition_mm(BED_TRAMMING_HEIGHT, axis_t(Z)); - waitway = 0; - } - break; - case 7: - if (!commandsInQueue()) waitway = 0; - break; - } - - TERN_(HAS_MESH, rtscheck.RTS_SndData(getLevelingActive() ? 3 : 2, AutoLevelIcon)); - TERN_(HAS_FILAMENT_SENSOR, rtscheck.RTS_SndData(getFilamentRunoutEnabled() ? 3 : 2, RunoutToggle)); - TERN_(CASE_LIGHT_ENABLE, rtscheck.RTS_SndData(getCaseLightState() ? 3 : 2, LedToggle)); - TERN_(POWER_LOSS_RECOVERY, rtscheck.RTS_SndData(getPowerLossRecoveryEnabled() ? 3 : 2, PowerLossToggle)); - - if (startprogress == 0) { - startprogress += 25; - delay_ms(3000); // Delay to show bootscreen - } - else if (startprogress < 250) { - if (isMediaInserted()) // Re init media as it happens too early on STM32 boards often - onMediaInserted(); - else - injectCommands(F("M22\nM21")); - startprogress = 254; - InforShowStatus = true; - TPShowStatus = false; - rtscheck.RTS_SndData(ExchangePageBase + 45, ExchangepageAddr); - reEntryPrevent = false; - return; - } - if (startprogress <= 100) - rtscheck.RTS_SndData(startprogress, StartIcon); - else - rtscheck.RTS_SndData(startprogress - 100, StartIcon + 1); - - //rtscheck.RTS_SndData((startprogress++) % 5, ExchFlmntIcon); - - if (isPrinting()) { - rtscheck.RTS_SndData(getActualFan_percent((fan_t)getActiveTool()), FanKeyIcon); - rtscheck.RTS_SndData(getProgress_seconds_elapsed() / 3600, Timehour); - rtscheck.RTS_SndData((getProgress_seconds_elapsed() % 3600) / 60, Timemin); - if (getProgress_percent() > 0) { - const uint16_t perc = getProgress_percent() + 1; - if (perc <= 50) { - rtscheck.RTS_SndData(uint16_t(perc) * 2, PrintscheduleIcon); - rtscheck.RTS_SndData(0, PrintscheduleIcon + 1); - } - else { - rtscheck.RTS_SndData(100, PrintscheduleIcon); - rtscheck.RTS_SndData(uint16_t(perc) * 2 - 100, PrintscheduleIcon + 1); - } - } - else { - rtscheck.RTS_SndData(0, PrintscheduleIcon); - rtscheck.RTS_SndData(0, PrintscheduleIcon + 1); - } - rtscheck.RTS_SndData(uint16_t(getProgress_percent()), Percentage); - } - else { // Not printing settings - rtscheck.RTS_SndData(map(constrain(Settings.display_volume, 0, 255), 0, 255, 0, 100), VolumeDisplay); - rtscheck.RTS_SndData(Settings.screen_brightness, DisplayBrightness); - rtscheck.RTS_SndData(Settings.standby_screen_brightness, DisplayStandbyBrightness); - rtscheck.RTS_SndData(Settings.standby_time_seconds, DisplayStandbySeconds); - if (Settings.display_standby) - rtscheck.RTS_SndData(3, DisplayStandbyEnableIndicator); - else - rtscheck.RTS_SndData(2, DisplayStandbyEnableIndicator); - - rtscheck.RTS_SndData(getAxisSteps_per_mm(X) * 10, StepMM_X); - rtscheck.RTS_SndData(getAxisSteps_per_mm(Y) * 10, StepMM_Y); - rtscheck.RTS_SndData(getAxisSteps_per_mm(Z) * 10, StepMM_Z); - rtscheck.RTS_SndData(getAxisSteps_per_mm(E0) * 10, StepMM_E); - - rtscheck.RTS_SndData(getAxisMaxAcceleration_mm_s2(X) / 100, Accel_X); - rtscheck.RTS_SndData(getAxisMaxAcceleration_mm_s2(Y) / 100, Accel_Y); - rtscheck.RTS_SndData(getAxisMaxAcceleration_mm_s2(Z) / 10, Accel_Z); - rtscheck.RTS_SndData(getAxisMaxAcceleration_mm_s2(E0), Accel_E); - - rtscheck.RTS_SndData(getAxisMaxFeedrate_mm_s(X), Feed_X); - rtscheck.RTS_SndData(getAxisMaxFeedrate_mm_s(Y), Feed_Y); - rtscheck.RTS_SndData(getAxisMaxFeedrate_mm_s(Z), Feed_Z); - rtscheck.RTS_SndData(getAxisMaxFeedrate_mm_s(E0), Feed_E); - - rtscheck.RTS_SndData(getAxisMaxJerk_mm_s(X) * 100, Jerk_X); - rtscheck.RTS_SndData(getAxisMaxJerk_mm_s(Y) * 100, Jerk_Y); - rtscheck.RTS_SndData(getAxisMaxJerk_mm_s(Z) * 100, Jerk_Z); - rtscheck.RTS_SndData(getAxisMaxJerk_mm_s(E0) * 100, Jerk_E); - - #if HAS_HOTEND_OFFSET - rtscheck.RTS_SndData(getNozzleOffset_mm(X, E1) * 10, T2Offset_X); - rtscheck.RTS_SndData(getNozzleOffset_mm(Y, E1) * 10, T2Offset_Y); - rtscheck.RTS_SndData(getNozzleOffset_mm(Z, E1) * 10, T2Offset_Z); - rtscheck.RTS_SndData(getAxisSteps_per_mm(E1) * 10, T2StepMM_E); - #endif - - #if HAS_BED_PROBE - rtscheck.RTS_SndData(getProbeOffset_mm(X) * 100, ProbeOffset_X); - rtscheck.RTS_SndData(getProbeOffset_mm(Y) * 100, ProbeOffset_Y); - #endif - - #if HAS_PID_HEATING - rtscheck.RTS_SndData(pid_hotendAutoTemp, HotendPID_AutoTmp); - rtscheck.RTS_SndData(pid_bedAutoTemp, BedPID_AutoTmp); - rtscheck.RTS_SndData(getPID_Kp(E0) * 10, HotendPID_P); - rtscheck.RTS_SndData(getPID_Ki(E0) * 10, HotendPID_I); - rtscheck.RTS_SndData(getPID_Kd(E0) * 10, HotendPID_D); - #if ENABLED(PIDTEMPBED) - rtscheck.RTS_SndData(getBedPID_Kp() * 10, BedPID_P); - rtscheck.RTS_SndData(getBedPID_Ki() * 10, BedPID_I); - rtscheck.RTS_SndData(getBedPID_Kd() * 10, BedPID_D); - #endif - #endif - } - - rtscheck.RTS_SndData(getZOffset_mm() * 100, ProbeOffset_Z); - rtscheck.RTS_SndData(uint16_t(getFlow_percent(E0)), Flowrate); - - if (NozzleTempStatus[0] || NozzleTempStatus[2]) { // statuse of loadfilament and unloadfinement when temperature is less than - uint16_t IconTemp = getActualTemp_celsius(getActiveTool()) * 100 / getTargetTemp_celsius(getActiveTool()); - NOMORE(IconTemp, 100U); - rtscheck.RTS_SndData(IconTemp, HeatPercentIcon); - if (getActualTemp_celsius(getActiveTool()) > EXTRUDE_MINTEMP && NozzleTempStatus[0] != 0) { - NozzleTempStatus[0] = 0; - rtscheck.RTS_SndData(10 * ChangeMaterialbuf[0], FilamentUnit1); - rtscheck.RTS_SndData(10 * ChangeMaterialbuf[1], FilamentUnit2); - rtscheck.RTS_SndData(ExchangePageBase + 65, ExchangepageAddr); - } - else if (getActualTemp_celsius(getActiveTool()) >= getTargetTemp_celsius(getActiveTool()) && NozzleTempStatus[2]) { - NozzleTempStatus[2] = 0; - TPShowStatus = true; - rtscheck.RTS_SndData(4, ExchFlmntIcon); - rtscheck.RTS_SndData(ExchangePageBase + 83, ExchangepageAddr); - } - else if (NozzleTempStatus[2]) { - //rtscheck.RTS_SndData((startprogress++) % 5, ExchFlmntIcon); - } - } - - if (AutohomeKey) { - rtscheck.RTS_SndData(AutoHomeIconNum, AutoZeroIcon); - if (++AutoHomeIconNum > 9) AutoHomeIconNum = 0; - } - - if (isMediaInserted()) { - const uint16_t currPage = fileIndex == 0 ? 1 : CEIL(float(fileIndex) / float(DISPLAY_FILES)) + 1, - maxPageAdd = filenavigator.folderdepth ? 1 : 0, - maxPages = CEIL(float(filenavigator.maxFiles() + maxPageAdd) / float(DISPLAY_FILES) ); - - rtscheck.RTS_SndData(currPage, FilesCurentPage); - rtscheck.RTS_SndData(maxPages, FilesMaxPage); - } - else { - rtscheck.RTS_SndData(0, FilesCurentPage); - rtscheck.RTS_SndData(0, FilesMaxPage); - } - - if (rtscheck.recdat.addr != DisplayZaxis && rtscheck.recdat.addr != DisplayYaxis && rtscheck.recdat.addr != DisplayZaxis) { - rtscheck.RTS_SndData(10 * getAxisPosition_mm(axis_t(X)), DisplayXaxis); - rtscheck.RTS_SndData(10 * getAxisPosition_mm(axis_t(Y)), DisplayYaxis); - rtscheck.RTS_SndData(10 * getAxisPosition_mm(axis_t(Z)), DisplayZaxis); - } - reEntryPrevent = false; - } - - rx_datagram_state_t RTSSHOW::rx_datagram_state = DGUS_IDLE; - uint8_t RTSSHOW::rx_datagram_len = 0; - bool RTSSHOW::Initialized = false; - RTSSHOW::RTSSHOW() { - recdat.head[0] = snddat.head[0] = FHONE; - recdat.head[1] = snddat.head[1] = FHTWO; - ZERO(databuf); - } - - int16_t RTSSHOW::RTS_RecData() { - uint8_t receivedbyte; - while (DWIN_SERIAL.available()) - switch (rx_datagram_state) { - - case DGUS_IDLE: // Waiting for the first header byte - receivedbyte = DWIN_SERIAL.read(); - if (FHONE == receivedbyte) rx_datagram_state = DGUS_HEADER1_SEEN; - break; - - case DGUS_HEADER1_SEEN: // Waiting for the second header byte - receivedbyte = DWIN_SERIAL.read(); - rx_datagram_state = (FHTWO == receivedbyte) ? DGUS_HEADER2_SEEN : DGUS_IDLE; - break; - - case DGUS_HEADER2_SEEN: // Waiting for the length byte - rx_datagram_len = DWIN_SERIAL.read(); - //DEBUGLCDCOMM_ECHOPGM(" (", rx_datagram_len, ") "); - - // Telegram min len is 3 (command and one word of payload) - rx_datagram_state = WITHIN(rx_datagram_len, 3, DGUS_RX_BUFFER_SIZE) ? DGUS_WAIT_TELEGRAM : DGUS_IDLE; - break; - - case DGUS_WAIT_TELEGRAM: // wait for complete datagram to arrive. - if (DWIN_SERIAL.available() < rx_datagram_len) return -1; - - Initialized = true; // We've talked to it, so we defined it as initialized. - uint8_t command = DWIN_SERIAL.read(); - - //DEBUGLCDCOMM_ECHOPGM("# ", command); - - uint8_t readlen = rx_datagram_len - 1; // command is part of len. - uint8_t tmp[rx_datagram_len - 1]; - uint8_t *ptmp = tmp; - while (readlen--) { - receivedbyte = DWIN_SERIAL.read(); - //DEBUGLCDCOMM_ECHOPGM(" ", receivedbyte); - *ptmp++ = receivedbyte; - } - //DEBUGLCDCOMM_ECHOPGM(" # "); - // mostly we'll get this: 5A A5 03 82 4F 4B -- ACK on 0x82, so discard it. - if (command == VarAddr_W && 'O' == tmp[0] && 'K' == tmp[1]) { - rx_datagram_state = DGUS_IDLE; - break; - } - - /* AutoUpload, (and answer to) Command 0x83 : - | tmp[0 1 2 3 4 ... ] - | Example 5A A5 06 83 20 01 01 78 01 …… - | / / | | \ / | \ \ - | Header | | | | \_____\_ DATA (Words!) - | DatagramLen / VPAdr | - | Command DataLen (in Words) */ - if (command == VarAddr_R) { - const uint16_t vp = tmp[0] << 8 | tmp[1]; - - const uint8_t dlen = tmp[2] << 1; // Convert to Bytes. (Display works with words) - recdat.addr = vp; - recdat.len = tmp[2]; - for (uint16_t i = 0; i < dlen; i += 2) { - recdat.data[i / 2] = tmp[3 + i]; - recdat.data[i / 2] = (recdat.data[i / 2] << 8 ) | tmp[4 + i]; - } - - rx_datagram_state = DGUS_IDLE; - return 2; - break; - } - - // discard anything else - rx_datagram_state = DGUS_IDLE; - } - return -1; - } - - void RTSSHOW::RTS_SndData() { - if (snddat.head[0] == FHONE && snddat.head[1] == FHTWO && snddat.len >= 3) { - databuf[0] = snddat.head[0]; - databuf[1] = snddat.head[1]; - databuf[2] = snddat.len; - databuf[3] = snddat.command; - if (snddat.command == 0x80) { // to write data to the register - databuf[4] = snddat.addr; - for (int16_t i = 0; i < (snddat.len - 2); i++) databuf[5 + i] = snddat.data[i]; - } - else if (snddat.len == 3 && (snddat.command == 0x81)) { // to read data from the register - databuf[4] = snddat.addr; - databuf[5] = snddat.bytelen; - } - else if (snddat.command == 0x82) { // to write data to the variate - databuf[4] = snddat.addr >> 8; - databuf[5] = snddat.addr & 0xFF; - for (int16_t i = 0; i < (snddat.len - 3); i += 2) { - databuf[6 + i] = snddat.data[i / 2] >> 8; - databuf[7 + i] = snddat.data[i / 2] & 0xFF; - } - } - else if (snddat.len == 4 && (snddat.command == 0x83)) { // to read data from the variate - databuf[4] = snddat.addr >> 8; - databuf[5] = snddat.addr & 0xFF; - databuf[6] = snddat.bytelen; - } - for (int16_t i = 0; i < (snddat.len + 3); i++) { - DWIN_SERIAL.write(databuf[i]); - delay_us(1); - } - - memset(&snddat, 0, sizeof(snddat)); - ZERO(databuf); - snddat.head[0] = FHONE; - snddat.head[1] = FHTWO; - } - } - - void RTSSHOW::RTS_SndData(const String &s, uint32_t addr, uint8_t cmd/*=VarAddr_W*/) { - if (s.length() < 1) return; - RTS_SndData(s.c_str(), addr, cmd); - } - - void RTSSHOW::RTS_SndData(const char *str, uint32_t addr, uint8_t cmd/*=VarAddr_W*/) { - int16_t len = strlen(str); - constexpr int16_t maxlen = SizeofDatabuf - 6; - if (len > 0) { - if (len > maxlen) len = maxlen; - databuf[0] = FHONE; - databuf[1] = FHTWO; - databuf[2] = 3 + len; - databuf[3] = cmd; - databuf[4] = addr >> 8; - databuf[5] = addr & 0x00FF; - for (int16_t i = 0; i < len; i++) databuf[6 + i] = str[i]; - - for (int16_t i = 0; i < (len + 6); i++) { - DWIN_SERIAL.write(databuf[i]); - delay_us(1); - } - ZERO(databuf); - } - } - - void RTSSHOW::RTS_SndData(const char c, const uint32_t addr, const uint8_t cmd/*=VarAddr_W*/) { - snddat.command = cmd; - snddat.addr = addr; - snddat.data[0] = uint32_t(uint16_t(c) << 8); - snddat.len = 5; - RTS_SndData(); - } - - void RTSSHOW::RTS_SndData(const_float_t f, const uint32_t addr, const uint8_t cmd/*=VarAddr_W*/) { - int16_t n = f; - if (cmd == VarAddr_W) { - snddat.data[0] = n; - snddat.len = 5; - } - else if (cmd == RegAddr_W) { - snddat.data[0] = n; - snddat.len = 3; - } - else if (cmd == VarAddr_R) { - snddat.bytelen = n; - snddat.len = 4; - } - snddat.command = cmd; - snddat.addr = addr; - RTS_SndData(); - } - - void RTSSHOW::RTS_SndData(const int n, const uint32_t addr, const uint8_t cmd/*=VarAddr_W*/) { - if (cmd == VarAddr_W) { - if ((unsigned int)n > 0xFFFF) { - snddat.data[0] = n >> 16; - snddat.data[1] = n & 0xFFFF; - snddat.len = 7; - } - else { - snddat.data[0] = n; - snddat.len = 5; - } - } - else if (cmd == RegAddr_W) { - snddat.data[0] = n; - snddat.len = 3; - } - else if (cmd == VarAddr_R) { - snddat.bytelen = n; - snddat.len = 4; - } - snddat.command = cmd; - snddat.addr = addr; - RTS_SndData(); - } - - void RTSSHOW::RTS_SndData(const unsigned long n, uint32_t addr, uint8_t cmd/*=VarAddr_W*/) { - if (cmd == VarAddr_W) { - if (n > 0xFFFF) { - snddat.data[0] = n >> 16; - snddat.data[1] = n & 0xFFFF; - //snddat.data[0] = n >> 24; - //snddat.data[1] = n >> 16; - //snddat.data[2] = n >> 8; - //snddat.data[3] = n; - snddat.len = 7; - } - else { - snddat.data[0] = n; - snddat.len = 5; - } - } - else if (cmd == VarAddr_R) { - snddat.bytelen = n; - snddat.len = 4; - } - snddat.command = cmd; - snddat.addr = addr; - RTS_SndData(); - } - - void RTSSHOW::RTS_HandleData() { - int16_t Checkkey = -1; - if (waitway > 0) { // for waiting - memset(&recdat, 0, sizeof(recdat)); - recdat.head[0] = FHONE; - recdat.head[1] = FHTWO; - return; - } - for (int16_t i = 0; Addrbuf[i] != 0; i++) - if (recdat.addr == Addrbuf[i]) { - if (Addrbuf[i] == NzBdSet || Addrbuf[i] == NozzlePreheat || Addrbuf[i] == BedPreheat || Addrbuf[i] == Flowrate) - Checkkey = ManualSetTemp; - else if (WITHIN(Addrbuf[i], Stopprint, Resumeprint)) - Checkkey = PrintChoice; - else if (WITHIN(Addrbuf[i], AutoZero, DisplayZaxis)) - Checkkey = XYZEaxis; - else if (WITHIN(Addrbuf[i], FilamentUnit1, FilamentUnit2)) - Checkkey = Filament; - else - Checkkey = i; - break; - } - - switch (recdat.addr) { - case Flowrate: - case StepMM_X ... StepMM_E: - case ProbeOffset_X ... ProbeOffset_Y: - case HotendPID_AutoTmp ... BedPID_AutoTmp: - case HotendPID_P ... HotendPID_D: - case BedPID_P ... BedPID_D: - case T2Offset_X ... T2StepMM_E: - case Accel_X ... Accel_E: - case Feed_X ... Feed_E: - case Jerk_X ... Jerk_E: - case RunoutToggle: - case PowerLossToggle: - case FanKeyIcon: - case LedToggle: - case e2Preheat: Checkkey = ManualSetTemp; break; - case ProbeOffset_Z: Checkkey = Zoffset_Value; break; - case VolumeDisplay: Checkkey = VolumeDisplay; break; - case DisplayBrightness: Checkkey = DisplayBrightness; break; - case DisplayStandbyBrightness: Checkkey = DisplayStandbyBrightness; break; - case DisplayStandbySeconds: Checkkey = DisplayStandbySeconds; break; - default: - if (WITHIN(recdat.addr, AutolevelVal, 4400)) // (int16_t(AutolevelVal) + GRID_MAX_POINTS * 2) = 4400 with 5x5 mesh - Checkkey = AutolevelVal; - else if (WITHIN(recdat.addr, SDFILE_ADDR, SDFILE_ADDR + 10 * (FileNum + 1))) - Checkkey = Filename; - break; - } - - if (Checkkey < 0) { - memset(&recdat, 0, sizeof(recdat)); - recdat.head[0] = FHONE; - recdat.head[1] = FHTWO; - return; - } - - constexpr float lfrb[4] = BED_TRAMMING_INSET_LFRB; - - switch (Checkkey) { - case Printfile: - if (recdat.data[0] == 1) { // card - InforShowStatus = false; - filenavigator.getFiles(0); - fileIndex = 0; - recordcount = 0; - RTS_SndData(ExchangePageBase + 46, ExchangepageAddr); - } - else if (recdat.data[0] == 2) { // return after printing result. - InforShowStatus = true; - TPShowStatus = false; - stopPrint(); - injectCommands(F("M84")); - RTS_SndData(11, FilenameIcon); - RTS_SndData(0, PrintscheduleIcon); - RTS_SndData(0, PrintscheduleIcon + 1); - RTS_SndData(0, Percentage); - delay_ms(2); - RTS_SndData(0, Timehour); - RTS_SndData(0, Timemin); - - RTS_SndData(ExchangePageBase + 45, ExchangepageAddr); // exchange to 45 page - } - else if (recdat.data[0] == 3) { // Temperature control - InforShowStatus = true; - TPShowStatus = false; - if (getTargetFan_percent((fan_t)getActiveTool()) == 0) - RTS_SndData(ExchangePageBase + 58, ExchangepageAddr); // exchange to 58 page, the fans off - else - RTS_SndData(ExchangePageBase + 57, ExchangepageAddr); // exchange to 57 page, the fans on - } - else if (recdat.data[0] == 4) { // Settings - InforShowStatus = false; - } - break; - - case Adjust: - if (recdat.data[0] == 1) { - InforShowStatus = false; - } - else if (recdat.data[0] == 2) { - InforShowStatus = true; - if (PrinterStatusKey[1] == 3) // during heating - RTS_SndData(ExchangePageBase + 53, ExchangepageAddr); - else if (PrinterStatusKey[1] == 4) - RTS_SndData(ExchangePageBase + 54, ExchangepageAddr); - else - RTS_SndData(ExchangePageBase + 53, ExchangepageAddr); - } - else if (recdat.data[0] == 3) - setTargetFan_percent(getTargetFan_percent((fan_t)getActiveTool()) != 0 ? 100 : 0, FAN0); - - break; - - case Feedrate: - setFeedrate_percent(recdat.data[0]); - break; - - case PrintChoice: - if (recdat.addr == Stopprint) { - if (recdat.data[0] == 240) { // no - RTS_SndData(ExchangePageBase + 53, ExchangepageAddr); - } - else { - RTS_SndData(ExchangePageBase + 45, ExchangepageAddr); - RTS_SndData(0, Timehour); - RTS_SndData(0, Timemin); - stopPrint(); - } - } - else if (recdat.addr == Pauseprint) { - if (recdat.data[0] != 0xF1) - break; - - RTS_SndData(ExchangePageBase + 54, ExchangepageAddr); - pausePrint(); - } - else if (recdat.addr == Resumeprint && recdat.data[0] == 1) { - resumePrint(); - - PrinterStatusKey[1] = 0; - InforShowStatus = true; - - RTS_SndData(ExchangePageBase + 53, ExchangepageAddr); - } - if (recdat.addr == Resumeprint && recdat.data[0] == 2) { // warming - resumePrint(); - NozzleTempStatus[2] = 1; - PrinterStatusKey[1] = 0; - InforShowStatus = true; - RTS_SndData(ExchangePageBase + 82, ExchangepageAddr); - } - break; - - case Zoffset: - float tmp_zprobe_offset; - if (recdat.data[0] >= 32768) - tmp_zprobe_offset = (float(recdat.data[0]) - 65536) / 100; - else - tmp_zprobe_offset = float(recdat.data[0]) / 100; - if (WITHIN((tmp_zprobe_offset), Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { - int16_t tmpSteps = mmToWholeSteps(getZOffset_mm() - tmp_zprobe_offset, axis_t(Z)); - if (tmpSteps == 0) tmpSteps = getZOffset_mm() < tmp_zprobe_offset ? 1 : -1; - smartAdjustAxis_steps(-tmpSteps, axis_t(Z), false); - char zOffs[20], tmp1[11]; - sprintf_P(zOffs, PSTR("Z Offset : %s"), dtostrf(getZOffset_mm(), 1, 3, tmp1)); - onStatusChanged(zOffs); - } - else { - onStatusChanged(F("Requested Offset Beyond Limits")); - } - - rtscheck.RTS_SndData(getZOffset_mm() * 100, ProbeOffset_Z); - break; - - case TempControl: - if (recdat.data[0] == 0) { - InforShowStatus = true; - TPShowStatus = false; - } - else if (recdat.data[0] == 1) { - if (getTargetFan_percent((fan_t)getActiveTool()) == 0) - RTS_SndData(ExchangePageBase + 60, ExchangepageAddr); // exchange to 60 page, the fans off - else - RTS_SndData(ExchangePageBase + 59, ExchangepageAddr); // exchange to 59 page, the fans on - } - else if (recdat.data[0] == 2) { - InforShowStatus = true; - } - else if (recdat.data[0] == 3) { - if (getTargetFan_percent((fan_t)getActiveTool()) == 0) { // turn on the fan - setTargetFan_percent(100, FAN0); - RTS_SndData(ExchangePageBase + 57, ExchangepageAddr); // exchange to 57 page, the fans on - } - else { // turn off the fan - setTargetFan_percent(0, FAN0); - RTS_SndData(ExchangePageBase + 58, ExchangepageAddr); // exchange to 58 page, the fans on - } - } - else if (recdat.data[0] == 5) { // PLA mode - setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, getActiveTool()); - setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); - RTS_SndData(PREHEAT_1_TEMP_HOTEND, NozzlePreheat); - RTS_SndData(PREHEAT_1_TEMP_BED, BedPreheat); - } - else if (recdat.data[0] == 6) { // ABS mode - setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, getActiveTool()); - setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); - RTS_SndData(PREHEAT_2_TEMP_HOTEND, NozzlePreheat); - RTS_SndData(PREHEAT_2_TEMP_BED, BedPreheat); - } - else if (recdat.data[0] == 0xF1) { - //InforShowStatus = true; - #if FAN_COUNT > 0 - for (uint8_t i = 0; i < FAN_COUNT; i++) setTargetFan_percent(0, (fan_t)i); - #endif - setTargetTemp_celsius(0.0, H0); - TERN_(HAS_MULTI_HOTEND, setTargetTemp_celsius(0.0, H1)); - setTargetTemp_celsius(0.0, BED); - RTS_SndData(0, NozzlePreheat); delay_ms(1); - RTS_SndData(0, BedPreheat); delay_ms(1); - RTS_SndData(ExchangePageBase + 57, ExchangepageAddr); - PrinterStatusKey[1] = 2; - } - break; - - case ManualSetTemp: - if (recdat.addr == NzBdSet) { - if (recdat.data[0] == 0) { - if (getTargetFan_percent((fan_t)getActiveTool()) == 0) - RTS_SndData(ExchangePageBase + 58, ExchangepageAddr); // exchange to 58 page, the fans off - else - RTS_SndData(ExchangePageBase + 57, ExchangepageAddr); // exchange to 57 page, the fans on - } - else if (recdat.data[0] == 1) { - setTargetTemp_celsius(0.0, getActiveTool()); - RTS_SndData(0, NozzlePreheat); - } - else if (recdat.data[0] == 2) { - setTargetTemp_celsius(0.0, BED); - RTS_SndData(0, BedPreheat); - } - } - else if (recdat.addr == NozzlePreheat) { - setTargetTemp_celsius(float(recdat.data[0]), H0); - } - #if HAS_MULTI_HOTEND - else if (recdat.addr == e2Preheat) { - setTargetTemp_celsius(float(recdat.data[0]), H1); - } - #endif - else if (recdat.addr == BedPreheat) { - setTargetTemp_celsius(float(recdat.data[0]), BED); - } - else if (recdat.addr == Flowrate) { - setFlow_percent(int16_t(recdat.data[0]), getActiveTool()); - } - - #if HAS_PID_HEATING - else if (recdat.addr == HotendPID_AutoTmp) { - pid_hotendAutoTemp = uint16_t(recdat.data[0]); - } - else if (recdat.addr == BedPID_AutoTmp) { - pid_bedAutoTemp = uint16_t(recdat.data[0]); - } - #endif - - else if (recdat.addr == Accel_X) { - setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]) * 100, X); - } - else if (recdat.addr == Accel_Y) { - setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]) * 100, Y); - } - else if (recdat.addr == Accel_Z) { - setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]) * 10, Z); - } - else if (recdat.addr == Accel_E) { - setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]), E0); - setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]), E1); - } - - else if (recdat.addr == Feed_X) { - setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), X); - } - else if (recdat.addr == Feed_Y) { - setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), Y); - } - else if (recdat.addr == Feed_Z) { - setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), Z); - } - else if (recdat.addr == Feed_E) { - setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), E0); - setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), E1); - } - else if (recdat.addr == FanKeyIcon) { - setTargetFan_percent(uint16_t(recdat.data[0]), (fan_t)getActiveTool()); - } - else { - float tmp_float_handling; - if (recdat.data[0] >= 32768) - tmp_float_handling = (float(recdat.data[0]) - 65536) / 100; - else - tmp_float_handling = float(recdat.data[0]) / 100; - if (recdat.addr == StepMM_X) { - setAxisSteps_per_mm(tmp_float_handling * 10, X); - } - else if (recdat.addr == StepMM_Y) { - setAxisSteps_per_mm(tmp_float_handling * 10, Y); - } - else if (recdat.addr == StepMM_Z) { - setAxisSteps_per_mm(tmp_float_handling * 10, Z); - } - else if (recdat.addr == StepMM_E) { - setAxisSteps_per_mm(tmp_float_handling * 10, E0); - #if DISABLED(DUAL_X_CARRIAGE) - setAxisSteps_per_mm(tmp_float_handling * 10, E1); - #endif - } - #if ENABLED(DUAL_X_CARRIAGE) - else if (recdat.addr == T2StepMM_E) { - setAxisSteps_per_mm(tmp_float_handling * 10, E1); - } - else if (recdat.addr == T2Offset_X) { - setNozzleOffset_mm(tmp_float_handling * 10, X, E1); - } - else if (recdat.addr == T2Offset_Y) { - setNozzleOffset_mm(tmp_float_handling * 10, Y, E1); - } - else if (recdat.addr == T2Offset_Z) { - setNozzleOffset_mm(tmp_float_handling * 10, Z, E1); - } - #endif - #if HAS_BED_PROBE - else if (recdat.addr == ProbeOffset_X) { - setProbeOffset_mm(tmp_float_handling, X); - } - else if (recdat.addr == ProbeOffset_Y) { - setProbeOffset_mm(tmp_float_handling, Y); - } - else if (recdat.addr == ProbeOffset_Z) { - setProbeOffset_mm(tmp_float_handling, Z); - } - #endif - - #if ENABLED(CLASSIC_JERK) - else if (recdat.addr == Jerk_X) { - setAxisMaxJerk_mm_s(tmp_float_handling, X); - } - else if (recdat.addr == Jerk_Y) { - setAxisMaxJerk_mm_s(tmp_float_handling, Y); - } - else if (recdat.addr == Jerk_Z) { - setAxisMaxJerk_mm_s(tmp_float_handling, Z); - } - else if (recdat.addr == Jerk_E) { - setAxisMaxJerk_mm_s(tmp_float_handling, E0); - setAxisMaxJerk_mm_s(tmp_float_handling, E1); - } - #endif - - #if HAS_FILAMENT_SENSOR - else if (recdat.addr == RunoutToggle) { - setFilamentRunoutEnabled(!getFilamentRunoutEnabled()); - } - #endif - - #if ENABLED(POWER_LOSS_RECOVERY) - else if (recdat.addr == PowerLossToggle) { - setPowerLossRecoveryEnabled(!getPowerLossRecoveryEnabled()); - } - #endif - - #if ENABLED(CASE_LIGHT_ENABLE) - else if (recdat.addr == LedToggle) { - setCaseLightState(!getCaseLightState()); - } - #endif - - #if HAS_PID_HEATING - else if (recdat.addr == HotendPID_P) { - setPID(tmp_float_handling * 10, getPID_Ki(getActiveTool()), getPID_Kd(getActiveTool()), getActiveTool()); - } - else if (recdat.addr == HotendPID_I) { - setPID(getPID_Kp(getActiveTool()), tmp_float_handling * 10, getPID_Kd(getActiveTool()), getActiveTool()); - } - else if (recdat.addr == HotendPID_D) { - setPID(getPID_Kp(getActiveTool()), getPID_Ki(getActiveTool()), tmp_float_handling * 10, getActiveTool()); - } - #if ENABLED(PIDTEMPBED) - else if (recdat.addr == BedPID_P) { - setBedPID(tmp_float_handling * 10, getBedPID_Ki(), getBedPID_Kd()); - } - else if (recdat.addr == BedPID_I) { - setBedPID(getBedPID_Kp(), tmp_float_handling * 10, getBedPID_Kd()); - } - else if (recdat.addr == BedPID_D) { - setBedPID(getBedPID_Kp(), getBedPID_Ki(), tmp_float_handling * 10); - } - #endif - #endif // HAS_PID_HEATING - } - break; - - case Setting: - if (recdat.data[0] == 0) { // return to main page - InforShowStatus = true; - TPShowStatus = false; - } - else if (recdat.data[0] == 1) { // Bed Autoleveling - #if HAS_MESH - RTS_SndData(getLevelingActive() ? 3 : 2, AutoLevelIcon); - - if (ExtUI::getMeshValid()) { - uint8_t abl_probe_index = 0; - for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) - for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { - const bool zig = outer & 1; - const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; - rtscheck.RTS_SndData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + abl_probe_index * 2); - ++abl_probe_index; - } - } - #endif - RTS_SndData(10, FilenameIcon); // Motor Icon - injectCommands(isPositionKnown() ? F("G1F1000Z0.0") : F("G28\nG1F1000Z0.0")); - waitway = 2; - RTS_SndData(ExchangePageBase + 64, ExchangepageAddr); - } - else if (recdat.data[0] == 2) { // Exchange filament - InforShowStatus = true; - TPShowStatus = false; - ZERO(ChangeMaterialbuf); - ChangeMaterialbuf[1] = ChangeMaterialbuf[0] = 10; - RTS_SndData(10 * ChangeMaterialbuf[0], FilamentUnit1); // It's ChangeMaterialbuf for show,instead of current_position[E_AXIS] in them. - RTS_SndData(10 * ChangeMaterialbuf[1], FilamentUnit2); - RTS_SndData(getActualTemp_celsius(H0), NozzleTemp); - RTS_SndData(getTargetTemp_celsius(H0), NozzlePreheat); - rtscheck.RTS_SndData(TERN0(HAS_MULTI_HOTEND, getActualTemp_celsius(H1)), e2Temp); - rtscheck.RTS_SndData(TERN0(HAS_MULTI_HOTEND, getTargetTemp_celsius(H1)), e2Preheat); - delay_ms(2); - RTS_SndData(ExchangePageBase + 65, ExchangepageAddr); - } - else if (recdat.data[0] == 3) { // Move - AxisPagenum = 0; - RTS_SndData(ExchangePageBase + 71, ExchangepageAddr); - } - else if (recdat.data[0] == 4) { // Language - // Just loads language screen, now used for tools - } - else if (recdat.data[0] == 5) { // Printer Information - RTS_SndData(WEBSITE_URL, CorpWebsite); - } - else if (recdat.data[0] == 6) { // Diabalestepper - injectCommands(F("M84")); - RTS_SndData(11, FilenameIcon); - } - break; - - case ReturnBack: - if (recdat.data[0] == 1) { // return to the tool page - InforShowStatus = false; - RTS_SndData(ExchangePageBase + 63, ExchangepageAddr); - } - if (recdat.data[0] == 2) // return to the Level mode page - RTS_SndData(ExchangePageBase + 64, ExchangepageAddr); - break; - - case Bedlevel: - switch (recdat.data[0]) { - case 1: { // Z-axis to home - // Disallow Z homing if X or Y are unknown - injectCommands(isAxisPositionKnown(axis_t(X)) && isAxisPositionKnown(axis_t(Y)) ? F("G28Z\nG1F1500Z0.0") : F("G28\nG1F1500Z0.0")); - RTS_SndData(getZOffset_mm() * 100, ProbeOffset_Z); - break; - } - case 2: { // Z-axis to Up - if (WITHIN((getZOffset_mm() + 0.1), Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { - smartAdjustAxis_steps(getAxisSteps_per_mm(Z) / 10, axis_t(Z), false); - //setZOffset_mm(getZOffset_mm() + 0.1); - RTS_SndData(getZOffset_mm() * 100, ProbeOffset_Z); - char zOffs[20], tmp1[11]; - sprintf_P(zOffs, PSTR("Z Offset : %s"), dtostrf(getZOffset_mm(), 1, 3, tmp1)); - onStatusChanged(zOffs); - } - break; - } - case 3: { // Z-axis to Down - if (WITHIN((getZOffset_mm() - 0.1), Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { - smartAdjustAxis_steps(-getAxisSteps_per_mm(Z) / 10, axis_t(Z), false); - //babystepAxis_steps(int16_t(-getAxisSteps_per_mm(Z)) / 10, axis_t(Z)); - //setZOffset_mm(getZOffset_mm() - 0.1); - RTS_SndData(getZOffset_mm() * 100, ProbeOffset_Z); - char zOffs[20], tmp1[11]; - sprintf_P(zOffs, PSTR("Z Offset : %s"), dtostrf(getZOffset_mm(), 1, 3, tmp1)); - onStatusChanged(zOffs); - } - break; - } - case 4: { // Assistant Level - TERN_(HAS_MESH, setLevelingActive(false)); - injectCommands(isPositionKnown() ? F("G1 F1000 Z0.0") : F("G28\nG1 F1000 Z0.0")); - waitway = 2; - RTS_SndData(ExchangePageBase + 84, ExchangepageAddr); - break; - } - case 5: { // AutoLevel "Measuring" Button - #if ENABLED(MESH_BED_LEVELING) - RTS_SndData(ExchangePageBase + 93, ExchangepageAddr); - #else - waitway = 3; // only for prohibiting to receive massage - RTS_SndData(3, AutolevelIcon); - uint8_t abl_probe_index = 0; - while (abl_probe_index < 25) { - rtscheck.RTS_SndData(0, AutolevelVal + abl_probe_index * 2); - ++abl_probe_index; - } - RTS_SndData(ExchangePageBase + 64, ExchangepageAddr); - injectCommands(F(MEASURING_GCODE)); - #endif - break; - } - - case 6: { // Assitant Level , Centre 1 - setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); - setAxisPosition_mm(X_CENTER, axis_t(X)); - setAxisPosition_mm(Y_CENTER, axis_t(Y)); - waitway = 6; - break; - } - case 7: { // Assitant Level , Front Left 2 - setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); - setAxisPosition_mm(X_MIN_BED + lfrb[0], axis_t(X)); - setAxisPosition_mm(Y_MIN_BED + lfrb[1], axis_t(Y)); - waitway = 6; - break; - } - case 8: { // Assitant Level , Front Right 3 - setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); - setAxisPosition_mm(X_MAX_BED - lfrb[2], axis_t(X)); - setAxisPosition_mm(Y_MIN_BED + lfrb[1], axis_t(Y)); - waitway = 6; - break; - } - case 9: { // Assitant Level , Back Right 4 - setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); - setAxisPosition_mm(X_MAX_BED - lfrb[2], axis_t(X)); - setAxisPosition_mm(Y_MAX_BED - lfrb[3], axis_t(Y)); - waitway = 6; - break; - } - case 10: { // Assitant Level , Back Left 5 - setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); - setAxisPosition_mm(X_MIN_BED + lfrb[0], axis_t(X)); - setAxisPosition_mm(Y_MAX_BED - lfrb[3], axis_t(Y)); - waitway = 6; - break; - } - case 11: { // Autolevel switch - #if HAS_MESH - const bool gla = !getLevelingActive(); - setLevelingActive(gla); - RTS_SndData(gla ? 3 : 2, AutoLevelIcon); - #endif - RTS_SndData(getZOffset_mm() * 100, ProbeOffset_Z); - break; - } - case 12: { - injectCommands(F("G26R255")); - onStatusChanged(F("Beginning G26.. Heating")); - break; - } - case 13: { - injectCommands(F("G29S1")); - onStatusChanged(F("Begin Manual Mesh")); - break; - } - case 14: { - injectCommands(F("G29S2")); - onStatusChanged(F("Moving to Next Mesh Point")); - break; - } - case 15: { - injectCommands(F("M211S0\nG91\nG1Z-0.025\nG90\nM211S1")); - onStatusChanged(F("Moved down 0.025")); - break; - } - case 16: { - injectCommands(F("M211S0\nG91\nG1Z0.025\nG90\nM211S1")); - onStatusChanged(F("Moved up 0.025")); - break; - } - case 17: { - Settings.display_volume = 0; - Settings.display_sound = false; - SetTouchScreenConfiguration(); - break; - } - case 18: { - Settings.display_volume = 255; - Settings.display_sound = true; - SetTouchScreenConfiguration(); - break; - } - case 19: { - Settings.screen_brightness = 10; - SetTouchScreenConfiguration(); - break; - } - case 20: { - Settings.screen_brightness = 100; - SetTouchScreenConfiguration(); - break; - } - case 21: { - Settings.display_standby ^= true; - SetTouchScreenConfiguration(); - break; - } - case 22: { - Settings.screen_rotation = Settings.screen_rotation == 10 ? 0 : 10; - SetTouchScreenConfiguration(); - break; - } - case 23: { // Set IDEX Autopark - injectCommands(F("M605S1\nG28X\nG1X0")); - break; - } - case 24: { // Set IDEX Duplication - injectCommands(F("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0")); - break; - } - case 25: { // Set IDEX Mirrored Duplication - injectCommands(F("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0\nM605S3")); - break; - } - case 26: { // Set IDEX Full Control - injectCommands(F("M605S0\nG28X")); - break; - } - case 27: { // Change Tool - setActiveTool(getActiveTool() == E0 ? E1 : E0, !isAxisPositionKnown(X)); - break; - } - default: break; - } - - RTS_SndData(10, FilenameIcon); - break; - - case XYZEaxis: { - axis_t axis = X; - float min = 0.0f, max = 0.0f; - waitway = 4; - if (recdat.addr == DisplayXaxis) { - axis = X; - min = X_MIN_POS; - max = X_MAX_POS; - } - else if (recdat.addr == DisplayYaxis) { - axis = Y; - min = Y_MIN_POS; - max = Y_MAX_POS; - } - else if (recdat.addr == DisplayZaxis) { - axis = Z; - min = Z_MIN_POS; - max = Z_MAX_POS; - } - else if (recdat.addr == AutoZero) { - if (recdat.data[0] == 3) { // autohome - waitway = 4; - injectCommands(F("G28\nG1 F1000 Z10")); - InforShowStatus = AutohomeKey = true; - AutoHomeIconNum = 0; - RTS_SndData(10, FilenameIcon); - } - else { - AxisPagenum = recdat.data[0]; - waitway = 0; - } - break; - } - - float targetPos = float(recdat.data[0]) / 10; - LIMIT(targetPos, min, max); - setAxisPosition_mm(targetPos, axis); - waitway = 0; - RTS_SndData(10, FilenameIcon); - break; - } - - case Filament: - - uint16_t IconTemp; - if (recdat.addr == Exchfilament) { - if (getActualTemp_celsius(getActiveTool()) < EXTRUDE_MINTEMP && recdat.data[0] < 5) { - RTS_SndData(int16_t(EXTRUDE_MINTEMP), 0x1020); - delay_ms(5); - RTS_SndData(ExchangePageBase + 66, ExchangepageAddr); - break; - } - - switch (recdat.data[0]) { - case 1: { // Unload filament1 - setAxisPosition_mm(getAxisPosition_mm(E0) - ChangeMaterialbuf[0], E0); - break; - } - case 2: { // Load filament1 - setAxisPosition_mm(getAxisPosition_mm(E0) + ChangeMaterialbuf[0], E0); - break; - } - case 3: { // Unload filament2 - setAxisPosition_mm(getAxisPosition_mm(E1) - ChangeMaterialbuf[1], E1); - break; - } - case 4: { // Load filament2 - setAxisPosition_mm(getAxisPosition_mm(E1) + ChangeMaterialbuf[1], E1); - break; - } - case 5: { // sure to heat - NozzleTempStatus[0] = 1; - - setTargetTemp_celsius((PREHEAT_1_TEMP_HOTEND + 10), getActiveTool()); - IconTemp = getActualTemp_celsius(getActiveTool()) * 100 / getTargetTemp_celsius(getActiveTool()); - NOMORE(IconTemp, 100U); - RTS_SndData(IconTemp, HeatPercentIcon); - - RTS_SndData(getActualTemp_celsius(H0), NozzleTemp); - RTS_SndData(getTargetTemp_celsius(H0), NozzlePreheat); - rtscheck.RTS_SndData(TERN0(HAS_MULTI_HOTEND, getActualTemp_celsius(H1)), e2Temp); - rtscheck.RTS_SndData(TERN0(HAS_MULTI_HOTEND, getTargetTemp_celsius(H1)), e2Preheat); - delay_ms(5); - RTS_SndData(ExchangePageBase + 68, ExchangepageAddr); - break; - } - case 6: { // cancel to heat - RTS_SndData(ExchangePageBase + 65, ExchangepageAddr); - break; - } - case 0xF1: { // Sure to cancel heating - NozzleTempStatus[0] = 0; - delay_ms(1); - RTS_SndData(ExchangePageBase + 65, ExchangepageAddr); - break; - } - case 0xF0: // not to cancel heating - break; - } - RTS_SndData(10 * ChangeMaterialbuf[0], FilamentUnit1); // It's ChangeMaterialbuf for show,instead of current_position[E_AXIS] in them. - RTS_SndData(10 * ChangeMaterialbuf[1], FilamentUnit2); - } - else if (recdat.addr == FilamentUnit1) { - ChangeMaterialbuf[0] = float(recdat.data[0]) / 10; - } - else if (recdat.addr == FilamentUnit2) { - ChangeMaterialbuf[1] = float(recdat.data[0]) / 10; - } - break; - - case LanguageChoice: - - //if (recdat.data[0] == 1) settings.save(); else injectCommands(F("M300")); - - // may at some point use language change screens to save eeprom explicitly - switch (recdat.data[0]) { - case 0: { - injectCommands(F("M500")); - break; - } - case 1: { - RTS_SndData(ExchangePageBase + 94, ExchangepageAddr); - break; - } - - #if ENABLED(PIDTEMP) - case 2: { - onStatusChanged(F("Hotend PID Started")); - startPIDTune(static_cast(pid_hotendAutoTemp), getActiveTool()); - break; - } - #endif - - case 3: { - injectCommands(F("M502\nM500")); - break; - } - case 4: { - injectCommands(F("M999\nM280P0S160")); - break; - } - - case 5: { - #if ENABLED(PIDTEMPBED) - onStatusChanged(F("Bed PID Started")); - startBedPIDTune(static_cast(pid_bedAutoTemp)); - #endif - break; - } - case 6: { - injectCommands(F("M500")); - break; - } - default: break; - } - break; - - case No_Filament: - if (recdat.data[0] == 1) { // Filament is out, resume / resume selected on screen - if (ExtUI::pauseModeStatus != PAUSE_MESSAGE_PURGE && ExtUI::pauseModeStatus != PAUSE_MESSAGE_OPTION) { - // setPauseMenuResponse(PAUSE_RESPONSE_RESUME_PRINT); - setUserConfirmed(); - // PrinterStatusKey[1] = 3; - // pause_resume_selected = true; - } - else { - #if ENABLED(FILAMENT_RUNOUT_SENSOR) - bool runouton = false; - if (getFilamentRunoutState()) { - #if NUM_RUNOUT_SENSORS > 1 - if ((runouton = getFilamentRunoutEnabled(getActiveTool()))) - ExtUI::setFilamentRunoutEnabled(false, getActiveTool()); - #else - if ((runouton = getFilamentRunoutEnabled())) - ExtUI::setFilamentRunoutEnabled(false); - #endif - } - #else - constexpr bool runouton = false; - #endif - if (!runouton) { - setPauseMenuResponse(PAUSE_RESPONSE_RESUME_PRINT); - setUserConfirmed(); - PrinterStatusKey[1] = 3; - pause_resume_selected = true; - } - } - } - else if (recdat.data[0] == 0) { // Filamet is out, Cancel Selected - if (ExtUI::pauseModeStatus == PAUSE_MESSAGE_PURGE || ExtUI::pauseModeStatus == PAUSE_MESSAGE_OPTION) { - setPauseMenuResponse(PAUSE_RESPONSE_EXTRUDE_MORE); - setUserConfirmed(); - } - } - break; - - #if ENABLED(POWER_LOSS_RECOVERY) - case PwrOffNoF: - if (recdat.data[0] == 1) // Yes: continue to print the 3Dmode during power-off. - injectCommands(F("M1000")); - else if (recdat.data[0] == 2) // No - injectCommands(F("M1000C")); - break; - #endif - - case Volume: - if (recdat.data[0] < 0) - Settings.display_volume = 0; - else if (recdat.data[0] > 255) - Settings.display_volume = 0xFF; - else - Settings.display_volume = recdat.data[0]; - - if (Settings.display_volume == 0) { - RTS_SndData(0, VolumeIcon); - RTS_SndData(9, SoundIcon); - } - else { - RTS_SndData((Settings.display_volume + 1) / 32 - 1, VolumeIcon); - RTS_SndData(8, SoundIcon); - } - RTS_SndData(Settings.display_volume << 8, SoundAddr + 1); - break; - - case Filename: - if (isMediaInserted() && recdat.addr == FilenameChs) { - - recordcount = recdat.data[0] - 1; - if (filenavigator.currentindex == 0 && filenavigator.folderdepth > 0 && (fileIndex + recordcount) == 0) { - filenavigator.upDIR(); - filenavigator.getFiles(0); - fileIndex = 0; - return; - } - - if (filenavigator.currentindex == 0 && filenavigator.folderdepth > 0) - recordcount = recordcount - 1; // account for return dir link in file index - - for (int16_t j = 1; j <= 4; j++) { // Clear filename BG Color and Frame - RTS_SndData(0xFFFFUL, FilenameNature + j * 16); // white - RTS_SndData(10, FilenameIcon1 + j); // clean - } - for (int16_t j = 0; j < 10; j++) // clear current filename - RTS_SndData(0, Choosefilename + j); - - if (filenavigator.getIndexisDir(fileIndex + recordcount)) { - filenavigator.changeDIR((char *)filenavigator.getIndexName(fileIndex + recordcount)); - filenavigator.getFiles(0); - fileIndex = 0; - return; - } - else { - RTS_SndData(filenavigator.getIndexName(fileIndex + recordcount), Choosefilename); - RTS_SndData(0x87F0UL, FilenameNature + recdat.data[0] * 16); // Change BG of selected line to Light Green - RTS_SndData(6, FilenameIcon1 + recdat.data[0]); // show frame - } - } - else if (recdat.addr == FilenamePlay) { - if (recdat.data[0] == 1 && isMediaInserted()) { // for sure - printFile(filenavigator.getIndexName(fileIndex + recordcount)); - - for (int16_t j = 0; j < 10; j++) // clean screen. - RTS_SndData(0, Printfilename + j); - - RTS_SndData(filenavigator.getIndexName(fileIndex + recordcount), Printfilename); - - delay_ms(4); - - RTS_SndData(ExchangePageBase + 53, ExchangepageAddr); - - TPShowStatus = InforShowStatus = true; - PrinterStatusKey[0] = 1; - PrinterStatusKey[1] = 3; - fileIndex = 0; - recordcount = 0; - } - else if (recdat.data[0] == 2) { // Page Down - if ((fileIndex + DISPLAY_FILES) < (filenavigator.maxFiles() + (filenavigator.folderdepth != 0))) { - fileIndex = fileIndex + DISPLAY_FILES; - // if(filenavigator.folderdepth!=0 && fileIndex!=0) //Shift to acknowledge Return DIR button on first page - // filenavigator.getFiles(fileIndex-1); - // else - filenavigator.getFiles(fileIndex); - // filenavigator.getFiles(filenavigator.currentindex+1); - } - } - else if (recdat.data[0] == 3) { // Page Up - if (fileIndex >= DISPLAY_FILES) { - fileIndex = fileIndex - DISPLAY_FILES; - // if(filenavigator.folderdepth!=0 && fileIndex!=0) //Shift to acknowledge Return DIR button on first page - // filenavigator.getFiles(filenavigator.currentindex-DISPLAY_FILES); - // else - filenavigator.getFiles(fileIndex); - } - } - else if (recdat.data[0] == 4) { // Page Up - injectCommands(F("M22\nM21")); - } - else if (recdat.data[0] == 0) { // return to main page - InforShowStatus = true; - TPShowStatus = false; - } - } - break; - - case VolumeDisplay: { - if (recdat.data[0] == 0) { - Settings.display_volume = 0; - Settings.display_sound = false; - } - else if (recdat.data[0] > 100) { - Settings.display_volume = 255; - Settings.display_sound = true; - } - else { - Settings.display_volume = (uint8_t)map(constrain(recdat.data[0], 0, 100), 0, 100, 0, 255); - Settings.display_sound = true; - } - SetTouchScreenConfiguration(); - break; - } - - case DisplayBrightness: { - if (recdat.data[0] < 10) - Settings.screen_brightness = 10; - else if (recdat.data[0] > 100) - Settings.screen_brightness = 100; - else - Settings.screen_brightness = (uint8_t)recdat.data[0]; - SetTouchScreenConfiguration(); - break; - } - - case DisplayStandbyBrightness: { - if (recdat.data[0] < 10) - Settings.standby_screen_brightness = 10; - else if (recdat.data[0] > 100) - Settings.standby_screen_brightness = 100; - else - Settings.standby_screen_brightness = (uint8_t)recdat.data[0]; - SetTouchScreenConfiguration(); - break; - } - - case DisplayStandbySeconds: { - if (recdat.data[0] < 5) - Settings.standby_time_seconds = 5; - else if (recdat.data[0] > 100) - Settings.standby_time_seconds = 100; - else - Settings.standby_time_seconds = (uint8_t)recdat.data[0]; - SetTouchScreenConfiguration(); - break; - } - - case AutolevelVal: { - uint8_t meshPoint = (recdat.addr - AutolevelVal) / 2, - yPnt = floor(meshPoint / GRID_MAX_POINTS_X), - xPnt = meshPoint - (yPnt * GRID_MAX_POINTS_X); - if (yPnt % 2 != 0) xPnt = (GRID_MAX_POINTS_X - 1) - xPnt; // zag row - - float meshVal = float(recdat.data[0] - (recdat.data[0] >= 32768 ? 65536 : 0)) / 1000; - - LIMIT(meshVal, Z_PROBE_LOW_POINT, Z_CLEARANCE_BETWEEN_PROBES); - xy_uint8_t point = { xPnt, yPnt }; - setMeshPoint(point, meshVal); - rtscheck.RTS_SndData(meshVal * 1000, recdat.addr); - break; - } - - default: break; - } - - memset(&recdat, 0, sizeof(recdat)); - recdat.head[0] = FHONE; - recdat.head[1] = FHTWO; - } - - void WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr=false, char fillChar=' ') { - const char* myvalues = static_cast(values); - bool strend = !myvalues; - DWIN_SERIAL.write(FHONE); - DWIN_SERIAL.write(FHTWO); - DWIN_SERIAL.write(valueslen + 3); - DWIN_SERIAL.write(0x82); - DWIN_SERIAL.write(adr >> 8); - DWIN_SERIAL.write(adr & 0xFF); - while (valueslen--) { - char x; - if (!strend) x = *myvalues++; - if ((isstr && !x) || strend) { - strend = true; - x = fillChar; - } - DWIN_SERIAL.write(x); - } - } - - void SetTouchScreenConfiguration() { - // Main configuration (System_Config) - LIMIT(Settings.screen_brightness, 10, 100); // Prevent a possible all-dark screen - LIMIT(Settings.standby_time_seconds, 10, 655); // Prevent a possible all-dark screen for standby, yet also don't go higher than the DWIN limitation - - uint8_t cfg_bits = 0x0 - | _BV(7) // 7: Enable Control ... TERN0(DWINOS_4, _BV(7)) - | _BV(5) // 5: load 22 touch file - | _BV(4) // 4: auto-upload should always be enabled - | (Settings.display_sound ? _BV(3) : 0) // 3: audio - | (Settings.display_standby ? _BV(2) : 0) // 2: backlight on standby - | (Settings.screen_rotation == 10 ? _BV(1) : 0) // 1 & 0: Inversion - #if LCD_SCREEN_ROTATE == 90 - | _BV(0) // Portrait Mode or 800x480 display has 0 point rotated 90deg from 480x272 display - #elif LCD_SCREEN_ROTATE - #error "Only 90° rotation is supported for the selected LCD." - #endif - ; - - const uint8_t config_set[] = { 0x5A, 0x00, TERN(DWINOS_4, 0x00, 0xFF), cfg_bits }; - WriteVariable(0x80 /*System_Config*/, config_set, sizeof(config_set)); - - // Standby brightness (LED_Config) - uint16_t dwinStandbyTimeSeconds = 100 * Settings.standby_time_seconds; /* milliseconds, but divided by 10 (not 5 like the docs say) */ - const uint8_t brightness_set[] = { - Settings.screen_brightness /*% active*/, - Settings.standby_screen_brightness /*% standby*/, - static_cast(dwinStandbyTimeSeconds >> 8), - static_cast(dwinStandbyTimeSeconds) - }; - WriteVariable(0x82 /*LED_Config*/, brightness_set, sizeof(brightness_set)); - - if (!Settings.display_sound) { - rtscheck.RTS_SndData(0, VolumeIcon); - rtscheck.RTS_SndData(9, SoundIcon); - } - else { - rtscheck.RTS_SndData((Settings.display_volume + 1) / 32 - 1, VolumeIcon); - rtscheck.RTS_SndData(8, SoundIcon); - } - rtscheck.RTS_SndData(Settings.display_volume, VolumeIcon - 2); - rtscheck.RTS_SndData(Settings.display_volume << 8, SoundAddr + 1); - rtscheck.RTS_SndData(map(constrain(Settings.display_volume, 0, 255), 0, 255, 0, 100), VolumeDisplay); - rtscheck.RTS_SndData(Settings.screen_brightness, DisplayBrightness); - rtscheck.RTS_SndData(Settings.standby_screen_brightness, DisplayStandbyBrightness); - rtscheck.RTS_SndData(Settings.standby_time_seconds, DisplayStandbySeconds); - if (Settings.display_standby) - rtscheck.RTS_SndData(3, DisplayStandbyEnableIndicator); - else - rtscheck.RTS_SndData(2, DisplayStandbyEnableIndicator); - } - - void onPrinterKilled(FSTR_P const error, FSTR_P const component) { - rtscheck.RTS_SndData(ExchangePageBase + 88, ExchangepageAddr); - int16_t j = 0; - char outmsg[40]; - char killMsg[strlen_P(FTOP(error)) + strlen_P(FTOP(component)) + 3]; - sprintf_P(killMsg, PSTR(S_FMT ": " S_FMT), FTOP(error), FTOP(component)); - while (j < 4) { - outmsg[j] = '*'; - j++; - } - while (const char c = killMsg[j - 4]) { - outmsg[j] = c; - j++; - } - while (j < 40) { - outmsg[j] = '*'; - j++; - } - rtscheck.RTS_SndData(outmsg, MacVersion); - delay_ms(10); - } - - void onMediaInserted() { - filenavigator.reset(); - filenavigator.getFiles(0); - fileIndex = 0; - recordcount = 0; - } - - void onMediaError() { - filenavigator.reset(); - for (int16_t i = 0; i < MaxFileNumber; i++) - for (int16_t j = 0; j < 10; j++) rtscheck.RTS_SndData(0, SDFILE_ADDR + i * 10 + j); - - for (int16_t j = 0; j < 10; j++) { - rtscheck.RTS_SndData(0, Printfilename + j); // clean screen. - rtscheck.RTS_SndData(0, Choosefilename + j); // clean filename - } - for (int16_t j = 0; j < 8; j++) rtscheck.RTS_SndData(0, FilenameCount + j); - for (int16_t j = 1; j <= MaxFileNumber; j++) { - rtscheck.RTS_SndData(10, FilenameIcon + j); - rtscheck.RTS_SndData(10, FilenameIcon1 + j); - } - } - - void onMediaRemoved() { - filenavigator.reset(); - for (int16_t i = 0; i < MaxFileNumber; i++) - for (int16_t j = 0; j < 10; j++) rtscheck.RTS_SndData(0, SDFILE_ADDR + i * 10 + j); - - for (int16_t j = 0; j < 10; j++) { - rtscheck.RTS_SndData(0, Printfilename + j); // clean screen. - rtscheck.RTS_SndData(0, Choosefilename + j); // clean filename - } - for (int16_t j = 0; j < 8; j++) rtscheck.RTS_SndData(0, FilenameCount + j); - for (int16_t j = 1; j <= MaxFileNumber; j++) { - rtscheck.RTS_SndData(10, FilenameIcon + j); - rtscheck.RTS_SndData(10, FilenameIcon1 + j); - } - } - - void onPlayTone(const uint16_t frequency, const uint16_t duration) { - rtscheck.RTS_SndData(StartSoundSet, SoundAddr); - } - - void onPrintTimerStarted() { - if (waitway == 7) return; - PrinterStatusKey[1] = 3; - InforShowStatus = true; - delay_ms(1); - rtscheck.RTS_SndData(ExchangePageBase + 53, ExchangepageAddr); - } - - void onPrintTimerPaused() { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); // Display Pause Screen - onStatusChanged(F("Pausing...")); - } - void onPrintTimerStopped() { - if (waitway == 3) return; - - #if FAN_COUNT > 0 - for (uint8_t i = 0; i < FAN_COUNT; i++) setTargetFan_percent(FanOff, (fan_t)i); - #endif - - PrinterStatusKey[0] = 0; - InforShowStatus = true; - TPShowStatus = false; - rtscheck.RTS_SndData(ExchangePageBase + 51, ExchangepageAddr); - } - - void onFilamentRunout() { - PrinterStatusKey[1] = 4; - TPShowStatus = false; - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - } - void onFilamentRunout(extruder_t extruder) { - PrinterStatusKey[1] = 4; - TPShowStatus = false; - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - } - void onUserConfirmRequired(const char *const msg) { - PrinterStatusKey[1] = 4; - TPShowStatus = false; - if (lastPauseMsgState == ExtUI::pauseModeStatus && msg == (const char*)GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)) - return; - - switch (ExtUI::pauseModeStatus) { - case PAUSE_MESSAGE_WAITING: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - onStatusChanged(F("Press Yes to Continue")); - break; - } - case PAUSE_MESSAGE_INSERT: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - onStatusChanged(F("Load Filament to Continue")); - break; - } - case PAUSE_MESSAGE_HEAT: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - onStatusChanged(F("Add Filament and Press Yes to Reheat")); - break; - } - - #if DISABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - case PAUSE_MESSAGE_PURGE: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - char newMsg[40] = "Yes to "; - strcat_P(newMsg, TERN1(FILAMENT_RUNOUT_SENSOR, !ExtUI::getFilamentRunoutState() && getFilamentRunoutEnabled()) ? PSTR("Continue") : PSTR("Disable ")); - strcat_P(newMsg, PSTR(" No to Purge")); - onStatusChanged(newMsg); - break; - } - #endif - - case PAUSE_MESSAGE_OPTION: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - char newMsg[40] = "Yes to "; - strcat_P(newMsg, TERN1(FILAMENT_RUNOUT_SENSOR, !ExtUI::getFilamentRunoutState() && getFilamentRunoutEnabled()) ? PSTR("Continue") : PSTR("Disable ")); - strcat_P(newMsg, PSTR(" No to Purge")); - onStatusChanged(newMsg); - break; - } - - case PAUSE_MESSAGE_PARKING: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - onStatusChanged(F("Parking...")); - break; - } - case PAUSE_MESSAGE_CHANGING: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - onStatusChanged(F("Beginning Filament Change")); - break; - } - case PAUSE_MESSAGE_UNLOAD: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - onStatusChanged(F("Unloading...")); - break; - } - case PAUSE_MESSAGE_LOAD: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - onStatusChanged(F("Reloading...")); - break; - } - case PAUSE_MESSAGE_RESUME: - #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) - case PAUSE_MESSAGE_PURGE: { - rtscheck.RTS_SndData(ExchangePageBase + 78, ExchangepageAddr); - onStatusChanged(F("Press Yes to Stop Purge")); - break; - } - #endif - - case PAUSE_MESSAGE_HEATING: { - rtscheck.RTS_SndData(ExchangePageBase + 68, ExchangepageAddr); - onStatusChanged(F("Reheating")); - break; - } - - case PAUSE_MESSAGE_STATUS: - default: { - setPauseMenuResponse(PAUSE_RESPONSE_RESUME_PRINT); - setUserConfirmed(); - break; - } - } - lastPauseMsgState = ExtUI::pauseModeStatus; - } - - void onStatusChanged(const char *const statMsg) { - for (int16_t j = 0; j < 20; j++) // Clear old message - rtscheck.RTS_SndData(' ', StatusMessageString + j); - rtscheck.RTS_SndData(statMsg, StatusMessageString); - } - void onFactoryReset() { - Settings.settings_size = sizeof(creality_dwin_settings_t); - Settings.settings_version = dwin_settings_version; - Settings.display_standby = true; - Settings.display_sound = true; - Settings.display_volume = 32; - Settings.standby_screen_brightness = 15; - Settings.screen_brightness = 100; - Settings.standby_time_seconds = 60; - Settings.screen_rotation = 0; - onStartup(); - startprogress = 0; - InforShowStatus = true; - } - - void onMeshUpdate(const int8_t xpos, const int8_t ypos, probe_state_t state) {} - - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { - if (waitway == 3) - if (isPositionKnown() && (getActualTemp_celsius(BED) >= (getTargetTemp_celsius(BED) - 1))) - rtscheck.RTS_SndData(ExchangePageBase + 64, ExchangepageAddr); - #if HAS_MESH - uint8_t abl_probe_index = 0; - for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) - for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { - const bool zig = outer & 1; // != ((PR_OUTER_END) & 1); - const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; - if (point.x == xpos && outer == ypos) - rtscheck.RTS_SndData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + (abl_probe_index * 2)); - ++abl_probe_index; - } - #endif - } - - void onStoreSettings(char *buff) { - static_assert( - ExtUI::eeprom_data_size >= sizeof(creality_dwin_settings_t), - "Insufficient space in EEPROM for UI parameters" - ); - - // Write to buffer - memcpy(buff, &Settings, sizeof(creality_dwin_settings_t)); - } - - void onLoadSettings(const char *buff) { - static_assert( - ExtUI::eeprom_data_size >= sizeof(creality_dwin_settings_t), - "Insufficient space in EEPROM for UI parameters" - ); - - creality_dwin_settings_t eepromSettings; - memcpy(&eepromSettings, buff, sizeof(creality_dwin_settings_t)); - - // If size is not the same, discard settings - if (eepromSettings.settings_size != sizeof(creality_dwin_settings_t)) { - onFactoryReset(); - return; - } - - if (eepromSettings.settings_version != dwin_settings_version) { - onFactoryReset(); - return; - } - - // Copy into final location - memcpy(&Settings, &eepromSettings, sizeof(creality_dwin_settings_t)); - - SetTouchScreenConfiguration(); - } - - void onSettingsStored(const bool success) { - // This is called after the entire EEPROM has been written, - // whether successful or not. - } - - void onSettingsLoaded(const bool success) { - #if HAS_MESH - if (ExtUI::getMeshValid()) { - uint8_t abl_probe_index = 0; - for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) - for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { - const bool zig = outer & 1; - const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; - rtscheck.RTS_SndData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + (abl_probe_index * 2)); - ++abl_probe_index; - } - - rtscheck.RTS_SndData(3, AutoLevelIcon); // 2=On, 3=Off - setLevelingActive(true); - } - else { - rtscheck.RTS_SndData(2, AutoLevelIcon); /*Off*/ - setLevelingActive(false); - } - #endif - - rtscheck.RTS_SndData(getZOffset_mm() * 100, ProbeOffset_Z); - SetTouchScreenConfiguration(); - } - - #if ENABLED(POWER_LOSS_RECOVERY) - void onSetPowerLoss(const bool onoff) { - // Called when power-loss is enabled/disabled - } - void onPowerLoss() { - // Called when power-loss state is detected - } - void onPowerLossResume() { - startprogress = 254; - InforShowStatus = true; - TPShowStatus = false; - reEntryPrevent = false; - rtscheck.RTS_SndData(ExchangePageBase + 76, ExchangepageAddr); - } - #endif - - #if HAS_PID_HEATING - void onPidTuning(const result_t rst) { - // Called for temperature PID tuning result - rtscheck.RTS_SndData(pid_hotendAutoTemp, HotendPID_AutoTmp); - rtscheck.RTS_SndData(pid_bedAutoTemp, BedPID_AutoTmp); - rtscheck.RTS_SndData(uint16_t(getPID_Kp(E0)) * 10, HotendPID_P); - rtscheck.RTS_SndData(uint16_t(getPID_Ki(E0)) * 10, HotendPID_I); - rtscheck.RTS_SndData(uint16_t(getPID_Kd(E0)) * 10, HotendPID_D); - #if ENABLED(PIDTEMPBED) - rtscheck.RTS_SndData(uint16_t(getBedPID_Kp()) * 10, BedPID_P); - rtscheck.RTS_SndData(uint16_t(getBedPID_Ki()) * 10, BedPID_I); - rtscheck.RTS_SndData(uint16_t(getBedPID_Kd()) * 10, BedPID_D); - #endif - onStatusChanged(F("PID Tune Finished")); - } - #endif - - void onLevelingStart() {} - - void onLevelingDone() { - #if HAS_MESH - if (ExtUI::getMeshValid()) { - uint8_t abl_probe_index = 0; - for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) - for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { - const bool zig = outer & 1; - const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; - rtscheck.RTS_SndData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + abl_probe_index * 2); - ++abl_probe_index; - } - - rtscheck.RTS_SndData(3, AutoLevelIcon); // 2=On, 3=Off - setLevelingActive(true); - } - else { - rtscheck.RTS_SndData(2, AutoLevelIcon); /*Off*/ - setLevelingActive(false); - } - #endif - } - - void onSteppersEnabled() {} - void onPrintDone() {} - void onHomingStart() {} - void onHomingDone() {} - void onSteppersDisabled() {} - void onPostprocessSettings() {} - -} // namespace ExtUI - -#endif // DGUS_LCD_UI_IA_CREALITY diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp new file mode 100644 index 0000000000..2d6c2aa96e --- /dev/null +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp @@ -0,0 +1,403 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2022 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/ia_creality/ia_creality_extui.cpp + * **************************************** + * Extensible_UI implementation for Creality DWIN + * 10SPro, Max, CRX, and others + * Based original Creality release, ported to Marlin ExtUI + * Written by Insanity Automation, sponsored by Tiny Machines 3D + * + * ***************************************/ + +#include "../../../inc/MarlinConfigPre.h" + +#if DGUS_LCD_UI_IA_CREALITY + +#include "ia_creality_rts.h" +#include "FileNavigator.h" +#include "../ui_api.h" + +namespace ExtUI { + +uint8_t dwin_settings_version = 1; + +void onStartup() { rts.onStartup(); } + +void onIdle() { rts.onIdle(); } + +void onPrinterKilled(FSTR_P const error, FSTR_P const component) { + rts.sendData(ExchangePageBase + 88, ExchangepageAddr); + int16_t j = 0; + char outmsg[40]; + char killMsg[strlen_P(FTOP(error)) + strlen_P(FTOP(component)) + 3]; + sprintf_P(killMsg, PSTR(S_FMT ": " S_FMT), FTOP(error), FTOP(component)); + while (j < 4) outmsg[j++] = '*'; + while (const char c = killMsg[j - 4]) outmsg[j++] = c; + while (j < 40) outmsg[j++] = '*'; + rts.sendData(outmsg, MacVersion); + delay_ms(10); +} + +void onMediaInserted() { + filenavigator.reset(); + filenavigator.getFiles(0); + fileIndex = 0; + recordcount = 0; +} + +void onMediaError() { + filenavigator.reset(); + for (int16_t i = 0; i < MaxFileNumber; i++) + for (int16_t j = 0; j < 10; j++) rts.sendData(0, SDFILE_ADDR + i * 10 + j); + + for (int16_t j = 0; j < 10; j++) { + rts.sendData(0, Printfilename + j); // clean screen. + rts.sendData(0, Choosefilename + j); // clean filename + } + for (int16_t j = 0; j < 8; j++) rts.sendData(0, FilenameCount + j); + for (int16_t j = 1; j <= MaxFileNumber; j++) { + rts.sendData(10, FilenameIcon + j); + rts.sendData(10, FilenameIcon1 + j); + } +} + +void onMediaRemoved() { + filenavigator.reset(); + for (int16_t i = 0; i < MaxFileNumber; i++) + for (int16_t j = 0; j < 10; j++) rts.sendData(0, SDFILE_ADDR + i * 10 + j); + + for (int16_t j = 0; j < 10; j++) { + rts.sendData(0, Printfilename + j); // clean screen. + rts.sendData(0, Choosefilename + j); // clean filename + } + for (int16_t j = 0; j < 8; j++) rts.sendData(0, FilenameCount + j); + for (int16_t j = 1; j <= MaxFileNumber; j++) { + rts.sendData(10, FilenameIcon + j); + rts.sendData(10, FilenameIcon1 + j); + } +} + +void onPlayTone(const uint16_t frequency, const uint16_t duration) { + rts.sendData(StartSoundSet, SoundAddr); +} + +void onPrintTimerStarted() { + if (waitway == 7) return; + printerStatusKey[1] = 3; + show_status = true; + delay_ms(1); + rts.sendData(ExchangePageBase + 53, ExchangepageAddr); +} + +void onPrintTimerPaused() { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); // Display Pause Screen + onStatusChanged(F("Pausing...")); +} + +void onPrintTimerStopped() { + if (waitway == 3) return; + + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) setTargetFan_percent(FanOff, (fan_t)i); + #endif + + printerStatusKey[0] = 0; + show_status = true; + tpShowStatus = false; + rts.sendData(ExchangePageBase + 51, ExchangepageAddr); +} + +void onFilamentRunout() { + printerStatusKey[1] = 4; + tpShowStatus = false; + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); +} + +void onFilamentRunout(extruder_t extruder) { + printerStatusKey[1] = 4; + tpShowStatus = false; + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); +} + +void onUserConfirmRequired(const char *const msg) { + printerStatusKey[1] = 4; + tpShowStatus = false; + if (lastPauseMsgState == ExtUI::pauseModeStatus && msg == (const char*)GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)) + return; + + switch (ExtUI::pauseModeStatus) { + case PAUSE_MESSAGE_WAITING: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + onStatusChanged(F("Press Yes to Continue")); + break; + } + case PAUSE_MESSAGE_INSERT: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + onStatusChanged(F("Load Filament to Continue")); + break; + } + case PAUSE_MESSAGE_HEAT: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + onStatusChanged(F("Add Filament and Press Yes to Reheat")); + break; + } + + #if DISABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + case PAUSE_MESSAGE_PURGE: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + char newMsg[40] = "Yes to "; + strcat_P(newMsg, TERN1(FILAMENT_RUNOUT_SENSOR, !ExtUI::getFilamentRunoutState() && getFilamentRunoutEnabled()) ? PSTR("Continue") : PSTR("Disable ")); + strcat_P(newMsg, PSTR(" No to Purge")); + onStatusChanged(newMsg); + break; + } + #endif + + case PAUSE_MESSAGE_OPTION: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + char newMsg[40] = "Yes to "; + strcat_P(newMsg, TERN1(FILAMENT_RUNOUT_SENSOR, !ExtUI::getFilamentRunoutState() && getFilamentRunoutEnabled()) ? PSTR("Continue") : PSTR("Disable ")); + strcat_P(newMsg, PSTR(" No to Purge")); + onStatusChanged(newMsg); + break; + } + + case PAUSE_MESSAGE_PARKING: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + onStatusChanged(F("Parking...")); + break; + } + case PAUSE_MESSAGE_CHANGING: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + onStatusChanged(F("Beginning Filament Change")); + break; + } + case PAUSE_MESSAGE_UNLOAD: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + onStatusChanged(F("Unloading...")); + break; + } + case PAUSE_MESSAGE_LOAD: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + onStatusChanged(F("Reloading...")); + break; + } + case PAUSE_MESSAGE_RESUME: + #if ENABLED(ADVANCED_PAUSE_CONTINUOUS_PURGE) + case PAUSE_MESSAGE_PURGE: { + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); + onStatusChanged(F("Press Yes to Stop Purge")); + break; + } + #endif + + case PAUSE_MESSAGE_HEATING: { + rts.sendData(ExchangePageBase + 68, ExchangepageAddr); + onStatusChanged(F("Reheating")); + break; + } + + case PAUSE_MESSAGE_STATUS: + default: { + setPauseMenuResponse(PAUSE_RESPONSE_RESUME_PRINT); + setUserConfirmed(); + break; + } + } + lastPauseMsgState = ExtUI::pauseModeStatus; +} + +void onStatusChanged(const char *const statMsg) { + for (int16_t j = 0; j < 20; j++) // Clear old message + rts.sendData(' ', StatusMessageString + j); + rts.sendData(statMsg, StatusMessageString); +} + +void onFactoryReset() { + dwin_settings.settings_size = sizeof(creality_dwin_settings_t); + dwin_settings.settings_version = dwin_settings_version; + dwin_settings.display_standby = true; + dwin_settings.display_sound = true; + dwin_settings.display_volume = 32; + dwin_settings.standby_brightness = 15; + dwin_settings.screen_brightness = 100; + dwin_settings.standby_time_seconds = 60; + dwin_settings.screen_rotation = 0; + onStartup(); + startprogress = 0; + show_status = true; +} + +void onMeshUpdate(const int8_t xpos, const int8_t ypos, probe_state_t state) {} + +void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { + if (waitway == 3) + if (isPositionKnown() && (getActualTemp_celsius(BED) >= (getTargetTemp_celsius(BED) - 1))) + rts.sendData(ExchangePageBase + 64, ExchangepageAddr); + #if HAS_MESH + uint8_t abl_probe_index = 0; + for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) + for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { + const bool zig = outer & 1; // != ((PR_OUTER_END) & 1); + const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; + if (point.x == xpos && outer == ypos) + rts.sendData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + (abl_probe_index * 2)); + ++abl_probe_index; + } + #endif +} + +void onStoreSettings(char *buff) { + static_assert( + ExtUI::eeprom_data_size >= sizeof(creality_dwin_settings_t), + "Insufficient space in EEPROM for UI parameters" + ); + + // Write to buffer + memcpy(buff, &dwin_settings, sizeof(creality_dwin_settings_t)); +} + +void onLoadSettings(const char *buff) { + static_assert( + ExtUI::eeprom_data_size >= sizeof(creality_dwin_settings_t), + "Insufficient space in EEPROM for UI parameters" + ); + + creality_dwin_settings_t eepromSettings; + memcpy(&eepromSettings, buff, sizeof(creality_dwin_settings_t)); + + // If size is not the same, discard settings + if (eepromSettings.settings_size != sizeof(creality_dwin_settings_t)) { + onFactoryReset(); + return; + } + + if (eepromSettings.settings_version != dwin_settings_version) { + onFactoryReset(); + return; + } + + // Copy into final location + memcpy(&dwin_settings, &eepromSettings, sizeof(creality_dwin_settings_t)); + + rts.setTouchScreenConfiguration(); +} + +void onSettingsStored(const bool success) { + // This is called after the entire EEPROM has been written, + // whether successful or not. +} + +void onSettingsLoaded(const bool success) { + #if HAS_MESH + if (ExtUI::getLevelingIsValid()) { + uint8_t abl_probe_index = 0; + for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) + for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { + const bool zig = outer & 1; + const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; + rts.sendData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + (abl_probe_index * 2)); + ++abl_probe_index; + } + + rts.sendData(3, AutoLevelIcon); // 2=On, 3=Off + setLevelingActive(true); + } + else { + rts.sendData(2, AutoLevelIcon); /*Off*/ + setLevelingActive(false); + } + #endif + + rts.sendData(getZOffset_mm() * 100, ProbeOffset_Z); + rts.setTouchScreenConfiguration(); +} + +#if ENABLED(POWER_LOSS_RECOVERY) + void onSetPowerLoss(const bool onoff) { + // Called when power-loss is enabled/disabled + } + void onPowerLoss() { + // Called when power-loss state is detected + } + void onPowerLossResume() { + startprogress = 254; + show_status = true; + tpShowStatus = false; + no_reentry = false; + rts.sendData(ExchangePageBase + 76, ExchangepageAddr); + } +#endif + +#if HAS_PID_HEATING + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + rts.sendData(pid_hotendAutoTemp, HotendPID_AutoTmp); + rts.sendData(pid_bedAutoTemp, BedPID_AutoTmp); + rts.sendData(uint16_t(getPID_Kp(E0)) * 10, HotendPID_P); + rts.sendData(uint16_t(getPID_Ki(E0)) * 10, HotendPID_I); + rts.sendData(uint16_t(getPID_Kd(E0)) * 10, HotendPID_D); + #if ENABLED(PIDTEMPBED) + rts.sendData(uint16_t(getBedPID_Kp()) * 10, BedPID_P); + rts.sendData(uint16_t(getBedPID_Ki()) * 10, BedPID_I); + rts.sendData(uint16_t(getBedPID_Kd()) * 10, BedPID_D); + #endif + onStatusChanged(F("PID Tune Finished")); + } +#endif + +void onLevelingStart() {} + +void onLevelingDone() { + #if HAS_MESH + if (ExtUI::getLevelingIsValid()) { + uint8_t abl_probe_index = 0; + for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) + for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { + const bool zig = outer & 1; + const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; + rts.sendData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + abl_probe_index * 2); + ++abl_probe_index; + } + + rts.sendData(3, AutoLevelIcon); // 2=On, 3=Off + setLevelingActive(true); + } + else { + rts.sendData(2, AutoLevelIcon); /*Off*/ + setLevelingActive(false); + } + #endif +} + +void onSteppersEnabled() {} +void onPrintDone() {} +void onHomingStart() {} +void onHomingDone() {} +void onSteppersDisabled() {} +void onPostprocessSettings() {} + +} // namespace ExtUI + +#endif // DGUS_LCD_UI_IA_CREALITY diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp new file mode 100644 index 0000000000..a64fa2ef20 --- /dev/null +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp @@ -0,0 +1,1730 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2022 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/ia_creality/ia_creality_rts.cpp + * **************************************** + * Creality DWIN Resistive Touch Screen + * 10SPro, Max, CRX, and others + * Based original Creality release + * Written by Insanity Automation, sponsored by Tiny Machines 3D + * + * ***************************************/ + +#include "../../../inc/MarlinConfigPre.h" + +#if DGUS_LCD_UI_IA_CREALITY + +#include "ia_creality_rts.h" +#include "FileNavigator.h" +#include "../ui_api.h" + +using namespace ExtUI; + +#include // for memset + +// Singleton instance +RTS rts; + +// Static data +DB RTS::recdat, RTS::snddat; +uint8_t RTS::databuf[DATA_BUF_SIZE]; +rx_datagram_state_t RTS::rx_datagram_state = DGUS_IDLE; +uint8_t RTS::rx_datagram_len = 0; + +// Local data +uint16_t fileIndex = 0; +uint8_t recordcount = 0; +uint8_t waitway_lock = 0; +uint8_t startprogress = 0; + +char waitway = 0; +int16_t recnum = 0; +float changeMaterialBuf[2] = { 0 }; +char nozzleTempStatus[3] = { 0 }; +char printerStatusKey[2] = { 0 }; + +uint8_t axisPageNum = 0; // 0 for 10mm, 1 for 1mm, 2 for 0.1mm +bool show_status = true; +bool tpShowStatus = false; // true for only opening time and percentage, false for closing time and percentage. +bool autoHomeKey = false; +uint8_t autoHomeIconNum; +int16_t userConfValidation = 0; +uint8_t lastPauseMsgState = 0; + +creality_dwin_settings_t dwin_settings; + +bool no_reentry = false; +uint8_t reentryCount = 0; +uint16_t idleThrottling = 0; + +bool pause_resume_selected = false; + +#if HAS_PID_HEATING + uint16_t pid_hotendAutoTemp = 150; + uint16_t pid_bedAutoTemp = 70; +#endif + +#ifndef IA_CREALITY_BOOT_DELAY + #define IA_CREALITY_BOOT_DELAY 500 +#endif + +void RTS::onStartup() { + DWIN_SERIAL.begin(115200); + recdat.head[0] = snddat.head[0] = FHONE; + recdat.head[1] = snddat.head[1] = FHTWO; + ZERO(databuf); + + delay_ms(IA_CREALITY_BOOT_DELAY); // Delay to allow screen startup + setTouchScreenConfiguration(); + sendData(StartSoundSet, SoundAddr); + delay_ms(400); // Delay to allow screen to configure + + onStatusChanged(MACHINE_NAME " Ready"); + + sendData(100, FeedrateDisplay); + + /***************turn off motor*****************/ + sendData(11, FilenameIcon); + + /***************transmit temperature to screen*****************/ + sendData(0, NozzlePreheat); + sendData(0, BedPreheat); + sendData(getActualTemp_celsius(H0), NozzleTemp); + sendData(TERN0(HAS_MULTI_HOTEND, getActualTemp_celsius(H1)), e2Temp); + sendData(getActualTemp_celsius(BED), Bedtemp); + /***************transmit Fan speed to screen*****************/ + sendData(getActualFan_percent((fan_t)getActiveTool()), FanKeyIcon); + + /***************transmit Printer information to screen*****************/ + for (int16_t j = 0; j < 20; j++) // clean filename + sendData(0, MacVersion + j); + char sizebuf[20] = {0}; + sprintf(sizebuf, "%d X %d X %d", Y_BED_SIZE, X_BED_SIZE, Z_MAX_POS); + sendData(MACHINE_NAME, MacVersion); + sendData(SHORT_BUILD_VERSION, SoftVersion); + sendData(sizebuf, PrinterSize); + sendData(WEBSITE_URL, CorpWebsite); + + /**************************some info init*******************************/ + sendData(0, PrintscheduleIcon); + sendData(0, PrintscheduleIcon + 1); + + /************************clean screen*******************************/ + for (int16_t i = 0; i < MaxFileNumber; i++) + for (int16_t j = 0; j < 10; j++) sendData(0, SDFILE_ADDR + i * 10 + j); + + for (int16_t j = 0; j < 10; j++) { + sendData(0, Printfilename + j); // clean screen. + sendData(0, Choosefilename + j); // clean filename + } + for (int16_t j = 0; j < 8; j++) sendData(0, FilenameCount + j); + for (int16_t j = 1; j <= MaxFileNumber; j++) { + sendData(10, FilenameIcon + j); + sendData(10, FilenameIcon1 + j); + } +} + +void RTS::onIdle() { + while (rts.receiveData() > 0 && (rts.recdat.data[0] != 0 || rts.recdat.addr != 0)) + rts.handleData(); + + if (no_reentry && reentryCount < 120) { reentryCount++; return; } + reentryCount = 0; + + if (idleThrottling++ < 750) return; + + // Always send temperature data + rts.sendData(getActualTemp_celsius(getActiveTool()), NozzleTemp); + rts.sendData(getActualTemp_celsius(BED), Bedtemp); + rts.sendData(getTargetTemp_celsius(getActiveTool()), NozzlePreheat); + rts.sendData(getTargetTemp_celsius(BED), BedPreheat); + rts.sendData(TERN0(HAS_MULTI_HOTEND, getActualTemp_celsius(H1)), e2Temp); + rts.sendData(TERN0(HAS_MULTI_HOTEND, getTargetTemp_celsius(H1)), e2Preheat); + TERN_(HAS_MULTI_HOTEND, rts.sendData(uint8_t(getActiveTool() + 1), ActiveToolVP)); + + if (awaitingUserConfirm() && (lastPauseMsgState != ExtUI::pauseModeStatus || userConfValidation > 99)) { + switch (ExtUI::pauseModeStatus) { + case PAUSE_MESSAGE_PARKING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_PAUSE_PRINT_PARKING)); break; + case PAUSE_MESSAGE_CHANGING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INIT)); break; + case PAUSE_MESSAGE_UNLOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_UNLOAD)); break; + case PAUSE_MESSAGE_WAITING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_ADVANCED_PAUSE_WAITING)); break; + case PAUSE_MESSAGE_INSERT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_INSERT)); break; + case PAUSE_MESSAGE_LOAD: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_LOAD)); break; + case PAUSE_MESSAGE_PURGE: ExtUI::onUserConfirmRequired(GET_TEXT_F(TERN(ADVANCED_PAUSE_CONTINUOUS_PURGE, MSG_FILAMENT_CHANGE_CONT_PURGE, MSG_FILAMENT_CHANGE_PURGE))); break; + case PAUSE_MESSAGE_RESUME: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_RESUME)); break; + case PAUSE_MESSAGE_HEAT: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEAT)); break; + case PAUSE_MESSAGE_HEATING: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_HEATING)); break; + case PAUSE_MESSAGE_OPTION: ExtUI::onUserConfirmRequired(GET_TEXT_F(MSG_FILAMENT_CHANGE_OPTION_HEADER)); break; + case PAUSE_MESSAGE_STATUS: break; + default: onUserConfirmRequired(PSTR("Confirm Continue")); break; + } + userConfValidation = 0; + } + else if (pause_resume_selected && !awaitingUserConfirm()) { + rts.sendData(ExchangePageBase + 53, ExchangepageAddr); + pause_resume_selected = false; + userConfValidation = 0; + } + else if (awaitingUserConfirm()) { + if (pause_resume_selected) { + pause_resume_selected = false; + userConfValidation = 100; + } + else + userConfValidation++; + } + + no_reentry = true; + idleThrottling = 0; + if (waitway && !commandsInQueue()) + waitway_lock++; + else + waitway_lock = 0; + + if (waitway_lock > 100) { + waitway_lock = 0; + waitway = 0; // clear waitway if nothing is going on + } + + switch (waitway) { + case 1: + if (isPositionKnown()) { + show_status = true; + rts.sendData(ExchangePageBase + 54, ExchangepageAddr); + waitway = 0; + } + break; + + case 2: + if (isPositionKnown() && !commandsInQueue()) waitway = 0; + break; + + case 3: + //if(isPositionKnown() && (getActualTemp_celsius(BED) >= (getTargetTemp_celsius(BED)-1))) { + rts.sendData(ExchangePageBase + 64, ExchangepageAddr); + waitway = 7; + //return; + //} + break; + + case 4: + if (autoHomeKey && isPositionKnown() && !commandsInQueue()) { // Manual Move Home Done + //rts.sendData(ExchangePageBase + 71 + axisPageNum, ExchangepageAddr); + autoHomeKey = false; + waitway = 0; + } + break; + case 5: + if (isPositionKnown() && !commandsInQueue()) { + show_status = true; + waitway = 0; + rts.sendData(ExchangePageBase + 78, ExchangepageAddr); // exchange to 78 page + } + break; + case 6: + if (!commandsInQueue()) { + setAxisPosition_mm(BED_TRAMMING_HEIGHT, axis_t(Z)); + waitway = 0; + } + break; + case 7: + if (!commandsInQueue()) waitway = 0; + break; + } + + TERN_(HAS_MESH, rts.sendData(getLevelingActive() ? 3 : 2, AutoLevelIcon)); + TERN_(HAS_FILAMENT_SENSOR, rts.sendData(getFilamentRunoutEnabled() ? 3 : 2, RunoutToggle)); + TERN_(CASE_LIGHT_ENABLE, rts.sendData(getCaseLightState() ? 3 : 2, LedToggle)); + TERN_(POWER_LOSS_RECOVERY, rts.sendData(getPowerLossRecoveryEnabled() ? 3 : 2, PowerLossToggle)); + + if (startprogress == 0) { + startprogress += 25; + delay_ms(3000); // Delay to show bootscreen + } + else if (startprogress < 250) { + if (isMediaInserted()) // Re init media as it happens too early on STM32 boards often + onMediaInserted(); + else + injectCommands(F("M22\nM21")); + startprogress = 254; + show_status = true; + tpShowStatus = false; + rts.sendData(ExchangePageBase + 45, ExchangepageAddr); + no_reentry = false; + return; + } + if (startprogress <= 100) + rts.sendData(startprogress, StartIcon); + else + rts.sendData(startprogress - 100, StartIcon + 1); + + //rts.sendData((startprogress++) % 5, ExchFlmntIcon); + + if (isPrinting()) { + rts.sendData(getActualFan_percent((fan_t)getActiveTool()), FanKeyIcon); + rts.sendData(getProgress_seconds_elapsed() / 3600, Timehour); + rts.sendData((getProgress_seconds_elapsed() % 3600) / 60, Timemin); + if (getProgress_percent() > 0) { + const uint16_t perc = getProgress_percent() + 1; + if (perc <= 50) { + rts.sendData(uint16_t(perc) * 2, PrintscheduleIcon); + rts.sendData(0, PrintscheduleIcon + 1); + } + else { + rts.sendData(100, PrintscheduleIcon); + rts.sendData(uint16_t(perc) * 2 - 100, PrintscheduleIcon + 1); + } + } + else { + rts.sendData(0, PrintscheduleIcon); + rts.sendData(0, PrintscheduleIcon + 1); + } + rts.sendData(uint16_t(getProgress_percent()), Percentage); + } + else { // Not printing settings + rts.sendData(map(constrain(dwin_settings.display_volume, 0, 255), 0, 255, 0, 100), VolumeDisplay); + rts.sendData(dwin_settings.screen_brightness, DisplayBrightness); + rts.sendData(dwin_settings.standby_brightness, DisplayStandbyBrightness); + rts.sendData(dwin_settings.standby_time_seconds, DisplayStandbySeconds); + if (dwin_settings.display_standby) + rts.sendData(3, DisplayStandbyEnableIndicator); + else + rts.sendData(2, DisplayStandbyEnableIndicator); + + rts.sendData(getAxisSteps_per_mm(X) * 10, StepMM_X); + rts.sendData(getAxisSteps_per_mm(Y) * 10, StepMM_Y); + rts.sendData(getAxisSteps_per_mm(Z) * 10, StepMM_Z); + rts.sendData(getAxisSteps_per_mm(E0) * 10, StepMM_E); + + rts.sendData(getAxisMaxAcceleration_mm_s2(X) / 100, Accel_X); + rts.sendData(getAxisMaxAcceleration_mm_s2(Y) / 100, Accel_Y); + rts.sendData(getAxisMaxAcceleration_mm_s2(Z) / 10, Accel_Z); + rts.sendData(getAxisMaxAcceleration_mm_s2(E0), Accel_E); + + rts.sendData(getAxisMaxFeedrate_mm_s(X), Feed_X); + rts.sendData(getAxisMaxFeedrate_mm_s(Y), Feed_Y); + rts.sendData(getAxisMaxFeedrate_mm_s(Z), Feed_Z); + rts.sendData(getAxisMaxFeedrate_mm_s(E0), Feed_E); + + rts.sendData(getAxisMaxJerk_mm_s(X) * 100, Jerk_X); + rts.sendData(getAxisMaxJerk_mm_s(Y) * 100, Jerk_Y); + rts.sendData(getAxisMaxJerk_mm_s(Z) * 100, Jerk_Z); + rts.sendData(getAxisMaxJerk_mm_s(E0) * 100, Jerk_E); + + #if HAS_HOTEND_OFFSET + rts.sendData(getNozzleOffset_mm(X, E1) * 10, T2Offset_X); + rts.sendData(getNozzleOffset_mm(Y, E1) * 10, T2Offset_Y); + rts.sendData(getNozzleOffset_mm(Z, E1) * 10, T2Offset_Z); + rts.sendData(getAxisSteps_per_mm(E1) * 10, T2StepMM_E); + #endif + + #if HAS_BED_PROBE + rts.sendData(getProbeOffset_mm(X) * 100, ProbeOffset_X); + rts.sendData(getProbeOffset_mm(Y) * 100, ProbeOffset_Y); + #endif + + #if HAS_PID_HEATING + rts.sendData(pid_hotendAutoTemp, HotendPID_AutoTmp); + rts.sendData(pid_bedAutoTemp, BedPID_AutoTmp); + rts.sendData(getPID_Kp(E0) * 10, HotendPID_P); + rts.sendData(getPID_Ki(E0) * 10, HotendPID_I); + rts.sendData(getPID_Kd(E0) * 10, HotendPID_D); + #if ENABLED(PIDTEMPBED) + rts.sendData(getBedPID_Kp() * 10, BedPID_P); + rts.sendData(getBedPID_Ki() * 10, BedPID_I); + rts.sendData(getBedPID_Kd() * 10, BedPID_D); + #endif + #endif + } + + rts.sendData(getZOffset_mm() * 100, ProbeOffset_Z); + rts.sendData(uint16_t(getFlow_percent(E0)), Flowrate); + + if (nozzleTempStatus[0] || nozzleTempStatus[2]) { // statuse of loadfilament and unloadfinement when temperature is less than + uint16_t IconTemp = getActualTemp_celsius(getActiveTool()) * 100 / getTargetTemp_celsius(getActiveTool()); + NOMORE(IconTemp, 100U); + rts.sendData(IconTemp, HeatPercentIcon); + if (getActualTemp_celsius(getActiveTool()) > EXTRUDE_MINTEMP && nozzleTempStatus[0] != 0) { + nozzleTempStatus[0] = 0; + rts.sendData(10 * changeMaterialBuf[0], FilamentUnit1); + rts.sendData(10 * changeMaterialBuf[1], FilamentUnit2); + rts.sendData(ExchangePageBase + 65, ExchangepageAddr); + } + else if (getActualTemp_celsius(getActiveTool()) >= getTargetTemp_celsius(getActiveTool()) && nozzleTempStatus[2]) { + nozzleTempStatus[2] = 0; + tpShowStatus = true; + rts.sendData(4, ExchFlmntIcon); + rts.sendData(ExchangePageBase + 83, ExchangepageAddr); + } + else if (nozzleTempStatus[2]) { + //rts.sendData((startprogress++) % 5, ExchFlmntIcon); + } + } + + if (autoHomeKey) { + rts.sendData(autoHomeIconNum, AutoZeroIcon); + if (++autoHomeIconNum > 9) autoHomeIconNum = 0; + } + + if (isMediaInserted()) { + const uint16_t currPage = fileIndex == 0 ? 1 : CEIL(float(fileIndex) / float(DISPLAY_FILES)) + 1, + maxPageAdd = filenavigator.folderdepth ? 1 : 0, + maxPages = CEIL(float(filenavigator.maxFiles() + maxPageAdd) / float(DISPLAY_FILES) ); + + rts.sendData(currPage, FilesCurentPage); + rts.sendData(maxPages, FilesMaxPage); + } + else { + rts.sendData(0, FilesCurentPage); + rts.sendData(0, FilesMaxPage); + } + + if (rts.recdat.addr != DisplayZaxis && rts.recdat.addr != DisplayYaxis && rts.recdat.addr != DisplayZaxis) { + rts.sendData(10 * getAxisPosition_mm(axis_t(X)), DisplayXaxis); + rts.sendData(10 * getAxisPosition_mm(axis_t(Y)), DisplayYaxis); + rts.sendData(10 * getAxisPosition_mm(axis_t(Z)), DisplayZaxis); + } + no_reentry = false; +} + +RTS::RTS() { + recdat.head[0] = snddat.head[0] = FHONE; + recdat.head[1] = snddat.head[1] = FHTWO; + ZERO(databuf); +} + +int16_t RTS::receiveData() { + uint8_t receivedbyte; + while (DWIN_SERIAL.available()) + switch (rx_datagram_state) { + + case DGUS_IDLE: // Waiting for the first header byte + receivedbyte = DWIN_SERIAL.read(); + if (FHONE == receivedbyte) rx_datagram_state = DGUS_HEADER1_SEEN; + break; + + case DGUS_HEADER1_SEEN: // Waiting for the second header byte + receivedbyte = DWIN_SERIAL.read(); + rx_datagram_state = (FHTWO == receivedbyte) ? DGUS_HEADER2_SEEN : DGUS_IDLE; + break; + + case DGUS_HEADER2_SEEN: // Waiting for the length byte + rx_datagram_len = DWIN_SERIAL.read(); + //DEBUGLCDCOMM_ECHOPGM(" (", rx_datagram_len, ") "); + + // Telegram min len is 3 (command and one word of payload) + rx_datagram_state = WITHIN(rx_datagram_len, 3, DGUS_RX_BUFFER_SIZE) ? DGUS_WAIT_TELEGRAM : DGUS_IDLE; + break; + + case DGUS_WAIT_TELEGRAM: // wait for complete datagram to arrive. + if (DWIN_SERIAL.available() < rx_datagram_len) return -1; + + uint8_t command = DWIN_SERIAL.read(); + + //DEBUGLCDCOMM_ECHOPGM("# ", command); + + uint8_t readlen = rx_datagram_len - 1; // command is part of len. + uint8_t tmp[rx_datagram_len - 1]; + uint8_t *ptmp = tmp; + while (readlen--) { + receivedbyte = DWIN_SERIAL.read(); + //DEBUGLCDCOMM_ECHOPGM(" ", receivedbyte); + *ptmp++ = receivedbyte; + } + //DEBUGLCDCOMM_ECHOPGM(" # "); + // mostly we'll get this: 5A A5 03 82 4F 4B -- ACK on 0x82, so discard it. + if (command == VarAddr_W && 'O' == tmp[0] && 'K' == tmp[1]) { + rx_datagram_state = DGUS_IDLE; + break; + } + + /* AutoUpload, (and answer to) Command 0x83 : + | tmp[0 1 2 3 4 ... ] + | Example 5A A5 06 83 20 01 01 78 01 …… + | / / | | \ / | \ \ + | Header | | | | \_____\_ DATA (Words!) + | DatagramLen / VPAdr | + | Command DataLen (in Words) */ + if (command == VarAddr_R) { + const uint16_t vp = tmp[0] << 8 | tmp[1]; + + const uint8_t dlen = tmp[2] << 1; // Convert to Bytes. (Display works with words) + recdat.addr = vp; + recdat.len = tmp[2]; + for (uint16_t i = 0; i < dlen; i += 2) { + recdat.data[i / 2] = tmp[3 + i]; + recdat.data[i / 2] = (recdat.data[i / 2] << 8 ) | tmp[4 + i]; + } + + rx_datagram_state = DGUS_IDLE; + return 2; + break; + } + + // discard anything else + rx_datagram_state = DGUS_IDLE; + } + return -1; +} + +void RTS::sendData() { + if (snddat.head[0] == FHONE && snddat.head[1] == FHTWO && snddat.len >= 3) { + databuf[0] = snddat.head[0]; + databuf[1] = snddat.head[1]; + databuf[2] = snddat.len; + databuf[3] = snddat.command; + if (snddat.command == 0x80) { // to write data to the register + databuf[4] = snddat.addr; + for (int16_t i = 0; i < (snddat.len - 2); i++) databuf[5 + i] = snddat.data[i]; + } + else if (snddat.len == 3 && (snddat.command == 0x81)) { // to read data from the register + databuf[4] = snddat.addr; + databuf[5] = snddat.bytelen; + } + else if (snddat.command == 0x82) { // to write data to the variate + databuf[4] = snddat.addr >> 8; + databuf[5] = snddat.addr & 0xFF; + for (int16_t i = 0; i < (snddat.len - 3); i += 2) { + databuf[6 + i] = snddat.data[i / 2] >> 8; + databuf[7 + i] = snddat.data[i / 2] & 0xFF; + } + } + else if (snddat.len == 4 && (snddat.command == 0x83)) { // to read data from the variate + databuf[4] = snddat.addr >> 8; + databuf[5] = snddat.addr & 0xFF; + databuf[6] = snddat.bytelen; + } + for (int16_t i = 0; i < (snddat.len + 3); i++) { + DWIN_SERIAL.write(databuf[i]); + delay_us(1); + } + + memset(&snddat, 0, sizeof(snddat)); + ZERO(databuf); + snddat.head[0] = FHONE; + snddat.head[1] = FHTWO; + } +} + +void RTS::sendData(const String &s, uint32_t addr, uint8_t cmd/*=VarAddr_W*/) { + if (s.length() < 1) return; + sendData(s.c_str(), addr, cmd); +} + +void RTS::sendData(const char *str, uint32_t addr, uint8_t cmd/*=VarAddr_W*/) { + int16_t len = strlen(str); + constexpr int16_t maxlen = DATA_BUF_SIZE - 6; + if (len > 0) { + if (len > maxlen) len = maxlen; + databuf[0] = FHONE; + databuf[1] = FHTWO; + databuf[2] = 3 + len; + databuf[3] = cmd; + databuf[4] = addr >> 8; + databuf[5] = addr & 0x00FF; + for (int16_t i = 0; i < len; i++) databuf[6 + i] = str[i]; + + for (int16_t i = 0; i < (len + 6); i++) { + DWIN_SERIAL.write(databuf[i]); + delay_us(1); + } + ZERO(databuf); + } +} + +void RTS::sendData(const char c, const uint32_t addr, const uint8_t cmd/*=VarAddr_W*/) { + snddat.command = cmd; + snddat.addr = addr; + snddat.data[0] = uint32_t(uint16_t(c) << 8); + snddat.len = 5; + sendData(); +} + +void RTS::sendData(const_float_t f, const uint32_t addr, const uint8_t cmd/*=VarAddr_W*/) { + int16_t n = f; + if (cmd == VarAddr_W) { + snddat.data[0] = n; + snddat.len = 5; + } + else if (cmd == RegAddr_W) { + snddat.data[0] = n; + snddat.len = 3; + } + else if (cmd == VarAddr_R) { + snddat.bytelen = n; + snddat.len = 4; + } + snddat.command = cmd; + snddat.addr = addr; + sendData(); +} + +void RTS::sendData(const int n, const uint32_t addr, const uint8_t cmd/*=VarAddr_W*/) { + if (cmd == VarAddr_W) { + if ((unsigned int)n > 0xFFFF) { + snddat.data[0] = n >> 16; + snddat.data[1] = n & 0xFFFF; + snddat.len = 7; + } + else { + snddat.data[0] = n; + snddat.len = 5; + } + } + else if (cmd == RegAddr_W) { + snddat.data[0] = n; + snddat.len = 3; + } + else if (cmd == VarAddr_R) { + snddat.bytelen = n; + snddat.len = 4; + } + snddat.command = cmd; + snddat.addr = addr; + sendData(); +} + +void RTS::sendData(const unsigned long n, uint32_t addr, uint8_t cmd/*=VarAddr_W*/) { + if (cmd == VarAddr_W) { + if (n > 0xFFFF) { + snddat.data[0] = n >> 16; + snddat.data[1] = n & 0xFFFF; + //snddat.data[0] = n >> 24; + //snddat.data[1] = n >> 16; + //snddat.data[2] = n >> 8; + //snddat.data[3] = n; + snddat.len = 7; + } + else { + snddat.data[0] = n; + snddat.len = 5; + } + } + else if (cmd == VarAddr_R) { + snddat.bytelen = n; + snddat.len = 4; + } + snddat.command = cmd; + snddat.addr = addr; + sendData(); +} + +void RTS::handleData() { + int16_t Checkkey = -1; + if (waitway > 0) { // for waiting + memset(&recdat, 0, sizeof(recdat)); + recdat.head[0] = FHONE; + recdat.head[1] = FHTWO; + return; + } + for (int16_t i = 0; Addrbuf[i] != 0; i++) + if (recdat.addr == Addrbuf[i]) { + if (Addrbuf[i] == NzBdSet || Addrbuf[i] == NozzlePreheat || Addrbuf[i] == BedPreheat || Addrbuf[i] == Flowrate) + Checkkey = ManualSetTemp; + else if (WITHIN(Addrbuf[i], Stopprint, Resumeprint)) + Checkkey = PrintChoice; + else if (WITHIN(Addrbuf[i], AutoZero, DisplayZaxis)) + Checkkey = XYZEaxis; + else if (WITHIN(Addrbuf[i], FilamentUnit1, FilamentUnit2)) + Checkkey = Filament; + else + Checkkey = i; + break; + } + + switch (recdat.addr) { + case Flowrate: + case StepMM_X ... StepMM_E: + case ProbeOffset_X ... ProbeOffset_Y: + case HotendPID_AutoTmp ... BedPID_AutoTmp: + case HotendPID_P ... HotendPID_D: + case BedPID_P ... BedPID_D: + case T2Offset_X ... T2StepMM_E: + case Accel_X ... Accel_E: + case Feed_X ... Feed_E: + case Jerk_X ... Jerk_E: + case RunoutToggle: + case PowerLossToggle: + case FanKeyIcon: + case LedToggle: + case e2Preheat: Checkkey = ManualSetTemp; break; + case ProbeOffset_Z: Checkkey = Zoffset_Value; break; + case VolumeDisplay: Checkkey = VolumeDisplay; break; + case DisplayBrightness: Checkkey = DisplayBrightness; break; + case DisplayStandbyBrightness: Checkkey = DisplayStandbyBrightness; break; + case DisplayStandbySeconds: Checkkey = DisplayStandbySeconds; break; + default: + if (WITHIN(recdat.addr, AutolevelVal, AutolevelVal + 2 * (5 * 5 - 1))) // Assuming 5x5 mesh or smaller + Checkkey = AutolevelVal; + else if (WITHIN(recdat.addr, SDFILE_ADDR, SDFILE_ADDR + 10 * (FileNum + 1))) + Checkkey = Filename; + break; + } + + if (Checkkey < 0) { + memset(&recdat, 0, sizeof(recdat)); + recdat.head[0] = FHONE; + recdat.head[1] = FHTWO; + return; + } + + constexpr float lfrb[4] = BED_TRAMMING_INSET_LFRB; + + switch (Checkkey) { + case Printfile: + if (recdat.data[0] == 1) { // card + show_status = false; + filenavigator.getFiles(0); + fileIndex = 0; + recordcount = 0; + sendData(ExchangePageBase + 46, ExchangepageAddr); + } + else if (recdat.data[0] == 2) { // return after printing result. + show_status = true; + tpShowStatus = false; + stopPrint(); + injectCommands(F("M84")); + sendData(11, FilenameIcon); + sendData(0, PrintscheduleIcon); + sendData(0, PrintscheduleIcon + 1); + sendData(0, Percentage); + delay_ms(2); + sendData(0, Timehour); + sendData(0, Timemin); + + sendData(ExchangePageBase + 45, ExchangepageAddr); // exchange to 45 page + } + else if (recdat.data[0] == 3) { // Temperature control + show_status = true; + tpShowStatus = false; + if (getTargetFan_percent((fan_t)getActiveTool()) == 0) + sendData(ExchangePageBase + 58, ExchangepageAddr); // exchange to 58 page, the fans off + else + sendData(ExchangePageBase + 57, ExchangepageAddr); // exchange to 57 page, the fans on + } + else if (recdat.data[0] == 4) { // Settings + show_status = false; + } + break; + + case Adjust: + if (recdat.data[0] == 1) { + show_status = false; + } + else if (recdat.data[0] == 2) { + show_status = true; + if (printerStatusKey[1] == 3) // during heating + sendData(ExchangePageBase + 53, ExchangepageAddr); + else if (printerStatusKey[1] == 4) + sendData(ExchangePageBase + 54, ExchangepageAddr); + else + sendData(ExchangePageBase + 53, ExchangepageAddr); + } + else if (recdat.data[0] == 3) + setTargetFan_percent(getTargetFan_percent((fan_t)getActiveTool()) != 0 ? 100 : 0, FAN0); + + break; + + case Feedrate: + setFeedrate_percent(recdat.data[0]); + break; + + case PrintChoice: + if (recdat.addr == Stopprint) { + if (recdat.data[0] == 240) { // no + sendData(ExchangePageBase + 53, ExchangepageAddr); + } + else { + sendData(ExchangePageBase + 45, ExchangepageAddr); + sendData(0, Timehour); + sendData(0, Timemin); + stopPrint(); + } + } + else if (recdat.addr == Pauseprint) { + if (recdat.data[0] != 0xF1) + break; + + sendData(ExchangePageBase + 54, ExchangepageAddr); + pausePrint(); + } + else if (recdat.addr == Resumeprint && recdat.data[0] == 1) { + resumePrint(); + + printerStatusKey[1] = 0; + show_status = true; + + sendData(ExchangePageBase + 53, ExchangepageAddr); + } + if (recdat.addr == Resumeprint && recdat.data[0] == 2) { // warming + resumePrint(); + nozzleTempStatus[2] = 1; + printerStatusKey[1] = 0; + show_status = true; + sendData(ExchangePageBase + 82, ExchangepageAddr); + } + break; + + case Zoffset: + float tmp_zprobe_offset; + if (recdat.data[0] >= 32768) + tmp_zprobe_offset = (float(recdat.data[0]) - 65536) / 100; + else + tmp_zprobe_offset = float(recdat.data[0]) / 100; + if (WITHIN((tmp_zprobe_offset), Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + int16_t tmpSteps = mmToWholeSteps(getZOffset_mm() - tmp_zprobe_offset, axis_t(Z)); + if (tmpSteps == 0) tmpSteps = getZOffset_mm() < tmp_zprobe_offset ? 1 : -1; + smartAdjustAxis_steps(-tmpSteps, axis_t(Z), false); + char zOffs[20], tmp1[11]; + sprintf_P(zOffs, PSTR("Z Offset : %s"), dtostrf(getZOffset_mm(), 1, 3, tmp1)); + onStatusChanged(zOffs); + } + else { + onStatusChanged(F("Requested Offset Beyond Limits")); + } + + sendData(getZOffset_mm() * 100, ProbeOffset_Z); + break; + + case TempControl: + if (recdat.data[0] == 0) { + show_status = true; + tpShowStatus = false; + } + else if (recdat.data[0] == 1) { + if (getTargetFan_percent((fan_t)getActiveTool()) == 0) + sendData(ExchangePageBase + 60, ExchangepageAddr); // exchange to 60 page, the fans off + else + sendData(ExchangePageBase + 59, ExchangepageAddr); // exchange to 59 page, the fans on + } + else if (recdat.data[0] == 2) { + show_status = true; + } + else if (recdat.data[0] == 3) { + if (getTargetFan_percent((fan_t)getActiveTool()) == 0) { // turn on the fan + setTargetFan_percent(100, FAN0); + sendData(ExchangePageBase + 57, ExchangepageAddr); // exchange to 57 page, the fans on + } + else { // turn off the fan + setTargetFan_percent(0, FAN0); + sendData(ExchangePageBase + 58, ExchangepageAddr); // exchange to 58 page, the fans on + } + } + else if (recdat.data[0] == 5) { // PLA mode + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, getActiveTool()); + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, BED); + sendData(PREHEAT_1_TEMP_HOTEND, NozzlePreheat); + sendData(PREHEAT_1_TEMP_BED, BedPreheat); + } + else if (recdat.data[0] == 6) { // ABS mode + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, getActiveTool()); + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, BED); + sendData(PREHEAT_2_TEMP_HOTEND, NozzlePreheat); + sendData(PREHEAT_2_TEMP_BED, BedPreheat); + } + else if (recdat.data[0] == 0xF1) { + //show_status = true; + #if FAN_COUNT > 0 + for (uint8_t i = 0; i < FAN_COUNT; i++) setTargetFan_percent(0, (fan_t)i); + #endif + setTargetTemp_celsius(0.0, H0); + TERN_(HAS_MULTI_HOTEND, setTargetTemp_celsius(0.0, H1)); + setTargetTemp_celsius(0.0, BED); + sendData(0, NozzlePreheat); delay_ms(1); + sendData(0, BedPreheat); delay_ms(1); + sendData(ExchangePageBase + 57, ExchangepageAddr); + printerStatusKey[1] = 2; + } + break; + + case ManualSetTemp: + if (recdat.addr == NzBdSet) { + if (recdat.data[0] == 0) { + if (getTargetFan_percent((fan_t)getActiveTool()) == 0) + sendData(ExchangePageBase + 58, ExchangepageAddr); // exchange to 58 page, the fans off + else + sendData(ExchangePageBase + 57, ExchangepageAddr); // exchange to 57 page, the fans on + } + else if (recdat.data[0] == 1) { + setTargetTemp_celsius(0.0, getActiveTool()); + sendData(0, NozzlePreheat); + } + else if (recdat.data[0] == 2) { + setTargetTemp_celsius(0.0, BED); + sendData(0, BedPreheat); + } + } + else if (recdat.addr == NozzlePreheat) { + setTargetTemp_celsius(float(recdat.data[0]), H0); + } + #if HAS_MULTI_HOTEND + else if (recdat.addr == e2Preheat) { + setTargetTemp_celsius(float(recdat.data[0]), H1); + } + #endif + else if (recdat.addr == BedPreheat) { + setTargetTemp_celsius(float(recdat.data[0]), BED); + } + else if (recdat.addr == Flowrate) { + setFlow_percent(int16_t(recdat.data[0]), getActiveTool()); + } + + #if HAS_PID_HEATING + else if (recdat.addr == HotendPID_AutoTmp) { + pid_hotendAutoTemp = uint16_t(recdat.data[0]); + } + else if (recdat.addr == BedPID_AutoTmp) { + pid_bedAutoTemp = uint16_t(recdat.data[0]); + } + #endif + + else if (recdat.addr == Accel_X) { + setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]) * 100, X); + } + else if (recdat.addr == Accel_Y) { + setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]) * 100, Y); + } + else if (recdat.addr == Accel_Z) { + setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]) * 10, Z); + } + else if (recdat.addr == Accel_E) { + setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]), E0); + setAxisMaxAcceleration_mm_s2(uint16_t(recdat.data[0]), E1); + } + + else if (recdat.addr == Feed_X) { + setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), X); + } + else if (recdat.addr == Feed_Y) { + setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), Y); + } + else if (recdat.addr == Feed_Z) { + setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), Z); + } + else if (recdat.addr == Feed_E) { + setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), E0); + setAxisMaxFeedrate_mm_s(uint16_t(recdat.data[0]), E1); + } + else if (recdat.addr == FanKeyIcon) { + setTargetFan_percent(uint16_t(recdat.data[0]), (fan_t)getActiveTool()); + } + else { + float tmp_float_handling; + if (recdat.data[0] >= 32768) + tmp_float_handling = (float(recdat.data[0]) - 65536) / 100; + else + tmp_float_handling = float(recdat.data[0]) / 100; + if (recdat.addr == StepMM_X) { + setAxisSteps_per_mm(tmp_float_handling * 10, X); + } + else if (recdat.addr == StepMM_Y) { + setAxisSteps_per_mm(tmp_float_handling * 10, Y); + } + else if (recdat.addr == StepMM_Z) { + setAxisSteps_per_mm(tmp_float_handling * 10, Z); + } + else if (recdat.addr == StepMM_E) { + setAxisSteps_per_mm(tmp_float_handling * 10, E0); + #if DISABLED(DUAL_X_CARRIAGE) + setAxisSteps_per_mm(tmp_float_handling * 10, E1); + #endif + } + #if ENABLED(DUAL_X_CARRIAGE) + else if (recdat.addr == T2StepMM_E) { + setAxisSteps_per_mm(tmp_float_handling * 10, E1); + } + else if (recdat.addr == T2Offset_X) { + setNozzleOffset_mm(tmp_float_handling * 10, X, E1); + } + else if (recdat.addr == T2Offset_Y) { + setNozzleOffset_mm(tmp_float_handling * 10, Y, E1); + } + else if (recdat.addr == T2Offset_Z) { + setNozzleOffset_mm(tmp_float_handling * 10, Z, E1); + } + #endif + #if HAS_BED_PROBE + else if (recdat.addr == ProbeOffset_X) { + setProbeOffset_mm(tmp_float_handling, X); + } + else if (recdat.addr == ProbeOffset_Y) { + setProbeOffset_mm(tmp_float_handling, Y); + } + else if (recdat.addr == ProbeOffset_Z) { + setProbeOffset_mm(tmp_float_handling, Z); + } + #endif + + #if ENABLED(CLASSIC_JERK) + else if (recdat.addr == Jerk_X) { + setAxisMaxJerk_mm_s(tmp_float_handling, X); + } + else if (recdat.addr == Jerk_Y) { + setAxisMaxJerk_mm_s(tmp_float_handling, Y); + } + else if (recdat.addr == Jerk_Z) { + setAxisMaxJerk_mm_s(tmp_float_handling, Z); + } + else if (recdat.addr == Jerk_E) { + setAxisMaxJerk_mm_s(tmp_float_handling, E0); + setAxisMaxJerk_mm_s(tmp_float_handling, E1); + } + #endif + + #if HAS_FILAMENT_SENSOR + else if (recdat.addr == RunoutToggle) { + setFilamentRunoutEnabled(!getFilamentRunoutEnabled()); + } + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + else if (recdat.addr == PowerLossToggle) { + setPowerLossRecoveryEnabled(!getPowerLossRecoveryEnabled()); + } + #endif + + #if ENABLED(CASE_LIGHT_ENABLE) + else if (recdat.addr == LedToggle) { + setCaseLightState(!getCaseLightState()); + } + #endif + + #if HAS_PID_HEATING + else if (recdat.addr == HotendPID_P) { + setPID(tmp_float_handling * 10, getPID_Ki(getActiveTool()), getPID_Kd(getActiveTool()), getActiveTool()); + } + else if (recdat.addr == HotendPID_I) { + setPID(getPID_Kp(getActiveTool()), tmp_float_handling * 10, getPID_Kd(getActiveTool()), getActiveTool()); + } + else if (recdat.addr == HotendPID_D) { + setPID(getPID_Kp(getActiveTool()), getPID_Ki(getActiveTool()), tmp_float_handling * 10, getActiveTool()); + } + #if ENABLED(PIDTEMPBED) + else if (recdat.addr == BedPID_P) { + setBedPID(tmp_float_handling * 10, getBedPID_Ki(), getBedPID_Kd()); + } + else if (recdat.addr == BedPID_I) { + setBedPID(getBedPID_Kp(), tmp_float_handling * 10, getBedPID_Kd()); + } + else if (recdat.addr == BedPID_D) { + setBedPID(getBedPID_Kp(), getBedPID_Ki(), tmp_float_handling * 10); + } + #endif + #endif // HAS_PID_HEATING + } + break; + + case Setting: + if (recdat.data[0] == 0) { // return to main page + show_status = true; + tpShowStatus = false; + } + else if (recdat.data[0] == 1) { // Bed Autoleveling + #if HAS_MESH + sendData(getLevelingActive() ? 3 : 2, AutoLevelIcon); + + if (ExtUI::getLevelingIsValid()) { + uint8_t abl_probe_index = 0; + for (uint8_t outer = 0; outer < GRID_MAX_POINTS_Y; outer++) + for (uint8_t inner = 0; inner < GRID_MAX_POINTS_X; inner++) { + const bool zig = outer & 1; + const xy_uint8_t point = { uint8_t(zig ? (GRID_MAX_POINTS_X - 1) - inner : inner), outer }; + sendData(ExtUI::getMeshPoint(point) * 1000, AutolevelVal + abl_probe_index * 2); + ++abl_probe_index; + } + } + #endif + sendData(10, FilenameIcon); // Motor Icon + injectCommands(isPositionKnown() ? F("G1F1000Z0.0") : F("G28\nG1F1000Z0.0")); + waitway = 2; + sendData(ExchangePageBase + 64, ExchangepageAddr); + } + else if (recdat.data[0] == 2) { // Exchange filament + show_status = true; + tpShowStatus = false; + ZERO(changeMaterialBuf); + changeMaterialBuf[1] = changeMaterialBuf[0] = 10; + sendData(10 * changeMaterialBuf[0], FilamentUnit1); // It's changeMaterialBuf for show, instead of current_position.e in them. + sendData(10 * changeMaterialBuf[1], FilamentUnit2); + sendData(getActualTemp_celsius(H0), NozzleTemp); + sendData(getTargetTemp_celsius(H0), NozzlePreheat); + sendData(TERN0(HAS_MULTI_HOTEND, getActualTemp_celsius(H1)), e2Temp); + sendData(TERN0(HAS_MULTI_HOTEND, getTargetTemp_celsius(H1)), e2Preheat); + delay_ms(2); + sendData(ExchangePageBase + 65, ExchangepageAddr); + } + else if (recdat.data[0] == 3) { // Move + axisPageNum = 0; + sendData(ExchangePageBase + 71, ExchangepageAddr); + } + else if (recdat.data[0] == 4) { // Language + // Just loads language screen, now used for tools + } + else if (recdat.data[0] == 5) { // Printer Information + sendData(WEBSITE_URL, CorpWebsite); + } + else if (recdat.data[0] == 6) { // Diabalestepper + injectCommands(F("M84")); + sendData(11, FilenameIcon); + } + break; + + case ReturnBack: + if (recdat.data[0] == 1) { // return to the tool page + show_status = false; + sendData(ExchangePageBase + 63, ExchangepageAddr); + } + if (recdat.data[0] == 2) // return to the Level mode page + sendData(ExchangePageBase + 64, ExchangepageAddr); + break; + + case Bedlevel: + switch (recdat.data[0]) { + case 1: { // Z-axis to home + // Disallow Z homing if X or Y are unknown + injectCommands(isAxisPositionKnown(axis_t(X)) && isAxisPositionKnown(axis_t(Y)) ? F("G28Z\nG1F1500Z0.0") : F("G28\nG1F1500Z0.0")); + sendData(getZOffset_mm() * 100, ProbeOffset_Z); + break; + } + case 2: { // Z-axis to Up + if (WITHIN((getZOffset_mm() + 0.1), Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + smartAdjustAxis_steps(getAxisSteps_per_mm(Z) / 10, axis_t(Z), false); + //setZOffset_mm(getZOffset_mm() + 0.1); + sendData(getZOffset_mm() * 100, ProbeOffset_Z); + char zOffs[20], tmp1[11]; + sprintf_P(zOffs, PSTR("Z Offset : %s"), dtostrf(getZOffset_mm(), 1, 3, tmp1)); + onStatusChanged(zOffs); + } + break; + } + case 3: { // Z-axis to Down + if (WITHIN((getZOffset_mm() - 0.1), Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + smartAdjustAxis_steps(-getAxisSteps_per_mm(Z) / 10, axis_t(Z), false); + //babystepAxis_steps(int16_t(-getAxisSteps_per_mm(Z)) / 10, axis_t(Z)); + //setZOffset_mm(getZOffset_mm() - 0.1); + sendData(getZOffset_mm() * 100, ProbeOffset_Z); + char zOffs[20], tmp1[11]; + sprintf_P(zOffs, PSTR("Z Offset : %s"), dtostrf(getZOffset_mm(), 1, 3, tmp1)); + onStatusChanged(zOffs); + } + break; + } + case 4: { // Assistant Level + TERN_(HAS_MESH, setLevelingActive(false)); + injectCommands(isPositionKnown() ? F("G1 F1000 Z0.0") : F("G28\nG1 F1000 Z0.0")); + waitway = 2; + sendData(ExchangePageBase + 84, ExchangepageAddr); + break; + } + case 5: { // AutoLevel "Measuring" Button + #if ENABLED(MESH_BED_LEVELING) + sendData(ExchangePageBase + 93, ExchangepageAddr); + #else + waitway = 3; // only for prohibiting to receive massage + sendData(3, AutolevelIcon); + uint8_t abl_probe_index = 0; + while (abl_probe_index < 25) { + sendData(0, AutolevelVal + abl_probe_index * 2); + ++abl_probe_index; + } + sendData(ExchangePageBase + 64, ExchangepageAddr); + injectCommands(F(MEASURING_GCODE)); + #endif + break; + } + + case 6: { // Assitant Level , Centre 1 + setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); + setAxisPosition_mm(X_CENTER, axis_t(X)); + setAxisPosition_mm(Y_CENTER, axis_t(Y)); + waitway = 6; + break; + } + case 7: { // Assitant Level , Front Left 2 + setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); + setAxisPosition_mm(X_MIN_BED + lfrb[0], axis_t(X)); + setAxisPosition_mm(Y_MIN_BED + lfrb[1], axis_t(Y)); + waitway = 6; + break; + } + case 8: { // Assitant Level , Front Right 3 + setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); + setAxisPosition_mm(X_MAX_BED - lfrb[2], axis_t(X)); + setAxisPosition_mm(Y_MIN_BED + lfrb[1], axis_t(Y)); + waitway = 6; + break; + } + case 9: { // Assitant Level , Back Right 4 + setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); + setAxisPosition_mm(X_MAX_BED - lfrb[2], axis_t(X)); + setAxisPosition_mm(Y_MAX_BED - lfrb[3], axis_t(Y)); + waitway = 6; + break; + } + case 10: { // Assitant Level , Back Left 5 + setAxisPosition_mm(BED_TRAMMING_Z_HOP, axis_t(Z)); + setAxisPosition_mm(X_MIN_BED + lfrb[0], axis_t(X)); + setAxisPosition_mm(Y_MAX_BED - lfrb[3], axis_t(Y)); + waitway = 6; + break; + } + case 11: { // Autolevel switch + #if HAS_MESH + const bool gla = !getLevelingActive(); + setLevelingActive(gla); + sendData(gla ? 3 : 2, AutoLevelIcon); + #endif + sendData(getZOffset_mm() * 100, ProbeOffset_Z); + break; + } + case 12: { + injectCommands(F("G26R255")); + onStatusChanged(F("Beginning G26.. Heating")); + break; + } + case 13: { + injectCommands(F("G29S1")); + onStatusChanged(F("Begin Manual Mesh")); + break; + } + case 14: { + injectCommands(F("G29S2")); + onStatusChanged(F("Moving to Next Mesh Point")); + break; + } + case 15: { + injectCommands(F("M211S0\nG91\nG1Z-0.025\nG90\nM211S1")); + onStatusChanged(F("Moved down 0.025")); + break; + } + case 16: { + injectCommands(F("M211S0\nG91\nG1Z0.025\nG90\nM211S1")); + onStatusChanged(F("Moved up 0.025")); + break; + } + case 17: { + dwin_settings.display_volume = 0; + dwin_settings.display_sound = false; + setTouchScreenConfiguration(); + break; + } + case 18: { + dwin_settings.display_volume = 255; + dwin_settings.display_sound = true; + setTouchScreenConfiguration(); + break; + } + case 19: { + dwin_settings.screen_brightness = 10; + setTouchScreenConfiguration(); + break; + } + case 20: { + dwin_settings.screen_brightness = 100; + setTouchScreenConfiguration(); + break; + } + case 21: { + dwin_settings.display_standby ^= true; + setTouchScreenConfiguration(); + break; + } + case 22: { + dwin_settings.screen_rotation = dwin_settings.screen_rotation == 10 ? 0 : 10; + setTouchScreenConfiguration(); + break; + } + case 23: { // Set IDEX Autopark + injectCommands(F("M605S1\nG28X\nG1X0")); + break; + } + case 24: { // Set IDEX Duplication + injectCommands(F("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0")); + break; + } + case 25: { // Set IDEX Mirrored Duplication + injectCommands(F("M605S1\nT0\nG28\nM605S2\nG28X\nG1X0\nM605S3")); + break; + } + case 26: { // Set IDEX Full Control + injectCommands(F("M605S0\nG28X")); + break; + } + case 27: { // Change Tool + setActiveTool(getActiveTool() == E0 ? E1 : E0, !isAxisPositionKnown(X)); + break; + } + default: break; + } + + sendData(10, FilenameIcon); + break; + + case XYZEaxis: { + axis_t axis = X; + float min = 0.0f, max = 0.0f; + waitway = 4; + if (recdat.addr == DisplayXaxis) { + axis = X; + min = X_MIN_POS; + max = X_MAX_POS; + } + else if (recdat.addr == DisplayYaxis) { + axis = Y; + min = Y_MIN_POS; + max = Y_MAX_POS; + } + else if (recdat.addr == DisplayZaxis) { + axis = Z; + min = Z_MIN_POS; + max = Z_MAX_POS; + } + else if (recdat.addr == AutoZero) { + if (recdat.data[0] == 3) { // autohome + waitway = 4; + injectCommands(F("G28\nG1 F1000 Z10")); + show_status = autoHomeKey = true; + autoHomeIconNum = 0; + sendData(10, FilenameIcon); + } + else { + axisPageNum = recdat.data[0]; + waitway = 0; + } + break; + } + + float targetPos = float(recdat.data[0]) / 10; + LIMIT(targetPos, min, max); + setAxisPosition_mm(targetPos, axis); + waitway = 0; + sendData(10, FilenameIcon); + break; + } + + case Filament: + + uint16_t IconTemp; + if (recdat.addr == Exchfilament) { + if (getActualTemp_celsius(getActiveTool()) < EXTRUDE_MINTEMP && recdat.data[0] < 5) { + sendData(int16_t(EXTRUDE_MINTEMP), 0x1020); + delay_ms(5); + sendData(ExchangePageBase + 66, ExchangepageAddr); + break; + } + + switch (recdat.data[0]) { + case 1: { // Unload filament1 + setAxisPosition_mm(getAxisPosition_mm(E0) - changeMaterialBuf[0], E0); + break; + } + case 2: { // Load filament1 + setAxisPosition_mm(getAxisPosition_mm(E0) + changeMaterialBuf[0], E0); + break; + } + case 3: { // Unload filament2 + setAxisPosition_mm(getAxisPosition_mm(E1) - changeMaterialBuf[1], E1); + break; + } + case 4: { // Load filament2 + setAxisPosition_mm(getAxisPosition_mm(E1) + changeMaterialBuf[1], E1); + break; + } + case 5: { // sure to heat + nozzleTempStatus[0] = 1; + + setTargetTemp_celsius((PREHEAT_1_TEMP_HOTEND + 10), getActiveTool()); + IconTemp = getActualTemp_celsius(getActiveTool()) * 100 / getTargetTemp_celsius(getActiveTool()); + NOMORE(IconTemp, 100U); + sendData(IconTemp, HeatPercentIcon); + + sendData(getActualTemp_celsius(H0), NozzleTemp); + sendData(getTargetTemp_celsius(H0), NozzlePreheat); + sendData(TERN0(HAS_MULTI_HOTEND, getActualTemp_celsius(H1)), e2Temp); + sendData(TERN0(HAS_MULTI_HOTEND, getTargetTemp_celsius(H1)), e2Preheat); + delay_ms(5); + sendData(ExchangePageBase + 68, ExchangepageAddr); + break; + } + case 6: { // cancel to heat + sendData(ExchangePageBase + 65, ExchangepageAddr); + break; + } + case 0xF1: { // Sure to cancel heating + nozzleTempStatus[0] = 0; + delay_ms(1); + sendData(ExchangePageBase + 65, ExchangepageAddr); + break; + } + case 0xF0: // not to cancel heating + break; + } + sendData(10 * changeMaterialBuf[0], FilamentUnit1); // It's changeMaterialBuf for show, instead of current_position.e in them. + sendData(10 * changeMaterialBuf[1], FilamentUnit2); + } + else if (recdat.addr == FilamentUnit1) { + changeMaterialBuf[0] = float(recdat.data[0]) / 10; + } + else if (recdat.addr == FilamentUnit2) { + changeMaterialBuf[1] = float(recdat.data[0]) / 10; + } + break; + + case LanguageChoice: + + //if (recdat.data[0] == 1) settings.save(); else injectCommands(F("M300")); + + // may at some point use language change screens to save eeprom explicitly + switch (recdat.data[0]) { + case 0: { + injectCommands(F("M500")); + break; + } + case 1: { + sendData(ExchangePageBase + 94, ExchangepageAddr); + break; + } + + #if ENABLED(PIDTEMP) + case 2: { + onStatusChanged(F("Hotend PID Started")); + startPIDTune(static_cast(pid_hotendAutoTemp), getActiveTool()); + break; + } + #endif + + case 3: { + injectCommands(F("M502\nM500")); + break; + } + case 4: { + injectCommands(F("M999\nM280P0S160")); + break; + } + + case 5: { + #if ENABLED(PIDTEMPBED) + onStatusChanged(F("Bed PID Started")); + startBedPIDTune(static_cast(pid_bedAutoTemp)); + #endif + break; + } + case 6: { + injectCommands(F("M500")); + break; + } + default: break; + } + break; + + case No_Filament: + if (recdat.data[0] == 1) { // Filament is out, resume / resume selected on screen + if (ExtUI::pauseModeStatus != PAUSE_MESSAGE_PURGE && ExtUI::pauseModeStatus != PAUSE_MESSAGE_OPTION) { + // setPauseMenuResponse(PAUSE_RESPONSE_RESUME_PRINT); + setUserConfirmed(); + // printerStatusKey[1] = 3; + // pause_resume_selected = true; + } + else { + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + bool runouton = false; + if (getFilamentRunoutState()) { + #if NUM_RUNOUT_SENSORS > 1 + if ((runouton = getFilamentRunoutEnabled(getActiveTool()))) + ExtUI::setFilamentRunoutEnabled(false, getActiveTool()); + #else + if ((runouton = getFilamentRunoutEnabled())) + ExtUI::setFilamentRunoutEnabled(false); + #endif + } + #else + constexpr bool runouton = false; + #endif + if (!runouton) { + setPauseMenuResponse(PAUSE_RESPONSE_RESUME_PRINT); + setUserConfirmed(); + printerStatusKey[1] = 3; + pause_resume_selected = true; + } + } + } + else if (recdat.data[0] == 0) { // Filamet is out, Cancel Selected + if (ExtUI::pauseModeStatus == PAUSE_MESSAGE_PURGE || ExtUI::pauseModeStatus == PAUSE_MESSAGE_OPTION) { + setPauseMenuResponse(PAUSE_RESPONSE_EXTRUDE_MORE); + setUserConfirmed(); + } + } + break; + + #if ENABLED(POWER_LOSS_RECOVERY) + case PwrOffNoF: + if (recdat.data[0] == 1) // Yes: continue to print the 3Dmode during power-off. + injectCommands(F("M1000")); + else if (recdat.data[0] == 2) // No + injectCommands(F("M1000C")); + break; + #endif + + case Volume: + if (recdat.data[0] < 0) + dwin_settings.display_volume = 0; + else if (recdat.data[0] > 255) + dwin_settings.display_volume = 0xFF; + else + dwin_settings.display_volume = recdat.data[0]; + + if (dwin_settings.display_volume == 0) { + sendData(0, VolumeIcon); + sendData(9, SoundIcon); + } + else { + sendData((dwin_settings.display_volume + 1) / 32 - 1, VolumeIcon); + sendData(8, SoundIcon); + } + sendData(dwin_settings.display_volume << 8, SoundAddr + 1); + break; + + case Filename: + if (isMediaInserted() && recdat.addr == FilenameChs) { + + recordcount = recdat.data[0] - 1; + if (filenavigator.currentindex == 0 && filenavigator.folderdepth > 0 && (fileIndex + recordcount) == 0) { + filenavigator.upDIR(); + filenavigator.getFiles(0); + fileIndex = 0; + return; + } + + if (filenavigator.currentindex == 0 && filenavigator.folderdepth > 0) + recordcount = recordcount - 1; // account for return dir link in file index + + for (int16_t j = 1; j <= 4; j++) { // Clear filename BG Color and Frame + sendData(0xFFFFUL, FilenameNature + j * 16); // white + sendData(10, FilenameIcon1 + j); // clean + } + for (int16_t j = 0; j < 10; j++) // clear current filename + sendData(0, Choosefilename + j); + + if (filenavigator.getIndexisDir(fileIndex + recordcount)) { + filenavigator.changeDIR((char *)filenavigator.getIndexName(fileIndex + recordcount)); + filenavigator.getFiles(0); + fileIndex = 0; + return; + } + else { + sendData(filenavigator.getIndexName(fileIndex + recordcount), Choosefilename); + sendData(0x87F0UL, FilenameNature + recdat.data[0] * 16); // Change BG of selected line to Light Green + sendData(6, FilenameIcon1 + recdat.data[0]); // show frame + } + } + else if (recdat.addr == FilenamePlay) { + if (recdat.data[0] == 1 && isMediaInserted()) { // for sure + printFile(filenavigator.getIndexName(fileIndex + recordcount)); + + for (int16_t j = 0; j < 10; j++) // clean screen. + sendData(0, Printfilename + j); + + sendData(filenavigator.getIndexName(fileIndex + recordcount), Printfilename); + + delay_ms(4); + + sendData(ExchangePageBase + 53, ExchangepageAddr); + + tpShowStatus = show_status = true; + printerStatusKey[0] = 1; + printerStatusKey[1] = 3; + fileIndex = 0; + recordcount = 0; + } + else if (recdat.data[0] == 2) { // Page Down + if ((fileIndex + DISPLAY_FILES) < (filenavigator.maxFiles() + (filenavigator.folderdepth != 0))) { + fileIndex = fileIndex + DISPLAY_FILES; + // if(filenavigator.folderdepth!=0 && fileIndex!=0) //Shift to acknowledge Return DIR button on first page + // filenavigator.getFiles(fileIndex-1); + // else + filenavigator.getFiles(fileIndex); + // filenavigator.getFiles(filenavigator.currentindex+1); + } + } + else if (recdat.data[0] == 3) { // Page Up + if (fileIndex >= DISPLAY_FILES) { + fileIndex = fileIndex - DISPLAY_FILES; + // if(filenavigator.folderdepth!=0 && fileIndex!=0) //Shift to acknowledge Return DIR button on first page + // filenavigator.getFiles(filenavigator.currentindex-DISPLAY_FILES); + // else + filenavigator.getFiles(fileIndex); + } + } + else if (recdat.data[0] == 4) { // Page Up + injectCommands(F("M22\nM21")); + } + else if (recdat.data[0] == 0) { // return to main page + show_status = true; + tpShowStatus = false; + } + } + break; + + case VolumeDisplay: { + if (recdat.data[0] == 0) { + dwin_settings.display_volume = 0; + dwin_settings.display_sound = false; + } + else if (recdat.data[0] > 100) { + dwin_settings.display_volume = 255; + dwin_settings.display_sound = true; + } + else { + dwin_settings.display_volume = (uint8_t)map(constrain(recdat.data[0], 0, 100), 0, 100, 0, 255); + dwin_settings.display_sound = true; + } + setTouchScreenConfiguration(); + break; + } + + case DisplayBrightness: { + if (recdat.data[0] < 10) + dwin_settings.screen_brightness = 10; + else if (recdat.data[0] > 100) + dwin_settings.screen_brightness = 100; + else + dwin_settings.screen_brightness = (uint8_t)recdat.data[0]; + setTouchScreenConfiguration(); + break; + } + + case DisplayStandbyBrightness: { + if (recdat.data[0] < 10) + dwin_settings.standby_brightness = 10; + else if (recdat.data[0] > 100) + dwin_settings.standby_brightness = 100; + else + dwin_settings.standby_brightness = (uint8_t)recdat.data[0]; + setTouchScreenConfiguration(); + break; + } + + case DisplayStandbySeconds: { + if (recdat.data[0] < 5) + dwin_settings.standby_time_seconds = 5; + else if (recdat.data[0] > 100) + dwin_settings.standby_time_seconds = 100; + else + dwin_settings.standby_time_seconds = (uint8_t)recdat.data[0]; + setTouchScreenConfiguration(); + break; + } + + case AutolevelVal: { + uint8_t meshPoint = (recdat.addr - AutolevelVal) / 2, + yPnt = floor(meshPoint / GRID_MAX_POINTS_X), + xPnt = meshPoint - (yPnt * GRID_MAX_POINTS_X); + if (yPnt % 2 != 0) xPnt = (GRID_MAX_POINTS_X - 1) - xPnt; // zag row + + float meshVal = float(recdat.data[0] - (recdat.data[0] >= 32768 ? 65536 : 0)) / 1000; + + LIMIT(meshVal, Z_PROBE_LOW_POINT, Z_CLEARANCE_BETWEEN_PROBES); + xy_uint8_t point = { xPnt, yPnt }; + setMeshPoint(point, meshVal); + sendData(meshVal * 1000, recdat.addr); + break; + } + + default: break; + } + + memset(&recdat, 0, sizeof(recdat)); + recdat.head[0] = FHONE; + recdat.head[1] = FHTWO; +} + +void RTS::writeVariable(const uint16_t adr, const void * const values, uint8_t valueslen, const bool isstr/*=false*/, const char fillChar/*=' '*/) { + const char* myvalues = static_cast(values); + bool strend = !myvalues; + DWIN_SERIAL.write(FHONE); + DWIN_SERIAL.write(FHTWO); + DWIN_SERIAL.write(valueslen + 3); + DWIN_SERIAL.write(0x82); + DWIN_SERIAL.write(adr >> 8); + DWIN_SERIAL.write(adr & 0xFF); + while (valueslen--) { + char x; + if (!strend) x = *myvalues++; + if ((isstr && !x) || strend) { + strend = true; + x = fillChar; + } + DWIN_SERIAL.write(x); + } +} + +void RTS::setTouchScreenConfiguration() { + // Main configuration (System_Config) + LIMIT(dwin_settings.screen_brightness, 10, 100); // Prevent a possible all-dark screen + LIMIT(dwin_settings.standby_time_seconds, 10, 655); // Prevent a possible all-dark screen for standby, yet also don't go higher than the DWIN limitation + + uint8_t cfg_bits = (0x0 + | _BV(7) // 7: Enable Control ... TERN0(DWINOS_4, _BV(7)) + | _BV(5) // 5: load 22 touch file + | _BV(4) // 4: auto-upload should always be enabled + | (dwin_settings.display_sound ? _BV(3) : 0) // 3: audio + | (dwin_settings.display_standby ? _BV(2) : 0) // 2: backlight on standby + | (dwin_settings.screen_rotation == 10 ? _BV(1) : 0) // 1 & 0: Inversion + #if LCD_SCREEN_ROTATE == 90 + | _BV(0) // Portrait Mode or 800x480 display has 0 point rotated 90deg from 480x272 display + #elif LCD_SCREEN_ROTATE + #error "Only 90° rotation is supported for the selected LCD." + #endif + ); + + const uint8_t config_set[] = { 0x5A, 0x00, TERN(DWINOS_4, 0x00, 0xFF), cfg_bits }; + writeVariable(0x80 /*System_Config*/, config_set, sizeof(config_set)); + + // Standby brightness (LED_Config) + uint16_t dwinStandbyTimeSeconds = 100 * dwin_settings.standby_time_seconds; /* milliseconds, but divided by 10 (not 5 like the docs say) */ + const uint8_t brightness_set[] = { + dwin_settings.screen_brightness /*% active*/, + dwin_settings.standby_brightness /*% standby*/, + static_cast(dwinStandbyTimeSeconds >> 8), + static_cast(dwinStandbyTimeSeconds) + }; + writeVariable(0x82 /*LED_Config*/, brightness_set, sizeof(brightness_set)); + + if (!dwin_settings.display_sound) { + sendData(0, VolumeIcon); + sendData(9, SoundIcon); + } + else { + sendData((dwin_settings.display_volume + 1) / 32 - 1, VolumeIcon); + sendData(8, SoundIcon); + } + sendData(dwin_settings.display_volume, VolumeIcon - 2); + sendData(dwin_settings.display_volume << 8, SoundAddr + 1); + sendData(map(constrain(dwin_settings.display_volume, 0, 255), 0, 255, 0, 100), VolumeDisplay); + sendData(dwin_settings.screen_brightness, DisplayBrightness); + sendData(dwin_settings.standby_brightness, DisplayStandbyBrightness); + sendData(dwin_settings.standby_time_seconds, DisplayStandbySeconds); + sendData(dwin_settings.display_standby ? 3 : 2, DisplayStandbyEnableIndicator); +} + +#endif // DGUS_LCD_UI_IA_CREALITY diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.h b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.h similarity index 60% rename from Marlin/src/lcd/extui/ia_creality/ia_creality_extui.h rename to Marlin/src/lcd/extui/ia_creality/ia_creality_rts.h index 0d93255663..3b467f4d25 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.h +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.h @@ -22,17 +22,18 @@ #pragma once /* **************************************** - * lcd/extui/ia_creality/ia_creality_extui.h + * lcd/extui/ia_creality/ia_creality_rts.h * **************************************** * Extensible_UI implementation for Creality DWIN * 10SPro, Max, CRX, and others - * Based original Creality release, ported to ExtUI for Marlin 2.0 + * Based original Creality release * Written by Insanity Automation, sponsored by Tiny Machines 3D * * ***************************************/ -#include "string.h" -#include "../ui_api.h" +#include "../../../inc/MarlinConfig.h" + +#include /*********************************/ #define FHONE (0x5A) @@ -46,7 +47,7 @@ #define FileNum MaxFileNumber #define FileNameLen TEXTBYTELEN -#define SizeofDatabuf 46 +#define DATA_BUF_SIZE 46 //#define FONT_EEPROM 90 //#define AutoLeve_EEPROM 100 @@ -176,122 +177,114 @@ #define StatusMessageString 0x2064 +// TODO: Use LCD_SERIAL 1 or 3 (?) by configuration, not overriding here #ifdef TARGET_STM32F4 #define DWIN_SERIAL Serial1 #else #define DWIN_SERIAL LCD_SERIAL #endif -namespace ExtUI { +/************struct**************/ - /************struct**************/ +typedef enum : uint8_t { + DGUS_IDLE, //< waiting for DGUS_HEADER1. + DGUS_HEADER1_SEEN, //< DGUS_HEADER1 received + DGUS_HEADER2_SEEN, //< DGUS_HEADER2 received + DGUS_WAIT_TELEGRAM, //< LEN received, Waiting for to receive all bytes. +} rx_datagram_state_t; - typedef enum : uint8_t { - DGUS_IDLE, //< waiting for DGUS_HEADER1. - DGUS_HEADER1_SEEN, //< DGUS_HEADER1 received - DGUS_HEADER2_SEEN, //< DGUS_HEADER2 received - DGUS_WAIT_TELEGRAM, //< LEN received, Waiting for to receive all bytes. - } rx_datagram_state_t; +typedef struct DataBuf { + uint8_t len; + uint8_t head[2]; + uint8_t command; + uint32_t addr; + uint32_t bytelen; + uint16_t data[32]; + uint8_t reserv[4]; +} DB; - typedef struct DataBuf { - uint8_t len; - uint8_t head[2]; - uint8_t command; - uint32_t addr; - uint32_t bytelen; - uint16_t data[32]; - uint8_t reserv[4]; - } DB; +struct creality_dwin_settings_t { + size_t settings_size; + uint8_t settings_version; - struct creality_dwin_settings_t { - size_t settings_size; - uint8_t settings_version; + bool display_standby; + bool display_sound; + int8_t screen_rotation; + int16_t display_volume; + uint8_t standby_brightness; + uint8_t screen_brightness; + int16_t standby_time_seconds; +}; - bool display_standby; - bool display_sound; - int8_t screen_rotation; - int16_t display_volume; - uint8_t standby_screen_brightness; - uint8_t screen_brightness; - int16_t standby_time_seconds; - }; +class RTS { + public: + RTS(); + static void onStartup(); + static void onIdle(); + static int16_t receiveData(); + static void sendData(); + static void sendData(const String&, const uint32_t, const uint8_t=VarAddr_W); + static void sendData(const char[], const uint32_t, const uint8_t=VarAddr_W); + static void sendData(char, const uint32_t, const uint8_t=VarAddr_W); + static void sendData(int, const uint32_t, const uint8_t=VarAddr_W); + static void sendData(unsigned long, const uint32_t, const uint8_t=VarAddr_W); + static void sendData(const_float_t, const uint32_t, const uint8_t=VarAddr_W); - void SetTouchScreenConfiguration(); + static void sendData(uint8_t * const str, const uint32_t addr, const uint8_t cmd=VarAddr_W) { sendData((char *)str, addr, cmd); } + static void sendData(const unsigned int n, uint32_t addr, const uint8_t cmd=VarAddr_W) { sendData(int(n), addr, cmd); } + static void sendData(const long n, const uint32_t addr, const uint8_t cmd=VarAddr_W) { sendData((unsigned long)n, addr, cmd); } - class RTSSHOW { - public: - RTSSHOW(); - int16_t RTS_RecData(); - void RTS_SDCardInit(); - void RTS_SDCardUpate(bool, bool); - int16_t RTS_CheckFilament(int16_t); - void RTS_SndData(); - void RTS_SndData(const String&, const uint32_t, const uint8_t=VarAddr_W); - void RTS_SndData(const char[], const uint32_t, const uint8_t=VarAddr_W); - void RTS_SndData(char, const uint32_t, const uint8_t=VarAddr_W); - void RTS_SndData(int, const uint32_t, const uint8_t=VarAddr_W); - void RTS_SndData(unsigned long, const uint32_t, const uint8_t=VarAddr_W); - void RTS_SndData(const_float_t, const uint32_t, const uint8_t=VarAddr_W); + static void handleData(); - void RTS_SndData(uint8_t * const str, const uint32_t addr, const uint8_t cmd=VarAddr_W) { RTS_SndData((char *)str, addr, cmd); } - void RTS_SndData(const unsigned int n, uint32_t addr, const uint8_t cmd=VarAddr_W) { RTS_SndData(int(n), addr, cmd); } - void RTS_SndData(const long n, const uint32_t addr, const uint8_t cmd=VarAddr_W) { RTS_SndData((unsigned long)n, addr, cmd); } + static void writeVariable(const uint16_t adr, const void * const values, uint8_t valueslen, const bool isstr=false, const char fillChar=' '); + static void setTouchScreenConfiguration(); - void RTS_SDcard_Stop(); - void RTS_HandleData(); - void RTS_Init(); + static DB recdat, snddat; + static uint8_t databuf[DATA_BUF_SIZE]; - DB recdat; - DB snddat; - uint8_t databuf[SizeofDatabuf]; + static rx_datagram_state_t rx_datagram_state; + static uint8_t rx_datagram_len; +}; - static rx_datagram_state_t rx_datagram_state; - static uint8_t rx_datagram_len; - static bool Initialized; - }; +extern RTS rts; - static RTSSHOW rtscheck; +#define Addvalue 3 +#define PrintChoice_Value (0 + Addvalue) +#define Zoffset_Value (3 + Addvalue) +#define Setting_Value (8 + Addvalue) +#define XYZEaxis_Value (12 + Addvalue) +#define Filament_Value (15 + Addvalue) +#define Language_Value (18 + Addvalue) +#define Filename_Value (22 + Addvalue) - #define Addvalue 3 - #define PrintChoice_Value (0 + Addvalue) - #define Zoffset_Value (3 + Addvalue) - #define Setting_Value (8 + Addvalue) - #define XYZEaxis_Value (12 + Addvalue) - #define Filament_Value (15 + Addvalue) - #define Language_Value (18 + Addvalue) - #define Filename_Value (22 + Addvalue) +enum PROC_COM { + Printfile = 0, + Adjust, + Feedrate, + PrintChoice = PrintChoice_Value, + Zoffset = Zoffset_Value, + TempControl, + ManualSetTemp, + Setting = Setting_Value, + ReturnBack, + Bedlevel, + Autohome, + XYZEaxis = XYZEaxis_Value, + Filament = Filament_Value, + LanguageChoice = Language_Value, + No_Filament, + PwrOffNoF, + Volume, + Filename = Filename_Value +}; - enum PROC_COM { - Printfile = 0, - Adjust, - Feedrate, - PrintChoice = PrintChoice_Value, - Zoffset = Zoffset_Value, - TempControl, - ManualSetTemp, - Setting = Setting_Value, - ReturnBack, - Bedlevel, - Autohome, - XYZEaxis = XYZEaxis_Value, - Filament = Filament_Value, - LanguageChoice = Language_Value, - No_Filament, - PwrOffNoF, - Volume, - Filename = Filename_Value - }; +const uint16_t Addrbuf[] = { + 0x1002, 0x1004, 0x1006, 0x1008, 0x100A, 0x100C, 0x1026, 0x1030, 0x1032, 0x1034, 0x103A, + 0x103E, 0x1040, 0x1044, 0x1046, 0x1048, 0x104A, 0x104C, 0x1054, 0x1056, 0x1058, + 0x105C, 0x105E, 0x105F, 0x1088, 0 +}; - const uint16_t Addrbuf[] = { - 0x1002, 0x1004, 0x1006, 0x1008, 0x100A, 0x100C, 0x1026, 0x1030, 0x1032, 0x1034, 0x103A, - 0x103E, 0x1040, 0x1044, 0x1046, 0x1048, 0x104A, 0x104C, 0x1054, 0x1056, 0x1058, - 0x105C, 0x105E, 0x105F, 0x1088, 0 - }; - - void RTSUpdate(); - void RTSInit(); - -} // ExtUI +void RTS_Update(); #ifndef MAIN_MENU_ITEM_1_GCODE #if ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -304,3 +297,19 @@ namespace ExtUI { #else #define MEASURING_GCODE MAIN_MENU_ITEM_1_GCODE #endif + +// Data shared by RTS and ExtUI +extern uint16_t fileIndex; +extern uint8_t recordcount; +extern uint8_t startprogress; +extern char waitway; +extern char printerStatusKey[2]; // [0] = 0:ready [1] = 0:keep temperature, 1:heating, 2:cooling, 3:printing +extern bool show_status; +extern bool tpShowStatus; // true: opening time/percentage, false: closing time/percentage +extern uint8_t lastPauseMsgState; +extern creality_dwin_settings_t dwin_settings; +extern bool no_reentry; +#if HAS_PID_HEATING + extern uint16_t pid_hotendAutoTemp; + extern uint16_t pid_bedAutoTemp; +#endif diff --git a/Marlin/src/lcd/extui/malyan/malyan.cpp b/Marlin/src/lcd/extui/malyan/malyan.cpp index 1c051f4504..d1c2387682 100644 --- a/Marlin/src/lcd/extui/malyan/malyan.cpp +++ b/Marlin/src/lcd/extui/malyan/malyan.cpp @@ -79,7 +79,7 @@ void write_to_lcd(FSTR_P const fmsg) { char encoded_message[MAX_CURLY_COMMAND]; uint8_t message_length = _MIN(strlen_P(pmsg), sizeof(encoded_message)); - LOOP_L_N(i, message_length) + for (uint8_t i = 0; i < message_length; ++i) encoded_message[i] = pgm_read_byte(&pmsg[i]) | 0x80; LCD_SERIAL.Print::write(encoded_message, message_length); @@ -89,7 +89,7 @@ void write_to_lcd(const char * const cmsg) { char encoded_message[MAX_CURLY_COMMAND]; const uint8_t message_length = _MIN(strlen(cmsg), sizeof(encoded_message)); - LOOP_L_N(i, message_length) + for (uint8_t i = 0; i < message_length; ++i) encoded_message[i] = cmsg[i] | 0x80; LCD_SERIAL.Print::write(encoded_message, message_length); diff --git a/Marlin/src/lcd/extui/malyan/malyan_extui.cpp b/Marlin/src/lcd/extui/malyan/malyan_extui.cpp index 042062b7c9..f82f1f06a7 100644 --- a/Marlin/src/lcd/extui/malyan/malyan_extui.cpp +++ b/Marlin/src/lcd/extui/malyan/malyan_extui.cpp @@ -150,11 +150,14 @@ namespace ExtUI { void onSettingsStored(const bool) {} void onSettingsLoaded(const bool) {} - #if HAS_MESH + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} - 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 + + #if HAS_MESH + void onMeshUpdate(const int8_t, const int8_t, const_float_t) {} + void onMeshUpdate(const int8_t, const int8_t, const ExtUI::probe_state_t) {} #endif #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/lcd/extui/mks_ui/SPI_TFT.cpp b/Marlin/src/lcd/extui/mks_ui/SPI_TFT.cpp index 42abd4bf64..6cbe13e9fd 100644 --- a/Marlin/src/lcd/extui/mks_ui/SPI_TFT.cpp +++ b/Marlin/src/lcd/extui/mks_ui/SPI_TFT.cpp @@ -37,29 +37,29 @@ TFT SPI_TFT; // use SPI1 for the spi tft. -void TFT::spi_init(uint8_t spiRate) { - tftio.Init(); +void TFT::spiInit(uint8_t spiRate) { + tftio.init(); } -void TFT::SetPoint(uint16_t x, uint16_t y, uint16_t point) { +void TFT::setPoint(uint16_t x, uint16_t y, uint16_t point) { if ((x > 480) || (y > 320)) return; setWindow(x, y, 1, 1); - tftio.WriteMultiple(point, (uint16_t)1); + tftio.writeMultiple(point, (uint16_t)1); } void TFT::setWindow(uint16_t x, uint16_t y, uint16_t with, uint16_t height) { tftio.set_window(x, y, (x + with - 1), (y + height - 1)); } -void TFT::LCD_init() { - tftio.InitTFT(); +void TFT::lcdInit() { + tftio.initTFT(); #if PIN_EXISTS(TFT_BACKLIGHT) OUT_WRITE(TFT_BACKLIGHT_PIN, LOW); #endif delay(100); - LCD_clear(0x0000); - LCD_Draw_Logo(); + lcdClear(0x0000); + lcdDrawLogo(); #if PIN_EXISTS(TFT_BACKLIGHT) OUT_WRITE(TFT_BACKLIGHT_PIN, HIGH); #endif @@ -68,17 +68,17 @@ void TFT::LCD_init() { #endif } -void TFT::LCD_clear(uint16_t color) { +void TFT::lcdClear(uint16_t color) { setWindow(0, 0, TFT_WIDTH, TFT_HEIGHT); - tftio.WriteMultiple(color, uint32_t(TFT_WIDTH) * uint32_t(TFT_HEIGHT)); + tftio.writeMultiple(color, uint32_t(TFT_WIDTH) * uint32_t(TFT_HEIGHT)); } -void TFT::LCD_Draw_Logo() { +void TFT::lcdDrawLogo() { #if HAS_LOGO_IN_FLASH setWindow(0, 0, TFT_WIDTH, TFT_HEIGHT); for (uint16_t i = 0; i < (TFT_HEIGHT); i++) { - Pic_Logo_Read((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); - tftio.WriteSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); + picLogoRead((uint8_t *)"", (uint8_t *)bmp_public_buf, (TFT_WIDTH) * 2); + tftio.writeSequence((uint16_t *)bmp_public_buf, TFT_WIDTH); } #endif } diff --git a/Marlin/src/lcd/extui/mks_ui/SPI_TFT.h b/Marlin/src/lcd/extui/mks_ui/SPI_TFT.h index 62a084fb11..56576c8c16 100644 --- a/Marlin/src/lcd/extui/mks_ui/SPI_TFT.h +++ b/Marlin/src/lcd/extui/mks_ui/SPI_TFT.h @@ -27,12 +27,12 @@ class TFT { public: TFT_IO tftio; - void spi_init(uint8_t spiRate); - void SetPoint(uint16_t x, uint16_t y, uint16_t point); + void spiInit(uint8_t spiRate); + void setPoint(uint16_t x, uint16_t y, uint16_t point); void setWindow(uint16_t x, uint16_t y, uint16_t with, uint16_t height); - void LCD_init(); - void LCD_clear(uint16_t color); - void LCD_Draw_Logo(); + void lcdInit(); + void lcdClear(uint16_t color); + void lcdDrawLogo(); }; extern TFT SPI_TFT; diff --git a/Marlin/src/lcd/extui/mks_ui/draw_acceleration_settings.cpp b/Marlin/src/lcd/extui/mks_ui/draw_acceleration_settings.cpp index ac7d6d3dfb..48455e7e36 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_acceleration_settings.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_acceleration_settings.cpp @@ -124,8 +124,10 @@ void lv_draw_acceleration_settings() { lv_screen_menu_item_1_edit(scr, machine_menu.TravelAcceleration, PARA_UI_POS_X, y, event_handler, ID_ACCE_TRAVEL, 2, public_buf_l); y += PARA_UI_POS_Y; - itoa(planner.settings.max_acceleration_mm_per_s2[X_AXIS], public_buf_l, 10); - lv_screen_menu_item_1_edit(scr, machine_menu.X_Acceleration, PARA_UI_POS_X, y, event_handler, ID_ACCE_X, 3, public_buf_l); + #if HAS_X_AXIS + itoa(planner.settings.max_acceleration_mm_per_s2[X_AXIS], public_buf_l, 10); + lv_screen_menu_item_1_edit(scr, machine_menu.X_Acceleration, PARA_UI_POS_X, y, event_handler, ID_ACCE_X, 3, public_buf_l); + #endif 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_ACCE_DOWN, true); } diff --git a/Marlin/src/lcd/extui/mks_ui/draw_auto_level_offset_settings.cpp b/Marlin/src/lcd/extui/mks_ui/draw_auto_level_offset_settings.cpp index fd14585e70..5a5d457b08 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_auto_level_offset_settings.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_auto_level_offset_settings.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, HAS_BED_PROBE) +#if ALL(HAS_TFT_LVGL_UI, HAS_BED_PROBE) #include "draw_ui.h" #include diff --git a/Marlin/src/lcd/extui/mks_ui/draw_cloud_bind.cpp b/Marlin/src/lcd/extui/mks_ui/draw_cloud_bind.cpp index 1dae0ebe22..0798db1cc9 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_cloud_bind.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_cloud_bind.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) +#if ALL(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) #include "lv_conf.h" #include "draw_ui.h" diff --git a/Marlin/src/lcd/extui/mks_ui/draw_error_message.cpp b/Marlin/src/lcd/extui/mks_ui/draw_error_message.cpp index bc15100153..2c9928f387 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_error_message.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_error_message.cpp @@ -35,7 +35,7 @@ static lv_obj_t *scr; void lv_draw_error_message(FSTR_P const fmsg) { FSTR_P fhalted = F("PRINTER HALTED"), fplease = F("Please Reset"); - SPI_TFT.LCD_clear(0x0000); + SPI_TFT.lcdClear(0x0000); if (fmsg) disp_string((TFT_WIDTH - strlen_P(FTOP(fmsg)) * 16) / 2, 100, fmsg, 0xFFFF, 0x0000); disp_string((TFT_WIDTH - strlen_P(FTOP(fhalted)) * 16) / 2, 140, fhalted, 0xFFFF, 0x0000); disp_string((TFT_WIDTH - strlen_P(FTOP(fplease)) * 16) / 2, 180, fplease, 0xFFFF, 0x0000); diff --git a/Marlin/src/lcd/extui/mks_ui/draw_jerk_settings.cpp b/Marlin/src/lcd/extui/mks_ui/draw_jerk_settings.cpp index a070cae15f..5b22103e8f 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_jerk_settings.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_jerk_settings.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, HAS_CLASSIC_JERK) +#if ALL(HAS_TFT_LVGL_UI, HAS_CLASSIC_JERK) #include "draw_ui.h" #include diff --git a/Marlin/src/lcd/extui/mks_ui/draw_media_select.cpp b/Marlin/src/lcd/extui/mks_ui/draw_media_select.cpp index 81c82dc02d..085a008acd 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_media_select.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_media_select.cpp @@ -21,7 +21,7 @@ */ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, MULTI_VOLUME) +#if ALL(HAS_TFT_LVGL_UI, MULTI_VOLUME) #include "draw_ui.h" #include diff --git a/Marlin/src/lcd/extui/mks_ui/draw_pause_message.cpp b/Marlin/src/lcd/extui/mks_ui/draw_pause_message.cpp index e5f6a5963a..b753a57801 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_pause_message.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_pause_message.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, ADVANCED_PAUSE_FEATURE) +#if ALL(HAS_TFT_LVGL_UI, ADVANCED_PAUSE_FEATURE) #include "draw_ui.h" #include diff --git a/Marlin/src/lcd/extui/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/mks_ui/draw_print_file.cpp index 4997641e15..da79cb6174 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_print_file.cpp @@ -120,8 +120,6 @@ bool have_pre_pic(char *path) { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; uint8_t i, file_count = 0; - //switch (obj->mks_obj_id) - //{ if (obj->mks_obj_id == ID_P_UP) { if (dir_offset[curDirLever].curPage > 0) { // 2015.05.19 @@ -130,9 +128,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (dir_offset[curDirLever].cur_page_first_offset >= FILE_NUM) list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset - FILE_NUM; - #if HAS_MEDIA - file_count = search_file(); - #endif + TERN_(HAS_MEDIA, file_count = search_file()); if (file_count != 0) { dir_offset[curDirLever].curPage--; lv_clear_print_file(); @@ -144,9 +140,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (dir_offset[curDirLever].cur_page_last_offset > 0) { list_file.Sd_file_cnt = 0; list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_last_offset + 1; - #if HAS_MEDIA - file_count = search_file(); - #endif + TERN_(HAS_MEDIA, file_count = search_file()); if (file_count != 0) { dir_offset[curDirLever].curPage++; lv_clear_print_file(); @@ -161,17 +155,13 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { int8_t *ch = (int8_t *)strrchr(list_file.curDirPath, '/'); if (ch) { *ch = 0; - #if HAS_MEDIA - card.cdup(); - #endif + TERN_(HAS_MEDIA, card.cdup()); dir_offset[curDirLever].curPage = 0; dir_offset[curDirLever].cur_page_first_offset = 0; dir_offset[curDirLever].cur_page_last_offset = 0; curDirLever--; list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - #if HAS_MEDIA - file_count = search_file(); - #endif + TERN_(HAS_MEDIA, file_count = search_file()); lv_clear_print_file(); disp_gcode_icon(file_count); } @@ -189,9 +179,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { strcpy(list_file.curDirPath, list_file.file_name[i]); curDirLever++; list_file.Sd_file_offset = dir_offset[curDirLever].cur_page_first_offset; - #if HAS_MEDIA - file_count = search_file(); - #endif + TERN_(HAS_MEDIA, file_count = search_file()); lv_clear_print_file(); disp_gcode_icon(file_count); } @@ -396,8 +384,7 @@ int ascii2dec_test(char *ascii) { void lv_gcode_file_read(uint8_t *data_buf) { #if HAS_MEDIA - uint16_t i = 0, j = 0, k = 0; - uint16_t row_1 = 0; + uint16_t i = 0, j = 0, k = 0, row_1 = 0; bool ignore_start = true; char temp_test[200]; volatile uint16_t *p_index; @@ -435,24 +422,13 @@ void lv_gcode_file_read(uint8_t *data_buf) { break; } } - #if HAS_TFT_LVGL_UI_SPI - for (i = 0; i < 200;) { - p_index = (uint16_t *)(&public_buf[i]); - - //Color = (*p_index >> 8); - //*p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; - } - #else // !HAS_TFT_LVGL_UI_SPI - for (i = 0; i < 200;) { - p_index = (uint16_t *)(&public_buf[i]); - //Color = (*p_index >> 8); - //*p_index = Color | ((*p_index & 0xFF) << 8); - i += 2; - if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; // 0x18C3; - } - #endif // !HAS_TFT_LVGL_UI_SPI + for (i = 0; i < 200;) { + p_index = (uint16_t *)(&public_buf[i]); + //Color = (*p_index >> 8); + //*p_index = Color | ((*p_index & 0xFF) << 8); + i += 2; + if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; + } memcpy(data_buf, public_buf, 200); #endif // HAS_MEDIA } diff --git a/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp index 9ec8f1501a..b243c88705 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, HAS_TRINAMIC_CONFIG) +#if ALL(HAS_TFT_LVGL_UI, HAS_TRINAMIC_CONFIG) #include "draw_ui.h" #include diff --git a/Marlin/src/lcd/extui/mks_ui/draw_tmc_step_mode_settings.cpp b/Marlin/src/lcd/extui/mks_ui/draw_tmc_step_mode_settings.cpp index 990cdda7e6..d09c823b59 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_tmc_step_mode_settings.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_tmc_step_mode_settings.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, HAS_STEALTHCHOP) +#if ALL(HAS_TFT_LVGL_UI, HAS_STEALTHCHOP) #include "draw_ui.h" #include diff --git a/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp b/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp index a9a25db118..dda9ee1c29 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, TOUCH_SCREEN_CALIBRATION) +#if ALL(HAS_TFT_LVGL_UI, TOUCH_SCREEN_CALIBRATION) #include "draw_ui.h" #include "draw_touch_calibration.h" @@ -47,9 +47,9 @@ enum { static void drawCross(uint16_t x, uint16_t y, uint16_t color) { SPI_TFT.tftio.set_window(x - 15, y, x + 15, y); - SPI_TFT.tftio.WriteMultiple(color, 31); + SPI_TFT.tftio.writeMultiple(color, 31); SPI_TFT.tftio.set_window(x, y - 15, x, y + 15); - SPI_TFT.tftio.WriteMultiple(color, 31); + SPI_TFT.tftio.writeMultiple(color, 31); } void lv_update_touch_calibration_screen() { diff --git a/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp index 102109a136..5d44090a77 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp @@ -631,7 +631,7 @@ char *creat_title_text() { p_index = (uint16_t *)(&bmp_public_buf[i]); if (*p_index == 0x0000) *p_index = LV_COLOR_BACKGROUND.full; } - SPI_TFT.tftio.WriteSequence((uint16_t*)bmp_public_buf, 200); + SPI_TFT.tftio.writeSequence((uint16_t*)bmp_public_buf, 200); #if HAS_BAK_VIEW_IN_FLASH W25QXX.init(SPI_QUARTER_SPEED); if (row < 20) W25QXX.SPI_FLASH_SectorErase(BAK_VIEW_ADDR_TFT35 + row * 4096); @@ -692,7 +692,7 @@ char *creat_title_text() { #endif SPI_TFT.setWindow(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200 - SPI_TFT.tftio.WriteSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20); + SPI_TFT.tftio.writeSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20); y_off++; } @@ -1377,7 +1377,7 @@ void LV_TASK_HANDLER() { if (TERN1(USE_SPI_DMA_TC, !get_lcd_dma_lock())) lv_task_handler(); - #if BOTH(MKS_TEST, HAS_MEDIA) + #if ALL(MKS_TEST, HAS_MEDIA) if (mks_test_flag == 0x1E) mks_hardware_test(); #endif diff --git a/Marlin/src/lcd/extui/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/mks_ui/draw_ui.h index 9bc583d3ad..da43f2a490 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/mks_ui/draw_ui.h @@ -133,16 +133,16 @@ #define FILE_PRE_PIC_Y_OFFSET 0 #define PREVIEW_LITTLE_PIC_SIZE 40910 // 400*100+9*101+1 - #define PREVIEW_SIZE 202720 // (PREVIEW_LITTLE_PIC_SIZE+800*200+201*9+1) + #define PREVIEW_SIZE 202720 // (PREVIEW_LITTLE_PIC_SIZE+800*200+201*9+1) // machine parameter ui - #define PARA_UI_POS_X 10 - #define PARA_UI_POS_Y 50 + #define PARA_UI_POS_X 10 + #define PARA_UI_POS_Y 50 #define PARA_UI_SIZE_X 450 - #define PARA_UI_SIZE_Y 40 + #define PARA_UI_SIZE_Y 40 - #define PARA_UI_ARROW_V 12 + #define PARA_UI_ARROW_V 12 #define PARA_UI_BACK_POS_X 400 #define PARA_UI_BACK_POS_Y 270 @@ -152,31 +152,31 @@ #define PARA_UI_VALUE_SIZE_X 370 #define PARA_UI_VALUE_POS_X 400 - #define PARA_UI_VALUE_V 5 + #define PARA_UI_VALUE_V 5 #define PARA_UI_STATE_POS_X 380 - #define PARA_UI_STATE_V 2 + #define PARA_UI_STATE_V 2 #define PARA_UI_VALUE_SIZE_X_2 200 #define PARA_UI_VALUE_POS_X_2 320 - #define PARA_UI_VALUE_V_2 5 + #define PARA_UI_VALUE_V_2 5 - #define PARA_UI_VALUE_BTN_X_SIZE 70 - #define PARA_UI_VALUE_BTN_Y_SIZE 28 + #define PARA_UI_VALUE_BTN_X_SIZE 70 + #define PARA_UI_VALUE_BTN_Y_SIZE 28 - #define PARA_UI_BACK_BTN_X_SIZE 70 - #define PARA_UI_BACK_BTN_Y_SIZE 40 + #define PARA_UI_BACK_BTN_X_SIZE 70 + #define PARA_UI_BACK_BTN_Y_SIZE 40 - #define QRCODE_X 20 - #define QRCODE_Y 40 + #define QRCODE_X 20 + #define QRCODE_Y 40 #define QRCODE_WIDTH 160 -#else // ifdef TFT35 +#else // !TFT35 #define TFT_WIDTH 320 #define TFT_HEIGHT 240 -#endif // ifdef TFT35 +#endif #ifdef __cplusplus extern "C" { diff --git a/Marlin/src/lcd/extui/mks_ui/draw_z_offset_wizard.cpp b/Marlin/src/lcd/extui/mks_ui/draw_z_offset_wizard.cpp index 69e547a68c..9d16c9dff2 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_z_offset_wizard.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_z_offset_wizard.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, PROBE_OFFSET_WIZARD) +#if ALL(HAS_TFT_LVGL_UI, PROBE_OFFSET_WIZARD) #include "draw_ui.h" #include diff --git a/Marlin/src/lcd/extui/mks_ui/irq_overrid.cpp b/Marlin/src/lcd/extui/mks_ui/irq_overrid.cpp index aca1db0039..b2615ac24b 100644 --- a/Marlin/src/lcd/extui/mks_ui/irq_overrid.cpp +++ b/Marlin/src/lcd/extui/mks_ui/irq_overrid.cpp @@ -23,7 +23,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) +#if ALL(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) #include "tft_lvgl_configuration.h" diff --git a/Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp b/Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp index 45a54f6177..c46a532d9a 100644 --- a/Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp +++ b/Marlin/src/lcd/extui/mks_ui/mks_hardware.cpp @@ -87,12 +87,12 @@ #if PIN_EXISTS(MT_DET_2) mt_det2_sta = (READ(MT_DET_2_PIN) == LOW); #endif - TERN_(HAS_X_ENDSTOP, endstopx1_sta = ESTATE(TERN(HAS_X_MIN, X_MIN, X_MAX))); - TERN_(HAS_X2_ENDSTOP, endstopx2_sta = ESTATE(TERN(HAS_X2_MIN, X2_MIN, X2_MAX))); - TERN_(HAS_Y_ENDSTOP, endstopy1_sta = ESTATE(TERN(HAS_Y_MIN, Y_MIN, Y_MAX))); - TERN_(HAS_Y2_ENDSTOP, endstopy2_sta = ESTATE(TERN(HAS_Y2_MIN, Y2_MIN, Y2_MAX))); - TERN_(HAS_Z_ENDSTOP, endstopz1_sta = ESTATE(TERN(HAS_Z_MIN, Z_MIN, Z_MAX))); - TERN_(HAS_Z2_ENDSTOP, endstopz2_sta = ESTATE(TERN(HAS_Z2_MIN, Z2_MIN, Z2_MAX))); + TERN_(HAS_X_ENDSTOP, endstopx1_sta = ESTATE(TERN(USE_X_MIN, X_MIN, X_MAX))); + TERN_(HAS_X2_ENDSTOP, endstopx2_sta = ESTATE(TERN(USE_X2_MIN, X2_MIN, X2_MAX))); + TERN_(HAS_Y_ENDSTOP, endstopy1_sta = ESTATE(TERN(USE_Y_MIN, Y_MIN, Y_MAX))); + TERN_(HAS_Y2_ENDSTOP, endstopy2_sta = ESTATE(TERN(USE_Y2_MIN, Y2_MIN, Y2_MAX))); + TERN_(HAS_Z_ENDSTOP, endstopz1_sta = ESTATE(TERN(HAS_Z_MIN_PIN, Z_MIN, Z_MAX))); + TERN_(HAS_Z2_ENDSTOP, endstopz2_sta = ESTATE(TERN(USE_Z2_MIN, Z2_MIN, Z2_MAX))); } void test_gpio_readlevel_H() { @@ -104,12 +104,12 @@ #if PIN_EXISTS(MT_DET_2) mt_det2_sta = (READ(MT_DET_2_PIN) == HIGH); #endif - TERN_(HAS_X_ENDSTOP, endstopx1_sta = !ESTATE(TERN(HAS_X_MIN, X_MIN, X_MAX))); - TERN_(HAS_X2_ENDSTOP, endstopx2_sta = !ESTATE(TERN(HAS_X2_MIN, X2_MIN, X2_MAX))); - TERN_(HAS_Y_ENDSTOP, endstopy1_sta = !ESTATE(TERN(HAS_Y_MIN, Y_MIN, Y_MAX))); - TERN_(HAS_Y2_ENDSTOP, endstopy2_sta = !ESTATE(TERN(HAS_Y2_MIN, Y2_MIN, Y2_MAX))); - TERN_(HAS_Z_ENDSTOP, endstopz1_sta = !ESTATE(TERN(HAS_Z_MIN, Z_MIN, Z_MAX))); - TERN_(HAS_Z2_ENDSTOP, endstopz2_sta = !ESTATE(TERN(HAS_Z2_MIN, Z2_MIN, Z2_MAX))); + TERN_(HAS_X_ENDSTOP, endstopx1_sta = !ESTATE(TERN(USE_X_MIN, X_MIN, X_MAX))); + TERN_(HAS_X2_ENDSTOP, endstopx2_sta = !ESTATE(TERN(USE_X2_MIN, X2_MIN, X2_MAX))); + TERN_(HAS_Y_ENDSTOP, endstopy1_sta = !ESTATE(TERN(USE_Y_MIN, Y_MIN, Y_MAX))); + TERN_(HAS_Y2_ENDSTOP, endstopy2_sta = !ESTATE(TERN(USE_Y2_MIN, Y2_MIN, Y2_MAX))); + TERN_(HAS_Z_ENDSTOP, endstopz1_sta = !ESTATE(TERN(HAS_Z_MIN_PIN, Z_MIN, Z_MAX))); + TERN_(HAS_Z2_ENDSTOP, endstopz2_sta = !ESTATE(TERN(USE_Z2_MIN, Z2_MIN, Z2_MAX))); } #include "../../../libs/buzzer.h" @@ -194,7 +194,9 @@ void mks_hardware_test() { if (millis() % 2000 < 1000) { thermalManager.fan_speed[0] = 255; - WRITE(X_DIR_PIN, LOW); + #if HAS_X_AXIS + WRITE(X_DIR_PIN, LOW); + #endif #if HAS_Y_AXIS WRITE(Y_DIR_PIN, LOW); #endif @@ -219,7 +221,9 @@ } else { thermalManager.fan_speed[0] = 0; - WRITE(X_DIR_PIN, HIGH); + #if HAS_X_AXIS + WRITE(X_DIR_PIN, HIGH); + #endif #if HAS_Y_AXIS WRITE(Y_DIR_PIN, HIGH); #endif @@ -644,7 +648,7 @@ void disp_char_1624(uint16_t x, uint16_t y, uint8_t c, uint16_t charColor, uint1 for (uint16_t i = 0; i < 24; i++) { const uint16_t tmp_char = pgm_read_word(&ASCII_Table_16x24[((c - 0x20) * 24) + i]); for (uint16_t j = 0; j < 16; j++) - SPI_TFT.SetPoint(x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor); + SPI_TFT.setPoint(x + j, y + i, ((tmp_char >> j) & 0x01) ? charColor : bkColor); } } @@ -660,7 +664,7 @@ void disp_string(uint16_t x, uint16_t y, FSTR_P const fstr, uint16_t charColor, } void disp_assets_update() { - SPI_TFT.LCD_clear(0x0000); + SPI_TFT.lcdClear(0x0000); disp_string(100, 140, F("Assets Updating..."), 0xFFFF, 0x0000); } @@ -677,7 +681,7 @@ void disp_assets_update_progress(FSTR_P const fmsg) { #endif } -#if BOTH(MKS_TEST, HAS_MEDIA) +#if ALL(MKS_TEST, HAS_MEDIA) uint8_t mks_test_flag = 0; const char *MKSTestPath = "MKS_TEST"; void mks_test_get() { diff --git a/Marlin/src/lcd/extui/mks_ui/mks_hardware.h b/Marlin/src/lcd/extui/mks_ui/mks_hardware.h index 6a2574e3b0..f73f4e6459 100644 --- a/Marlin/src/lcd/extui/mks_ui/mks_hardware.h +++ b/Marlin/src/lcd/extui/mks_ui/mks_hardware.h @@ -26,7 +26,7 @@ #include // Functions for MKS_TEST -#if BOTH(MKS_TEST, HAS_MEDIA) +#if ALL(MKS_TEST, HAS_MEDIA) void mks_hardware_test(); void mks_test_get(); void mks_gpio_test(); diff --git a/Marlin/src/lcd/extui/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/mks_ui/pic_manager.cpp index 6570176a29..06d47d949b 100644 --- a/Marlin/src/lcd/extui/mks_ui/pic_manager.cpp +++ b/Marlin/src/lcd/extui/mks_ui/pic_manager.cpp @@ -24,7 +24,6 @@ #if HAS_TFT_LVGL_UI -#include "string.h" #include "draw_ui.h" #include "pic_manager.h" #include "draw_ready_print.h" @@ -34,6 +33,8 @@ #include "../../../sd/cardreader.h" #include "../../../MarlinCore.h" +#include + extern uint16_t DeviceCode; #if HAS_MEDIA @@ -290,7 +291,7 @@ void spiFlashErase_PIC() { uint32_t LogoWrite_Addroffset = 0; -uint8_t Pic_Logo_Write(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWriteSize) { +uint8_t picLogoWrite(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWriteSize) { if (LogoWriteSize <= 0) return 0; W25QXX.SPI_FLASH_BufferWrite(Logo_Wbuff, PIC_LOGO_ADDR + LogoWrite_Addroffset, LogoWriteSize); @@ -307,7 +308,7 @@ uint8_t Pic_Logo_Write(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWrit } uint32_t TitleLogoWrite_Addroffset = 0; -uint8_t Pic_TitleLogo_Write(uint8_t *TitleLogoName, uint8_t *TitleLogo_Wbuff, uint32_t TitleLogoWriteSize) { +uint8_t picTitleLogoWrite(uint8_t *TitleLogoName, uint8_t *TitleLogo_Wbuff, uint32_t TitleLogoWriteSize) { if (TitleLogoWriteSize <= 0) return 0; if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) @@ -328,15 +329,15 @@ void default_view_Write(uint8_t *default_view__Rbuff, uint32_t default_view_Writ default_view_addroffset_r = 0; } -uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { +uint32_t picInfoWrite(uint8_t *P_name, uint32_t P_size) { uint8_t pic_counter = 0; - uint32_t Pic_SaveAddr; + uint32_t picSaveAddr; uint32_t Pic_SizeSaveAddr; - uint32_t Pic_NameSaveAddr; - uint8_t Pname_temp; + uint32_t picNameSaveAddr; + uint8_t pNameTemp; uint32_t i, j; uint32_t name_len = 0; - uint32_t SaveName_len = 0; + uint32_t saveNameLen = 0; union union32 size_tmp; W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1); @@ -345,15 +346,15 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { pic_counter = 0; if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761)) - Pic_SaveAddr = PIC_DATA_ADDR_TFT35 + pic_counter * PER_PIC_MAX_SPACE_TFT35; + picSaveAddr = PIC_DATA_ADDR_TFT35 + pic_counter * PER_PIC_MAX_SPACE_TFT35; else - Pic_SaveAddr = PIC_DATA_ADDR_TFT32 + pic_counter * PER_PIC_MAX_SPACE_TFT32; + picSaveAddr = PIC_DATA_ADDR_TFT32 + pic_counter * PER_PIC_MAX_SPACE_TFT32; for (j = 0; j < pic_counter; j++) { do { - W25QXX.SPI_FLASH_BufferRead(&Pname_temp, PIC_NAME_ADDR + SaveName_len, 1); - SaveName_len++; - } while (Pname_temp != '\0'); + W25QXX.SPI_FLASH_BufferRead(&pNameTemp, PIC_NAME_ADDR + saveNameLen, 1); + saveNameLen++; + } while (pNameTemp != '\0'); } i = 0; while ((*(P_name + i) != '\0')) { @@ -361,8 +362,8 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { name_len++; } - Pic_NameSaveAddr = PIC_NAME_ADDR + SaveName_len; - W25QXX.SPI_FLASH_BufferWrite(P_name, Pic_NameSaveAddr, name_len + 1); + picNameSaveAddr = PIC_NAME_ADDR + saveNameLen; + W25QXX.SPI_FLASH_BufferWrite(P_name, picNameSaveAddr, name_len + 1); Pic_SizeSaveAddr = PIC_SIZE_ADDR + 4 * pic_counter; size_tmp.dwords = P_size; W25QXX.SPI_FLASH_BufferWrite(size_tmp.bytes, Pic_SizeSaveAddr, 4); @@ -371,14 +372,14 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { W25QXX.SPI_FLASH_SectorErase(PIC_COUNTER_ADDR); W25QXX.SPI_FLASH_BufferWrite(&pic_counter, PIC_COUNTER_ADDR, 1); - return Pic_SaveAddr; + return picSaveAddr; } #if HAS_MEDIA static void dosName2LongName(const char dosName[11], char *longName) { uint8_t j = 0; - LOOP_L_N(i, 11) { + for (uint8_t i = 0; i < 11; ++i) { if (i == 8) longName[j++] = '.'; if (dosName[i] == '\0' || dosName[i] == ' ') continue; longName[j++] = dosName[i]; @@ -429,14 +430,14 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { do { hal.watchdog_refresh(); pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_Logo_Write((uint8_t*)fn, public_buf, pbr); + picLogoWrite((uint8_t*)fn, public_buf, pbr); } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_TITLE_LOGO) { do { hal.watchdog_refresh(); pbr = file.read(public_buf, BMP_WRITE_BUF_LEN); - Pic_TitleLogo_Write((uint8_t*)fn, public_buf, pbr); + picTitleLogoWrite((uint8_t*)fn, public_buf, pbr); } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_G_PREVIEW) { @@ -447,7 +448,7 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { } while (pbr >= BMP_WRITE_BUF_LEN); } else if (assetType == ASSET_TYPE_ICON) { - Pic_Write_Addr = Pic_Info_Write((uint8_t*)fn, pfileSize); + Pic_Write_Addr = picInfoWrite((uint8_t*)fn, pfileSize); SPIFlash.beginWrite(Pic_Write_Addr); #if HAS_SPI_FLASH_COMPRESSION do { @@ -549,7 +550,7 @@ uint32_t Pic_Info_Write(uint8_t *P_name, uint32_t P_size) { #endif // HAS_MEDIA -void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff) { +void picRead(uint8_t *Pname, uint8_t *P_Rbuff) { uint8_t i, j; uint8_t Pic_cnt; uint32_t tmp_cnt = 0; @@ -595,7 +596,7 @@ void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) { #endif uint32_t logo_addroffset = 0; -void Pic_Logo_Read(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) { +void picLogoRead(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize) { W25QXX.init(SPI_QUARTER_SPEED); W25QXX.SPI_FLASH_BufferRead(Logo_Rbuff, PIC_LOGO_ADDR + logo_addroffset, LogoReadsize); logo_addroffset += LogoReadsize; diff --git a/Marlin/src/lcd/extui/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/mks_ui/pic_manager.h index cdcc5b76b8..1483b96461 100644 --- a/Marlin/src/lcd/extui/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/mks_ui/pic_manager.h @@ -154,8 +154,8 @@ typedef struct pic_msg PIC_MSG; #define PIC_SIZE_xM 6 #define FONT_SIZE_xM 2 -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 picRead(uint8_t *Pname, uint8_t *P_Rbuff); +void picLogoRead(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); diff --git a/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.cpp index 972349d287..09b9c7a53e 100644 --- a/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.cpp @@ -36,10 +36,11 @@ #include #include "../../../MarlinCore.h" +#include "../../marlinui.h" + #include "../../../inc/MarlinConfig.h" -#include HAL_PATH(../../../HAL, tft/xpt2046.h) -#include "../../marlinui.h" +#include HAL_PATH(../../.., tft/xpt2046.h) XPT2046 touch; #if ENABLED(POWER_LOSS_RECOVERY) @@ -50,7 +51,7 @@ XPT2046 touch; #include "../../../module/servo.h" #endif -#if EITHER(PROBE_TARE, HAS_Z_SERVO_PROBE) +#if ANY(PROBE_TARE, HAS_Z_SERVO_PROBE) #include "../../../module/probe.h" #endif @@ -128,16 +129,18 @@ void tft_lvgl_init() { hal.watchdog_refresh(); // LVGL init takes time // Init TFT first! - SPI_TFT.spi_init(SPI_FULL_SPEED); - SPI_TFT.LCD_init(); + SPI_TFT.spiInit(SPI_FULL_SPEED); + SPI_TFT.lcdInit(); hal.watchdog_refresh(); // LVGL init takes time #if ENABLED(USB_FLASH_DRIVE_SUPPORT) uint16_t usb_flash_loop = 1000; #if ENABLED(MULTI_VOLUME) && !HAS_SD_HOST_DRIVE - SET_INPUT_PULLUP(SD_DETECT_PIN); - card.changeMedia(IS_SD_INSERTED() ? &card.media_driver_sdcard : &card.media_driver_usbFlash); + if (IS_SD_INSERTED()) + card.changeMedia(&card.media_driver_sdcard); + else + card.changeMedia(&card.media_driver_usbFlash); #endif do { card.media_driver_usbFlash.idle(); @@ -159,7 +162,7 @@ void tft_lvgl_init() { TERN_(MKS_TEST, mks_test_get()); #endif - touch.Init(); + touch.init(); lv_init(); @@ -246,7 +249,7 @@ void tft_lvgl_init() { if (ready) lv_draw_ready_print(); - #if BOTH(MKS_TEST, HAS_MEDIA) + #if ALL(MKS_TEST, HAS_MEDIA) if (mks_test_flag == 0x1E) mks_gpio_test(); #endif } @@ -261,7 +264,7 @@ void dmc_tc_handler(struct __DMA_HandleTypeDef * hdma) { #if ENABLED(USE_SPI_DMA_TC) lv_disp_flush_ready(disp_drv_p); lcd_dma_trans_lock = false; - TFT_SPI::Abort(); + TFT_SPI::abort(); #endif } @@ -275,10 +278,10 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co #if ENABLED(USE_SPI_DMA_TC) lcd_dma_trans_lock = true; - SPI_TFT.tftio.WriteSequenceIT((uint16_t*)color_p, width * height); + SPI_TFT.tftio.writeSequenceIT((uint16_t*)color_p, width * height); TFT_SPI::DMAtx.XferCpltCallback = dmc_tc_handler; #else - SPI_TFT.tftio.WriteSequence((uint16_t*)color_p, width * height); + SPI_TFT.tftio.writeSequence((uint16_t*)color_p, width * height); lv_disp_flush_ready(disp_drv_p); // Indicate you are ready with the flushing #endif @@ -294,7 +297,7 @@ void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv width = x2 - x1 + 1; height = y2 - y1 + 1; SPI_TFT.setWindow((uint16_t)x1, (uint16_t)y1, width, height); - SPI_TFT.tftio.WriteMultiple(bk_color.full, width * height); + SPI_TFT.tftio.writeMultiple(bk_color.full, width * height); W25QXX.init(SPI_QUARTER_SPEED); } diff --git a/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.h index 0368140b28..80335b7370 100644 --- a/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.h @@ -32,8 +32,6 @@ #include -//#define TFT_ROTATION TFT_ROTATE_180 - extern uint8_t bmp_public_buf[14 * 1024]; extern uint8_t public_buf[513]; @@ -42,7 +40,7 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co 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); -void LCD_Clear(uint16_t Color); +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 height); void LCD_WriteRAM_Prepare(); diff --git a/Marlin/src/lcd/extui/mks_ui/wifiSerial_STM32.cpp b/Marlin/src/lcd/extui/mks_ui/wifiSerial_STM32.cpp index 9d7f5e2032..cb5b7f0b68 100644 --- a/Marlin/src/lcd/extui/mks_ui/wifiSerial_STM32.cpp +++ b/Marlin/src/lcd/extui/mks_ui/wifiSerial_STM32.cpp @@ -25,7 +25,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) +#if ALL(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) #include "tft_lvgl_configuration.h" diff --git a/Marlin/src/lcd/extui/mks_ui/wifiSerial_STM32F1.cpp b/Marlin/src/lcd/extui/mks_ui/wifiSerial_STM32F1.cpp index 654fca6cb3..92fd139dfa 100644 --- a/Marlin/src/lcd/extui/mks_ui/wifiSerial_STM32F1.cpp +++ b/Marlin/src/lcd/extui/mks_ui/wifiSerial_STM32F1.cpp @@ -23,7 +23,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) +#if ALL(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) #include "tft_lvgl_configuration.h" diff --git a/Marlin/src/lcd/extui/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/mks_ui/wifi_module.cpp index cf2411ee7e..122712e9e1 100644 --- a/Marlin/src/lcd/extui/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/mks_ui/wifi_module.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) +#if ALL(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) #include "draw_ui.h" #include "wifi_module.h" @@ -55,7 +55,7 @@ #define WIFI_IO1_SET() WRITE(WIFI_IO1_PIN, HIGH); #define WIFI_IO1_RESET() WRITE(WIFI_IO1_PIN, LOW); -uint8_t Explore_Disk(const char * const path, const uint8_t recu_level, const bool with_longnames); +uint8_t exploreDisk(const char * const path, const uint8_t recu_level, const bool with_longnames); extern uint8_t commands_in_queue; extern uint8_t sel_id; @@ -723,7 +723,7 @@ void get_file_list(const char * const path, const bool with_longnames) { else if (gCfgItems.fileSysType == FILE_SYS_USB) { // udisk } - Explore_Disk(path, 0, with_longnames); + exploreDisk(path, 0, with_longnames); } char wait_ip_back_flag = 0; @@ -818,7 +818,7 @@ static int cut_msg_head(uint8_t * const msg, const uint16_t msgLen, uint16_t cut return msgLen - cutLen; } -uint8_t Explore_Disk(const char * const path, const uint8_t recu_level, const bool with_longnames) { +uint8_t exploreDisk(const char * const path, const uint8_t recu_level, const bool with_longnames) { char Fstream[200]; if (!path) return 0; @@ -1804,7 +1804,8 @@ void stopEspTransfer() { W25QXX.init(SPI_QUARTER_SPEED); - TERN_(HAS_TFT_LVGL_UI_SPI, SPI_TFT.spi_init(SPI_FULL_SPEED)); + // ?? Workaround for SPI / Servo issues ?? + TERN_(HAS_TFT_LVGL_UI_SPI, SPI_TFT.spiInit(SPI_FULL_SPEED)); TERN_(HAS_SERVOS, servo_init()); TERN_(HAS_Z_SERVO_PROBE, probe.servo_probe_init()); diff --git a/Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp index 398d35fdc3..2d4d19e7a2 100644 --- a/Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/mks_ui/wifi_upload.cpp @@ -22,7 +22,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if BOTH(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) +#if ALL(HAS_TFT_LVGL_UI, MKS_WIFI_MODULE) #include "draw_ui.h" #include "wifi_module.h" @@ -101,15 +101,17 @@ const char *resultMessages[] = { "slip data" }; -// A note on baud rates. -// The ESP8266 supports 921600, 460800, 230400, 115200, 74880 and some lower baud rates. -// 921600b is not reliable because even though it sometimes succeeds in connecting, we get a bad response during uploading after a few blocks. -// Probably our UART ISR cannot receive bytes fast enough, perhaps because of the latency of the system tick ISR. -// 460800b doesn't always manage to connect, but if it does then uploading appears to be reliable. -// 230400b always manages to connect. +/** + * Baud Rate Notes: + * The ESP8266 supports 921600, 460800, 230400, 115200, 74880 and some lower baud rates. + * 921600b is not reliable because even though it sometimes succeeds in connecting, we get a bad response during uploading after a few blocks. + * Probably our UART ISR cannot receive bytes fast enough, perhaps because of the latency of the system tick ISR. + * 460800b doesn't always manage to connect, but if it does then uploading appears to be reliable. + * 230400b always manages to connect. + */ static const uint32_t uploadBaudRates[] = { 460800, 230400, 115200, 74880 }; -signed char IsReady() { +signed char isReady() { return esp_upload.state == upload_idle; } @@ -170,15 +172,17 @@ void putData(uint32_t val, unsigned byteCnt, uint8_t *buf, int ofst) { } } -// Read a byte optionally performing SLIP decoding. The return values are: -// -// 2 - an escaped byte was read successfully -// 1 - a non-escaped byte was read successfully -// 0 - no data was available -// -1 - the value 0xC0 was encountered (shouldn't happen) -// -2 - a SLIP escape byte was found but the following byte wasn't available -// -3 - a SLIP escape byte was followed by an invalid byte -int ReadByte(uint8_t *data, signed char slipDecode) { +/** + * Read a byte optionally performing SLIP decoding. The return values are: + * + * 2 - an escaped byte was read successfully + * 1 - a non-escaped byte was read successfully + * 0 - no data was available + * -1 - the value 0xC0 was encountered (shouldn't happen) + * -2 - a SLIP escape byte was found but the following byte wasn't available + * -3 - a SLIP escape byte was followed by an invalid byte + */ +int readByte(uint8_t *data, signed char slipDecode) { if (uploadPort_available() == 0) return 0; // At least one byte is available @@ -206,31 +210,33 @@ void _writePacketRaw(const uint8_t *buf, size_t len) { } // Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. -void WriteByteRaw(uint8_t b) { +void writeByteRaw(uint8_t b) { uploadPort_write((const uint8_t *)&b, 1); } // Write a byte to the serial port optionally SLIP encoding. Return the number of bytes actually written. -void WriteByteSlip(const uint8_t b) { +void writeByteSlip(const uint8_t b) { if (b == 0xC0) { - WriteByteRaw(0xDB); - WriteByteRaw(0xDC); + writeByteRaw(0xDB); + writeByteRaw(0xDC); } else if (b == 0xDB) { - WriteByteRaw(0xDB); - WriteByteRaw(0xDD); + writeByteRaw(0xDB); + writeByteRaw(0xDD); } else uploadPort_write((const uint8_t *)&b, 1); } -// Wait for a data packet to be returned. If the body of the packet is -// non-zero length, return an allocated buffer indirectly containing the -// data and return the data length. Note that if the pointer for returning -// the data buffer is nullptr, the response is expected to be two bytes of zero. -// -// If an error occurs, return a negative value. Otherwise, return the number -// of bytes in the response (or zero if the response was not the standard "two bytes of zero"). +/** + * Wait for a data packet to be returned. If the body of the packet is + * non-zero length, return an allocated buffer indirectly containing the + * data and return the data length. Note that if the pointer for returning + * the data buffer is nullptr, the response is expected to be two bytes of zero. + * + * If an error occurs, return a negative value. Otherwise, return the number + * of bytes in the response (or zero if the response was not the standard "two bytes of zero"). + */ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t msTimeout) { typedef enum { begin = 0, @@ -292,7 +298,7 @@ EspUploadResult readPacket(uint8_t op, uint32_t *valp, size_t *bodyLen, uint32_t case body: { // reading the response body int rslt; // retrieve a byte with SLIP decoding - rslt = ReadByte(&c, 1); + rslt = readByte(&c, 1); if (rslt != 1 && rslt != 2) { // some error occurred stat = (rslt == 0 || rslt == -2) ? slipData : slipFrame; @@ -370,19 +376,19 @@ void _writePacket(const uint8_t *data, size_t len) { // 0xC0 and 0xDB replaced by the two-byte sequences {0xDB, 0xDC} and {0xDB, 0xDD} respectively. void writePacket(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { - WriteByteRaw(0xC0); // send the packet start character + writeByteRaw(0xC0); // send the packet start character _writePacket(hdr, hdrLen); // send the header _writePacket(data, dataLen); // send the data block - WriteByteRaw(0xC0); // send the packet end character + writeByteRaw(0xC0); // send the packet end character } // Send a packet to the serial port while performing SLIP framing. The packet data comprises a header and an optional data block. // This is like writePacket except that it does a fast block write for both the header and the main data with no SLIP encoding. Used to send sync commands. void writePacketRaw(const uint8_t *hdr, size_t hdrLen, const uint8_t *data, size_t dataLen) { - WriteByteRaw(0xC0); // send the packet start character + writeByteRaw(0xC0); // send the packet start character _writePacketRaw(hdr, hdrLen); // send the header _writePacketRaw(data, dataLen); // send the data block in raw mode - WriteByteRaw(0xC0); // send the packet end character + writeByteRaw(0xC0); // send the packet end character } // Send a command to the attached device together with the supplied data, if any. @@ -418,7 +424,7 @@ EspUploadResult doCommand(uint8_t op, const uint8_t *data, size_t dataLen, uint3 // Send a synchronising packet to the serial port in an attempt to induce // the ESP8266 to auto-baud lock on the baud rate. -EspUploadResult Sync(uint16_t timeout) { +EspUploadResult sync(uint16_t timeout) { uint8_t buf[36]; EspUploadResult stat; int i; @@ -553,7 +559,7 @@ void upload_spin() { case connecting: if ((getWifiTickDiff(esp_upload.lastAttemptTime, getWifiTick()) >= connectAttemptInterval) && (getWifiTickDiff(esp_upload.lastResetTime, getWifiTick()) >= 500)) { - EspUploadResult res = Sync(5000); + EspUploadResult res = sync(5000); esp_upload.lastAttemptTime = getWifiTick(); if (res == success) esp_upload.state = erasing; @@ -622,7 +628,7 @@ void upload_spin() { } // Try to upload the given file at the given address -void SendUpdateFile(const char *file, uint32_t address) { +void sendUpdateFile(const char *file, uint32_t address) { const char * const fname = card.diveToFile(false, update_curDir, ESP_FIRMWARE_FILE); if (!update_file.open(update_curDir, fname, O_READ)) return; @@ -640,7 +646,7 @@ void SendUpdateFile(const char *file, uint32_t address) { static const uint32_t FirmwareAddress = 0x00000000, WebFilesAddress = 0x00100000; -void ResetWiFiForUpload(int begin_or_end) { +void resetWiFiForUpload(int begin_or_end) { //#if 0 uint32_t start = getWifiTick(); @@ -660,12 +666,12 @@ void ResetWiFiForUpload(int begin_or_end) { int32_t wifi_upload(int type) { esp_upload.retriesPerBaudRate = 9; - ResetWiFiForUpload(0); + resetWiFiForUpload(0); switch (type) { - case 0: SendUpdateFile(ESP_FIRMWARE_FILE, FirmwareAddress); break; - case 1: SendUpdateFile(ESP_WEB_FIRMWARE_FILE, FirmwareAddress); break; - case 2: SendUpdateFile(ESP_WEB_FILE, WebFilesAddress); break; + case 0: sendUpdateFile(ESP_FIRMWARE_FILE, FirmwareAddress); break; + case 1: sendUpdateFile(ESP_WEB_FIRMWARE_FILE, FirmwareAddress); break; + case 2: sendUpdateFile(ESP_WEB_FILE, WebFilesAddress); break; default: return -1; } @@ -674,7 +680,7 @@ int32_t wifi_upload(int type) { hal.watchdog_refresh(); } - ResetWiFiForUpload(1); + resetWiFiForUpload(1); return esp_upload.uploadResult == success ? 0 : -1; } diff --git a/Marlin/src/lcd/extui/nextion/FileNavigator.cpp b/Marlin/src/lcd/extui/nextion/FileNavigator.cpp index 6730370a94..c00ccb4e36 100644 --- a/Marlin/src/lcd/extui/nextion/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/nextion/FileNavigator.cpp @@ -39,18 +39,18 @@ 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 +FileList FileNavigator::filelist; // ExtUI file API +char FileNavigator::currentDirPath[MAX_PATH_LEN]; // Current folder path uint16_t FileNavigator::lastindex; uint8_t FileNavigator::folderdepth; -uint16_t FileNavigator::currentindex; // override the panel request +uint16_t FileNavigator::currentindex; // override the panel request FileNavigator filenavigator; FileNavigator::FileNavigator() { reset(); } void FileNavigator::reset() { - currentfoldername[0] = '\0'; + currentDirPath[0] = '\0'; folderdepth = 0; currentindex = 0; lastindex = 0; @@ -83,51 +83,51 @@ void FileNavigator::getFiles(uint16_t index) { #endif if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder - nextion.SendtoTFT(F("vis p0,1")); - nextion.SendtoTFT(F("\xFF\xFF\xFF")); + nextion.tftSend(F("vis p0,1")); + nextion.tftSend(F("\xFF\xFF\xFF")); SEND_VAL("tmpUP", "0"); files--; } else { - nextion.SendtoTFT(F("vis p0,0")); - nextion.SendtoTFT(F("\xFF\xFF\xFF")); + nextion.tftSend(F("vis p0,0")); + nextion.tftSend(F("\xFF\xFF\xFF")); } for (uint16_t seek = currentindex; seek < currentindex + files; seek++) { if (filelist.seek(seek)) { - nextion.SendtoTFT(F("s")); + nextion.tftSend(F("s")); LCD_SERIAL.print(fcnt); - nextion.SendtoTFT(F(".txt=\"")); + nextion.tftSend(F(".txt=\"")); if (filelist.isDir()) { LCD_SERIAL.print(filelist.shortFilename()); - nextion.SendtoTFT(F("/\"")); - nextion.SendtoTFT(F("\xFF\xFF\xFF")); + nextion.tftSend(F("/\"")); + nextion.tftSend(F("\xFF\xFF\xFF")); - nextion.SendtoTFT(F("l")); + nextion.tftSend(F("l")); LCD_SERIAL.print(fcnt); - nextion.SendtoTFT(F(".txt=\"")); + nextion.tftSend(F(".txt=\"")); LCD_SERIAL.print(filelist.filename()); - nextion.SendtoTFT(F("\"")); - nextion.SendtoTFT(F("\xFF\xFF\xFF")); + nextion.tftSend(F("\"")); + nextion.tftSend(F("\xFF\xFF\xFF")); SEND_PCO2("l", fcnt, "1055"); } else { - LCD_SERIAL.print(currentfoldername); + LCD_SERIAL.print(currentDirPath); LCD_SERIAL.print(filelist.shortFilename()); - nextion.SendtoTFT(F("\"")); - nextion.SendtoTFT(F("\xFF\xFF\xFF")); + nextion.tftSend(F("\"")); + nextion.tftSend(F("\xFF\xFF\xFF")); - nextion.SendtoTFT(F("l")); + nextion.tftSend(F("l")); LCD_SERIAL.print(fcnt); - nextion.SendtoTFT(F(".txt=\"")); + nextion.tftSend(F(".txt=\"")); LCD_SERIAL.print(filelist.longFilename()); - nextion.SendtoTFT(F("\"")); - nextion.SendtoTFT(F("\xFF\xFF\xFF")); + nextion.tftSend(F("\"")); + nextion.tftSend(F("\xFF\xFF\xFF")); } fcnt++; fseek = seek; #if NEXDEBUG(AC_FILE) - DEBUG_ECHOLNPGM("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); + DEBUG_ECHOLNPGM("-", seek, " '", filelist.longFilename(), "' '", currentDirPath, "", filelist.shortFilename(), "'\n"); #endif } } @@ -137,11 +137,11 @@ void FileNavigator::getFiles(uint16_t index) { void FileNavigator::changeDIR(char *folder) { #if NEXDEBUG(AC_FILE) - DEBUG_ECHOLNPGM("currentfolder: ", currentfoldername, " New: ", folder); + DEBUG_ECHOLNPGM("currentfolder: ", currentDirPath, " New: ", folder); #endif if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth - strcat(currentfoldername, folder); - strcat(currentfoldername, "/"); + strcat(currentDirPath, folder); + strcat(currentDirPath, "/"); filelist.changeDir(folder); refresh(); folderdepth++; @@ -155,20 +155,20 @@ void FileNavigator::upDIR() { currentindex = 0; // Remove the last child folder from the stored path if (folderdepth == 0) { - currentfoldername[0] = '\0'; + currentDirPath[0] = '\0'; reset(); } else { char *pos = nullptr; for (uint8_t f = 0; f < folderdepth; f++) - pos = strchr(currentfoldername, '/'); + pos = strchr(currentDirPath, '/'); pos[1] = '\0'; } #if NEXDEBUG(AC_FILE) - DEBUG_ECHOLNPGM("depth: ", folderdepth, " currentfoldername: ", currentfoldername); + DEBUG_ECHOLNPGM("depth: ", folderdepth, " currentDirPath: ", currentDirPath); #endif } -char* FileNavigator::getCurrentFolderName() { return currentfoldername; } +char* FileNavigator::getCurrentDirPath() { return currentDirPath; } #endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/nextion/FileNavigator.h b/Marlin/src/lcd/extui/nextion/FileNavigator.h index fd29bceade..57773fab5e 100644 --- a/Marlin/src/lcd/extui/nextion/FileNavigator.h +++ b/Marlin/src/lcd/extui/nextion/FileNavigator.h @@ -41,10 +41,10 @@ class FileNavigator { static void upDIR(); static void changeDIR(char *); static void refresh(); - static char* getCurrentFolderName(); + static char* getCurrentDirPath(); private: static FileList filelist; - static char currentfoldername[MAX_PATH_LEN]; + static char currentDirPath[MAX_PATH_LEN]; static uint16_t lastindex; static uint8_t folderdepth; static uint16_t currentindex; diff --git a/Marlin/src/lcd/extui/nextion/nextion_extui.cpp b/Marlin/src/lcd/extui/nextion/nextion_extui.cpp index bf40fe97ac..b1e1997a3a 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_extui.cpp +++ b/Marlin/src/lcd/extui/nextion/nextion_extui.cpp @@ -35,9 +35,9 @@ namespace ExtUI { - void onStartup() { nextion.Startup(); } - void onIdle() { nextion.IdleLoop(); } - void onPrinterKilled(FSTR_P const error, FSTR_P const component) { nextion.PrinterKilled(error, component); } + void onStartup() { nextion.startup(); } + void onIdle() { nextion.idleLoop(); } + void onPrinterKilled(FSTR_P const error, FSTR_P const component) { nextion.printerKilled(error, component); } void onMediaInserted() {} void onMediaError() {} void onMediaRemoved() {} @@ -46,8 +46,8 @@ namespace ExtUI { 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 onUserConfirmRequired(const char * const msg) { nextion.confirmationRequest(msg); } + void onStatusChanged(const char * const msg) { nextion.statusChange(msg); } void onHomingStart() {} void onHomingDone() {} @@ -89,10 +89,12 @@ namespace ExtUI { // whether successful or not. } - #if HAS_MESH + #if HAS_LEVELING void onLevelingStart() {} void onLevelingDone() {} + #endif + #if HAS_MESH void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { // Called when any mesh points are updated } @@ -117,7 +119,7 @@ namespace ExtUI { #if HAS_PID_HEATING void onPidTuning(const result_t rst) { // Called for temperature PID tuning result - nextion.PanelInfo(37); + nextion.panelInfo(37); } #endif diff --git a/Marlin/src/lcd/extui/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/nextion/nextion_tft.cpp index 8b7b36e9ce..87a6544e5e 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_tft.cpp +++ b/Marlin/src/lcd/extui/nextion/nextion_tft.cpp @@ -53,7 +53,7 @@ NextionTFT nextion; NextionTFT::NextionTFT() {} -void NextionTFT::Startup() { +void NextionTFT::startup() { selectedfile[0] = '\0'; nextion_command[0] = '\0'; command_len = 0; @@ -76,15 +76,15 @@ void NextionTFT::Startup() { DEBUG_ECHOLNPGM("Nextion Debug Level ", NEXDEBUGLEVEL); } -void NextionTFT::IdleLoop() { - if (ReadTFTCommand()) { - ProcessPanelRequest(); +void NextionTFT::idleLoop() { + if (readTFTCommand()) { + processPanelRequest(); command_len = 0; } UpdateOnChange(); } -void NextionTFT::PrinterKilled(FSTR_P const error, FSTR_P const component) { +void NextionTFT::printerKilled(FSTR_P const error, FSTR_P const component) { SEND_TXT_END("page error"); SEND_TXT_F("t3", F("Error")); SEND_TXT_F("t4", component); @@ -96,29 +96,29 @@ void NextionTFT::PrintFinished() { SEND_TXT_END("page printfinished"); } -void NextionTFT::ConfirmationRequest(const char * const msg) { +void NextionTFT::confirmationRequest(const char * const msg) { SEND_VALasTXT("tmppage.M117", msg); #if NEXDEBUG(N_MARLIN) - DEBUG_ECHOLNPGM("ConfirmationRequest() ", msg, " printer_state:", printer_state); + DEBUG_ECHOLNPGM("confirmationRequest() ", msg, " printer_state:", printer_state); #endif } -void NextionTFT::StatusChange(const char * const msg) { +void NextionTFT::statusChange(const char * const msg) { #if NEXDEBUG(N_MARLIN) - DEBUG_ECHOLNPGM("StatusChange() ", msg, "\nprinter_state:", printer_state); + DEBUG_ECHOLNPGM("statusChange() ", msg, "\nprinter_state:", printer_state); #endif SEND_VALasTXT("tmppage.M117", msg); } -void NextionTFT::SendtoTFT(FSTR_P const fstr/*=nullptr*/) { // A helper to print PROGMEM string to the panel +void NextionTFT::tftSend(FSTR_P const fstr/*=nullptr*/) { // A helper to print PROGMEM string to the panel #if NEXDEBUG(N_SOME) - DEBUG_ECHOF(fstr); + DEBUG_ECHO(fstr); #endif PGM_P str = FTOP(fstr); while (const char c = pgm_read_byte(str++)) LCD_SERIAL.write(c); } -bool NextionTFT::ReadTFTCommand() { +bool NextionTFT::readTFTCommand() { bool command_ready = false; while ((LCD_SERIAL.available() > 0) && (command_len < MAX_CMND_LEN)) { nextion_command[command_len] = LCD_SERIAL.read(); @@ -149,32 +149,32 @@ bool NextionTFT::ReadTFTCommand() { return command_ready; } -void NextionTFT::SendFileList(int8_t startindex) { +void NextionTFT::sendFileList(int8_t startindex) { // respond to panel request for 7 files starting at index #if NEXDEBUG(N_INFO) - DEBUG_ECHOLNPGM("## SendFileList ## ", startindex); + DEBUG_ECHOLNPGM("## sendFileList ## ", startindex); #endif filenavigator.getFiles(startindex); } -void NextionTFT::SelectFile() { +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); + DEBUG_ECHOLNPGM(" 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; + 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; } } @@ -188,24 +188,24 @@ void NextionTFT::_format_time(char *outstr, uint32_t time) { sprintf_P(outstr, PSTR("%02d:%02ds"), min, sec); } -void NextionTFT::ProcessPanelRequest() { +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); + panelInfo(req); // Simple Actions else if (req >= 50) - PanelAction(req); + panelAction(req); } } #define SEND_NA(A) SEND_TXT(A, "n/a") -void NextionTFT::PanelInfo(uint8_t req) { +void NextionTFT::panelInfo(uint8_t req) { switch (req) { case 0: break; @@ -216,7 +216,7 @@ void NextionTFT::PanelInfo(uint8_t req) { //SEND_TXT("tmppage.M117", msg_no_sd_card); } else if (nextion_command[3] == 'S') - SendFileList(atoi(&nextion_command[4])); + sendFileList(atoi(&nextion_command[4])); } break; @@ -294,7 +294,7 @@ void NextionTFT::PanelInfo(uint8_t req) { break; case 26: // TMC Hybrid Threshold Speed - #if 0 && BOTH(HAS_TRINAMIC_CONFIG, HYBRID_THRESHOLD) + #if 0 && ALL(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) @@ -445,13 +445,13 @@ void NextionTFT::PanelInfo(uint8_t req) { #elif Z_HOME_TO_MAX SEND_VALasTXT("z2", READ(Z_MAX_PIN) == Z_MAX_ENDSTOP_HIT_STATE ? "triggered" : "open"); #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN SEND_VALasTXT("z2", READ(Z2_MIN_PIN) == Z2_MIN_ENDSTOP_HIT_STATE ? "triggered" : "open"); - #elif HAS_Z2_MAX + #elif USE_Z2_MAX SEND_VALasTXT("z2", READ(Z2_MAX_PIN) == Z2_MAX_ENDSTOP_HIT_STATE ? "triggered" : "open"); #endif #if HAS_BED_PROBE - //SEND_VALasTXT("bltouch", READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_HIT_STATE ? "triggered" : "open"); + //SEND_VALasTXT("bltouch", PROBE_TRIGGERED() ? "triggered" : "open"); #else SEND_NA("bltouch"); #endif @@ -463,7 +463,7 @@ void NextionTFT::PanelInfo(uint8_t req) { #else #define SEND_PID_INFO_0(A, B) SEND_NA(A) #endif - #if BOTH(PIDTEMP, HAS_MULTI_EXTRUDER) + #if ALL(PIDTEMP, HAS_MULTI_EXTRUDER) #define SEND_PID_INFO_1(A, B) SEND_VALasTXT(A, getPID_K##B(E1)) #else #define SEND_PID_INFO_1(A, B) SEND_NA(A) @@ -488,7 +488,7 @@ void NextionTFT::PanelInfo(uint8_t req) { } } -void NextionTFT::PanelAction(uint8_t req) { +void NextionTFT::panelAction(uint8_t req) { switch (req) { case 50: // Pause SD print @@ -512,7 +512,7 @@ void NextionTFT::PanelAction(uint8_t req) { break; case 54: // A13 Select file - SelectFile(); + selectFile(); break; case 65: // Cool Down diff --git a/Marlin/src/lcd/extui/nextion/nextion_tft.h b/Marlin/src/lcd/extui/nextion/nextion_tft.h index 806630485c..9e085b0f72 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_tft.h +++ b/Marlin/src/lcd/extui/nextion/nextion_tft.h @@ -40,23 +40,23 @@ class NextionTFT { public: NextionTFT(); - static void Startup(); - static void IdleLoop(); - static void PrinterKilled(FSTR_P const, FSTR_P const); - static void ConfirmationRequest(const char * const); - static void StatusChange(const char * const); - static void SendtoTFT(FSTR_P const=nullptr); - //static void SendtoTFTLN(FSTR_P const=nullptr); + static void startup(); + static void idleLoop(); + static void printerKilled(FSTR_P const, FSTR_P const); + static void confirmationRequest(const char * const); + static void statusChange(const char * const); + static void tftSend(FSTR_P const=nullptr); + //static void tftSendLn(FSTR_P const=nullptr); static void UpdateOnChange(); static void PrintFinished(); - static void PanelInfo(uint8_t); + 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 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); }; diff --git a/Marlin/src/lcd/extui/nextion/nextion_tft_defs.h b/Marlin/src/lcd/extui/nextion/nextion_tft_defs.h index cdd91bf2a3..061d29559c 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_tft_defs.h +++ b/Marlin/src/lcd/extui/nextion/nextion_tft_defs.h @@ -54,10 +54,10 @@ // TFT panel commands #define msg_welcome MACHINE_NAME " Ready." -#define SEND_TEMP(x,y,t,z) (nextion.SendtoTFT(F(x)), nextion.SendtoTFT(F(".txt=\"")), LCD_SERIAL.print(y), nextion.SendtoTFT(F(t)), LCD_SERIAL.print(z), nextion.SendtoTFT(F("\"\xFF\xFF\xFF"))) -#define SEND_VAL(x,y) (nextion.SendtoTFT(F(x)), nextion.SendtoTFT(F(".val=")), LCD_SERIAL.print(y), nextion.SendtoTFT(F("\xFF\xFF\xFF"))) -#define SEND_TXT(x,y) (nextion.SendtoTFT(F(x)), nextion.SendtoTFT(F(".txt=\"")), nextion.SendtoTFT(F(y)), nextion.SendtoTFT(F("\"\xFF\xFF\xFF"))) -#define SEND_TXT_F(x,y) (nextion.SendtoTFT(F(x)), nextion.SendtoTFT(F(".txt=\"")), nextion.SendtoTFT(y), nextion.SendtoTFT(F("\"\xFF\xFF\xFF"))) -#define SEND_VALasTXT(x,y) (nextion.SendtoTFT(F(x)), nextion.SendtoTFT(F(".txt=\"")), LCD_SERIAL.print(y), nextion.SendtoTFT(F("\"\xFF\xFF\xFF"))) -#define SEND_TXT_END(x) (nextion.SendtoTFT(F(x)), nextion.SendtoTFT(F("\xFF\xFF\xFF"))) -#define SEND_PCO2(x,y,z) (nextion.SendtoTFT(F(x)), LCD_SERIAL.print(y), nextion.SendtoTFT(F(".pco=")), nextion.SendtoTFT(F(z)), nextion.SendtoTFT(F("\xFF\xFF\xFF"))) +#define SEND_TEMP(x,y,t,z) (nextion.tftSend(F(x)), nextion.tftSend(F(".txt=\"")), LCD_SERIAL.print(y), nextion.tftSend(F(t)), LCD_SERIAL.print(z), nextion.tftSend(F("\"\xFF\xFF\xFF"))) +#define SEND_VAL(x,y) (nextion.tftSend(F(x)), nextion.tftSend(F(".val=")), LCD_SERIAL.print(y), nextion.tftSend(F("\xFF\xFF\xFF"))) +#define SEND_TXT(x,y) (nextion.tftSend(F(x)), nextion.tftSend(F(".txt=\"")), nextion.tftSend(F(y)), nextion.tftSend(F("\"\xFF\xFF\xFF"))) +#define SEND_TXT_F(x,y) (nextion.tftSend(F(x)), nextion.tftSend(F(".txt=\"")), nextion.tftSend(y), nextion.tftSend(F("\"\xFF\xFF\xFF"))) +#define SEND_VALasTXT(x,y) (nextion.tftSend(F(x)), nextion.tftSend(F(".txt=\"")), LCD_SERIAL.print(y), nextion.tftSend(F("\"\xFF\xFF\xFF"))) +#define SEND_TXT_END(x) (nextion.tftSend(F(x)), nextion.tftSend(F("\xFF\xFF\xFF"))) +#define SEND_PCO2(x,y,z) (nextion.tftSend(F(x)), LCD_SERIAL.print(y), nextion.tftSend(F(".pco=")), nextion.tftSend(F(z)), nextion.tftSend(F("\xFF\xFF\xFF"))) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index a742a82a5b..7f21610728 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -375,7 +375,7 @@ namespace ExtUI { bool canMove(const axis_t axis) { switch (axis) { #if IS_KINEMATIC || ENABLED(NO_MOTION_BEFORE_HOMING) - case X: return !axis_should_home(X_AXIS); + OPTCODE(HAS_X_AXIS, case X: return !axis_should_home(X_AXIS)) OPTCODE(HAS_Y_AXIS, case Y: return !axis_should_home(Y_AXIS)) OPTCODE(HAS_Z_AXIS, case Z: return !axis_should_home(Z_AXIS)) #else @@ -773,7 +773,9 @@ namespace ExtUI { bool babystepAxis_steps(const int16_t steps, const axis_t axis) { switch (axis) { #if ENABLED(BABYSTEP_XY) - case X: babystep.add_steps(X_AXIS, steps); break; + #if HAS_X_AXIS + case X: babystep.add_steps(X_AXIS, steps); break; + #endif #if HAS_Y_AXIS case Y: babystep.add_steps(Y_AXIS, steps); break; #endif @@ -818,7 +820,7 @@ namespace ExtUI { if (e != active_extruder) hotend_offset[e][axis] += mm; - normalizeNozzleOffset(X); + TERN_(HAS_X_AXIS, normalizeNozzleOffset(X)); TERN_(HAS_Y_AXIS, normalizeNozzleOffset(Y)); TERN_(HAS_Z_AXIS, normalizeNozzleOffset(Z)); } @@ -917,7 +919,7 @@ namespace ExtUI { bool getLevelingActive() { return planner.leveling_active; } void setLevelingActive(const bool state) { set_bed_leveling_enabled(state); } - bool getMeshValid() { return leveling_is_valid(); } + bool getLevelingIsValid() { return leveling_is_valid(); } #if HAS_MESH @@ -931,7 +933,7 @@ namespace ExtUI { } void moveToMeshPoint(const xy_uint8_t &pos, const_float_t z) { - #if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + #if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) REMEMBER(fr, feedrate_mm_s); const float x_target = MESH_MIN_X + pos.x * (MESH_X_DIST), y_target = MESH_MIN_Y + pos.y * (MESH_Y_DIST); diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 209635ea09..125c85ffa2 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -172,14 +172,14 @@ namespace ExtUI { #if HAS_LEVELING bool getLevelingActive(); void setLevelingActive(const bool); - bool getMeshValid(); + bool getLevelingIsValid(); + void onLevelingStart(); + void onLevelingDone(); #if HAS_MESH bed_mesh_t& getMeshArray(); float getMeshPoint(const xy_uint8_t &pos); void setMeshPoint(const xy_uint8_t &pos, const_float_t zval); void moveToMeshPoint(const xy_uint8_t &pos, const_float_t z); - void onLevelingStart(); - void onLevelingDone(); 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); } diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index ac6d4388e1..b750ff1551 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -122,7 +122,7 @@ namespace Language_ca { LSTR MSG_STORE_EEPROM = _UxGT("Desa memoria"); LSTR MSG_LOAD_EEPROM = _UxGT("Carrega memoria"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restaura valors"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualitza"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualitza"); LSTR MSG_INFO_SCREEN = _UxGT("Pantalla Info."); LSTR MSG_PREPARE = _UxGT("Prepara"); LSTR MSG_TUNE = _UxGT("Ajusta"); diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index a424883000..91dc3513f7 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -92,9 +92,9 @@ namespace Language_da { LSTR MSG_FAN_SPEED = _UxGT("Blæser hastighed"); LSTR MSG_FAN_SPEED_N = _UxGT("Blæser hastighed ~"); LSTR MSG_CONTROL = _UxGT("Kontrol"); - LSTR MSG_MIN = _UxGT(" \002 Min"); - LSTR MSG_MAX = _UxGT(" \002 Max"); - LSTR MSG_FACTOR = _UxGT(" \002 Fact"); + LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Min"); + LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Max"); + LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Fact"); LSTR MSG_AUTOTEMP = _UxGT("Autotemp"); LSTR MSG_LCD_ON = _UxGT("Til"); LSTR MSG_LCD_OFF = _UxGT("Fra"); @@ -111,7 +111,7 @@ namespace Language_da { LSTR MSG_STORE_EEPROM = _UxGT("Gem i EEPROM"); LSTR MSG_LOAD_EEPROM = _UxGT("Hent fra EEPROM"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Gendan Defaults"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Genopfrisk"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Genopfrisk"); LSTR MSG_INFO_SCREEN = _UxGT("Info skærm"); LSTR MSG_PREPARE = _UxGT("Forbered"); LSTR MSG_PAUSE_PRINT = _UxGT("Pause printet"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 534d49ade9..c78942bff6 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -54,8 +54,6 @@ namespace Language_de { LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Software-Endstopp"); LSTR MSG_MAIN_MENU = _UxGT("Hauptmenü"); LSTR MSG_ADVANCED_SETTINGS = _UxGT("Erw. Einstellungen"); - LSTR MSG_TOOLBAR_SETUP = _UxGT("Toolbar Einstellung"); - LSTR MSG_OPTION_DISABLED = _UxGT("Option Deaktiviert"); LSTR MSG_CONFIGURATION = _UxGT("Konfiguration"); LSTR MSG_RUN_AUTO_FILES = _UxGT("Autostart"); LSTR MSG_DISABLE_STEPPERS = _UxGT("Motoren deaktivieren"); // M84 :: Max length 19 characters @@ -70,12 +68,12 @@ namespace Language_de { LSTR MSG_FILAMENT_SET = _UxGT("Fila. Einstellungen"); LSTR MSG_FILAMENT_MAN = _UxGT("Filament Management"); LSTR MSG_MANUAL_LEVELING = _UxGT("Manuell Nivellierung"); - LSTR MSG_LEVBED_FL = _UxGT("Vorne Links"); - LSTR MSG_LEVBED_FR = _UxGT("Vorne Rechts"); - LSTR MSG_LEVBED_C = _UxGT("Mitte"); - LSTR MSG_LEVBED_BL = _UxGT("Hinten Links"); - LSTR MSG_LEVBED_BR = _UxGT("Hinten Rechts"); - LSTR MSG_MANUAL_MESH = _UxGT("manuelles Netz"); + LSTR MSG_TRAM_FL = _UxGT("Vorne Links"); + LSTR MSG_TRAM_FR = _UxGT("Vorne Rechts"); + LSTR MSG_TRAM_C = _UxGT("Mitte"); + LSTR MSG_TRAM_BL = _UxGT("Hinten Links"); + LSTR MSG_TRAM_BR = _UxGT("Hinten Rechts"); + LSTR MSG_MANUAL_MESH = _UxGT("Manuelles Netz"); LSTR MSG_AUTO_MESH = _UxGT("Netz auto. erstellen"); LSTR MSG_AUTO_Z_ALIGN = _UxGT("Z-Achsen ausgleichen"); LSTR MSG_ITERATION = _UxGT("G34 Iteration: %i"); @@ -414,7 +412,7 @@ namespace Language_de { LSTR MSG_RESTORE_DEFAULTS = _UxGT("Standardwerte laden"); LSTR MSG_INIT_EEPROM = _UxGT("Werkseinstellungen"); LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Fehler"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Fehler"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("EEPROM Größe Fehler"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Fehler"); LSTR MSG_SETTINGS_STORED = _UxGT("Einstell. gespei."); LSTR MSG_MEDIA_UPDATE = _UxGT("FW Update vom Medium"); @@ -513,7 +511,7 @@ namespace Language_de { LSTR MSG_FILAMENTUNLOAD = _UxGT("Filament entladen"); LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Filament entladen *"); LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Alles entladen"); - LSTR MSG_ATTACH_MEDIA = _UxGT("Medium initial."); // Manually initialize the SD-card via user interface + LSTR MSG_ATTACH_MEDIA = _UxGT("Medium initial."); // Manually initialize the SD-card via user interface LSTR MSG_CHANGE_MEDIA = _UxGT("Medium getauscht"); // SD-card changed by user. For machines with no autocarddetect. Both send "M21" LSTR MSG_RELEASE_MEDIA = _UxGT("Medium freigeben"); // if Marlin gets confused - M22 LSTR MSG_ZPROBE_OUT = _UxGT("Z-Sonde außerhalb"); diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index e18bda4edf..aab74cc494 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -70,16 +70,16 @@ namespace Language_el { LSTR MSG_PREHEAT_1_END = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End"); LSTR MSG_PREHEAT_1_END_E = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" End ~"); LSTR MSG_PREHEAT_1_ALL = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" όλα"); - LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" bed"); //SHORTEN - LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); //SHORTEN + LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" bed"); // SHORTEN + LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Προθέρμανση ") PREHEAT_1_LABEL _UxGT(" επιβεβαίωση"); // SHORTEN LSTR MSG_PREHEAT_M = _UxGT("Προθέρμανση $"); LSTR MSG_PREHEAT_M_H = _UxGT("Προθέρμανση $ ~"); LSTR MSG_PREHEAT_M_END = _UxGT("Προθέρμανση $ End"); LSTR MSG_PREHEAT_M_END_E = _UxGT("Προθέρμανση $ End ~"); LSTR MSG_PREHEAT_M_ALL = _UxGT("Προθέρμανση $ όλα"); - LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Προθέρμανση $ bed"); //SHORTEN - LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Προθέρμανση $ επιβεβαίωση"); //SHORTEN + LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Προθέρμανση $ bed"); // SHORTEN + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Προθέρμανση $ επιβεβαίωση"); // SHORTEN #endif LSTR MSG_COOLDOWN = _UxGT("Αποθέρμανση"); LSTR MSG_SWITCH_PS_ON = _UxGT("Ενεργοποίηση"); @@ -157,7 +157,7 @@ namespace Language_el { LSTR MSG_STORE_EEPROM = _UxGT("Αποθήκευση σε EEPROM"); LSTR MSG_LOAD_EEPROM = _UxGT("Φόρτωση από EEPROM"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Επαναφορά προεπιλογών"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση"); LSTR MSG_INFO_SCREEN = _UxGT("Οθόνη πληροφόρησης"); LSTR MSG_PREPARE = _UxGT("Προετοιμασία"); LSTR MSG_TUNE = _UxGT("Συντονισμός"); @@ -173,7 +173,7 @@ namespace Language_el { LSTR MSG_KILLED = _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. "); LSTR MSG_STOPPED = _UxGT("ΔΙΑΚΟΠΗ. "); LSTR MSG_CONTROL_RETRACT = _UxGT("Ανάσυρση μμ"); - LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυρσης mm"); //SHORTEN + LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Εναλλαγή ανάσυρσης mm"); // SHORTEN LSTR MSG_CONTROL_RETRACTF = _UxGT("Ανάσυρση V"); LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Μεταπήδηση mm"); LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("Unretr. mm"); @@ -184,7 +184,7 @@ namespace Language_el { LSTR MSG_FILAMENTCHANGE_E = _UxGT("Αλλαγή νήματος *"); LSTR MSG_ATTACH_MEDIA = _UxGT("Προετοιμασία SD"); LSTR MSG_CHANGE_MEDIA = _UxGT("Αλλαγή κάρτας SD"); - LSTR MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός Επ.Εκτύπωσης"); //SHORTEN + LSTR MSG_ZPROBE_OUT = _UxGT("Διερεύνηση Z εκτός Επ.Εκτύπωσης"); // SHORTEN LSTR MSG_YX_UNHOMED = _UxGT("Επαναφορά Χ/Υ πρώτα"); LSTR MSG_XYZ_UNHOMED = _UxGT("Επαναφορά ΧΥΖ πρώτα"); LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Μετατόπιση Ζ"); diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index d4eabb70ce..696b1d055d 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -147,7 +147,7 @@ namespace Language_el_gr { LSTR MSG_STORE_EEPROM = _UxGT("Αποθήκευση"); LSTR MSG_LOAD_EEPROM = _UxGT("Φόρτωση"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Επαναφορά ασφαλούς αντιγράφου"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ανανέωση"); LSTR MSG_INFO_SCREEN = _UxGT("Οθόνη πληροφόρησης"); LSTR MSG_PREPARE = _UxGT("Προετοιμασία"); LSTR MSG_TUNE = _UxGT("Συντονισμός"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 0cfd2f8bea..c171338f19 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -64,13 +64,13 @@ namespace Language_en { LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" read error"); LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB device removed"); LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB start failed"); + LSTR MSG_MEDIA_SORT = _UxGT("Sort ") MEDIA_TYPE_EN; + LSTR MSG_MEDIA_UPDATE = MEDIA_TYPE_EN _UxGT(" Update"); LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall Overflow"); LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops"); LSTR MSG_MAIN_MENU = _UxGT("Main Menu"); LSTR MSG_ADVANCED_SETTINGS = _UxGT("Advanced Settings"); - LSTR MSG_TOOLBAR_SETUP = _UxGT("Toolbar Setup"); - LSTR MSG_OPTION_DISABLED = _UxGT("Option Disabled"); LSTR MSG_CONFIGURATION = _UxGT("Configuration"); LSTR MSG_RUN_AUTO_FILES = _UxGT("Run Auto Files"); LSTR MSG_DISABLE_STEPPERS = _UxGT("Disable Steppers"); @@ -88,11 +88,11 @@ namespace Language_en { LSTR MSG_FILAMENT_SET = _UxGT("Filament Settings"); LSTR MSG_FILAMENT_MAN = _UxGT("Filament Management"); LSTR MSG_MANUAL_LEVELING = _UxGT("Manual Leveling"); - LSTR MSG_LEVBED_FL = _UxGT("Front Left"); - LSTR MSG_LEVBED_FR = _UxGT("Front Right"); - LSTR MSG_LEVBED_C = _UxGT("Center"); - LSTR MSG_LEVBED_BL = _UxGT("Back Left"); - LSTR MSG_LEVBED_BR = _UxGT("Back Right"); + LSTR MSG_TRAM_FL = _UxGT("Front Left"); + LSTR MSG_TRAM_FR = _UxGT("Front Right"); + LSTR MSG_TRAM_C = _UxGT("Center"); + LSTR MSG_TRAM_BL = _UxGT("Back Left"); + LSTR MSG_TRAM_BR = _UxGT("Back Right"); LSTR MSG_MANUAL_MESH = _UxGT("Manual Mesh"); LSTR MSG_AUTO_MESH = _UxGT("Auto Build Mesh"); LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Align"); @@ -189,6 +189,7 @@ namespace Language_en { LSTR MSG_MESH_CENTER = _UxGT("Center Area"); LSTR MSG_MESH_EDIT_Z = _UxGT("Z Value"); LSTR MSG_MESH_CANCEL = _UxGT("Mesh cancelled"); + LSTR MSG_MESH_RESET = _UxGT("Mesh reset"); LSTR MSG_CUSTOM_COMMANDS = _UxGT("Custom Commands"); LSTR MSG_M48_TEST = _UxGT("M48 Probe Test"); LSTR MSG_M48_POINT = _UxGT("M48 Point"); @@ -366,7 +367,7 @@ namespace Language_en { LSTR MSG_PID_AUTOTUNE_E = _UxGT("PID Autotune *"); LSTR MSG_PID_CYCLE = _UxGT("PID Cycles"); LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID tuning done"); - LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("PID Autotune failed!"); + LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Autotune failed!"); LSTR MSG_BAD_HEATER_ID = _UxGT("Bad extruder."); LSTR MSG_TEMP_TOO_HIGH = _UxGT("Temperature too high."); LSTR MSG_TIMEOUT = _UxGT("Timeout."); @@ -397,6 +398,7 @@ namespace Language_en { LSTR MSG_VN_JERK = _UxGT("Max @ Jerk"); LSTR MSG_VE_JERK = _UxGT("Max E Jerk"); LSTR MSG_JUNCTION_DEVIATION = _UxGT("Junction Dev"); + LSTR MSG_STEP_SMOOTHING = _UxGT("Step Smoothing"); LSTR MSG_MAX_SPEED = _UxGT("Max Speed (mm/s)"); LSTR MSG_VMAX_A = _UxGT("Max ") STR_A _UxGT(" Speed"); LSTR MSG_VMAX_B = _UxGT("Max ") STR_B _UxGT(" Speed"); @@ -420,6 +422,12 @@ namespace Language_en { LSTR MSG_SHAPING_DISABLE = _UxGT("Disable @ shaping"); LSTR MSG_SHAPING_FREQ = _UxGT("@ frequency"); LSTR MSG_SHAPING_ZETA = _UxGT("@ damping"); + LSTR MSG_SHAPING_A_FREQ = STR_A _UxGT(" frequency"); + LSTR MSG_SHAPING_B_FREQ = STR_B _UxGT(" frequency"); + LSTR MSG_SHAPING_A_ZETA = STR_A _UxGT(" damping "); + LSTR MSG_SHAPING_B_ZETA = STR_B _UxGT(" damping "); + LSTR MSG_SHAPING_X_ENABLE = _UxGT("Enable X shaping"); + LSTR MSG_SHAPING_Y_ENABLE = _UxGT("Enable Y shaping"); LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("XY Freq Limit"); LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min FR Factor"); LSTR MSG_STEPS_PER_MM = _UxGT("Steps/mm"); @@ -446,6 +454,7 @@ namespace Language_en { LSTR MSG_DRAW_MIN_Y = _UxGT("Draw Min Y"); LSTR MSG_DRAW_MAX_Y = _UxGT("Draw Max Y"); LSTR MSG_MAX_BELT_LEN = _UxGT("Max Belt Len"); + LSTR MSG_LINEAR_ADVANCE = _UxGT("Linear Advance"); LSTR MSG_ADVANCE_K = _UxGT("Advance K"); LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *"); LSTR MSG_CONTRAST = _UxGT("LCD Contrast"); @@ -456,11 +465,12 @@ namespace Language_en { LSTR MSG_LOAD_EEPROM = _UxGT("Load Settings"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restore Defaults"); LSTR MSG_INIT_EEPROM = _UxGT("Initialize EEPROM"); - LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Error"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Error"); - LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Error"); + LSTR MSG_ERR_EEPROM_CRC = _UxGT("Err: EEPROM CRC"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Err: EEPROM Size"); + LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Err: EEPROM Version"); + LSTR MSG_ERR_EEPROM_CORRUPT = _UxGT("Err: EEPROM Corrupt"); LSTR MSG_SETTINGS_STORED = _UxGT("Settings Stored"); - LSTR MSG_MEDIA_UPDATE = MEDIA_TYPE_EN _UxGT(" Update"); + LSTR MSG_HAS_PREVIEW = _UxGT("Has preview"); LSTR MSG_RESET_PRINTER = _UxGT("Reset Printer"); LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); LSTR MSG_INFO_SCREEN = _UxGT("Info Screen"); @@ -507,7 +517,7 @@ namespace Language_en { LSTR MSG_CANCEL_OBJECT = _UxGT("Cancel Object"); LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancel Object {"); LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Continue Print Job"); - LSTR MSG_MEDIA_MENU = _UxGT("Print from ") MEDIA_TYPE_EN; + LSTR MSG_MEDIA_MENU = _UxGT("Select from ") MEDIA_TYPE_EN; LSTR MSG_TURN_OFF = _UxGT("Turn off the printer"); LSTR MSG_END_LOOPS = _UxGT("End Repeat Loops"); #else @@ -746,9 +756,9 @@ namespace Language_en { LSTR MSG_MMU2_EJECT_FILAMENT = _UxGT("MMU Eject"); LSTR MSG_MMU2_EJECT_FILAMENT_N = _UxGT("MMU Eject ~"); LSTR MSG_MMU2_UNLOAD_FILAMENT = _UxGT("MMU Unload"); - LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Loading Fil. %i..."); - LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Ejecting Fil. ..."); - LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Unloading Fil...."); + LSTR MSG_MMU2_LOADING_FILAMENT = _UxGT("Filament %i Load..."); + LSTR MSG_MMU2_EJECTING_FILAMENT = _UxGT("Filament Eject..."); + LSTR MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Filament Unload..."); LSTR MSG_MMU2_ALL = _UxGT("All"); LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filament ~"); LSTR MSG_MMU2_RESET = _UxGT("Reset MMU"); @@ -826,6 +836,10 @@ namespace Language_en { #endif LSTR MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); LSTR MSG_TMC_CURRENT = _UxGT("Driver Current"); + LSTR MSG_TMC_ACURRENT = STR_A _UxGT("Driver Current"); + LSTR MSG_TMC_BCURRENT = STR_B _UxGT("Driver Current"); + LSTR MSG_TMC_CCURRENT = STR_C _UxGT("Driver Current"); + LSTR MSG_TMC_ECURRENT = _UxGT("E Driver Current"); LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); @@ -836,6 +850,22 @@ namespace Language_en { LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction"); LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); + LSTR MSG_FIXED_TIME_MOTION = _UxGT("Fixed-Time Motion"); + LSTR MSG_FTM_MODE = _UxGT("Motion Mode:"); + LSTR MSG_FTM_ZV = _UxGT("ZV"); + LSTR MSG_FTM_ZVD = _UxGT("ZVD"); + LSTR MSG_FTM_EI = _UxGT("EI"); + LSTR MSG_FTM_2HEI = _UxGT("2HEI"); + LSTR MSG_FTM_3HEI = _UxGT("3HEI"); + LSTR MSG_FTM_MZV = _UxGT("MZV"); + //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo FBS"); + //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); + LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode:"); + LSTR MSG_FTM_Z_BASED = _UxGT("Z-based"); + LSTR MSG_FTM_MASS_BASED = _UxGT("Mass-based"); + LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Base Freq."); + LSTR MSG_FTM_DFREQ_K_N = _UxGT("@ Dyn. Freq."); + LSTR MSG_LEVEL_X_AXIS = _UxGT("Level X Axis"); LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Calibrate"); #if ENABLED(TOUCH_UI_FTDI_EVE) diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index f3d6fc577d..a487c7d289 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -315,11 +315,11 @@ namespace Language_es { LSTR MSG_RESTORE_DEFAULTS = _UxGT("Rest. fábrica"); LSTR MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM"); LSTR MSG_ERR_EEPROM_CRC = _UxGT("Err: EEPROM CRC"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Err: Índice EEPROM"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Err: EEPROM Tamaño"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versión EEPROM"); LSTR MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/FD"); LSTR MSG_RESET_PRINTER = _UxGT("Resetear Impresora"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); LSTR MSG_INFO_SCREEN = _UxGT("Pantalla de Inf."); LSTR MSG_PREPARE = _UxGT("Preparar"); LSTR MSG_TUNE = _UxGT("Ajustar"); diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index 9b969762d5..6433fde99f 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -194,7 +194,7 @@ namespace Language_eu { LSTR MSG_LOAD_EEPROM = _UxGT("Kargatu memoria"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Larri. berriz."); LSTR MSG_INIT_EEPROM = _UxGT("EEPROM-a hasieratu"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Berriz kargatu"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Berriz kargatu"); LSTR MSG_INFO_SCREEN = _UxGT("Pantaila info"); LSTR MSG_PREPARE = _UxGT("Prestatu"); LSTR MSG_TUNE = _UxGT("Doitu"); diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index 57fc0a7c21..8d5e4c7143 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -102,7 +102,7 @@ namespace Language_fi { LSTR MSG_STORE_EEPROM = _UxGT("Tallenna muistiin"); LSTR MSG_LOAD_EEPROM = _UxGT("Lataa muistista"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Palauta oletus"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Päivitä"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Päivitä"); LSTR MSG_INFO_SCREEN = _UxGT("Seuraa"); LSTR MSG_PREPARE = _UxGT("Valmistele"); LSTR MSG_TUNE = _UxGT("Säädä"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 01422f5c76..4f04345252 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -331,7 +331,7 @@ namespace Language_fr { LSTR MSG_SETTINGS_STORED = _UxGT("Config. enregistrée"); LSTR MSG_MEDIA_UPDATE = _UxGT("MaJ Firmware SD"); LSTR MSG_RESET_PRINTER = _UxGT("RaZ imprimante"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualiser"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualiser"); LSTR MSG_INFO_SCREEN = _UxGT("Surveiller"); LSTR MSG_PREPARE = _UxGT("Préparer"); LSTR MSG_TUNE = _UxGT("Régler"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 12fa0295ea..4441a7970a 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -331,7 +331,7 @@ namespace Language_fr_na { LSTR MSG_SETTINGS_STORED = _UxGT("Config. enregistree"); LSTR MSG_MEDIA_UPDATE = _UxGT("MaJ Firmware SD"); LSTR MSG_RESET_PRINTER = _UxGT("RaZ imprimante"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualiser"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Actualiser"); LSTR MSG_INFO_SCREEN = _UxGT("Surveiller"); LSTR MSG_PREPARE = _UxGT("Preparer"); LSTR MSG_TUNE = _UxGT("Regler"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 83855dd56d..25b30f71eb 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -317,12 +317,12 @@ namespace Language_gl { LSTR MSG_RESTORE_DEFAULTS = _UxGT("Rest. Defecto"); LSTR MSG_INIT_EEPROM = _UxGT("Inicializar EEPROM"); LSTR MSG_ERR_EEPROM_CRC = _UxGT("Erro: CRC EEPROM"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Erro: Índice EEPROM"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Erro: Tamaño EEPROM"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Erro: Versión EEPROM"); LSTR MSG_SETTINGS_STORED = _UxGT("Config Gardada"); LSTR MSG_MEDIA_UPDATE = _UxGT("Actualizar SD/FD"); LSTR MSG_RESET_PRINTER = _UxGT("Reiniciar Impresora"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Recargar"); LSTR MSG_INFO_SCREEN = _UxGT("Información"); LSTR MSG_PREPARE = _UxGT("Preparar"); LSTR MSG_TUNE = _UxGT("Axustar"); diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index 1f51c5c539..a857fb3619 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -105,7 +105,7 @@ namespace Language_hr { LSTR MSG_STORE_EEPROM = _UxGT("Pohrani u memoriju"); LSTR MSG_LOAD_EEPROM = _UxGT("Učitaj memoriju"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Učitaj Defaults"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Osvježi"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Osvježi"); LSTR MSG_INFO_SCREEN = _UxGT("Info screen"); LSTR MSG_PREPARE = _UxGT("Pripremi"); LSTR MSG_PAUSE_PRINT = _UxGT("Pauziraj print"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 99062ca5c3..f3880a31a6 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -363,12 +363,12 @@ namespace Language_hu { LSTR MSG_RESTORE_DEFAULTS = _UxGT("Alapértelmezett"); LSTR MSG_INIT_EEPROM = _UxGT("EEPROM inicializálás"); LSTR MSG_ERR_EEPROM_CRC = _UxGT("Hiba: EEPROM CRC"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM index"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Hiba: EEPROM mérete"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM verzió"); LSTR MSG_SETTINGS_STORED = _UxGT("Beállítások mentve"); LSTR MSG_MEDIA_UPDATE = _UxGT("Tároló frissítés"); LSTR MSG_RESET_PRINTER = _UxGT("Nyomtató újraindítása"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés"); LSTR MSG_INFO_SCREEN = _UxGT(""); LSTR MSG_PREPARE = _UxGT("Vezérlés"); LSTR MSG_TUNE = _UxGT("Hangolás"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index bd0d2f2257..054a71d6c0 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -64,13 +64,13 @@ namespace Language_it { LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa Soft"); LSTR MSG_MAIN_MENU = _UxGT("Menu principale"); LSTR MSG_ADVANCED_SETTINGS = _UxGT("Impostaz. avanzate"); - LSTR MSG_TOOLBAR_SETUP = _UxGT("Cnf barra strumenti"); - LSTR MSG_OPTION_DISABLED = _UxGT("Opzione disab."); LSTR MSG_CONFIGURATION = _UxGT("Configurazione"); LSTR MSG_RUN_AUTO_FILES = _UxGT("Esegui files auto"); LSTR MSG_DISABLE_STEPPERS = _UxGT("Disabilita Motori"); LSTR MSG_DEBUG_MENU = _UxGT("Menu di debug"); LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Test barra avanzam."); + LSTR MSG_ENDSTOP_TEST = _UxGT("Test Finecorsa"); + LSTR MSG_Z_PROBE = _UxGT("Sonda Z"); LSTR MSG_HOMING = _UxGT("Azzeramento"); LSTR MSG_AUTO_HOME = _UxGT("Auto Home"); LSTR MSG_AUTO_HOME_A = _UxGT("Home @"); @@ -81,11 +81,11 @@ namespace Language_it { LSTR MSG_FILAMENT_SET = _UxGT("Impostaz.filamento"); LSTR MSG_FILAMENT_MAN = _UxGT("Gestione filamento"); LSTR MSG_MANUAL_LEVELING = _UxGT("Livel.manuale"); - LSTR MSG_LEVBED_FL = _UxGT("Davanti Sinistra"); - LSTR MSG_LEVBED_FR = _UxGT("Davanti Destra"); - LSTR MSG_LEVBED_C = _UxGT("Centro"); - LSTR MSG_LEVBED_BL = _UxGT("Dietro Sinistra"); - LSTR MSG_LEVBED_BR = _UxGT("Dietro Destra"); + LSTR MSG_TRAM_FL = _UxGT("Davanti Sinistra"); + LSTR MSG_TRAM_FR = _UxGT("Davanti Destra"); + LSTR MSG_TRAM_C = _UxGT("Centro"); + LSTR MSG_TRAM_BL = _UxGT("Dietro Sinistra"); + LSTR MSG_TRAM_BR = _UxGT("Dietro Destra"); LSTR MSG_MANUAL_MESH = _UxGT("Mesh Manuale"); LSTR MSG_AUTO_MESH = _UxGT("Generaz.Autom.Mesh"); LSTR MSG_AUTO_Z_ALIGN = _UxGT("Allineam.automat. Z"); @@ -338,11 +338,11 @@ namespace Language_it { LSTR MSG_FLOWMETER_SAFETY = _UxGT("Sicurezza flusso"); LSTR MSG_CUTTER = _UxGT("Taglio"); LSTR MSG_LASER = _UxGT("Laser"); - LSTR MSG_FAN_SPEED = _UxGT("Vel. ventola"); // Max 15 characters - LSTR MSG_FAN_SPEED_N = _UxGT("Vel. ventola ~"); // Max 15 characters - LSTR MSG_STORED_FAN_N = _UxGT("Ventola mem. ~"); // Max 15 characters - LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra vel.vent."); // Max 15 characters - LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra v.vent. ~"); // Max 15 characters + LSTR MSG_FAN_SPEED = _UxGT("Vel. ventola"); // Max 15 characters + LSTR MSG_FAN_SPEED_N = _UxGT("Vel. ventola ~"); // Max 15 characters + LSTR MSG_STORED_FAN_N = _UxGT("Ventola mem. ~"); // Max 15 characters + LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra vel.vent."); // Max 15 characters + LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra v.vent. ~"); // Max 15 characters LSTR MSG_CONTROLLER_FAN = _UxGT("Controller vent."); LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Vel. inattivo"); LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Modo autom."); @@ -427,6 +427,7 @@ namespace Language_it { LSTR MSG_TEMPERATURE = _UxGT("Temperatura"); LSTR MSG_MOTION = _UxGT("Movimento"); LSTR MSG_FILAMENT = _UxGT("Filamento"); + LSTR MSG_FILAMENT_EN = _UxGT("Filamento *"); LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("Limite E in mm") SUPERSCRIPT_THREE; LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("Limite E *"); @@ -440,6 +441,7 @@ namespace Language_it { LSTR MSG_DRAW_MIN_Y = _UxGT("Min Y area disegno"); LSTR MSG_DRAW_MAX_Y = _UxGT("Max Y area disegno"); LSTR MSG_MAX_BELT_LEN = _UxGT("Lungh.max cinghia"); + LSTR MSG_LINEAR_ADVANCE = _UxGT("Avanzam.Lineare"); LSTR MSG_ADVANCE_K = _UxGT("K Avanzamento"); LSTR MSG_ADVANCE_K_E = _UxGT("K Avanzamento *"); LSTR MSG_CONTRAST = _UxGT("Contrasto LCD"); @@ -451,8 +453,9 @@ namespace Language_it { LSTR MSG_RESTORE_DEFAULTS = _UxGT("Ripristina imp."); LSTR MSG_INIT_EEPROM = _UxGT("Inizializza EEPROM"); LSTR MSG_ERR_EEPROM_CRC = _UxGT("Err: CRC EEPROM"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Err: Indice EEPROM"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Err: Dimens.EEPROM"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versione EEPROM"); + LSTR MSG_ERR_EEPROM_CORRUPT = _UxGT("Err: EEPROM corrotta"); LSTR MSG_SETTINGS_STORED = _UxGT("Impostazioni mem."); LSTR MSG_MEDIA_UPDATE = _UxGT("Aggiorna media"); LSTR MSG_RESET_PRINTER = _UxGT("Resetta stampante"); @@ -597,7 +600,7 @@ namespace Language_it { LSTR MSG_BABYSTEP_N = _UxGT("Babystep @"); LSTR MSG_BABYSTEP_TOTAL = _UxGT("Totali"); LSTR MSG_ENDSTOP_ABORT = _UxGT("Interrompi se FC"); - LSTR MSG_HEATING_FAILED_LCD = _UxGT("Risc.Fallito"); // Max 12 characters + LSTR MSG_HEATING_FAILED_LCD = _UxGT("Risc.Fallito"); // Max 12 characters LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Err: TEMP RIDONDANTE"); LSTR MSG_THERMAL_RUNAWAY = _UxGT("TEMP FUORI CONTROLLO"); LSTR MSG_TEMP_MALFUNCTION = _UxGT("MALFUNZIONAMENTO TEMP"); @@ -621,6 +624,7 @@ namespace Language_it { LSTR MSG_CHAMBER_COOLING = _UxGT("Raffr. camera..."); LSTR MSG_LASER_COOLING = _UxGT("Raffr. laser..."); LSTR MSG_DELTA_CALIBRATE = _UxGT("Calibraz. Delta"); + LSTR MSG_DELTA_CALIBRATION_IN_PROGRESS = _UxGT("Calibrazione Delta in corso"); LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Calibra X"); LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Calibra Y"); LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Calibra Z"); @@ -702,13 +706,13 @@ namespace Language_it { LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Riprendi stampa"); LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Spurga o continua?"); LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Ugello: "); - LSTR MSG_RUNOUT_SENSOR = _UxGT("Sens.filo termin."); // Max 17 characters + LSTR MSG_RUNOUT_SENSOR = _UxGT("Sens.filo termin."); // Max 17 characters LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("Dist mm filo term."); LSTR MSG_RUNOUT_ENABLE = _UxGT("Abil.filo termin."); LSTR MSG_RUNOUT_ACTIVE = _UxGT("Filo termin. attivo"); LSTR MSG_INVERT_EXTRUDER = _UxGT("Inverti estrusore"); LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Temp.min estrusore"); - LSTR MSG_FANCHECK = _UxGT("Verif.tacho vent."); // Max 17 characters + LSTR MSG_FANCHECK = _UxGT("Verif.tacho vent."); // Max 17 characters LSTR MSG_KILL_HOMING_FAILED = _UxGT("Home fallito"); LSTR MSG_LCD_PROBING_FAILED = _UxGT("Sondaggio fallito"); @@ -731,7 +735,8 @@ namespace Language_it { LSTR MSG_MMU2_FILAMENT_N = _UxGT("Filamento ~"); LSTR MSG_MMU2_RESET = _UxGT("Azzera MMU"); LSTR MSG_MMU2_RESETTING = _UxGT("Azzeramento MMU..."); - LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Rimuovi, click"); + LSTR MSG_MMU2_EJECT_RECOVER = _UxGT("Espelli, click"); + LSTR MSG_MMU2_REMOVE_AND_CLICK = _UxGT("Rimuovi e click..."); LSTR MSG_MIX = _UxGT("Miscela"); LSTR MSG_MIX_COMPONENT_N = _UxGT("Componente {"); @@ -778,7 +783,7 @@ namespace Language_it { // #if LCD_HEIGHT >= 4 LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Premi per", "riprendere", "la stampa")); - LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parcheggiando...")); + LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Sto parcheggiando...")); LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Attendere avvio", "del cambio", "di filamento")); LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Inserisci il", "filamento e premi", "per continuare")); LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Premi per", "riscaldare ugello")); @@ -815,6 +820,22 @@ namespace Language_it { LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correzione"); LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Appianamento"); + LSTR MSG_FIXED_TIME_MOTION = _UxGT("Movimento a Tempo-Fisso"); + LSTR MSG_FTM_MODE = _UxGT("Modo Movimento:"); + LSTR MSG_FTM_ZV = _UxGT("ZV"); + LSTR MSG_FTM_ZVD = _UxGT("ZVD"); + LSTR MSG_FTM_EI = _UxGT("EI"); + LSTR MSG_FTM_2HEI = _UxGT("2HEI"); + LSTR MSG_FTM_3HEI = _UxGT("3HEI"); + LSTR MSG_FTM_MZV = _UxGT("MZV"); + //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo FBS"); + //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); + LSTR MSG_FTM_DYN_MODE = _UxGT("Modo DF:"); + LSTR MSG_FTM_Z_BASED = _UxGT("Base-Z"); + LSTR MSG_FTM_MASS_BASED = _UxGT("Base-Massa"); + LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Freq. Base"); + LSTR MSG_FTM_DFREQ_K_N = _UxGT("@ Freq. Dinam."); + LSTR MSG_LEVEL_X_AXIS = _UxGT("Livello asse X"); LSTR MSG_AUTO_CALIBRATE = _UxGT("Auto Calibra"); #if ENABLED(TOUCH_UI_FTDI_EVE) diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index 7570710838..950ddcb5e5 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -42,188 +42,188 @@ namespace Language_jp_kana { // 片仮名表示定義 LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" ジュンビカンリョウ"); - LSTR MSG_MEDIA_INSERTED = _UxGT("メディアガソウニュウサレマシタ"); // "Card inserted" - LSTR MSG_MEDIA_REMOVED = _UxGT("メディアガアリマセン"); // "Card removed" + LSTR MSG_MEDIA_INSERTED = _UxGT("メディアガソウニュウサレマシタ"); // "Card inserted" + LSTR MSG_MEDIA_REMOVED = _UxGT("メディアガアリマセン"); // "Card removed" LSTR MSG_RELEASE_MEDIA = _UxGT("メディアノトリダシ"); - LSTR MSG_LCD_ENDSTOPS = _UxGT("エンドストップ"); // "Endstops" // Max length 8 characters - LSTR MSG_MAIN_MENU = _UxGT("メイン"); // "Main" - LSTR MSG_RUN_AUTO_FILES = _UxGT("ジドウカイシ"); // "Autostart" - LSTR MSG_DISABLE_STEPPERS = _UxGT("モーターデンゲン オフ"); // "Disable steppers" - LSTR MSG_DEBUG_MENU = _UxGT("デバッグメニュー"); // "Debug Menu" - LSTR MSG_PROGRESS_BAR_TEST = _UxGT("プログレスバー テスト"); // "Progress Bar Test" - LSTR MSG_AUTO_HOME = _UxGT("ゲンテンフッキ"); // "Auto home" - LSTR MSG_AUTO_HOME_X = _UxGT("Xジク ゲンテンフッキ"); // "Home X" - LSTR MSG_AUTO_HOME_Y = _UxGT("Yジク ゲンテンフッキ"); // "Home Y" - LSTR MSG_AUTO_HOME_Z = _UxGT("Zジク ゲンテンフッキ"); // "Home Z" - LSTR MSG_LEVEL_BED_HOMING = _UxGT("ゲンテンフッキチュウ"); // "Homing XYZ" - LSTR MSG_LEVEL_BED_WAITING = _UxGT("レベリングカイシ"); // "Click to Begin" - LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("ツギノソクテイテンヘ"); // "Next Point" - LSTR MSG_LEVEL_BED_DONE = _UxGT("レベリングカンリョウ"); // "Leveling Done!" - LSTR MSG_SET_HOME_OFFSETS = _UxGT("キジュンオフセットセッテイ"); // "Set home offsets" - LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("オフセットガテキヨウサレマシタ"); // "Offsets applied" + LSTR MSG_LCD_ENDSTOPS = _UxGT("エンドストップ"); // "Endstops" // Max length 8 characters + LSTR MSG_MAIN_MENU = _UxGT("メイン"); // "Main" + LSTR MSG_RUN_AUTO_FILES = _UxGT("ジドウカイシ"); // "Autostart" + LSTR MSG_DISABLE_STEPPERS = _UxGT("モーターデンゲン オフ"); // "Disable steppers" + LSTR MSG_DEBUG_MENU = _UxGT("デバッグメニュー"); // "Debug Menu" + LSTR MSG_PROGRESS_BAR_TEST = _UxGT("プログレスバー テスト"); // "Progress Bar Test" + LSTR MSG_AUTO_HOME = _UxGT("ゲンテンフッキ"); // "Auto home" + LSTR MSG_AUTO_HOME_X = _UxGT("Xジク ゲンテンフッキ"); // "Home X" + LSTR MSG_AUTO_HOME_Y = _UxGT("Yジク ゲンテンフッキ"); // "Home Y" + LSTR MSG_AUTO_HOME_Z = _UxGT("Zジク ゲンテンフッキ"); // "Home Z" + LSTR MSG_LEVEL_BED_HOMING = _UxGT("ゲンテンフッキチュウ"); // "Homing XYZ" + LSTR MSG_LEVEL_BED_WAITING = _UxGT("レベリングカイシ"); // "Click to Begin" + LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("ツギノソクテイテンヘ"); // "Next Point" + LSTR MSG_LEVEL_BED_DONE = _UxGT("レベリングカンリョウ"); // "Leveling Done!" + LSTR MSG_SET_HOME_OFFSETS = _UxGT("キジュンオフセットセッテイ"); // "Set home offsets" + LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("オフセットガテキヨウサレマシタ"); // "Offsets applied" #if HAS_PREHEAT - LSTR MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" ヨネツ"); // "Preheat " PREHEAT_1_LABEL - LSTR MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL - LSTR MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" ヨネツノズル"); // " Nozzle" - LSTR MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ~"); // " Nozzle" - LSTR MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" スベテヨネツ"); // " All" - LSTR MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" ベッドヨネツ"); // " Bed" - LSTR MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" ヨネツセッテイ"); // " conf" + LSTR MSG_PREHEAT_1 = PREHEAT_1_LABEL _UxGT(" ヨネツ"); // "Preheat " PREHEAT_1_LABEL + LSTR MSG_PREHEAT_1_H = PREHEAT_1_LABEL _UxGT(" ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL + LSTR MSG_PREHEAT_1_END = PREHEAT_1_LABEL _UxGT(" ヨネツノズル"); // " Nozzle" + LSTR MSG_PREHEAT_1_END_E = PREHEAT_1_LABEL _UxGT(" ヨネツノズル ~"); // " Nozzle" + LSTR MSG_PREHEAT_1_ALL = PREHEAT_1_LABEL _UxGT(" スベテヨネツ"); // " All" + LSTR MSG_PREHEAT_1_BEDONLY = PREHEAT_1_LABEL _UxGT(" ベッドヨネツ"); // " Bed" + LSTR MSG_PREHEAT_1_SETTINGS = PREHEAT_1_LABEL _UxGT(" ヨネツセッテイ"); // " conf" - LSTR MSG_PREHEAT_M = _UxGT("$ ヨネツ"); // "Preheat " PREHEAT_1_LABEL - LSTR MSG_PREHEAT_M_H = _UxGT("$ ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL - LSTR MSG_PREHEAT_M_END = _UxGT("$ ヨネツノズル"); // " Nozzle" - LSTR MSG_PREHEAT_M_END_E = _UxGT("$ ヨネツノズル ~"); // " Nozzle" - LSTR MSG_PREHEAT_M_ALL = _UxGT("$ スベテヨネツ"); // " All" - LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("$ ベッドヨネツ"); // " Bed" - LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("$ ヨネツセッテイ"); // " conf" + LSTR MSG_PREHEAT_M = _UxGT("$ ヨネツ"); // "Preheat " PREHEAT_1_LABEL + LSTR MSG_PREHEAT_M_H = _UxGT("$ ヨネツ ~"); // "Preheat " PREHEAT_1_LABEL + LSTR MSG_PREHEAT_M_END = _UxGT("$ ヨネツノズル"); // " Nozzle" + LSTR MSG_PREHEAT_M_END_E = _UxGT("$ ヨネツノズル ~"); // " Nozzle" + LSTR MSG_PREHEAT_M_ALL = _UxGT("$ スベテヨネツ"); // " All" + LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("$ ベッドヨネツ"); // " Bed" + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("$ ヨネツセッテイ"); // " conf" #endif - LSTR MSG_COOLDOWN = _UxGT("カネツテイシ"); // "Cooldown" - LSTR MSG_SWITCH_PS_ON = _UxGT("デンゲン オン"); // "Switch power on" - LSTR MSG_SWITCH_PS_OFF = _UxGT("デンゲン オフ"); // "Switch power off" - LSTR MSG_EXTRUDE = _UxGT("オシダシ"); // "Extrude" - LSTR MSG_RETRACT = _UxGT("ヒキコミセッテイ"); // "Retract" - LSTR MSG_MOVE_AXIS = _UxGT("ジクイドウ"); // "Move axis" - LSTR MSG_BED_LEVELING = _UxGT("ベッドレベリング"); // "Bed leveling" - LSTR MSG_LEVEL_BED = _UxGT("ベッドレベリング"); // "Level bed" + LSTR MSG_COOLDOWN = _UxGT("カネツテイシ"); // "Cooldown" + LSTR MSG_SWITCH_PS_ON = _UxGT("デンゲン オン"); // "Switch power on" + LSTR MSG_SWITCH_PS_OFF = _UxGT("デンゲン オフ"); // "Switch power off" + LSTR MSG_EXTRUDE = _UxGT("オシダシ"); // "Extrude" + LSTR MSG_RETRACT = _UxGT("ヒキコミセッテイ"); // "Retract" + LSTR MSG_MOVE_AXIS = _UxGT("ジクイドウ"); // "Move axis" + LSTR MSG_BED_LEVELING = _UxGT("ベッドレベリング"); // "Bed leveling" + LSTR MSG_LEVEL_BED = _UxGT("ベッドレベリング"); // "Level bed" - LSTR MSG_MOVING = _UxGT("イドウチュウ"); // "Moving..." - LSTR MSG_FREE_XY = _UxGT("XYジク カイホウ"); // "Free XY" - LSTR MSG_MOVE_X = _UxGT("Xジク イドウ"); // "Move X" - LSTR MSG_MOVE_Y = _UxGT("Yジク イドウ"); // "Move Y" - LSTR MSG_MOVE_Z = _UxGT("Zジク イドウ"); // "Move Z" - LSTR MSG_MOVE_N = _UxGT("@ジク イドウ"); // "Move @" - LSTR MSG_MOVE_E = _UxGT("エクストルーダー"); // "Extruder" - LSTR MSG_MOVE_EN = _UxGT("* エクストルーダー"); // "En" - LSTR MSG_MOVE_N_MM = _UxGT("$mm イドウ"); // "Move 0.025mm" - LSTR MSG_MOVE_01MM = _UxGT("0.1mm イドウ"); // "Move 0.1mm" - LSTR MSG_MOVE_1MM = _UxGT(" 1mm イドウ"); // "Move 1mm" - LSTR MSG_MOVE_10MM = _UxGT(" 10mm イドウ"); // "Move 10mm" - LSTR MSG_MOVE_50MM = _UxGT(" 50mm イドウ"); // "Move 50mm" - LSTR MSG_MOVE_100MM = _UxGT(" 100mm イドウ"); // "Move 100mm" - LSTR MSG_SPEED = _UxGT("ソクド"); // "Speed" - LSTR MSG_MESH_Z_OFFSET = _UxGT("Zオフセット"); // "Bed Z" - LSTR MSG_NOZZLE = _UxGT("ノズル"); // "Nozzle" - LSTR MSG_BED = _UxGT("ベッド"); // "Bed" - LSTR MSG_FAN_SPEED = _UxGT("ファンソクド"); // "Fan speed" - LSTR MSG_FLOW = _UxGT("トシュツリョウ"); // "Flow" - LSTR MSG_CONTROL = _UxGT("セイギョ"); // "Control" + LSTR MSG_MOVING = _UxGT("イドウチュウ"); // "Moving..." + LSTR MSG_FREE_XY = _UxGT("XYジク カイホウ"); // "Free XY" + LSTR MSG_MOVE_X = _UxGT("Xジク イドウ"); // "Move X" + LSTR MSG_MOVE_Y = _UxGT("Yジク イドウ"); // "Move Y" + LSTR MSG_MOVE_Z = _UxGT("Zジク イドウ"); // "Move Z" + LSTR MSG_MOVE_N = _UxGT("@ジク イドウ"); // "Move @" + LSTR MSG_MOVE_E = _UxGT("エクストルーダー"); // "Extruder" + LSTR MSG_MOVE_EN = _UxGT("* エクストルーダー"); // "En" + LSTR MSG_MOVE_N_MM = _UxGT("$mm イドウ"); // "Move 0.025mm" + LSTR MSG_MOVE_01MM = _UxGT("0.1mm イドウ"); // "Move 0.1mm" + LSTR MSG_MOVE_1MM = _UxGT(" 1mm イドウ"); // "Move 1mm" + LSTR MSG_MOVE_10MM = _UxGT(" 10mm イドウ"); // "Move 10mm" + LSTR MSG_MOVE_50MM = _UxGT(" 50mm イドウ"); // "Move 50mm" + LSTR MSG_MOVE_100MM = _UxGT(" 100mm イドウ"); // "Move 100mm" + LSTR MSG_SPEED = _UxGT("ソクド"); // "Speed" + LSTR MSG_MESH_Z_OFFSET = _UxGT("Zオフセット"); // "Bed Z" + LSTR MSG_NOZZLE = _UxGT("ノズル"); // "Nozzle" + LSTR MSG_BED = _UxGT("ベッド"); // "Bed" + LSTR MSG_FAN_SPEED = _UxGT("ファンソクド"); // "Fan speed" + LSTR MSG_FLOW = _UxGT("トシュツリョウ"); // "Flow" + LSTR MSG_CONTROL = _UxGT("セイギョ"); // "Control" LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" サイテイ"); // " Min" LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" サイコウ"); // " Max" LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" ファクター"); // " Fact" - LSTR MSG_AUTOTEMP = _UxGT("ジドウオンドセイギョ"); // "Autotemp" - LSTR MSG_LCD_ON = _UxGT("オン"); // "On" - LSTR MSG_LCD_OFF = _UxGT("オフ"); // "Off" + LSTR MSG_AUTOTEMP = _UxGT("ジドウオンドセイギョ"); // "Autotemp" + LSTR MSG_LCD_ON = _UxGT("オン"); // "On" + LSTR MSG_LCD_OFF = _UxGT("オフ"); // "Off" LSTR MSG_SELECT_E = _UxGT("センタク *"); - LSTR MSG_ACC = _UxGT("カソクド mm/s") SUPERSCRIPT_TWO; // "Accel" - LSTR MSG_JERK = _UxGT("ヤクドウ mm/s"); // "Jerk" - LSTR MSG_VA_JERK = _UxGT("ジク ヤクドウ mm/s") STR_A; // "Va-jerk" - LSTR MSG_VB_JERK = _UxGT("ジク ヤクドウ mm/s") STR_B; // "Vb-jerk" - LSTR MSG_VC_JERK = _UxGT("ジク ヤクドウ mm/s") STR_C; // "Vc-jerk" - LSTR MSG_VN_JERK = _UxGT("ジク ヤクドウ mm/s@"); // "V@-jerk" + LSTR MSG_ACC = _UxGT("カソクド mm/s") SUPERSCRIPT_TWO; // "Accel" + LSTR MSG_JERK = _UxGT("ヤクドウ mm/s"); // "Jerk" + LSTR MSG_VA_JERK = _UxGT("ジク ヤクドウ mm/s") STR_A; // "Va-jerk" + LSTR MSG_VB_JERK = _UxGT("ジク ヤクドウ mm/s") STR_B; // "Vb-jerk" + LSTR MSG_VC_JERK = _UxGT("ジク ヤクドウ mm/s") STR_C; // "Vc-jerk" + LSTR MSG_VN_JERK = _UxGT("ジク ヤクドウ mm/s@"); // "V@-jerk" LSTR MSG_A_STEPS = STR_A _UxGT("ステップ/mm"); LSTR MSG_B_STEPS = STR_B _UxGT("ステップ/mm"); LSTR MSG_C_STEPS = STR_C _UxGT("ステップ/mm"); LSTR MSG_N_STEPS = _UxGT("@ステップ/mm"); - LSTR MSG_VE_JERK = _UxGT("エクストルーダー ヤクド"); // "Ve-jerk" - LSTR MSG_VMAX_A = _UxGT("サイダイオクリソクド ") STR_A; // "Vmax A" - LSTR MSG_VMAX_B = _UxGT("サイダイオクリソクド ") STR_B; // "Vmax B" - LSTR MSG_VMAX_C = _UxGT("サイダイオクリソクド ") STR_C; // "Vmax C" - LSTR MSG_VMAX_E = _UxGT("サイダイオクリソクド E"); // "Vmax E" - LSTR MSG_VMAX_EN = _UxGT("サイダイオクリソクド *"); // "Vmax E1" - LSTR MSG_VMIN = _UxGT("サイショウオクリソクド"); // "Vmin" - LSTR MSG_VTRAV_MIN = _UxGT("サイショウイドウソクド"); // "VTrav min" - LSTR MSG_ACCELERATION = _UxGT("カソクド mm/s") SUPERSCRIPT_TWO; // "Accel" - LSTR MSG_A_RETRACT = _UxGT("ヒキコミカソクド"); // "A-retract" - LSTR MSG_A_TRAVEL = _UxGT("イドウカソクド"); // "A-travel" - LSTR MSG_TEMPERATURE = _UxGT("オンド"); // "Temperature" - LSTR MSG_MOTION = _UxGT("ウゴキセッテイ"); // "Motion" - LSTR MSG_FILAMENT = _UxGT("フィラメント"); // "Filament" + LSTR MSG_VE_JERK = _UxGT("エクストルーダー ヤクド"); // "Ve-jerk" + LSTR MSG_VMAX_A = _UxGT("サイダイオクリソクド ") STR_A; // "Vmax A" + LSTR MSG_VMAX_B = _UxGT("サイダイオクリソクド ") STR_B; // "Vmax B" + LSTR MSG_VMAX_C = _UxGT("サイダイオクリソクド ") STR_C; // "Vmax C" + LSTR MSG_VMAX_E = _UxGT("サイダイオクリソクド E"); // "Vmax E" + LSTR MSG_VMAX_EN = _UxGT("サイダイオクリソクド *"); // "Vmax E1" + LSTR MSG_VMIN = _UxGT("サイショウオクリソクド"); // "Vmin" + LSTR MSG_VTRAV_MIN = _UxGT("サイショウイドウソクド"); // "VTrav min" + LSTR MSG_ACCELERATION = _UxGT("カソクド mm/s") SUPERSCRIPT_TWO; // "Accel" + LSTR MSG_A_RETRACT = _UxGT("ヒキコミカソクド"); // "A-retract" + LSTR MSG_A_TRAVEL = _UxGT("イドウカソクド"); // "A-travel" + LSTR MSG_TEMPERATURE = _UxGT("オンド"); // "Temperature" + LSTR MSG_MOTION = _UxGT("ウゴキセッテイ"); // "Motion" + LSTR MSG_FILAMENT = _UxGT("フィラメント"); // "Filament" LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; - LSTR MSG_FILAMENT_DIAM = _UxGT("フィラメントチョッケイ"); // "Fil. Dia." + LSTR MSG_FILAMENT_DIAM = _UxGT("フィラメントチョッケイ"); // "Fil. Dia." LSTR MSG_FILAMENT_DIAM_E = _UxGT("フィラメントチョッケイ *"); - LSTR MSG_CONTRAST = _UxGT("LCDコントラスト"); // "LCD contrast" - LSTR MSG_STORE_EEPROM = _UxGT("EEPROMヘホゾン"); // "Store memory" - LSTR MSG_LOAD_EEPROM = _UxGT("EEPROMカラヨミコミ"); // "Load memory" - LSTR MSG_RESTORE_DEFAULTS = _UxGT("セッテイリセット"); // "Restore Defaults" - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("リフレッシュ"); // "Refresh" - LSTR MSG_INFO_SCREEN = _UxGT("ジョウホウガメン"); // "Info screen" - LSTR MSG_PREPARE = _UxGT("ジュンビセッテイ"); // "Prepare" - LSTR MSG_TUNE = _UxGT("チョウセイ"); // "Tune" - LSTR MSG_PAUSE_PRINT = _UxGT("イチジテイシ"); // "Pause print" - LSTR MSG_RESUME_PRINT = _UxGT("プリントサイカイ"); // "Resume print" - LSTR MSG_STOP_PRINT = _UxGT("プリントテイシ"); // "Stop print" - LSTR MSG_MEDIA_MENU = _UxGT("メディアカラプリント"); // "Print from SD" - LSTR MSG_NO_MEDIA = _UxGT("メディアガアリマセン"); // "Card removed" - LSTR MSG_DWELL = _UxGT("キュウシ"); // "Sleep..." - LSTR MSG_USERWAIT = _UxGT("ツヅケルニハクリックシテクダサイ"); // "Wait for user..." - LSTR MSG_PRINT_ABORTED = _UxGT("プリントガチュウシサレマシタ"); // "Print aborted" - LSTR MSG_NO_MOVE = _UxGT("ウゴキマセン"); // "No move." - LSTR MSG_KILLED = _UxGT("ヒジョウテイシ"); // "KILLED. " - LSTR MSG_STOPPED = _UxGT("テイシシマシタ"); // "STOPPED. " - LSTR MSG_CONTROL_RETRACT = _UxGT("ヒキコミリョウ mm"); // "Retract mm" - LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("ヒキコミリョウS mm"); // "Swap Re.mm" - LSTR MSG_CONTROL_RETRACTF = _UxGT("ヒキコミソクド mm/s"); // "Retract V" - LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("ノズルタイヒ mm"); // "Hop mm" - LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("ホショウリョウ mm"); // "Unretr. mm" - LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("ホショウリョウS mm"); // "S Unretr. mm" - LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ホショウソクド mm/s"); // "Unretract V" - LSTR MSG_AUTORETRACT = _UxGT("ジドウヒキコミ"); // "Auto-Retract" - LSTR MSG_FILAMENTCHANGE = _UxGT("フィラメントコウカン"); // "Change filament" - LSTR MSG_ATTACH_MEDIA = _UxGT("メディアサイヨミコミ"); // "Init. SD card" - LSTR MSG_CHANGE_MEDIA = _UxGT("メディアコウカン"); // "Change SD card" - LSTR MSG_ZPROBE_OUT = _UxGT("Zプローブ ベッドガイ"); // "Z probe out. bed" - LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch ジコシンダン"); // "BLTouch Self-Test" - LSTR MSG_BLTOUCH_RESET = _UxGT("BLTouch リセット"); // "Reset BLTouch" + LSTR MSG_CONTRAST = _UxGT("LCDコントラスト"); // "LCD contrast" + LSTR MSG_STORE_EEPROM = _UxGT("EEPROMヘホゾン"); // "Store memory" + LSTR MSG_LOAD_EEPROM = _UxGT("EEPROMカラヨミコミ"); // "Load memory" + LSTR MSG_RESTORE_DEFAULTS = _UxGT("セッテイリセット"); // "Restore Defaults" + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("リフレッシュ"); // "Refresh" + LSTR MSG_INFO_SCREEN = _UxGT("ジョウホウガメン"); // "Info screen" + LSTR MSG_PREPARE = _UxGT("ジュンビセッテイ"); // "Prepare" + LSTR MSG_TUNE = _UxGT("チョウセイ"); // "Tune" + LSTR MSG_PAUSE_PRINT = _UxGT("イチジテイシ"); // "Pause print" + LSTR MSG_RESUME_PRINT = _UxGT("プリントサイカイ"); // "Resume print" + LSTR MSG_STOP_PRINT = _UxGT("プリントテイシ"); // "Stop print" + LSTR MSG_MEDIA_MENU = _UxGT("メディアカラプリント"); // "Print from SD" + LSTR MSG_NO_MEDIA = _UxGT("メディアガアリマセン"); // "Card removed" + LSTR MSG_DWELL = _UxGT("キュウシ"); // "Sleep..." + LSTR MSG_USERWAIT = _UxGT("ツヅケルニハクリックシテクダサイ"); // "Wait for user..." + LSTR MSG_PRINT_ABORTED = _UxGT("プリントガチュウシサレマシタ"); // "Print aborted" + LSTR MSG_NO_MOVE = _UxGT("ウゴキマセン"); // "No move." + LSTR MSG_KILLED = _UxGT("ヒジョウテイシ"); // "KILLED. " + LSTR MSG_STOPPED = _UxGT("テイシシマシタ"); // "STOPPED. " + LSTR MSG_CONTROL_RETRACT = _UxGT("ヒキコミリョウ mm"); // "Retract mm" + LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("ヒキコミリョウS mm"); // "Swap Re.mm" + LSTR MSG_CONTROL_RETRACTF = _UxGT("ヒキコミソクド mm/s"); // "Retract V" + LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("ノズルタイヒ mm"); // "Hop mm" + LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("ホショウリョウ mm"); // "Unretr. mm" + LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("ホショウリョウS mm"); // "S Unretr. mm" + LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("ホショウソクド mm/s"); // "Unretract V" + LSTR MSG_AUTORETRACT = _UxGT("ジドウヒキコミ"); // "Auto-Retract" + LSTR MSG_FILAMENTCHANGE = _UxGT("フィラメントコウカン"); // "Change filament" + LSTR MSG_ATTACH_MEDIA = _UxGT("メディアサイヨミコミ"); // "Init. SD card" + LSTR MSG_CHANGE_MEDIA = _UxGT("メディアコウカン"); // "Change SD card" + LSTR MSG_ZPROBE_OUT = _UxGT("Zプローブ ベッドガイ"); // "Z probe out. bed" + LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch ジコシンダン"); // "BLTouch Self-Test" + LSTR MSG_BLTOUCH_RESET = _UxGT("BLTouch リセット"); // "Reset BLTouch" LSTR MSG_HOME_FIRST = _UxGT("サキニ %s ヲフッキサセテクダサイ"); // "Home ... first" - LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Zオフセット"); // "Z Offset" - LSTR MSG_BABYSTEP_X = _UxGT("Xジク ビドウ"); // "Babystep X" - LSTR MSG_BABYSTEP_Y = _UxGT("Yジク ビドウ"); // "Babystep Y" - LSTR MSG_BABYSTEP_Z = _UxGT("Zジク ビドウ"); // "Babystep Z" - LSTR MSG_ENDSTOP_ABORT = _UxGT("イドウゲンカイケンチキノウ"); // "Endstop abort" - LSTR MSG_HEATING_FAILED_LCD = _UxGT("カネツシッパイ"); // "Heating failed" - LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("エラー:ジョウチョウサーミスターキノウ"); // "Err: REDUNDANT TEMP" - LSTR MSG_THERMAL_RUNAWAY = _UxGT("ネツボウソウ"); // "THERMAL RUNAWAY" - LSTR MSG_ERR_MAXTEMP = _UxGT("エラー:サイコウオンチョウカ"); // "Err: MAXTEMP" - LSTR MSG_ERR_MINTEMP = _UxGT("エラー:サイテイオンミマン"); // "Err: MINTEMP" - LSTR MSG_HALTED = _UxGT("プリンターハテイシシマシタ"); // "PRINTER HALTED" - LSTR MSG_PLEASE_RESET = _UxGT("リセットシテクダサイ"); // "Please reset" - LSTR MSG_HEATING = _UxGT("カネツチュウ"); // "Heating..." - LSTR MSG_BED_HEATING = _UxGT("ベッド カネツチュウ"); // "Bed Heating..." - LSTR MSG_DELTA_CALIBRATE = _UxGT("デルタ コウセイ"); // "Delta Calibration" - LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Xジク コウセイ"); // "Calibrate X" - LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Yジク コウセイ"); // "Calibrate Y" - LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Zジク コウセイ"); // "Calibrate Z" - LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("チュウシン コウセイ"); // "Calibrate Center" - LSTR MSG_INFO_MENU = _UxGT("コノプリンターニツイテ"); // "About Printer" - LSTR MSG_INFO_PRINTER_MENU = _UxGT("プリンタージョウホウ"); // "Printer Info" - LSTR MSG_INFO_STATS_MENU = _UxGT("プリントジョウキョウ"); // "Printer Stats" - LSTR MSG_INFO_BOARD_MENU = _UxGT("セイギョケイジョウホウ"); // "Board Info" - LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("サーミスター"); // "Thermistors" - LSTR MSG_INFO_EXTRUDERS = _UxGT("エクストルーダースウ"); // "Extruders" - LSTR MSG_INFO_BAUDRATE = _UxGT("ボーレート"); // "Baud" - LSTR MSG_INFO_PROTOCOL = _UxGT("プロトコル"); // "Protocol" - LSTR MSG_CASE_LIGHT = _UxGT("キョウタイナイショウメイ"); // "Case light" - LSTR MSG_INFO_PRINT_COUNT = _UxGT("プリントスウ "); // "Print Count" - LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("カンリョウスウ"); // "Completed" - LSTR MSG_INFO_PRINT_TIME = _UxGT("プリントジカンルイケイ"); // "Total print time" - LSTR MSG_INFO_PRINT_LONGEST = _UxGT("サイチョウプリントジカン"); // "Longest job time" - LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("フィラメントシヨウリョウルイケイ"); // "Extruded total" - LSTR MSG_INFO_MIN_TEMP = _UxGT("セッテイサイテイオン"); // "Min Temp" - LSTR MSG_INFO_MAX_TEMP = _UxGT("セッテイサイコウオン"); // "Max Temp" - LSTR MSG_INFO_PSU = _UxGT("デンゲンシュベツ"); // "Power Supply" - LSTR MSG_DRIVE_STRENGTH = _UxGT("モータークドウリョク"); // "Drive Strength" - LSTR MSG_DAC_PERCENT_N = _UxGT("@ DACシュツリョク %"); // "@ Driver %" - LSTR MSG_DAC_EEPROM_WRITE = _UxGT("EEPROMヘホゾン"); // "Store memory" + LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Zオフセット"); // "Z Offset" + LSTR MSG_BABYSTEP_X = _UxGT("Xジク ビドウ"); // "Babystep X" + LSTR MSG_BABYSTEP_Y = _UxGT("Yジク ビドウ"); // "Babystep Y" + LSTR MSG_BABYSTEP_Z = _UxGT("Zジク ビドウ"); // "Babystep Z" + LSTR MSG_ENDSTOP_ABORT = _UxGT("イドウゲンカイケンチキノウ"); // "Endstop abort" + LSTR MSG_HEATING_FAILED_LCD = _UxGT("カネツシッパイ"); // "Heating failed" + LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("エラー:ジョウチョウサーミスターキノウ"); // "Err: REDUNDANT TEMP" + LSTR MSG_THERMAL_RUNAWAY = _UxGT("ネツボウソウ"); // "THERMAL RUNAWAY" + LSTR MSG_ERR_MAXTEMP = _UxGT("エラー:サイコウオンチョウカ"); // "Err: MAXTEMP" + LSTR MSG_ERR_MINTEMP = _UxGT("エラー:サイテイオンミマン"); // "Err: MINTEMP" + LSTR MSG_HALTED = _UxGT("プリンターハテイシシマシタ"); // "PRINTER HALTED" + LSTR MSG_PLEASE_RESET = _UxGT("リセットシテクダサイ"); // "Please reset" + LSTR MSG_HEATING = _UxGT("カネツチュウ"); // "Heating..." + LSTR MSG_BED_HEATING = _UxGT("ベッド カネツチュウ"); // "Bed Heating..." + LSTR MSG_DELTA_CALIBRATE = _UxGT("デルタ コウセイ"); // "Delta Calibration" + LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Xジク コウセイ"); // "Calibrate X" + LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Yジク コウセイ"); // "Calibrate Y" + LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Zジク コウセイ"); // "Calibrate Z" + LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("チュウシン コウセイ"); // "Calibrate Center" + LSTR MSG_INFO_MENU = _UxGT("コノプリンターニツイテ"); // "About Printer" + LSTR MSG_INFO_PRINTER_MENU = _UxGT("プリンタージョウホウ"); // "Printer Info" + LSTR MSG_INFO_STATS_MENU = _UxGT("プリントジョウキョウ"); // "Printer Stats" + LSTR MSG_INFO_BOARD_MENU = _UxGT("セイギョケイジョウホウ"); // "Board Info" + LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("サーミスター"); // "Thermistors" + LSTR MSG_INFO_EXTRUDERS = _UxGT("エクストルーダースウ"); // "Extruders" + LSTR MSG_INFO_BAUDRATE = _UxGT("ボーレート"); // "Baud" + LSTR MSG_INFO_PROTOCOL = _UxGT("プロトコル"); // "Protocol" + LSTR MSG_CASE_LIGHT = _UxGT("キョウタイナイショウメイ"); // "Case light" + LSTR MSG_INFO_PRINT_COUNT = _UxGT("プリントスウ "); // "Print Count" + LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("カンリョウスウ"); // "Completed" + LSTR MSG_INFO_PRINT_TIME = _UxGT("プリントジカンルイケイ"); // "Total print time" + LSTR MSG_INFO_PRINT_LONGEST = _UxGT("サイチョウプリントジカン"); // "Longest job time" + LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("フィラメントシヨウリョウルイケイ"); // "Extruded total" + LSTR MSG_INFO_MIN_TEMP = _UxGT("セッテイサイテイオン"); // "Min Temp" + LSTR MSG_INFO_MAX_TEMP = _UxGT("セッテイサイコウオン"); // "Max Temp" + LSTR MSG_INFO_PSU = _UxGT("デンゲンシュベツ"); // "Power Supply" + LSTR MSG_DRIVE_STRENGTH = _UxGT("モータークドウリョク"); // "Drive Strength" + LSTR MSG_DAC_PERCENT_N = _UxGT("@ DACシュツリョク %"); // "@ Driver %" + LSTR MSG_DAC_EEPROM_WRITE = _UxGT("EEPROMヘホゾン"); // "Store memory" LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("イチジテイシ"); - LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("プリントサイカイ"); // "Resume print" - LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("コウカンヲカイシシマス", "シバラクオマチクダサイ")); // "Wait for start of the filament" - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("フィラメントヌキダシチュウ", "シバラクオマチクダサイ")); // "Wait for filament unload" - LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("フィラメントヲソウニュウシ,", "クリックスルトゾッコウシマス")); // "Insert filament and press button" - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("フィラメントソウテンチュウ", "シバラクオマチクダサイ")); // "Wait for filament load" - LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("プリントヲサイカイシマス", "シバラクオマチクダサイ")); // "Wait for print to resume" + LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("プリントサイカイ"); // "Resume print" + LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("コウカンヲカイシシマス", "シバラクオマチクダサイ")); // "Wait for start of the filament" + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("フィラメントヌキダシチュウ", "シバラクオマチクダサイ")); // "Wait for filament unload" + LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_2_LINE("フィラメントヲソウニュウシ,", "クリックスルトゾッコウシマス")); // "Insert filament and press button" + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("フィラメントソウテンチュウ", "シバラクオマチクダサイ")); // "Wait for filament load" + LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("プリントヲサイカイシマス", "シバラクオマチクダサイ")); // "Wait for print to resume" - LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("マチガッタプリンター"); // "Wrong printer" + LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("マチガッタプリンター"); // "Wrong printer" LSTR MSG_CONFIGURATION = _UxGT("セッテイカンリ"); LSTR MSG_ADVANCED_SETTINGS = _UxGT("ショウサイセッテイ"); diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h index e52ced2dad..27be037344 100644 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ b/Marlin/src/lcd/language/language_ko_KR.h @@ -88,7 +88,7 @@ namespace Language_ko_KR { LSTR MSG_LOAD_EEPROM = _UxGT("설정 읽어오기"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("설정 되돌리기"); LSTR MSG_INIT_EEPROM = _UxGT("EEPROM 초기화"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("새로고침"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("새로고침"); LSTR MSG_INFO_SCREEN = _UxGT("처음으로"); LSTR MSG_PREPARE = _UxGT("준비하기"); LSTR MSG_PAUSE_PRINT = _UxGT("일시정지"); diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index d708135fac..bc60d19946 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -113,7 +113,7 @@ namespace Language_nl { LSTR MSG_TEMPERATURE = _UxGT("Temperatuur"); LSTR MSG_MOTION = _UxGT("Beweging"); LSTR MSG_FILAMENT = _UxGT("Filament"); - LSTR MSG_ADVANCE_K = _UxGT("Advance K"); // accepted english dutch + LSTR MSG_ADVANCE_K = _UxGT("Advance K"); // accepted english dutch LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *"); // accepted english dutch LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E in mm") SUPERSCRIPT_THREE; LSTR MSG_FILAMENT_DIAM = _UxGT("Fil. Dia."); @@ -122,7 +122,7 @@ namespace Language_nl { LSTR MSG_STORE_EEPROM = _UxGT("Geheugen opslaan"); LSTR MSG_LOAD_EEPROM = _UxGT("Geheugen laden"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Noodstop reset"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ververs"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Ververs"); LSTR MSG_INFO_SCREEN = _UxGT("Info scherm"); LSTR MSG_PREPARE = _UxGT("Voorbereiden"); LSTR MSG_TUNE = _UxGT("Afstellen"); @@ -137,7 +137,7 @@ namespace Language_nl { LSTR MSG_NO_MOVE = _UxGT("Geen beweging."); LSTR MSG_KILLED = _UxGT("Afgebroken. "); LSTR MSG_STOPPED = _UxGT("Gestopt. "); - LSTR MSG_CONTROL_RETRACT = _UxGT("Retract mm"); // accepted English term in Dutch + LSTR MSG_CONTROL_RETRACT = _UxGT("Retract mm"); // accepted English term in Dutch LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Ruil Retract mm"); LSTR MSG_CONTROL_RETRACTF = _UxGT("Retract F"); LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); @@ -153,7 +153,7 @@ namespace Language_nl { LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch Zelf-Test"); LSTR MSG_BLTOUCH_RESET = _UxGT("Reset BLTouch"); LSTR MSG_HOME_FIRST = _UxGT("Home %s Eerst"); - LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z Offset"); // accepted English term in Dutch + LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Z Offset"); // accepted English term in Dutch LSTR MSG_BABYSTEP_X = _UxGT("Babystap X"); LSTR MSG_BABYSTEP_Y = _UxGT("Babystap Y"); LSTR MSG_BABYSTEP_Z = _UxGT("Babystap Z"); @@ -196,7 +196,7 @@ namespace Language_nl { LSTR MSG_INFO_MIN_TEMP = _UxGT("Min Temp"); LSTR MSG_INFO_MAX_TEMP = _UxGT("Max Temp"); - LSTR MSG_INFO_PSU = _UxGT("PSU"); // accepted English term in Dutch + LSTR MSG_INFO_PSU = _UxGT("PSU"); // accepted English term in Dutch LSTR MSG_DRIVE_STRENGTH = _UxGT("Motorstroom"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 855a1e3bd1..8aa12d903d 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -306,7 +306,7 @@ namespace Language_pl { LSTR MSG_INIT_EEPROM = _UxGT("Initializuj EEPROM"); LSTR MSG_MEDIA_UPDATE = _UxGT("Uaktualnij kartę"); LSTR MSG_RESET_PRINTER = _UxGT("Resetuj drukarkę"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Odswież"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Odswież"); LSTR MSG_INFO_SCREEN = _UxGT("Ekran główny"); LSTR MSG_PREPARE = _UxGT("Przygotuj"); LSTR MSG_TUNE = _UxGT("Strojenie"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 4ace61e116..81344b60c4 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -274,7 +274,7 @@ namespace Language_pt_br { LSTR MSG_INIT_EEPROM = _UxGT("Iniciar EEPROM"); LSTR MSG_MEDIA_UPDATE = _UxGT("Atualiz. SD"); LSTR MSG_RESET_PRINTER = _UxGT("Resetar Impressora"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Atualização"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Atualização"); LSTR MSG_INFO_SCREEN = _UxGT("Informações"); LSTR MSG_PREPARE = _UxGT("Preparar"); LSTR MSG_TUNE = _UxGT("Ajustar"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 327ba7ad81..b4f7550a7f 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -317,13 +317,13 @@ namespace Language_ro { LSTR MSG_LOAD_EEPROM = _UxGT("Load Settings"); LSTR MSG_RESTORE_DEFAULTS = _UxGT("Restore Defaults"); LSTR MSG_INIT_EEPROM = _UxGT("Initialize EEPROM"); - LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Error"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Error"); - LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Error"); + LSTR MSG_ERR_EEPROM_CRC = _UxGT("Err: EEPROM CRC"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Err: Mărimea EEPROM"); + LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Err: Versiunea EEPROM"); LSTR MSG_SETTINGS_STORED = _UxGT("Settings Stored"); LSTR MSG_MEDIA_UPDATE = _UxGT("Media Update"); LSTR MSG_RESET_PRINTER = _UxGT("Reset Imprimanta"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Refresh"); LSTR MSG_INFO_SCREEN = _UxGT("Info Screen"); LSTR MSG_PREPARE = _UxGT("Prepare"); LSTR MSG_TUNE = _UxGT("Tune"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index b5815be1bd..7e00467fa1 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -91,42 +91,49 @@ namespace Language_ru { LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("Смещения применены"); LSTR MSG_SELECT_ORIGIN = _UxGT("Выберите ноль"); #if LCD_WIDTH > 21 || HAS_DWIN_E3V2 - LSTR MSG_LAST_VALUE_SP = _UxGT("Последнее знач. "); + LSTR MSG_LAST_VALUE_SP = _UxGT("Последнее значение "); #else LSTR MSG_LAST_VALUE_SP = _UxGT("Послед. знач. "); #endif #if HAS_PREHEAT - LSTR MSG_PREHEAT_1 = _UxGT("Преднагрев ") PREHEAT_1_LABEL; - LSTR MSG_PREHEAT_1_H = _UxGT("Нагреть ~ ") PREHEAT_1_LABEL; - LSTR MSG_PREHEAT_1_END = _UxGT("Нагреть сопло ") PREHEAT_1_LABEL; - LSTR MSG_PREHEAT_1_END_E = _UxGT("Нагреть сопло ~") PREHEAT_1_LABEL; - LSTR MSG_PREHEAT_1_ALL = _UxGT("Нагреть всё ") PREHEAT_1_LABEL; - LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Нагреть стол ") PREHEAT_1_LABEL; - LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Правка предн. ") PREHEAT_1_LABEL; - - LSTR MSG_PREHEAT_M = _UxGT("Преднагрев $"); + LSTR MSG_PREHEAT_1 = _UxGT("Нагрев ") PREHEAT_1_LABEL; + LSTR MSG_PREHEAT_1_H = _UxGT("Нагреть ~ ") PREHEAT_1_LABEL " ~"; + LSTR MSG_PREHEAT_1_END = _UxGT("Нагреть сопло ") PREHEAT_1_LABEL _UxGT(" сопло"); + LSTR MSG_PREHEAT_1_END_E = _UxGT("Нагреть сопло ~") PREHEAT_1_LABEL _UxGT(" сопло ~");; + LSTR MSG_PREHEAT_1_ALL = _UxGT("Нагреть всё ") PREHEAT_1_LABEL _UxGT(" всё"); + LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Нагреть стол ") PREHEAT_1_LABEL _UxGT(" стол"); + LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Правка предн. ") PREHEAT_1_LABEL _UxGT(" наст."); + #ifdef PREHEAT_2_LABEL + LSTR MSG_PREHEAT_2 = _UxGT("Нагрев ") PREHEAT_2_LABEL; + LSTR MSG_PREHEAT_2_SETTINGS = _UxGT("Нагрев ") PREHEAT_2_LABEL _UxGT(" настр."); + #endif + #ifdef PREHEAT_3_LABEL + LSTR MSG_PREHEAT_3 = _UxGT("Нагрев ") PREHEAT_3_LABEL; + LSTR MSG_PREHEAT_3_SETTINGS = _UxGT("Нагрев ") PREHEAT_3_LABEL _UxGT(" настр."); + #endif + LSTR MSG_PREHEAT_M = _UxGT("Нагрев $"); LSTR MSG_PREHEAT_M_H = _UxGT("Нагреть ~ $"); LSTR MSG_PREHEAT_M_END = _UxGT("Нагреть сопло $"); LSTR MSG_PREHEAT_M_END_E = _UxGT("Нагреть сопло ~ $"); LSTR MSG_PREHEAT_M_ALL = _UxGT("Нагреть всё $"); LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Нагреть стол $"); - LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Правка преднаг. $"); + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Настр.нагрева $"); #endif LSTR MSG_PREHEAT_CUSTOM = _UxGT("Нагрев Свой"); LSTR MSG_COOLDOWN = _UxGT("Охлаждение"); LSTR MSG_CUTTER_FREQUENCY = _UxGT("Частота"); LSTR MSG_LASER_MENU = _UxGT("Управление лазером"); #if LCD_WIDTH > 21 || HAS_DWIN_E3V2 - LSTR MSG_SPINDLE_MENU = _UxGT("Управление шпинделем"); + LSTR MSG_SPINDLE_MENU = _UxGT("Управлен.шпинделем"); LSTR MSG_LASER_TOGGLE = _UxGT("Переключить лазер"); - LSTR MSG_SPINDLE_TOGGLE = _UxGT("Переключ.шпиндель"); + LSTR MSG_SPINDLE_TOGGLE = _UxGT("Переключ. шпиндель"); LSTR MSG_SPINDLE_POWER = _UxGT("Мощность шпинделя"); LSTR MSG_LASER_POWER = _UxGT("Мощность лазера"); LSTR MSG_LASER_PULSE_MS = _UxGT("Тестовый импульс мс"); LSTR MSG_LASER_EVAC_TOGGLE = _UxGT("Переключить обдув"); LSTR MSG_SPINDLE_EVAC_TOGGLE = _UxGT("Переключить вакуум"); #else - LSTR MSG_SPINDLE_MENU = _UxGT("Управление шпинд."); + LSTR MSG_SPINDLE_MENU = _UxGT("Управл. шпинд."); LSTR MSG_LASER_TOGGLE = _UxGT("Переключ.лазер"); LSTR MSG_SPINDLE_TOGGLE = _UxGT("Переключ.шпинд"); LSTR MSG_SPINDLE_POWER = _UxGT("Мощн.шпинделя"); @@ -339,6 +346,11 @@ namespace Language_ru { LSTR MSG_MOVE_1MM = _UxGT("Движение 1мм"); LSTR MSG_MOVE_10MM = _UxGT("Движение 10мм"); LSTR MSG_MOVE_100MM = _UxGT("Движение 100mm"); + LSTR MSG_MOVE_0001IN = _UxGT("Движение 0.001in"); + LSTR MSG_MOVE_001IN = _UxGT("Движение 0.01in"); + LSTR MSG_MOVE_01IN = _UxGT("Движение 0.1in"); + LSTR MSG_MOVE_05IN = _UxGT("Движение 0.5in"); + LSTR MSG_MOVE_1IN = _UxGT("Движение 1.0in"); LSTR MSG_SPEED = _UxGT("Скорость"); LSTR MSG_MESH_Z_OFFSET = _UxGT("Z стола"); LSTR MSG_NOZZLE = _UxGT("Сопло, ") LCD_STR_DEGREE _UxGT("C"); @@ -452,12 +464,13 @@ namespace Language_ru { LSTR MSG_INIT_EEPROM = _UxGT("Инициализ. EEPROM"); #endif LSTR MSG_ERR_EEPROM_CRC = _UxGT("Сбой EEPROM: CRC"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Сбой EEPROM: индекс"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Сбой EEPROM: размер"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Сбой EEPROM: версия"); + LSTR MSG_ERR_EEPROM_CORRUPT = _UxGT("Сбой EEPROM: данные"); LSTR MSG_SETTINGS_STORED = _UxGT("Параметры сохранены"); LSTR MSG_MEDIA_UPDATE = _UxGT("Обновление прошивки"); LSTR MSG_RESET_PRINTER = _UxGT("Сброс принтера"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Обновить"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT(" Обновить"); LSTR MSG_INFO_SCREEN = _UxGT("Главный экран"); LSTR MSG_PREPARE = _UxGT("Подготовить"); LSTR MSG_TUNE = _UxGT("Настроить"); @@ -777,93 +790,261 @@ namespace Language_ru { LSTR MSG_BAD_PAGE_SPEED = _UxGT("Плохая скор.стран."); #endif - LSTR MSG_EDIT_PASSWORD = _UxGT("Редактировать пароль"); - LSTR MSG_LOGIN_REQUIRED = _UxGT("Нужен логин"); - LSTR MSG_PASSWORD_SETTINGS = _UxGT("Настройки пароля"); - LSTR MSG_ENTER_DIGIT = _UxGT("Введите цифру"); - LSTR MSG_CHANGE_PASSWORD = _UxGT("Смените пароль"); - LSTR MSG_REMOVE_PASSWORD = _UxGT("Удалить пароль"); - LSTR MSG_PASSWORD_SET = _UxGT("Пароль это "); - LSTR MSG_START_OVER = _UxGT("Старт через"); + LSTR MSG_EDIT_PASSWORD = _UxGT("Редактировать пароль"); + LSTR MSG_LOGIN_REQUIRED = _UxGT("Нужен логин"); + LSTR MSG_PASSWORD_SETTINGS = _UxGT("Настройки пароля"); + LSTR MSG_ENTER_DIGIT = _UxGT("Введите цифру"); + LSTR MSG_CHANGE_PASSWORD = _UxGT("Смените пароль"); + LSTR MSG_REMOVE_PASSWORD = _UxGT("Удалить пароль"); + LSTR MSG_PASSWORD_SET = _UxGT("Пароль это "); + LSTR MSG_START_OVER = _UxGT("Старт через"); #if LCD_WIDTH > 21 || HAS_DWIN_E3V2 - LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Не забудь сохранить!"); + LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Не забудь сохранить!"); #else - LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Не забудь сохранить"); + LSTR MSG_REMINDER_SAVE_SETTINGS = _UxGT("Не забудь сохранить"); #endif - LSTR MSG_PASSWORD_REMOVED = _UxGT("Пароль удалён"); + LSTR MSG_PASSWORD_REMOVED = _UxGT("Пароль удалён"); // // Filament Change screens show up to 3 lines on a 4-line display // ...or up to 2 lines on a 3-line display // - LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Парковка...")); + LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Парковка...")); #if LCD_HEIGHT >= 4 - LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Нажмите кнопку", "для продолжения", "печати")); - LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Ожидайте начала", "смены филамента")); - LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Вставьте филамент", "и нажмите кнопку", "для продолжения")); - LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_3_LINE("Нажмите кнопку", "для нагрева", "сопла...")); - LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Нагрев сопла", "Ждите...")); - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Ожидайте", "выгрузки", "филамента")); - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Ожидайте", "загрузки", "филамента")); - LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Ожидайте", "экструзии", "филамента")); - LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Нажмите кнопку", "для завершения", "прочистки филамента")); - LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Ожидайте", "возобновления", "печати")); + LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_3_LINE("Нажмите кнопку", "для продолжения", "печати")); + LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_2_LINE("Ожидайте начала", "смены филамента")); + LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Вставьте филамент", "и нажмите кнопку", "для продолжения")); + LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_3_LINE("Нажмите кнопку", "для нагрева", "сопла...")); + LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Нагрев сопла", "Ждите...")); + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_3_LINE("Ожидайте", "выгрузки", "филамента")); + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_3_LINE("Ожидайте", "загрузки", "филамента")); + LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_3_LINE("Ожидайте", "экструзии", "филамента")); + LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_3_LINE("Нажмите кнопку", "для завершения", "прочистки филамента")); + LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_3_LINE("Ожидайте", "возобновления", "печати")); #else - LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Продолжить печать")); - LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Ожидайте...")); - LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Вставь и нажми")); - LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Нагреть сопло")); - LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Нагрев...")); - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Выгрузка...")); - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Загрузка...")); - LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Прочистка...")); - LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Завершить прочистку")); - LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Возобновление...")); + LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Продолжить печать")); + LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Ожидайте...")); + LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Вставь и нажми")); + LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Нагреть сопло")); + LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Нагрев...")); + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Выгрузка...")); + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Загрузка...")); + LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Прочистка...")); + LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Завершить прочистку")); + LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Возобновление...")); #endif - LSTR MSG_TMC_DRIVERS = _UxGT("Драйвера TMC"); - LSTR MSG_TMC_CURRENT = _UxGT("Ток двигателей"); - LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим"); - LSTR MSG_TMC_HOMING_THRS = _UxGT("Чувствительность"); - LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим драйвера"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); + LSTR MSG_TMC_DRIVERS = _UxGT("Драйвера TMC"); + LSTR MSG_TMC_CURRENT = _UxGT("Ток двигателей"); + LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим"); + LSTR MSG_TMC_HOMING_THRS = _UxGT("Чувствительность"); + LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим драйвера"); + LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); - LSTR MSG_SERVICE_RESET = _UxGT("Сброс"); - LSTR MSG_SERVICE_IN = _UxGT(" в:"); - LSTR MSG_BACKLASH = _UxGT("Люфт"); - LSTR MSG_BACKLASH_CORRECTION = _UxGT("Исправление"); - LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Сглаживание"); + LSTR MSG_SERVICE_RESET = _UxGT("Сброс"); + LSTR MSG_SERVICE_IN = _UxGT(" в:"); + LSTR MSG_BACKLASH = _UxGT("Люфт"); + LSTR MSG_BACKLASH_CORRECTION = _UxGT("Исправление"); + LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Сглаживание"); - LSTR MSG_LEVEL_X_AXIS = _UxGT("Выровнять ось X"); - LSTR MSG_AUTO_CALIBRATE = _UxGT("Автокалибровка"); - LSTR MSG_HEATER_TIMEOUT = _UxGT("Таймаут нагрева"); - LSTR MSG_REHEAT = _UxGT("Возобновить нагрев"); - LSTR MSG_REHEATING = _UxGT("Нагрев..."); + LSTR MSG_LEVEL_X_AXIS = _UxGT("Выровнять ось X"); + LSTR MSG_AUTO_CALIBRATE = _UxGT("Автокалибровка"); + LSTR MSG_HEATER_TIMEOUT = _UxGT("Таймаут нагрева"); + LSTR MSG_REHEAT = _UxGT("Возобновить нагрев"); + LSTR MSG_REHEATING = _UxGT("Нагрев..."); - LSTR MSG_PROBE_WIZARD = _UxGT("Мастер Z-зонда"); - #if LCD_WIDTH > 21 || HAS_DWIN_E3V2 - LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Зондиров. контр. точки Z"); - LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Движение к точке зондиров."); + LSTR MSG_PROBE_WIZARD = _UxGT("Мастер Z-зонда"); + #if LCD_WIDTH > 20 || HAS_DWIN_E3V2 + LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Зондиров. контр. точки Z"); + LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Движение к точке зондиров."); #else - LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Зондир.контр.точки Z"); - LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Движ. к точке зондир."); + LSTR MSG_PROBE_WIZARD_PROBING = _UxGT("Зондир.контр.точки Z"); + LSTR MSG_PROBE_WIZARD_MOVING = _UxGT("Движ.к точке зондир."); #endif - LSTR MSG_SOUND = _UxGT("Звук"); + LSTR MSG_SOUND = _UxGT("Звук"); - LSTR MSG_TOP_LEFT = _UxGT("Верхний левый"); - LSTR MSG_BOTTOM_LEFT = _UxGT("Нижний левый"); - LSTR MSG_TOP_RIGHT = _UxGT("Верхний правый"); - LSTR MSG_BOTTOM_RIGHT = _UxGT("Нижний правый"); - LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Калибровка успешна"); - LSTR MSG_CALIBRATION_FAILED = _UxGT("Ошибка калибровки"); + LSTR MSG_TOP_LEFT = _UxGT("Верхний левый"); + LSTR MSG_BOTTOM_LEFT = _UxGT("Нижний левый"); + LSTR MSG_TOP_RIGHT = _UxGT("Верхний правый"); + LSTR MSG_BOTTOM_RIGHT = _UxGT("Нижний правый"); + LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Калибровка успешна"); + LSTR MSG_CALIBRATION_FAILED = _UxGT("Ошибка калибровки"); - LSTR MSG_DRIVER_BACKWARD = _UxGT(" драйвер наоборот"); + LSTR MSG_DRIVER_BACKWARD = _UxGT(" драйвер наоборот"); - LSTR MSG_SD_CARD = _UxGT("SD Карта"); - LSTR MSG_USB_DISK = _UxGT("USB Диск"); + LSTR MSG_SD_CARD = _UxGT("SD Карта"); + LSTR MSG_USB_DISK = _UxGT("USB Диск"); - LSTR MSG_SHORT_DAY = _UxGT("д"); // One character only - LSTR MSG_SHORT_HOUR = _UxGT("ч"); // One character only - LSTR MSG_SHORT_MINUTE = _UxGT("м"); // One character only + LSTR MSG_SHORT_DAY = _UxGT("д"); // One character only + LSTR MSG_SHORT_HOUR = _UxGT("ч"); // One character only + LSTR MSG_SHORT_MINUTE = _UxGT("м"); // One character only + + LSTR MSG_HIGH = _UxGT("ВЫСОКИЙ"); + LSTR MSG_LOW = _UxGT("НИЗКИЙ"); + LSTR MSG_ERROR = _UxGT("Ошибка"); + LSTR MSG_ENDSTOP_TEST = _UxGT("Тест концевиков"); + LSTR MSG_Z_PROBE = _UxGT("Z-зонд"); + LSTR MSG_HOMING = _UxGT("Парковка"); + LSTR MSG_Z_AFTER_HOME = _UxGT("Z после парковки"); + LSTR MSG_FILAMENT_SET = _UxGT("Настройки филамента"); + #if LCD_WIDTH > 20 || HAS_DWIN_E3V2 + LSTR MSG_FILAMENT_MAN = _UxGT("Управление филаментом"); + #else + LSTR MSG_FILAMENT_MAN = _UxGT("Управл.филаментом"); + #endif + LSTR MSG_MANUAL_LEVELING = _UxGT("Ручное выравнивание"); + LSTR MSG_TRAM_FL = _UxGT("Передний левый"); + LSTR MSG_TRAM_FR = _UxGT("Передний правый"); + LSTR MSG_TRAM_C = _UxGT("Центр"); + LSTR MSG_TRAM_BL = _UxGT("Задний левый"); + LSTR MSG_TRAM_BR = _UxGT("Задний правый"); + LSTR MSG_MANUAL_MESH = _UxGT("Сетка вручную"); + LSTR MSG_AUTO_MESH = _UxGT("Сетка автоматически"); + LSTR MSG_ERR_M428_TOO_FAR = _UxGT("Ошибка: слишком далеко!"); + LSTR MSG_TRAMMING_WIZARD = _UxGT("Помощник выравнив."); + LSTR MSG_PREHEAT_HOTEND = _UxGT("Нагреть сопло"); + LSTR MSG_BED_TRAMMING_MANUAL = _UxGT("Ручное выравнив."); + LSTR MSG_MESH_VIEWER = _UxGT("Просмотр сетки"); + LSTR MSG_MESH_VIEW = _UxGT("Смотреть сетку"); + LSTR MSG_NO_VALID_MESH = _UxGT("Нет годной сетки"); + LSTR MSG_ACTIVATE_MESH = _UxGT("Включить сетку"); + LSTR MSG_MESH_INSET = _UxGT("Отступы сетки"); + LSTR MSG_MESH_MIN_X = _UxGT("Сетка X минимум"); + LSTR MSG_MESH_MAX_X = _UxGT("Сетка X максимум"); + LSTR MSG_MESH_MIN_Y = _UxGT("Сетка Y минимум"); + LSTR MSG_MESH_MAX_Y = _UxGT("Сетка Y максимум"); + LSTR MSG_MESH_AMAX = _UxGT("Максимальная зона"); + LSTR MSG_MESH_CENTER = _UxGT("Центрировать зону"); + LSTR MSG_MESH_CANCEL = _UxGT("Сетка отменена"); + LSTR MSG_UBL_TILT_MESH = _UxGT("Наколнить сетку"); + LSTR MSG_UBL_TILTING_GRID = _UxGT("Величина наклона"); + LSTR MSG_UBL_MESH_TILTED = _UxGT("Сетка наклонена"); + LSTR MSG_UBL_MESH_FILLED = _UxGT("Попущенные точки заполнены"); + LSTR MSG_UBL_MESH_INVALID = _UxGT("Негодная сетка"); + LSTR MSG_UBL_INVALID_SLOT = _UxGT("Сперва выберите слот сетки"); + LSTR MSG_MESH_ACTIVE = _UxGT("Сетка %i активна"); + LSTR MSG_MOVE_50MM = _UxGT("Двигать 50mm"); + LSTR MSG_LIVE_MOVE = _UxGT("Живое перемещение"); + LSTR MSG_CUTTER = _UxGT("Резак"); + LSTR MSG_PID_CYCLE = _UxGT("Циклы PID"); + LSTR MSG_PID_AUTOTUNE_FAILED = _UxGT("Автонастройка PID не удалась!"); + LSTR MSG_BAD_HEATER_ID = _UxGT("Неверный экструдер."); + LSTR MSG_TEMP_TOO_HIGH = _UxGT("Слишком высокая температура."); + LSTR MSG_TIMEOUT = _UxGT("Таймаут."); + LSTR MSG_MPC_MEASURING_AMBIENT = _UxGT("Тест потери тепла"); + LSTR MSG_MPC_HEATING_PAST_200 = _UxGT("Нагрев выше >200C"); + LSTR MSG_MPC_COOLING_TO_AMBIENT = _UxGT("Охлаждение до окружающей"); + LSTR MSG_MPC_AUTOTUNE = _UxGT("Автонастройка MPC"); + LSTR MSG_MPC_EDIT = _UxGT("Изменить * MPC"); + LSTR MSG_MPC_POWER = _UxGT("Мощность нагревателя"); + LSTR MSG_MPC_POWER_E = _UxGT("Мощность *"); + LSTR MSG_MPC_BLOCK_HEAT_CAPACITY = _UxGT("Теплоёмкость"); + LSTR MSG_MPC_BLOCK_HEAT_CAPACITY_E = _UxGT("Теплоёмк. *"); + LSTR MSG_SENSOR_RESPONSIVENESS = _UxGT("Отклик датчика"); + LSTR MSG_SENSOR_RESPONSIVENESS_E = _UxGT("Отклик датч. *"); + LSTR MSG_MPC_AMBIENT_XFER_COEFF = _UxGT("Коэфф.окружения"); + LSTR MSG_MPC_AMBIENT_XFER_COEFF_E = _UxGT("Коэфф.окруж *"); + LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN = _UxGT("Коэфф.кулера"); + LSTR MSG_MPC_AMBIENT_XFER_COEFF_FAN_E = _UxGT("Коэфф.кулер *"); + LSTR MSG_INPUT_SHAPING = _UxGT("Input Shaping"); + LSTR MSG_SHAPING_ENABLE = _UxGT("Включить шейпинг @"); + LSTR MSG_SHAPING_DISABLE = _UxGT("Выключить шейпинг @"); + LSTR MSG_SHAPING_FREQ = _UxGT("@ частота"); + LSTR MSG_SHAPING_ZETA = _UxGT("@ подавление"); + LSTR MSG_FILAMENT_EN = _UxGT("Филамент *"); + LSTR MSG_SEGMENTS_PER_SECOND = _UxGT("Сегментов/сек"); + LSTR MSG_DRAW_MIN_X = _UxGT("Рисовать мин X"); + LSTR MSG_DRAW_MAX_X = _UxGT("Рисовать макс X"); + LSTR MSG_DRAW_MIN_Y = _UxGT("Рисовать мин Y"); + LSTR MSG_DRAW_MAX_Y = _UxGT("Рисовать макс Y"); + LSTR MSG_MAX_BELT_LEN = _UxGT("Макс.длина ремня"); + LSTR MSG_LINEAR_ADVANCE = _UxGT("Linear Advance"); + LSTR MSG_BRIGHTNESS = _UxGT("Яркость LCD"); + LSTR MSG_SCREEN_TIMEOUT = _UxGT("Таймаут LCD (м)"); + LSTR MSG_BRIGHTNESS_OFF = _UxGT("Выкл.подсветку"); + LSTR MSG_INFO_MACHINENAME = _UxGT("Название машины"); + LSTR MSG_INFO_SIZE = _UxGT("Размер"); + LSTR MSG_INFO_FWVERSION = _UxGT("Версия прошивки"); + LSTR MSG_INFO_BUILD = _UxGT("Дата сборки"); + LSTR MSG_BUTTON_CONFIRM = _UxGT("Подтвердить"); + LSTR MSG_BUTTON_CONTINUE = _UxGT("Продолжить"); + LSTR MSG_BUTTON_INFO = _UxGT("Инфо"); + LSTR MSG_BUTTON_LEVEL = _UxGT("Выровнять"); + LSTR MSG_BUTTON_PAUSE = _UxGT("Пауза"); + LSTR MSG_BUTTON_RESUME = _UxGT("Продолжить"); + LSTR MSG_BUTTON_ADVANCED = _UxGT("Расширанные"); + LSTR MSG_BUTTON_SAVE = _UxGT("Сохранить"); + LSTR MSG_BUTTON_PURGE = _UxGT("Прочистить"); + LSTR MSG_PAUSING = _UxGT("Пауза..."); + LSTR MSG_ADVANCED_PAUSE = _UxGT("Расширенная пауза"); + LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Продолжить печать"); + LSTR MSG_TURN_OFF = _UxGT("Выключить принтер"); + LSTR MSG_END_LOOPS = _UxGT("Завершить петлю"); + LSTR MSG_STOPPING = _UxGT("Остановка..."); + LSTR MSG_REMAINING_TIME = _UxGT("Осталось"); + LSTR MSG_PRINTER_KILLED = _UxGT("Принтер убит!"); + LSTR MSG_FWRETRACT = _UxGT("Откат принтера"); + LSTR MSG_SINGLENOZZLE_WIPE_RETRACT = _UxGT("Вытирание при откате"); + LSTR MSG_PARK_FAILED = _UxGT("Не удалось запарковать"); + LSTR MSG_FILAMENTUNLOAD = _UxGT("Выгрузить филамент"); + LSTR MSG_ATTACH_USB_MEDIA = _UxGT("Монтировать USB"); + LSTR MSG_BLTOUCH_SPEED_MODE = _UxGT("Высокая скорость"); + LSTR MSG_MANUAL_PENUP = _UxGT("Поднять перо"); + LSTR MSG_MANUAL_PENDOWN = _UxGT("Опустить перо"); + LSTR MSG_ZPROBE_SETTINGS = _UxGT("Наторойки зонда"); + LSTR MSG_ZPROBE_MARGIN = _UxGT("Отступы зонда"); + LSTR MSG_Z_FEED_RATE = _UxGT("Скорость Z"); + LSTR MSG_ENABLE_HS_MODE = _UxGT("Включить режим ВС"); + LSTR MSG_TEMP_MALFUNCTION = _UxGT("СБОЙ ТЕМПЕРАТУРЫ"); + LSTR MSG_PLEASE_WAIT = _UxGT("Ожидайте..."); + LSTR MSG_PREHEATING = _UxGT("Нагреваю..."); + LSTR MSG_DELTA_CALIBRATION_IN_PROGRESS = _UxGT("Делаю дельта-калибровку"); + LSTR MSG_RESET_STATS = _UxGT("Сбросить статистику печати?"); + LSTR MSG_FAN_SPEED_FAULT = _UxGT("Сбой скорости кулера"); + LSTR MSG_COLORS_GET = _UxGT("Получить цвет"); + LSTR MSG_COLORS_SELECT = _UxGT("Выбрать цвета"); + LSTR MSG_COLORS_APPLIED = _UxGT("Цвета применены"); + LSTR MSG_COLORS_RED = _UxGT("Красный"); + LSTR MSG_COLORS_GREEN = _UxGT("Зелёный"); + LSTR MSG_COLORS_BLUE = _UxGT("Синий"); + LSTR MSG_COLORS_WHITE = _UxGT("Белый"); + LSTR MSG_UI_LANGUAGE = _UxGT("UI Language"); + LSTR MSG_SOUND_ENABLE = _UxGT("Включить звук"); + LSTR MSG_LOCKSCREEN = _UxGT("Блокировать экран"); + LSTR MSG_LOCKSCREEN_LOCKED = _UxGT("Принтер заблокирован,"); + LSTR MSG_LOCKSCREEN_UNLOCK = _UxGT("Крутить для разблокировки."); + LSTR MSG_PLEASE_WAIT_REBOOT = _UxGT("Ждите перезагрузки."); + LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Нет носителя."); + LSTR MSG_PLEASE_PREHEAT = _UxGT("Нагрейте сопло."); + LSTR MSG_INFO_PRINT_COUNT_RESET = _UxGT("Сбросить счетчик"); + LSTR MSG_FILAMENT_CHANGE_PURGE_CONTINUE = _UxGT("Прочистить или продолжить?"); + LSTR MSG_RUNOUT_ENABLE = _UxGT("Включить датч.филамента"); + LSTR MSG_RUNOUT_ACTIVE = _UxGT("Датч.филам. активен"); + LSTR MSG_INVERT_EXTRUDER = _UxGT("Инвертировать экструдер"); + LSTR MSG_EXTRUDER_MIN_TEMP = _UxGT("Миню темп. экструдера."); + LSTR MSG_FANCHECK = _UxGT("Пров.тахометра кулера"); + LSTR MSG_MMU2_REMOVE_AND_CLICK = _UxGT("Уберите и кликните..."); + LSTR MSG_REHEATDONE = _UxGT("Нагрето"); + LSTR MSG_XATC = _UxGT("Помощник перекоса X"); + LSTR MSG_XATC_DONE = _UxGT("Перекос Х настроен!"); + LSTR MSG_XATC_UPDATE_Z_OFFSET = _UxGT("Новое смещение Z-зонда "); + LSTR MSG_HOST_SHUTDOWN = _UxGT("Выключить хост"); + + // did not translate as there is no local terms/slang yet + LSTR MSG_FIXED_TIME_MOTION = _UxGT("Fixed-Time Motion"); + LSTR MSG_FTM_MODE = _UxGT("Motion Mode:"); + LSTR MSG_FTM_ZV = _UxGT("ZV"); + LSTR MSG_FTM_ZVD = _UxGT("ZVD"); + LSTR MSG_FTM_EI = _UxGT("EI"); + LSTR MSG_FTM_2HEI = _UxGT("2HEI"); + LSTR MSG_FTM_3HEI = _UxGT("3HEI"); + LSTR MSG_FTM_MZV = _UxGT("MZV"); + //LSTR MSG_FTM_ULENDO_FBS = _UxGT("Ulendo ФBС"); + //LSTR MSG_FTM_DISCTF = _UxGT("DISCTF"); + LSTR MSG_FTM_DYN_MODE = _UxGT("DF Mode:"); + LSTR MSG_FTM_Z_BASED = _UxGT("Z-based"); + LSTR MSG_FTM_MASS_BASED = _UxGT("Mass-based"); + LSTR MSG_FTM_BASE_FREQ_N = _UxGT("@ Base Freq."); + LSTR MSG_FTM_DFREQ_K_N = _UxGT("@ Dyn. Freq."); } diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 907b865bd9..5499a24942 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -67,8 +67,6 @@ namespace Language_sk { LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft. endstopy"); LSTR MSG_MAIN_MENU = _UxGT("Hlavná ponuka"); LSTR MSG_ADVANCED_SETTINGS = _UxGT("Pokročilé nastav."); - LSTR MSG_TOOLBAR_SETUP = _UxGT("Panel nástrojov"); - LSTR MSG_OPTION_DISABLED = _UxGT("Možnosť vypnutá"); LSTR MSG_CONFIGURATION = _UxGT("Konfigurácia"); LSTR MSG_RUN_AUTO_FILES = _UxGT("Auto-štart"); LSTR MSG_DISABLE_STEPPERS = _UxGT("Uvolniť motory"); @@ -84,11 +82,11 @@ namespace Language_sk { LSTR MSG_FILAMENT_SET = _UxGT("Nastav. filamentu"); LSTR MSG_FILAMENT_MAN = _UxGT("Správa filamentu"); LSTR MSG_MANUAL_LEVELING = _UxGT("Ručné rovnanie"); - LSTR MSG_LEVBED_FL = _UxGT("Ľavý predný"); - LSTR MSG_LEVBED_FR = _UxGT("Pravý predný"); - LSTR MSG_LEVBED_C = _UxGT("Stred"); - LSTR MSG_LEVBED_BL = _UxGT("Ľavý zadný"); - LSTR MSG_LEVBED_BR = _UxGT("Pravý zadný"); + LSTR MSG_TRAM_FL = _UxGT("Ľavý predný"); + LSTR MSG_TRAM_FR = _UxGT("Pravý predný"); + LSTR MSG_TRAM_C = _UxGT("Stred"); + LSTR MSG_TRAM_BL = _UxGT("Ľavý zadný"); + LSTR MSG_TRAM_BR = _UxGT("Pravý zadný"); LSTR MSG_MANUAL_MESH = _UxGT("Ručná mriežka"); LSTR MSG_AUTO_MESH = _UxGT("Automat. mriežka"); LSTR MSG_AUTO_Z_ALIGN = _UxGT("Auto-zarovn. Z"); @@ -452,12 +450,12 @@ namespace Language_sk { LSTR MSG_RESTORE_DEFAULTS = _UxGT("Obnoviť nastavenie"); LSTR MSG_INIT_EEPROM = _UxGT("Inicializ. EEPROM"); LSTR MSG_ERR_EEPROM_CRC = _UxGT("Chyba: EEPROM CRC"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Chyba: EEPROM Index"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Chyba: Veľkosť EEPROM"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Chyba: Verzia EEPROM"); LSTR MSG_SETTINGS_STORED = _UxGT("Nastavenie uložené"); LSTR MSG_MEDIA_UPDATE = _UxGT("Aktualiz. z karty"); LSTR MSG_RESET_PRINTER = _UxGT("Reštart. tlačiar."); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnoviť"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Obnoviť"); LSTR MSG_INFO_SCREEN = _UxGT("Info. obrazovka"); LSTR MSG_INFO_MACHINENAME = _UxGT("Názov stroja"); LSTR MSG_INFO_SIZE = _UxGT("Rozmer"); diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h index 570bc3df8d..d264c1e6e2 100644 --- a/Marlin/src/lcd/language/language_sv.h +++ b/Marlin/src/lcd/language/language_sv.h @@ -348,7 +348,7 @@ namespace Language_sv { LSTR MSG_RESTORE_DEFAULTS = _UxGT("Återställ Standard"); LSTR MSG_INIT_EEPROM = _UxGT("Initiera EEPROM"); LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC Fel"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index Fel"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("EEPROM Storlek Fel"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version Fel"); LSTR MSG_SETTINGS_STORED = _UxGT("Inställningar Lagrad"); LSTR MSG_MEDIA_UPDATE = _UxGT("Media Uppdatera"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 1054137230..667db7b77a 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -57,8 +57,6 @@ namespace Language_tr { LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Yazılımsal Endstops"); LSTR MSG_MAIN_MENU = _UxGT("Ana"); LSTR MSG_ADVANCED_SETTINGS = _UxGT("Gelişmiş Ayarlar"); - LSTR MSG_TOOLBAR_SETUP = _UxGT("Araç Çubuğu Kurulumu"); - LSTR MSG_OPTION_DISABLED = _UxGT("Seçenek Devre Dışı"); LSTR MSG_CONFIGURATION = _UxGT("Yapılandırma"); LSTR MSG_RUN_AUTO_FILES = _UxGT("Oto. Başlat"); LSTR MSG_DISABLE_STEPPERS = _UxGT("Motorları Durdur"); @@ -73,11 +71,11 @@ namespace Language_tr { LSTR MSG_FILAMENT_SET = _UxGT("Filament Ayarları"); LSTR MSG_FILAMENT_MAN = _UxGT("Filament Yönetimi"); LSTR MSG_MANUAL_LEVELING = _UxGT("Manuel Seviyeleme"); - LSTR MSG_LEVBED_FL = _UxGT("Sol Ön"); - LSTR MSG_LEVBED_FR = _UxGT("Ön Sağ"); - LSTR MSG_LEVBED_C = _UxGT("Orta"); - LSTR MSG_LEVBED_BL = _UxGT("Arka Sol"); - LSTR MSG_LEVBED_BR = _UxGT("Arka Sağ"); + LSTR MSG_TRAM_FL = _UxGT("Sol Ön"); + LSTR MSG_TRAM_FR = _UxGT("Ön Sağ"); + LSTR MSG_TRAM_C = _UxGT("Orta"); + LSTR MSG_TRAM_BL = _UxGT("Arka Sol"); + LSTR MSG_TRAM_BR = _UxGT("Arka Sağ"); LSTR MSG_MANUAL_MESH = _UxGT("Manuel Mesh"); LSTR MSG_AUTO_MESH = _UxGT("Oto Mesh Oluştur"); LSTR MSG_AUTO_Z_ALIGN = _UxGT("Oto. Z-Hizalama"); @@ -431,12 +429,12 @@ namespace Language_tr { LSTR MSG_RESTORE_DEFAULTS = _UxGT("Fabrika Ayarları"); LSTR MSG_INIT_EEPROM = _UxGT("EEPROM'u başlat"); LSTR MSG_ERR_EEPROM_CRC = _UxGT("Hata: EEPROM CRC"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Hata: EEPROM Indeks"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Hata: EEPROM Boyutu"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Hata: EEPROM Sürümü"); LSTR MSG_SETTINGS_STORED = _UxGT("Ayarlar Kaydedildi"); LSTR MSG_MEDIA_UPDATE = _UxGT("SD Güncellemesi"); LSTR MSG_RESET_PRINTER = _UxGT("Yazıcıyı Resetle"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Yenile"); + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Yenile"); LSTR MSG_INFO_SCREEN = _UxGT("Bilgi Ekranı"); LSTR MSG_INFO_MACHINENAME = _UxGT("Makine Adı"); LSTR MSG_INFO_SIZE = _UxGT("Boyut"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 4ee32fe4bc..7a7f4a5f44 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -465,7 +465,7 @@ namespace Language_uk { LSTR MSG_INIT_EEPROM = _UxGT("Ініціаліз. EEPROM"); #endif LSTR MSG_ERR_EEPROM_CRC = _UxGT("Збій EEPROM: CRC"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("Збій EEPROM: індекс"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("Збій EEPROM: розмір"); LSTR MSG_ERR_EEPROM_VERSION = _UxGT("Збій EEPROM: версія"); LSTR MSG_SETTINGS_STORED = _UxGT("Параметри збережені"); LSTR MSG_MEDIA_UPDATE = _UxGT("Оновити SD-картку"); @@ -480,7 +480,7 @@ namespace Language_uk { LSTR MSG_POWER = _UxGT("Потужність"); LSTR MSG_START_PRINT = _UxGT("Почати друк"); - LSTR MSG_BUTTON_NEXT = _UxGT("Далі"); //short text for buttons + LSTR MSG_BUTTON_NEXT = _UxGT("Далі"); //short text for buttons LSTR MSG_BUTTON_INIT = _UxGT("Ініц-я"); LSTR MSG_BUTTON_STOP = _UxGT("Зупинка"); LSTR MSG_BUTTON_PRINT = _UxGT("Друк"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index 5795c58a1e..69b58f71f0 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -43,7 +43,7 @@ namespace Language_vi { LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB được rút ra"); LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB khởi thất bại"); LSTR MSG_LCD_ENDSTOPS = _UxGT("Công tắc"); // Endstops - công tắc hành trình - LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Công tắc mềm"); // soft Endstops + LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Công tắc mềm"); // Soft Endstops LSTR MSG_MAIN_MENU = _UxGT("Chính"); // Main LSTR MSG_ADVANCED_SETTINGS = _UxGT("Thiết lập cấp cao"); // Advanced Settings LSTR MSG_CONFIGURATION = _UxGT("Cấu hình"); // Configuration @@ -52,9 +52,9 @@ namespace Language_vi { LSTR MSG_DEBUG_MENU = _UxGT("Menu gỡ lỗi"); // Debug Menu LSTR MSG_PROGRESS_BAR_TEST = _UxGT("Kiểm tra tiến độ"); // Progress bar test LSTR MSG_AUTO_HOME = _UxGT("Về nhà tự động"); // Auto home - LSTR MSG_AUTO_HOME_X = _UxGT("Về nhà X"); // home X - LSTR MSG_AUTO_HOME_Y = _UxGT("Về nhà Y"); // home Y - LSTR MSG_AUTO_HOME_Z = _UxGT("Về nhà Z"); // home Z + LSTR MSG_AUTO_HOME_X = _UxGT("Về nhà X"); // Home X + LSTR MSG_AUTO_HOME_Y = _UxGT("Về nhà Y"); // Home Y + LSTR MSG_AUTO_HOME_Z = _UxGT("Về nhà Z"); // Home Z LSTR MSG_AUTO_Z_ALIGN = _UxGT("Chỉnh canh Z tự động"); LSTR MSG_LEVEL_BED_HOMING = _UxGT("Đang về nhà XYZ"); // Homing XYZ LSTR MSG_LEVEL_BED_WAITING = _UxGT("Nhấn để bắt đầu"); // Click to Begin @@ -68,17 +68,17 @@ namespace Language_vi { LSTR MSG_PREHEAT_1_H = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" trước ~"); // Preheat LSTR MSG_PREHEAT_1_END = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu"); LSTR MSG_PREHEAT_1_END_E = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Đầu ~"); - LSTR MSG_PREHEAT_1_ALL = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Tất cả"); // all - LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Bàn"); // bed -- using vietnamese term for 'table' instead - LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Cấu hình"); // conf + LSTR MSG_PREHEAT_1_ALL = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Tất cả"); // All + LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Bàn"); // Bed -- using vietnamese term for 'table' instead + LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("Làm nóng ") PREHEAT_1_LABEL _UxGT(" Cấu hình"); // Conf - LSTR MSG_PREHEAT_M = _UxGT("Làm nóng $ trước"); // Preheat - LSTR MSG_PREHEAT_M_H = _UxGT("Làm nóng $ trước ~"); // Preheat + LSTR MSG_PREHEAT_M = _UxGT("Làm nóng $ trước"); // Preheat + LSTR MSG_PREHEAT_M_H = _UxGT("Làm nóng $ trước ~"); // Preheat LSTR MSG_PREHEAT_M_END = _UxGT("Làm nóng $ Đầu"); LSTR MSG_PREHEAT_M_END_E = _UxGT("Làm nóng $ Đầu ~"); - LSTR MSG_PREHEAT_M_ALL = _UxGT("Làm nóng $ Tất cả"); // all - LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Làm nóng $ Bàn"); // bed -- using vietnamese term for 'table' instead - LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Làm nóng $ Cấu hình"); // conf + LSTR MSG_PREHEAT_M_ALL = _UxGT("Làm nóng $ Tất cả"); // All + LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Làm nóng $ Bàn"); // Bed -- using vietnamese term for 'table' instead + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Làm nóng $ Cấu hình"); // Conf #endif LSTR MSG_PREHEAT_CUSTOM = _UxGT("Sự nóng trước tự chọn"); // Preheat Custom LSTR MSG_COOLDOWN = _UxGT("Nguội xuống"); // Cooldown @@ -112,7 +112,7 @@ namespace Language_vi { LSTR MSG_UBL_BC_INSERT = _UxGT("Đặt chêm và đo"); // Place shim & measure LSTR MSG_UBL_BC_INSERT2 = _UxGT("Đo"); // Measure LSTR MSG_UBL_BC_REMOVE = _UxGT("Tháo và đo bàn"); // Remove & measure bed - LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Chuyển sang tiếp theo"); // moving to next + LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("Chuyển sang tiếp theo"); // Moving to next LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("Bật UBL"); LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("Tắt UBL"); LSTR MSG_UBL_SET_TEMP_BED = _UxGT("Nhiệt độ bàn"); // Bed Temp @@ -133,7 +133,7 @@ namespace Language_vi { LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Điều chỉnh chiều cao lưới"); // Adjust Mesh Height LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Số lượng chiều cao"); // Height Amount LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Thẩm tra lưới"); // Validate Mesh - LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Thẩm tra lưới tự chọn"); // validate custom mesh + LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Thẩm tra lưới tự chọn"); // Validate custom mesh LSTR MSG_UBL_CONTINUE_MESH = _UxGT("Tiếp tục xây lưới bàn"); // Continue Bed Mesh LSTR MSG_UBL_MESH_LEVELING = _UxGT("Đang san lấp lưới"); // Mesh Leveling LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("Đang san lấp 3-điểm"); // 3-Point Leveling @@ -210,20 +210,20 @@ namespace Language_vi { LSTR MSG_MESH_Z_OFFSET = _UxGT("Z Bàn"); LSTR MSG_NOZZLE = _UxGT("Đầu phun"); // Nozzle LSTR MSG_NOZZLE_N = _UxGT("Đầu phun ~"); - LSTR MSG_BED = _UxGT("Bàn"); // bed - LSTR MSG_FAN_SPEED = _UxGT("Tốc độ quạt"); // fan speed + LSTR MSG_BED = _UxGT("Bàn"); // Bed + LSTR MSG_FAN_SPEED = _UxGT("Tốc độ quạt"); // Fan speed LSTR MSG_FAN_SPEED_N = _UxGT("Tốc độ quạt ~"); LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Tốc độ quạt phụ"); // Extra fan speed LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("Tốc độ quạt phụ ~"); LSTR MSG_FLOW = _UxGT("Lưu Lượng"); LSTR MSG_FLOW_N = _UxGT("Lưu Lượng ~"); LSTR MSG_CONTROL = _UxGT("Điều khiển"); // Control - LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Đa"); // min - LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Thiểu"); - LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Hệ Số"); // factor + LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Đa"); // Min + LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Thiểu"); // Max + LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Hệ Số"); // Factor LSTR MSG_AUTOTEMP = _UxGT("Nhiệt độ tự động"); // Autotemp - LSTR MSG_LCD_ON = _UxGT("Bật"); // on - LSTR MSG_LCD_OFF = _UxGT("Tắt"); // off + LSTR MSG_LCD_ON = _UxGT("Bật"); // On + LSTR MSG_LCD_OFF = _UxGT("Tắt"); // Off LSTR MSG_SELECT_E = _UxGT("Lựa *"); LSTR MSG_ACC = _UxGT("Tăng Tốc"); LSTR MSG_JERK = _UxGT("Giật"); @@ -233,8 +233,8 @@ namespace Language_vi { LSTR MSG_VN_JERK = _UxGT("Giật-V@"); LSTR MSG_VE_JERK = _UxGT("Giật-Ve"); LSTR MSG_JUNCTION_DEVIATION = _UxGT("Độ Lệch Chỗ Giao"); // Junction Dev - LSTR MSG_MAX_SPEED = _UxGT("Vận tốc"); // velocity - LSTR MSG_VMAX_A = _UxGT("Vđa") STR_A; // Vmax + LSTR MSG_MAX_SPEED = _UxGT("Vận tốc"); // Velocity + LSTR MSG_VMAX_A = _UxGT("Vđa") STR_A; // Vmax LSTR MSG_VMAX_B = _UxGT("Vđa") STR_B; LSTR MSG_VMAX_C = _UxGT("Vđa") STR_C; LSTR MSG_VMAX_N = _UxGT("Vđa@"); @@ -243,162 +243,162 @@ namespace Language_vi { LSTR MSG_VMIN = _UxGT("Vthiểu"); // Vmin LSTR MSG_VTRAV_MIN = _UxGT("Vchuyển thiểu"); // VTrav min LSTR MSG_ACCELERATION = _UxGT("Sự tăng tốc"); // Acceleration - LSTR MSG_AMAX_A = _UxGT("Tăng tốc ca") STR_A; // Amax + LSTR MSG_AMAX_A = _UxGT("Tăng tốc ca") STR_A; // Amax LSTR MSG_AMAX_B = _UxGT("Tăng tốc ca") STR_B; LSTR MSG_AMAX_C = _UxGT("Tăng tốc ca") STR_C; LSTR MSG_AMAX_N = _UxGT("Tăng tốc ca@"); LSTR MSG_AMAX_E = _UxGT("Tăng tốc caE"); LSTR MSG_AMAX_EN = _UxGT("Tăng tốc ca *"); - LSTR MSG_A_RETRACT = _UxGT("TT-Rút"); // A-retract - LSTR MSG_A_TRAVEL = _UxGT("TT-Chuyển"); // A-travel - LSTR MSG_STEPS_PER_MM = _UxGT("Bước/mm"); // Steps - LSTR MSG_A_STEPS = _UxGT("Bước") STR_A _UxGT("/mm"); // Steps/mm + LSTR MSG_A_RETRACT = _UxGT("TT-Rút"); // A-retract + LSTR MSG_A_TRAVEL = _UxGT("TT-Chuyển"); // A-travel + LSTR MSG_STEPS_PER_MM = _UxGT("Bước/mm"); // Steps + LSTR MSG_A_STEPS = _UxGT("Bước") STR_A _UxGT("/mm"); // Steps/mm LSTR MSG_B_STEPS = _UxGT("Bước") STR_B _UxGT("/mm"); LSTR MSG_C_STEPS = _UxGT("Bước") STR_C _UxGT("/mm"); LSTR MSG_N_STEPS = _UxGT("Bước@/mm"); LSTR MSG_E_STEPS = _UxGT("BướcE/mm"); LSTR MSG_EN_STEPS = _UxGT("Bước */mm"); - LSTR MSG_TEMPERATURE = _UxGT("Nhiệt độ"); // Temperature - LSTR MSG_MOTION = _UxGT("Chuyển động"); // Motion - LSTR MSG_FILAMENT = _UxGT("Vật liệu in"); // dây nhựa - LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E bằng mm") SUPERSCRIPT_THREE; // E in mm - LSTR MSG_FILAMENT_DIAM = _UxGT("Đường kính nhựa"); // Fil. Dai. + LSTR MSG_TEMPERATURE = _UxGT("Nhiệt độ"); // Temperature + LSTR MSG_MOTION = _UxGT("Chuyển động"); // Motion + LSTR MSG_FILAMENT = _UxGT("Vật liệu in"); // Dây nhựa + LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E bằng mm") SUPERSCRIPT_THREE; // E in mm + LSTR MSG_FILAMENT_DIAM = _UxGT("Đường kính nhựa"); // Fil. Dai. LSTR MSG_FILAMENT_DIAM_E = _UxGT("Đường kính nhựa *"); - LSTR MSG_FILAMENT_UNLOAD = _UxGT("Dỡ mm"); // unload mm + LSTR MSG_FILAMENT_UNLOAD = _UxGT("Dỡ mm"); // Unload mm LSTR MSG_FILAMENT_LOAD = _UxGT("Nạp mm"); - LSTR MSG_ADVANCE_K = _UxGT("K Cấp Cao"); // Advance K - LSTR MSG_ADVANCE_K_E = _UxGT("K Cấp Cao *"); // Advance K - LSTR MSG_CONTRAST = _UxGT("Độ tương phản LCD"); // LCD contrast - LSTR MSG_STORE_EEPROM = _UxGT("Lưu các thiết lập"); // Store settings - LSTR MSG_LOAD_EEPROM = _UxGT("Tải các cài đặt"); // Load settings - LSTR MSG_RESTORE_DEFAULTS = _UxGT("Khôi phục phòng hư"); // Restore Defaults - LSTR MSG_INIT_EEPROM = _UxGT("Khởi Tạo EEPROM"); // Initialize EEPROM - LSTR MSG_MEDIA_UPDATE = _UxGT("Cập Nhật phương tiện"); // Update media + LSTR MSG_ADVANCE_K = _UxGT("K Cấp Cao"); // Advance K + LSTR MSG_ADVANCE_K_E = _UxGT("K Cấp Cao *"); // Advance K + LSTR MSG_CONTRAST = _UxGT("Độ tương phản LCD"); // LCD contrast + LSTR MSG_STORE_EEPROM = _UxGT("Lưu các thiết lập"); // Store settings + LSTR MSG_LOAD_EEPROM = _UxGT("Tải các cài đặt"); // Load settings + LSTR MSG_RESTORE_DEFAULTS = _UxGT("Khôi phục phòng hư"); // Restore Defaults + LSTR MSG_INIT_EEPROM = _UxGT("Khởi Tạo EEPROM"); // Initialize EEPROM + LSTR MSG_MEDIA_UPDATE = _UxGT("Cập Nhật phương tiện"); // Update media LSTR MSG_RESET_PRINTER = _UxGT("Bặt Lại Máy In"); - LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Cập Nhật"); // Refresh - LSTR MSG_INFO_SCREEN = _UxGT("Màn Hình Thông Tin"); // Info screen - LSTR MSG_PREPARE = _UxGT("Chuẩn bị"); // Prepare - LSTR MSG_TUNE = _UxGT("Điều Chỉnh"); // Tune - LSTR MSG_PAUSE_PRINT = _UxGT("Tạm dừng in"); // Pause print - LSTR MSG_RESUME_PRINT = _UxGT("Tiếp tục in"); // Resume print - LSTR MSG_STOP_PRINT = _UxGT("Ngừng in"); // Stop print - LSTR MSG_OUTAGE_RECOVERY = _UxGT("Phục Hồi Mất Điện"); // Outage Recovery - LSTR MSG_MEDIA_MENU = _UxGT("In từ phương tiện"); // Print from media - LSTR MSG_NO_MEDIA = _UxGT("Không có phương tiện"); // No media - LSTR MSG_DWELL = _UxGT("Ngủ..."); // Sleep - LSTR MSG_USERWAIT = _UxGT("Nhấn để tiếp tục..."); // Click to resume (same as 'continue') - LSTR MSG_PRINT_PAUSED = _UxGT("In tạm dừng"); // print paused - LSTR MSG_PRINTING = _UxGT("Đang in..."); // printing - LSTR MSG_PRINT_ABORTED = _UxGT("In đã hủy bỏ"); // Print aborted - LSTR MSG_NO_MOVE = _UxGT("Không di chuyển."); // No move. + LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("Cập Nhật"); // Refresh + LSTR MSG_INFO_SCREEN = _UxGT("Màn Hình Thông Tin"); // Info screen + LSTR MSG_PREPARE = _UxGT("Chuẩn bị"); // Prepare + LSTR MSG_TUNE = _UxGT("Điều Chỉnh"); // Tune + LSTR MSG_PAUSE_PRINT = _UxGT("Tạm dừng in"); // Pause print + LSTR MSG_RESUME_PRINT = _UxGT("Tiếp tục in"); // Resume print + LSTR MSG_STOP_PRINT = _UxGT("Ngừng in"); // Stop print + LSTR MSG_OUTAGE_RECOVERY = _UxGT("Phục Hồi Mất Điện"); // Outage Recovery + LSTR MSG_MEDIA_MENU = _UxGT("In từ phương tiện"); // Print from media + LSTR MSG_NO_MEDIA = _UxGT("Không có phương tiện"); // No media + LSTR MSG_DWELL = _UxGT("Ngủ..."); // Sleep + LSTR MSG_USERWAIT = _UxGT("Nhấn để tiếp tục..."); // Click to resume (same as 'continue') + LSTR MSG_PRINT_PAUSED = _UxGT("In tạm dừng"); // Print paused + LSTR MSG_PRINTING = _UxGT("Đang in..."); // Printing + LSTR MSG_PRINT_ABORTED = _UxGT("In đã hủy bỏ"); // Print aborted + LSTR MSG_NO_MOVE = _UxGT("Không di chuyển."); // No move. LSTR MSG_KILLED = _UxGT("ĐÃ CHẾT. "); LSTR MSG_STOPPED = _UxGT("ĐÃ NGỪNG. "); - LSTR MSG_CONTROL_RETRACT = _UxGT("Rút mm"); // Retract mm - LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Rút Trao.mm"); // Swap Re.mm + LSTR MSG_CONTROL_RETRACT = _UxGT("Rút mm"); // Retract mm + LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("Rút Trao.mm"); // Swap Re.mm LSTR MSG_CONTROL_RETRACTF = _UxGT("Rút V"); - LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Nhảy mm"); // hop - LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("BỏRút mm"); // Unretr. mm - LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("BỏRút T mm"); // S Unretr. mm - LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("BỏRút V"); // UnRet V - LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("BỏRút T V"); // S UnRet V - LSTR MSG_AUTORETRACT = _UxGT("RútTựĐộng"); // Auto-Retract - LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Khoảng Cách Rút"); // Retract Distance - LSTR MSG_TOOL_CHANGE = _UxGT("Thay Đổi Công Cụ"); // Tool Change - LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Đưa Lên Z"); // Z Raise - LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Tốc Độ Tuôn Ra"); // Prime Speed - LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Tốc Độ Rút Lại"); // Retract Speed - LSTR MSG_FILAMENTCHANGE = _UxGT("Thay dây nhựa"); // change filament - LSTR MSG_FILAMENTCHANGE_E = _UxGT("Thay dây nhựa *"); // change filament - LSTR MSG_FILAMENTLOAD = _UxGT("Nạp dây nhựa"); // load filament - LSTR MSG_FILAMENTLOAD_E = _UxGT("Nạp dây nhựa *"); // load filament - LSTR MSG_FILAMENTUNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament - LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Dỡ dây nhựa *"); // unload filament - LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Dỡ tất cả"); // Unload All - LSTR MSG_ATTACH_MEDIA = _UxGT("Khởi tạo phương tiện"); // Attach media - LSTR MSG_CHANGE_MEDIA = _UxGT("Thay phương tiện"); // Change midea + LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Nhảy mm"); // Hop + LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("BỏRút mm"); // Unretr. mm + LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("BỏRút T mm"); // S Unretr. mm + LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("BỏRút V"); // UnRet V + LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("BỏRút T V"); // S UnRet V + LSTR MSG_AUTORETRACT = _UxGT("RútTựĐộng"); // Auto-Retract + LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("Khoảng Cách Rút"); // Retract Distance + LSTR MSG_TOOL_CHANGE = _UxGT("Thay Đổi Công Cụ"); // Tool Change + LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Đưa Lên Z"); // Z Raise + LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Tốc Độ Tuôn Ra"); // Prime Speed + LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Tốc Độ Rút Lại"); // Retract Speed + LSTR MSG_FILAMENTCHANGE = _UxGT("Thay dây nhựa"); // Change filament + LSTR MSG_FILAMENTCHANGE_E = _UxGT("Thay dây nhựa *"); // Change filament + LSTR MSG_FILAMENTLOAD = _UxGT("Nạp dây nhựa"); // Load filament + LSTR MSG_FILAMENTLOAD_E = _UxGT("Nạp dây nhựa *"); // Load filament + LSTR MSG_FILAMENTUNLOAD = _UxGT("Dỡ dây nhựa"); // Unload filament + LSTR MSG_FILAMENTUNLOAD_E = _UxGT("Dỡ dây nhựa *"); // Unload filament + LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("Dỡ tất cả"); // Unload All + LSTR MSG_ATTACH_MEDIA = _UxGT("Khởi tạo phương tiện"); // Attach media + LSTR MSG_CHANGE_MEDIA = _UxGT("Thay phương tiện"); // Change midea LSTR MSG_RELEASE_MEDIA = _UxGT("Phát hành phương tiện"); - LSTR MSG_ZPROBE_OUT = _UxGT("Đầu Dò Z qua bàn"); // Z Probe past bed - LSTR MSG_SKEW_FACTOR = _UxGT("Hệ số nghiêng"); // Skew Factor - LSTR MSG_BLTOUCH = _UxGT("BLTOUCH"); // BLTouch - LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Tự kiểm tra BLTOUCH "); // BLTouch Self-Test - LSTR MSG_BLTOUCH_RESET = _UxGT("Bặt lại BLTouch"); // Reset BLTouch - LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Đem BLTouch"); // Deploy BLTouch - LSTR MSG_BLTOUCH_STOW = _UxGT("Cất BLTouch"); // Stow BLTouch - LSTR MSG_MANUAL_DEPLOY = _UxGT("Đem Đầu Dò-Z"); // Deploy Z-Probe - LSTR MSG_MANUAL_STOW = _UxGT("Cất Đầu Dò-Z"); // Stow Z-Probe + LSTR MSG_ZPROBE_OUT = _UxGT("Đầu Dò Z qua bàn"); // Z Probe past bed + LSTR MSG_SKEW_FACTOR = _UxGT("Hệ số nghiêng"); // Skew Factor + LSTR MSG_BLTOUCH = _UxGT("BLTOUCH"); // BLTouch + LSTR MSG_BLTOUCH_SELFTEST = _UxGT("Tự kiểm tra BLTOUCH "); // BLTouch Self-Test + LSTR MSG_BLTOUCH_RESET = _UxGT("Bặt lại BLTouch"); // Reset BLTouch + LSTR MSG_BLTOUCH_DEPLOY = _UxGT("Đem BLTouch"); // Deploy BLTouch + LSTR MSG_BLTOUCH_STOW = _UxGT("Cất BLTouch"); // Stow BLTouch + LSTR MSG_MANUAL_DEPLOY = _UxGT("Đem Đầu Dò-Z"); // Deploy Z-Probe + LSTR MSG_MANUAL_STOW = _UxGT("Cất Đầu Dò-Z"); // Stow Z-Probe LSTR MSG_HOME_FIRST = _UxGT("Về nhà %s Trước"); - LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Đầu Dò Bù Đắp Z"); // Probe Z Offset - LSTR MSG_BABYSTEP_X = _UxGT("Nhít X"); // Babystep X + LSTR MSG_ZPROBE_ZOFFSET = _UxGT("Đầu Dò Bù Đắp Z"); // Probe Z Offset + LSTR MSG_BABYSTEP_X = _UxGT("Nhít X"); // Babystep X LSTR MSG_BABYSTEP_Y = _UxGT("Nhít Y"); LSTR MSG_BABYSTEP_Z = _UxGT("Nhít Z"); LSTR MSG_BABYSTEP_N = _UxGT("Nhít @"); - LSTR MSG_ENDSTOP_ABORT = _UxGT("Hủy bỏ công tắc"); // Endstop abort - LSTR MSG_HEATING_FAILED_LCD = _UxGT("Sưởi đầu phun không thành công"); // Heating failed - LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Điều sai: nhiệt độ dư"); // Err: REDUNDANT TEMP - LSTR MSG_THERMAL_RUNAWAY = _UxGT("Vấn đề nhiệt"); // THERMAL RUNAWAY | problem - LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("Vấn đề nhiệt bàn"); // BED THERMAL RUNAWAY - LSTR MSG_ERR_MAXTEMP = _UxGT("Điều sai: nhiệt độ tối đa"); // Err: MAXTEMP - LSTR MSG_ERR_MINTEMP = _UxGT("Điều sai: nhiệt độ tối thiểu"); // Err: MINTEMP - LSTR MSG_HALTED = _UxGT("MÁY IN ĐÃ DỪNG LẠI"); // PRINTER HALTED - LSTR MSG_PLEASE_RESET = _UxGT("Xin bặt lại"); // Please reset - LSTR MSG_HEATING = _UxGT("Đang sưởi nóng..."); // heating - LSTR MSG_COOLING = _UxGT("Đang làm nguội..."); // cooling - LSTR MSG_BED_HEATING = _UxGT("Đang sưởi nong bàn..."); // bed heating - LSTR MSG_BED_COOLING = _UxGT("Đang làm nguội bàn..."); // bed cooling - LSTR MSG_DELTA_CALIBRATE = _UxGT("Cân Chỉnh Delta"); // Delta calibration + LSTR MSG_ENDSTOP_ABORT = _UxGT("Hủy bỏ công tắc"); // Endstop abort + LSTR MSG_HEATING_FAILED_LCD = _UxGT("Sưởi đầu phun không thành công"); // Heating failed + LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("Điều sai: nhiệt độ dư"); // Err: REDUNDANT TEMP + LSTR MSG_THERMAL_RUNAWAY = _UxGT("Vấn đề nhiệt"); // THERMAL RUNAWAY | problem + LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("Vấn đề nhiệt bàn"); // BED THERMAL RUNAWAY + LSTR MSG_ERR_MAXTEMP = _UxGT("Điều sai: nhiệt độ tối đa"); // Err: MAXTEMP + LSTR MSG_ERR_MINTEMP = _UxGT("Điều sai: nhiệt độ tối thiểu"); // Err: MINTEMP + LSTR MSG_HALTED = _UxGT("MÁY IN ĐÃ DỪNG LẠI"); // PRINTER HALTED + LSTR MSG_PLEASE_RESET = _UxGT("Xin bặt lại"); // Please reset + LSTR MSG_HEATING = _UxGT("Đang sưởi nóng..."); // Heating + LSTR MSG_COOLING = _UxGT("Đang làm nguội..."); // Cooling + LSTR MSG_BED_HEATING = _UxGT("Đang sưởi nong bàn..."); // Bed heating + LSTR MSG_BED_COOLING = _UxGT("Đang làm nguội bàn..."); // Bed cooling + LSTR MSG_DELTA_CALIBRATE = _UxGT("Cân Chỉnh Delta"); // Delta calibration LSTR MSG_DELTA_CALIBRATE_X = _UxGT("Chỉnh X lại"); LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("Chỉnh Y lại"); LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("Chỉnh Z lại"); - LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Chỉnh Z Center"); // Calibrate Center - LSTR MSG_DELTA_SETTINGS = _UxGT("Cài Đặt Delta"); // Delta Settings - LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Cân Chỉnh Tự Động"); // Auto Calibration - LSTR MSG_DELTA_DIAG_ROD = _UxGT("Gậy Chéo"); // Diag Rod - LSTR MSG_DELTA_HEIGHT = _UxGT("Chiều Cao"); // Height - LSTR MSG_DELTA_RADIUS = _UxGT("Bán Kính"); // Radius + LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("Chỉnh Z Center"); // Calibrate Center + LSTR MSG_DELTA_SETTINGS = _UxGT("Cài Đặt Delta"); // Delta Settings + LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("Cân Chỉnh Tự Động"); // Auto Calibration + LSTR MSG_DELTA_DIAG_ROD = _UxGT("Gậy Chéo"); // Diag Rod + LSTR MSG_DELTA_HEIGHT = _UxGT("Chiều Cao"); // Height + LSTR MSG_DELTA_RADIUS = _UxGT("Bán Kính"); // Radius LSTR MSG_INFO_MENU = _UxGT("Về Máy In"); - LSTR MSG_INFO_PRINTER_MENU = _UxGT("Thông Tin Máy In"); // Printer Info - LSTR MSG_3POINT_LEVELING = _UxGT("San lấp 3-Điểm"); // 3-Point Leveling - LSTR MSG_LINEAR_LEVELING = _UxGT("San Lấp Tuyến Tính"); // Linear Leveling - LSTR MSG_BILINEAR_LEVELING = _UxGT("San Lấp Song Tuyến"); // Bilinear Leveling - LSTR MSG_UBL_LEVELING = _UxGT("San Lấp Bàn Thống Nhất"); // Unified Bed Leveling - LSTR MSG_MESH_LEVELING = _UxGT("Lưới San Lấp"); // Mesh Leveling - LSTR MSG_INFO_STATS_MENU = _UxGT("Thống Kê Máy In"); // Printer Stats - LSTR MSG_INFO_BOARD_MENU = _UxGT("Thông Tin Bo Mạch"); // Board Info - LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Điện Trở Nhiệt"); // Thermistors - LSTR MSG_INFO_EXTRUDERS = _UxGT("Máy đùn"); // Extruders - LSTR MSG_INFO_BAUDRATE = _UxGT("Baud"); // Baud - LSTR MSG_INFO_PROTOCOL = _UxGT("Giao Thức"); // Protocol - LSTR MSG_CASE_LIGHT = _UxGT("Đèn Khuông"); // Case light - LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Độ Sáng"); // Light Brightness + LSTR MSG_INFO_PRINTER_MENU = _UxGT("Thông Tin Máy In"); // Printer Info + LSTR MSG_3POINT_LEVELING = _UxGT("San lấp 3-Điểm"); // 3-Point Leveling + LSTR MSG_LINEAR_LEVELING = _UxGT("San Lấp Tuyến Tính"); // Linear Leveling + LSTR MSG_BILINEAR_LEVELING = _UxGT("San Lấp Song Tuyến"); // Bilinear Leveling + LSTR MSG_UBL_LEVELING = _UxGT("San Lấp Bàn Thống Nhất"); // Unified Bed Leveling + LSTR MSG_MESH_LEVELING = _UxGT("Lưới San Lấp"); // Mesh Leveling + LSTR MSG_INFO_STATS_MENU = _UxGT("Thống Kê Máy In"); // Printer Stats + LSTR MSG_INFO_BOARD_MENU = _UxGT("Thông Tin Bo Mạch"); // Board Info + LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("Điện Trở Nhiệt"); // Thermistors + LSTR MSG_INFO_EXTRUDERS = _UxGT("Máy đùn"); // Extruders + LSTR MSG_INFO_BAUDRATE = _UxGT("Baud"); // Baud + LSTR MSG_INFO_PROTOCOL = _UxGT("Giao Thức"); // Protocol + LSTR MSG_CASE_LIGHT = _UxGT("Đèn Khuông"); // Case light + LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Độ Sáng"); // Light Brightness #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2 - LSTR MSG_INFO_PRINT_COUNT = _UxGT("Số In"); // Print Count + LSTR MSG_INFO_PRINT_COUNT = _UxGT("Số In"); // Print Count LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); - LSTR MSG_INFO_PRINT_TIME = _UxGT("Tổng số thời gian in"); // Total print time - LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Thời gian việc lâu nhất"); // Longest job time - LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Tổng số đùn"); // Extruded total + LSTR MSG_INFO_PRINT_TIME = _UxGT("Tổng số thời gian in"); // Total print time + LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Thời gian việc lâu nhất"); // Longest job time + LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Tổng số đùn"); // Extruded total #else - LSTR MSG_INFO_PRINT_COUNT = _UxGT("In"); // prints - LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); // Completed - LSTR MSG_INFO_PRINT_TIME = _UxGT("Tổng số"); // total - LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Dài nhất"); // Longest + LSTR MSG_INFO_PRINT_COUNT = _UxGT("In"); // Prints + LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("Đã hoàn thành"); // Completed + LSTR MSG_INFO_PRINT_TIME = _UxGT("Tổng số"); // Total + LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Dài nhất"); // Longest LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Đã ép đùn"); #endif - LSTR MSG_INFO_MIN_TEMP = _UxGT("Nhiệt độ tối thiểu"); // Min Temp - LSTR MSG_INFO_MAX_TEMP = _UxGT("Nhiệt độ tối đa"); // Max temp - LSTR MSG_INFO_PSU = _UxGT("Bộ nguồn"); // PSU - LSTR MSG_DRIVE_STRENGTH = _UxGT("Sức mạnh ổ đĩa"); // Drive Strength + LSTR MSG_INFO_MIN_TEMP = _UxGT("Nhiệt độ tối thiểu"); // Min Temp + LSTR MSG_INFO_MAX_TEMP = _UxGT("Nhiệt độ tối đa"); // Max temp + LSTR MSG_INFO_PSU = _UxGT("Bộ nguồn"); // PSU + LSTR MSG_DRIVE_STRENGTH = _UxGT("Sức mạnh ổ đĩa"); // Drive Strength LSTR MSG_DAC_PERCENT_N = _UxGT("@ % trình điều khiển"); - LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Ghi DAC EEPROM"); // DAC EEPROM Write - LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("In tạm dừng"); // PRINT PAUSED + LSTR MSG_DAC_EEPROM_WRITE = _UxGT("Ghi DAC EEPROM"); // DAC EEPROM Write + LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("In tạm dừng"); // PRINT PAUSED LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("Nạp dây nhựa"); - LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("Dỡ dây nhựa"); // unload filament - LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Tùy chọn hồi phục:"); // RESUME OPTIONS - LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Xả thêm"); // Purge more - LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Tiếp tục"); // continue - LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Đầu Phun: "); // Nozzle - LSTR MSG_RUNOUT_SENSOR_ENABLE = _UxGT("Cảm Biến Hết"); // Runout Sensor - LSTR MSG_KILL_HOMING_FAILED = _UxGT("Sự nhà không thành công"); // Homing failed - LSTR MSG_LCD_PROBING_FAILED = _UxGT(" không thành công"); // Probing failed + LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("Dỡ dây nhựa"); // Unload filament + LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("Tùy chọn hồi phục:"); // RESUME OPTIONS + LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Xả thêm"); // Purge more + LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Tiếp tục"); // Continue + LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Đầu Phun: "); // Nozzle + LSTR MSG_RUNOUT_SENSOR_ENABLE = _UxGT("Cảm Biến Hết"); // Runout Sensor + LSTR MSG_KILL_HOMING_FAILED = _UxGT("Sự nhà không thành công"); // Homing failed + LSTR MSG_LCD_PROBING_FAILED = _UxGT(" không thành công"); // Probing failed // // Filament Change screens show up to 3 lines on a 4-line display @@ -406,36 +406,36 @@ namespace Language_vi { // #if LCD_HEIGHT >= 4 LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nhấn nút", "để tiếp tục in")); // Press button to resume print - LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Chờ cho sự", "thay đổi dây nhựa", "bắt đầu")); // wait for filament change to start - LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Đút dây nhựa vào", "và nhấn nút", "để tiếp tục")); // insert filament and press button to continue // + LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Chờ cho sự", "thay đổi dây nhựa", "bắt đầu")); // Wait for filament change to start + LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Đút dây nhựa vào", "và nhấn nút", "để tiếp tục")); // Insert filament and press button to continue // LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nhấn nút", "để làm nóng đầu phun")); // Press button to heat nozzle LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Đầu phun đang nóng lên", "Xin chờ...")); // Nozzle heating Please wait - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa ra")); // Wait for filament unload - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa vào")); // Wait for filament load - LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Chờ tro", "xả dây nhựa")); // wait for filament purge + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa ra")); // Wait for filament unload + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Chờ tro", "dây nhựa vào")); // Wait for filament load + LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Chờ tro", "xả dây nhựa")); // Wait for filament purge LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("Nhấn nút để kết thúc", "xả dây nhựa")); // Click to finish dây nhựa purge LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("Chờ tro in", "tiếp tục...")); // Wait for print to resume #else // LCD_HEIGHT < 4 - LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Nhấn nút để tiếp tục")); // Click to continue + LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Nhấn nút để tiếp tục")); // Click to continue LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Xin chờ...")); - LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Chèn và nhấn")); // Insert and Click - LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Nhấn để sưởi")); // Click to heat - LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Đang sưởi nóng")); // Heating - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Đang dỡ ra...")); // Ejecting - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Đang nạp...")); // Loading - LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Đang xả...")); // Purging - LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Nhấn nút để kết thúc")); // Click to finish - LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Đang tiếp tục...")); // Resuming + LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Chèn và nhấn")); // Insert and Click + LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Nhấn để sưởi")); // Click to heat + LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Đang sưởi nóng")); // Heating + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Đang dỡ ra...")); // Ejecting + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Đang nạp...")); // Loading + LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Đang xả...")); // Purging + LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Nhấn nút để kết thúc")); // Click to finish + LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Đang tiếp tục...")); // Resuming #endif // LCD_HEIGHT < 4 - LSTR MSG_TMC_DRIVERS = _UxGT("Trình điều khiển TMC"); // TMC drivers - LSTR MSG_TMC_CURRENT = _UxGT("Dòng điện trình điều khiển"); // Driver current - LSTR MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold - LSTR MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing - LSTR MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled + LSTR MSG_TMC_DRIVERS = _UxGT("Trình điều khiển TMC"); // TMC drivers + LSTR MSG_TMC_CURRENT = _UxGT("Dòng điện trình điều khiển"); // Driver current + LSTR MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold + LSTR MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing + LSTR MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode + LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled - LSTR MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only - LSTR MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only - LSTR MSG_SHORT_MINUTE = _UxGT("p"); // m - phút - One character only + LSTR MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only + LSTR MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only + LSTR MSG_SHORT_MINUTE = _UxGT("p"); // m - phút - One character only } diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 27f2a597c6..03c8d80bca 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -28,88 +28,88 @@ * See also https://marlinfw.org/docs/development/lcd_language.html */ namespace Language_zh_CN { - using namespace Language_en; // Inherit undefined strings from English + using namespace Language_en; // Inherit undefined strings from English constexpr uint8_t CHARSIZE = 3; LSTR LANGUAGE = _UxGT("Simplified Chinese"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT("已就绪."); // " ready." + LSTR WELCOME_MSG = MACHINE_NAME _UxGT("已就绪."); // " ready." LSTR MSG_MARLIN = _UxGT("马林"); LSTR MSG_YES = _UxGT("是"); LSTR MSG_NO = _UxGT("否"); - LSTR MSG_BACK = _UxGT("返回"); // ”Back“ + LSTR MSG_BACK = _UxGT("返回"); // ”Back“ LSTR MSG_MEDIA_ABORTING = _UxGT("放弃中..."); - LSTR MSG_MEDIA_INSERTED = _UxGT("存储卡已插入"); // "Card inserted" - LSTR MSG_MEDIA_REMOVED = _UxGT("存储卡被拔出"); // "Card removed" + LSTR MSG_MEDIA_INSERTED = _UxGT("存储卡已插入"); // "Card inserted" + LSTR MSG_MEDIA_REMOVED = _UxGT("存储卡被拔出"); // "Card removed" LSTR MSG_MEDIA_WAITING = _UxGT("等待存储器"); LSTR MSG_MEDIA_READ_ERROR = _UxGT("存储器读取错误"); LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB设备已弹出"); LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB启动错误"); LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("子响应溢出"); - LSTR MSG_LCD_ENDSTOPS = _UxGT("挡块"); // "Endstops" // Max length 8 characters + LSTR MSG_LCD_ENDSTOPS = _UxGT("挡块"); // "Endstops" // Max length 8 characters LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("软挡块"); - LSTR MSG_MAIN_MENU = _UxGT("主菜单"); // "Main" + LSTR MSG_MAIN_MENU = _UxGT("主菜单"); // "Main" LSTR MSG_ADVANCED_SETTINGS = _UxGT("高级设置"); LSTR MSG_CONFIGURATION = _UxGT("配置"); - LSTR MSG_RUN_AUTO_FILES = _UxGT("自动开始"); // "Autostart" - LSTR MSG_DISABLE_STEPPERS = _UxGT("关闭步进电机"); // "Disable steppers" - LSTR MSG_DEBUG_MENU = _UxGT("调试菜单"); // "Debug Menu" - LSTR MSG_PROGRESS_BAR_TEST = _UxGT("进度条测试"); // "Progress Bar Test" + LSTR MSG_RUN_AUTO_FILES = _UxGT("自动开始"); // "Autostart" + LSTR MSG_DISABLE_STEPPERS = _UxGT("关闭步进电机"); // "Disable steppers" + LSTR MSG_DEBUG_MENU = _UxGT("调试菜单"); // "Debug Menu" + LSTR MSG_PROGRESS_BAR_TEST = _UxGT("进度条测试"); // "Progress Bar Test" LSTR MSG_HOMING = _UxGT("回原点"); - LSTR MSG_AUTO_HOME = _UxGT("自动回原点"); // "Auto home" - LSTR MSG_AUTO_HOME_X = _UxGT("回X原位"); // "Home X" - LSTR MSG_AUTO_HOME_Y = _UxGT("回Y原位"); // "Home Y" - LSTR MSG_AUTO_HOME_Z = _UxGT("回Z原位"); // "Home Z" + LSTR MSG_AUTO_HOME = _UxGT("自动回原点"); // "Auto home" + LSTR MSG_AUTO_HOME_X = _UxGT("回X原位"); // "Home X" + LSTR MSG_AUTO_HOME_Y = _UxGT("回Y原位"); // "Home Y" + LSTR MSG_AUTO_HOME_Z = _UxGT("回Z原位"); // "Home Z" LSTR MSG_AUTO_Z_ALIGN = _UxGT("自动Z对齐"); - LSTR MSG_LEVEL_BED_HOMING = _UxGT("平台调平XYZ归原位"); // "Homing XYZ" - LSTR MSG_LEVEL_BED_WAITING = _UxGT("单击开始热床调平"); // "Click to Begin" - LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("下个热床调平点"); // "Next Point" - LSTR MSG_LEVEL_BED_DONE = _UxGT("完成热床调平"); // "Leveling Done!" - LSTR MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" - LSTR MSG_SET_HOME_OFFSETS = _UxGT("设置原点偏移"); // "Set home offsets" - LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已启用"); // "Offsets applied" + LSTR MSG_LEVEL_BED_HOMING = _UxGT("平台调平XYZ归原位"); // "Homing XYZ" + LSTR MSG_LEVEL_BED_WAITING = _UxGT("单击开始热床调平"); // "Click to Begin" + LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("下个热床调平点"); // "Next Point" + LSTR MSG_LEVEL_BED_DONE = _UxGT("完成热床调平"); // "Leveling Done!" + LSTR MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" + LSTR MSG_SET_HOME_OFFSETS = _UxGT("设置原点偏移"); // "Set home offsets" + LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已启用"); // "Offsets applied" #if HAS_PREHEAT - LSTR MSG_PREHEAT_1 = _UxGT("预热 ") PREHEAT_1_LABEL; // "Preheat PREHEAT_2_LABEL" - LSTR MSG_PREHEAT_1_H = _UxGT("预热 ") PREHEAT_1_LABEL " ~"; // "Preheat PREHEAT_2_LABEL" - LSTR MSG_PREHEAT_1_END = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_1 " " - LSTR MSG_PREHEAT_1_END_E = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ~"); //MSG_PREHEAT_1 " " - LSTR MSG_PREHEAT_1_ALL = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" - LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 热床"); //MSG_PREHEAT_1 " Bed" - LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 设置"); //MSG_PREHEAT_1 " conf" + LSTR MSG_PREHEAT_1 = _UxGT("预热 ") PREHEAT_1_LABEL; // "Preheat PREHEAT_2_LABEL" + LSTR MSG_PREHEAT_1_H = _UxGT("预热 ") PREHEAT_1_LABEL " ~"; // "Preheat PREHEAT_2_LABEL" + LSTR MSG_PREHEAT_1_END = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴"); //MSG_PREHEAT_1 " " + LSTR MSG_PREHEAT_1_END_E = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 喷嘴 ~"); //MSG_PREHEAT_1 " " + LSTR MSG_PREHEAT_1_ALL = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" + LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 热床"); //MSG_PREHEAT_1 " Bed" + LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("预热 ") PREHEAT_1_LABEL _UxGT(" 设置"); //MSG_PREHEAT_1 " conf" - LSTR MSG_PREHEAT_M = _UxGT("预热 $"); // "Preheat PREHEAT_2_LABEL" - LSTR MSG_PREHEAT_M_H = _UxGT("预热 $ ~"); // "Preheat PREHEAT_2_LABEL" - LSTR MSG_PREHEAT_M_END = _UxGT("预热 $ 喷嘴"); //MSG_PREHEAT_1 " " - LSTR MSG_PREHEAT_M_END_E = _UxGT("预热 $ 喷嘴 ~"); //MSG_PREHEAT_1 " " - LSTR MSG_PREHEAT_M_ALL = _UxGT("预热 $ 全部"); //MSG_PREHEAT_1 " All" - LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("预热 $ 热床"); //MSG_PREHEAT_1 " Bed" - LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("预热 $ 设置"); //MSG_PREHEAT_1 " conf" + LSTR MSG_PREHEAT_M = _UxGT("预热 $"); // "Preheat PREHEAT_2_LABEL" + LSTR MSG_PREHEAT_M_H = _UxGT("预热 $ ~"); // "Preheat PREHEAT_2_LABEL" + LSTR MSG_PREHEAT_M_END = _UxGT("预热 $ 喷嘴"); //MSG_PREHEAT_1 " " + LSTR MSG_PREHEAT_M_END_E = _UxGT("预热 $ 喷嘴 ~"); //MSG_PREHEAT_1 " " + LSTR MSG_PREHEAT_M_ALL = _UxGT("预热 $ 全部"); //MSG_PREHEAT_1 " All" + LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("预热 $ 热床"); //MSG_PREHEAT_1 " Bed" + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("预热 $ 设置"); //MSG_PREHEAT_1 " conf" #endif LSTR MSG_PREHEAT_CUSTOM = _UxGT("预热自定义"); - LSTR MSG_COOLDOWN = _UxGT("降温"); // "Cooldown" + LSTR MSG_COOLDOWN = _UxGT("降温"); // "Cooldown" LSTR MSG_CUTTER_FREQUENCY = _UxGT("切割频率"); LSTR MSG_LASER_MENU = _UxGT("激光控制"); LSTR MSG_LASER_POWER = _UxGT("激光电源"); LSTR MSG_SPINDLE_MENU = _UxGT("主轴控制"); LSTR MSG_SPINDLE_POWER = _UxGT("主轴电源"); LSTR MSG_SPINDLE_REVERSE = _UxGT("主轴反转"); - LSTR MSG_SWITCH_PS_ON = _UxGT("开启电源"); // "Switch power on" - LSTR MSG_SWITCH_PS_OFF = _UxGT("关闭电源"); // "Switch power off" - LSTR MSG_EXTRUDE = _UxGT("挤出"); // "Extrude" - LSTR MSG_RETRACT = _UxGT("回抽"); // "Retract" - LSTR MSG_MOVE_AXIS = _UxGT("移动轴"); // "Move axis" - LSTR MSG_BED_LEVELING = _UxGT("调平热床"); // "Bed leveling" - LSTR MSG_LEVEL_BED = _UxGT("调平热床"); // "Level bed" - LSTR MSG_BED_TRAMMING = _UxGT("调平边角"); // "Bed Tramming" - LSTR MSG_NEXT_CORNER = _UxGT("下个边角"); // "Next corner" + LSTR MSG_SWITCH_PS_ON = _UxGT("开启电源"); // "Switch power on" + LSTR MSG_SWITCH_PS_OFF = _UxGT("关闭电源"); // "Switch power off" + LSTR MSG_EXTRUDE = _UxGT("挤出"); // "Extrude" + LSTR MSG_RETRACT = _UxGT("回抽"); // "Retract" + LSTR MSG_MOVE_AXIS = _UxGT("移动轴"); // "Move axis" + LSTR MSG_BED_LEVELING = _UxGT("调平热床"); // "Bed leveling" + LSTR MSG_LEVEL_BED = _UxGT("调平热床"); // "Level bed" + LSTR MSG_BED_TRAMMING = _UxGT("调平边角"); // "Bed Tramming" + LSTR MSG_NEXT_CORNER = _UxGT("下个边角"); // "Next corner" LSTR MSG_MESH_EDITOR = _UxGT("网格编辑器"); - LSTR MSG_EDIT_MESH = _UxGT("编辑网格"); // "Edit Mesh" - LSTR MSG_EDITING_STOPPED = _UxGT("网格编辑已停止"); // "Mesh Editing Stopped" + LSTR MSG_EDIT_MESH = _UxGT("编辑网格"); // "Edit Mesh" + LSTR MSG_EDITING_STOPPED = _UxGT("网格编辑已停止"); // "Mesh Editing Stopped" LSTR MSG_PROBING_POINT = _UxGT("探测点"); LSTR MSG_MESH_X = _UxGT("索引X"); LSTR MSG_MESH_Y = _UxGT("索引Y"); LSTR MSG_MESH_EDIT_Z = _UxGT("Z 值"); - LSTR MSG_CUSTOM_COMMANDS = _UxGT("定制命令"); // "Custom Commands" + LSTR MSG_CUSTOM_COMMANDS = _UxGT("定制命令"); // "Custom Commands" LSTR MSG_M48_TEST = _UxGT("M48探测"); LSTR MSG_M48_POINT = _UxGT("M48点"); LSTR MSG_M48_DEVIATION = _UxGT("M48偏差"); @@ -121,36 +121,36 @@ namespace Language_zh_CN { LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("完全控制"); LSTR MSG_HOTEND_OFFSET_Z = _UxGT("第二喷头是Z"); LSTR MSG_HOTEND_OFFSET_A = _UxGT("第二喷头是@"); - LSTR MSG_UBL_DOING_G29 = _UxGT("执行G29"); // "Doing G29" - LSTR MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" - LSTR MSG_UBL_LEVEL_BED = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" + LSTR MSG_UBL_DOING_G29 = _UxGT("执行G29"); // "Doing G29" + LSTR MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" + LSTR MSG_UBL_LEVEL_BED = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" LSTR MSG_LCD_TILTING_MESH = _UxGT("倾斜點"); - LSTR MSG_UBL_MANUAL_MESH = _UxGT("手工创设网格"); // "Manually Build Mesh" - LSTR MSG_UBL_BC_INSERT = _UxGT("放置垫片并测量"); // "Place shim & measure" - LSTR MSG_UBL_BC_INSERT2 = _UxGT("测量"); // "Measure" - LSTR MSG_UBL_BC_REMOVE = _UxGT("移除并测量热床"); // "Remove & measure bed" - LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("移动到下一个"); // "Moving to next" - LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("激活UBL"); // "Activate UBL" - LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("关闭UBL"); // "Deactivate UBL" - LSTR MSG_UBL_SET_TEMP_BED = _UxGT("热床温度"); // "Bed Temp" + LSTR MSG_UBL_MANUAL_MESH = _UxGT("手工创设网格"); // "Manually Build Mesh" + LSTR MSG_UBL_BC_INSERT = _UxGT("放置垫片并测量"); // "Place shim & measure" + LSTR MSG_UBL_BC_INSERT2 = _UxGT("测量"); // "Measure" + LSTR MSG_UBL_BC_REMOVE = _UxGT("移除并测量热床"); // "Remove & measure bed" + LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("移动到下一个"); // "Moving to next" + LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("激活UBL"); // "Activate UBL" + LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("关闭UBL"); // "Deactivate UBL" + LSTR MSG_UBL_SET_TEMP_BED = _UxGT("热床温度"); // "Bed Temp" LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("热床温度"); - LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("热端温度"); // "Hotend Temp" + LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("热端温度"); // "Hotend Temp" LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("热端温度"); - LSTR MSG_UBL_MESH_EDIT = _UxGT("网格编辑"); // "Mesh Edit" - LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("编辑客户网格"); // "Edit Custom Mesh" - LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("细调网格"); // "Fine Tuning Mesh" - LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("完成编辑网格"); // "Done Editing Mesh" - LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("创设客户网格"); // "Build Custom Mesh" - LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("创设网格"); // "Build Mesh" + LSTR MSG_UBL_MESH_EDIT = _UxGT("网格编辑"); // "Mesh Edit" + LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("编辑客户网格"); // "Edit Custom Mesh" + LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("细调网格"); // "Fine Tuning Mesh" + LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("完成编辑网格"); // "Done Editing Mesh" + LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("创设客户网格"); // "Build Custom Mesh" + LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("创设网格"); // "Build Mesh" #if HAS_PREHEAT - LSTR MSG_UBL_BUILD_MESH_M = _UxGT("创设 $ 网格"); // "Build PREHEAT_1_LABEL Mesh" - LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 网格"); // "Validate PREHEAT_1_LABEL Mesh" + LSTR MSG_UBL_BUILD_MESH_M = _UxGT("创设 $ 网格"); // "Build PREHEAT_1_LABEL Mesh" + LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 网格"); // "Validate PREHEAT_1_LABEL Mesh" #endif - LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("创设冷网格"); // "Build Cold Mesh" - LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("调整网格高度"); // "Adjust Mesh Height" - LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合计"); // "Height Amount" - LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准网格"); // "Validate Mesh" - LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客户网格"); // "Validate Custom Mesh" + LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("创设冷网格"); // "Build Cold Mesh" + LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("调整网格高度"); // "Adjust Mesh Height" + LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合计"); // "Height Amount" + LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准网格"); // "Validate Mesh" + LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客户网格"); // "Validate Custom Mesh" LSTR MSG_G26_HEATING_BED = _UxGT("G26加热热床"); LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26加热喷嘴"); LSTR MSG_G26_MANUAL_PRIME = _UxGT("手动填装中..."); @@ -158,38 +158,38 @@ namespace Language_zh_CN { LSTR MSG_G26_PRIME_DONE = _UxGT("填装完成"); LSTR MSG_G26_CANCELED = _UxGT("G26已取消"); LSTR MSG_G26_LEAVING = _UxGT("离开G26"); - LSTR MSG_UBL_CONTINUE_MESH = _UxGT("继续热床网格"); // "Continue Bed Mesh" - LSTR MSG_UBL_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" - LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" - LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子网格调平"); // "Grid Mesh Leveling" - LSTR MSG_UBL_MESH_LEVEL = _UxGT("调平网格"); // "Level Mesh" - LSTR MSG_UBL_SIDE_POINTS = _UxGT("边点"); // "Side Points" - LSTR MSG_UBL_MAP_TYPE = _UxGT("图类型"); // "Map Type" - LSTR MSG_UBL_OUTPUT_MAP = _UxGT("输出网格图"); // "Output Mesh Map" - LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("输出到主机"); // "Output for Host" - LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("输出到CSV"); // "Output for CSV" - LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("输出到备份"); // "Off Printer Backup" - LSTR MSG_UBL_INFO_UBL = _UxGT("输出UBL信息"); // "Output UBL Info" - LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合计"); // "Fill-in Amount" - LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in" - LSTR MSG_UBL_SMART_FILLIN = _UxGT("聪明填充"); // "Smart Fill-in" - LSTR MSG_UBL_FILLIN_MESH = _UxGT("填充网格"); // "Fill-in Mesh" - LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("作废所有的"); // "Invalidate All" - LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作废最近的"); // "Invalidate Closest" - LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("细调所有的"); // "Fine Tune All" - LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("细调最近的"); // "Fine Tune Closest" - LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("网格存储"); // "Mesh Storage" - LSTR MSG_UBL_STORAGE_SLOT = _UxGT("存储槽"); // "Memory Slot" - LSTR MSG_UBL_LOAD_MESH = _UxGT("装载热床网格"); // "Load Bed Mesh" - LSTR MSG_UBL_SAVE_MESH = _UxGT("保存热床网格"); // "Save Bed Mesh" - LSTR MSG_MESH_LOADED = _UxGT("网格 %i 已装载"); // "Mesh %i loaded" - LSTR MSG_MESH_SAVED = _UxGT("网格 %i 已保存"); // "Mesh %i saved" - LSTR MSG_UBL_NO_STORAGE = _UxGT("没有存储"); // "No storage" - LSTR MSG_UBL_SAVE_ERROR = _UxGT("错误: UBL保存"); // "Err: UBL Save" - LSTR MSG_UBL_RESTORE_ERROR = _UxGT("错误: UBL还原"); // "Err: UBL Restore" + LSTR MSG_UBL_CONTINUE_MESH = _UxGT("继续热床网格"); // "Continue Bed Mesh" + LSTR MSG_UBL_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" + LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" + LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子网格调平"); // "Grid Mesh Leveling" + LSTR MSG_UBL_MESH_LEVEL = _UxGT("调平网格"); // "Level Mesh" + LSTR MSG_UBL_SIDE_POINTS = _UxGT("边点"); // "Side Points" + LSTR MSG_UBL_MAP_TYPE = _UxGT("图类型"); // "Map Type" + LSTR MSG_UBL_OUTPUT_MAP = _UxGT("输出网格图"); // "Output Mesh Map" + LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("输出到主机"); // "Output for Host" + LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("输出到CSV"); // "Output for CSV" + LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("输出到备份"); // "Off Printer Backup" + LSTR MSG_UBL_INFO_UBL = _UxGT("输出UBL信息"); // "Output UBL Info" + LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合计"); // "Fill-in Amount" + LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in" + LSTR MSG_UBL_SMART_FILLIN = _UxGT("聪明填充"); // "Smart Fill-in" + LSTR MSG_UBL_FILLIN_MESH = _UxGT("填充网格"); // "Fill-in Mesh" + LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("作废所有的"); // "Invalidate All" + LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作废最近的"); // "Invalidate Closest" + LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("细调所有的"); // "Fine Tune All" + LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("细调最近的"); // "Fine Tune Closest" + LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("网格存储"); // "Mesh Storage" + LSTR MSG_UBL_STORAGE_SLOT = _UxGT("存储槽"); // "Memory Slot" + LSTR MSG_UBL_LOAD_MESH = _UxGT("装载热床网格"); // "Load Bed Mesh" + LSTR MSG_UBL_SAVE_MESH = _UxGT("保存热床网格"); // "Save Bed Mesh" + LSTR MSG_MESH_LOADED = _UxGT("网格 %i 已装载"); // "Mesh %i loaded" + LSTR MSG_MESH_SAVED = _UxGT("网格 %i 已保存"); // "Mesh %i saved" + LSTR MSG_UBL_NO_STORAGE = _UxGT("没有存储"); // "No storage" + LSTR MSG_UBL_SAVE_ERROR = _UxGT("错误: UBL保存"); // "Err: UBL Save" + LSTR MSG_UBL_RESTORE_ERROR = _UxGT("错误: UBL还原"); // "Err: UBL Restore" LSTR MSG_UBL_Z_OFFSET = _UxGT("Z偏移量: "); - LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" - LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL" + LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" + LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL" LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. 创设冷网格"); LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. 聪明填充"); LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. 批准网格"); @@ -198,66 +198,66 @@ namespace Language_zh_CN { LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 细调所有的"); LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. 保存热床网格"); - LSTR MSG_LED_CONTROL = _UxGT("LED控制"); // "LED Control" - LSTR MSG_LEDS = _UxGT("灯"); // "Lights" - LSTR MSG_LED_PRESETS = _UxGT("灯预置"); // "Light Presets" - LSTR MSG_SET_LEDS_RED = _UxGT("红"); // "Red" - LSTR MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange" - LSTR MSG_SET_LEDS_YELLOW = _UxGT("黄"); // "Yellow" - LSTR MSG_SET_LEDS_GREEN = _UxGT("绿"); // "Green" - LSTR MSG_SET_LEDS_BLUE = _UxGT("蓝"); // "Blue" - LSTR MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo" - LSTR MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet" - LSTR MSG_SET_LEDS_WHITE = _UxGT("白"); // "White" - LSTR MSG_SET_LEDS_DEFAULT = _UxGT("缺省"); // "Default" - LSTR MSG_CUSTOM_LEDS = _UxGT("定制灯"); // "Custom Lights" - LSTR MSG_INTENSITY_R = _UxGT("红饱和度"); // "Red Intensity" - LSTR MSG_INTENSITY_G = _UxGT("绿饱和度"); // "Green Intensity" - LSTR MSG_INTENSITY_B = _UxGT("蓝饱和度"); // "Blue Intensity" - LSTR MSG_INTENSITY_W = _UxGT("白饱和度"); // "White Intensity" - LSTR MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness" + LSTR MSG_LED_CONTROL = _UxGT("LED控制"); // "LED Control" + LSTR MSG_LEDS = _UxGT("灯"); // "Lights" + LSTR MSG_LED_PRESETS = _UxGT("灯预置"); // "Light Presets" + LSTR MSG_SET_LEDS_RED = _UxGT("红"); // "Red" + LSTR MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange" + LSTR MSG_SET_LEDS_YELLOW = _UxGT("黄"); // "Yellow" + LSTR MSG_SET_LEDS_GREEN = _UxGT("绿"); // "Green" + LSTR MSG_SET_LEDS_BLUE = _UxGT("蓝"); // "Blue" + LSTR MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo" + LSTR MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet" + LSTR MSG_SET_LEDS_WHITE = _UxGT("白"); // "White" + LSTR MSG_SET_LEDS_DEFAULT = _UxGT("缺省"); // "Default" + LSTR MSG_CUSTOM_LEDS = _UxGT("定制灯"); // "Custom Lights" + LSTR MSG_INTENSITY_R = _UxGT("红饱和度"); // "Red Intensity" + LSTR MSG_INTENSITY_G = _UxGT("绿饱和度"); // "Green Intensity" + LSTR MSG_INTENSITY_B = _UxGT("蓝饱和度"); // "Blue Intensity" + LSTR MSG_INTENSITY_W = _UxGT("白饱和度"); // "White Intensity" + LSTR MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness" - LSTR MSG_MOVING = _UxGT("移动..."); // "Moving..." - LSTR MSG_FREE_XY = _UxGT("释放 XY"); // "Free XY" - LSTR MSG_MOVE_X = _UxGT("移动X"); // "Move X" - LSTR MSG_MOVE_Y = _UxGT("移动Y"); // "Move Y" - LSTR MSG_MOVE_Z = _UxGT("移动Z"); // "Move Z" - LSTR MSG_MOVE_N = _UxGT("移动@"); // "Move @" - LSTR MSG_MOVE_E = _UxGT("挤出机"); // "Extruder" - LSTR MSG_MOVE_EN = _UxGT("挤出机 *"); // "Extruder" + LSTR MSG_MOVING = _UxGT("移动..."); // "Moving..." + LSTR MSG_FREE_XY = _UxGT("释放 XY"); // "Free XY" + LSTR MSG_MOVE_X = _UxGT("移动X"); // "Move X" + LSTR MSG_MOVE_Y = _UxGT("移动Y"); // "Move Y" + LSTR MSG_MOVE_Z = _UxGT("移动Z"); // "Move Z" + LSTR MSG_MOVE_N = _UxGT("移动@"); // "Move @" + LSTR MSG_MOVE_E = _UxGT("挤出机"); // "Extruder" + LSTR MSG_MOVE_EN = _UxGT("挤出机 *"); // "Extruder" LSTR MSG_HOTEND_TOO_COLD = _UxGT("热端太冷"); - LSTR MSG_MOVE_N_MM = _UxGT("移动 $ mm"); // "Move 0.025mm" - LSTR MSG_MOVE_01MM = _UxGT("移动 0.1 mm"); // "Move 0.1mm" - LSTR MSG_MOVE_1MM = _UxGT("移动 1 mm"); // "Move 1mm" - LSTR MSG_MOVE_10MM = _UxGT("移动 10 mm"); // "Move 10mm" - LSTR MSG_MOVE_100MM = _UxGT("移动 100 mm"); // "Move 100mm" - LSTR MSG_SPEED = _UxGT("速率"); // "Speed" - LSTR MSG_MESH_Z_OFFSET = _UxGT("热床Z"); // "Bed Z" - LSTR MSG_NOZZLE = _UxGT("喷嘴"); // "Nozzle" 噴嘴 - LSTR MSG_NOZZLE_N = _UxGT("喷嘴 ~"); // "Nozzle" 噴嘴 + LSTR MSG_MOVE_N_MM = _UxGT("移动 $ mm"); // "Move 0.025mm" + LSTR MSG_MOVE_01MM = _UxGT("移动 0.1 mm"); // "Move 0.1mm" + LSTR MSG_MOVE_1MM = _UxGT("移动 1 mm"); // "Move 1mm" + LSTR MSG_MOVE_10MM = _UxGT("移动 10 mm"); // "Move 10mm" + LSTR MSG_MOVE_100MM = _UxGT("移动 100 mm"); // "Move 100mm" + LSTR MSG_SPEED = _UxGT("速率"); // "Speed" + LSTR MSG_MESH_Z_OFFSET = _UxGT("热床Z"); // "Bed Z" + LSTR MSG_NOZZLE = _UxGT("喷嘴"); // "Nozzle" 噴嘴 + LSTR MSG_NOZZLE_N = _UxGT("喷嘴 ~"); // "Nozzle" 噴嘴 LSTR MSG_NOZZLE_PARKED = _UxGT("喷嘴已停靠"); LSTR MSG_NOZZLE_STANDBY = _UxGT("喷嘴待命中"); - LSTR MSG_BED = _UxGT("热床"); // "Bed" + LSTR MSG_BED = _UxGT("热床"); // "Bed" LSTR MSG_CHAMBER = _UxGT("机箱壳"); - LSTR MSG_FAN_SPEED = _UxGT("风扇速率"); // "Fan speed" - LSTR MSG_FAN_SPEED_N = _UxGT("风扇速率 ~"); // "Fan speed" + LSTR MSG_FAN_SPEED = _UxGT("风扇速率"); // "Fan speed" + LSTR MSG_FAN_SPEED_N = _UxGT("风扇速率 ~"); // "Fan speed" LSTR MSG_STORED_FAN_N = _UxGT("存储的风扇 ~"); - LSTR MSG_EXTRA_FAN_SPEED = _UxGT("额外风扇速率"); // "Extra fan speed" - LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("额外风扇速率 ~"); // "Extra fan speed" + LSTR MSG_EXTRA_FAN_SPEED = _UxGT("额外风扇速率"); // "Extra fan speed" + LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("额外风扇速率 ~"); // "Extra fan speed" LSTR MSG_CONTROLLER_FAN = _UxGT("控制器风扇"); LSTR MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("空闲速度"); LSTR MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("自动模式"); LSTR MSG_CONTROLLER_FAN_SPEED = _UxGT("工作速度"); LSTR MSG_CONTROLLER_FAN_DURATION = _UxGT("空闲周期"); - LSTR MSG_FLOW = _UxGT("挤出速率"); // "Flow" - LSTR MSG_FLOW_N = _UxGT("挤出速率 ~"); // "Flow" - LSTR MSG_CONTROL = _UxGT("控制"); // "Control" - LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); // " " LCD_STR_THERMOMETER " Min" - LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); // " " LCD_STR_THERMOMETER " Max" - LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 因数"); // " " LCD_STR_THERMOMETER " Fact" - LSTR MSG_AUTOTEMP = _UxGT("自动控温"); // "Autotemp" - LSTR MSG_LCD_ON = _UxGT("开"); // "On" - LSTR MSG_LCD_OFF = _UxGT("关"); // "Off" + LSTR MSG_FLOW = _UxGT("挤出速率"); // "Flow" + LSTR MSG_FLOW_N = _UxGT("挤出速率 ~"); // "Flow" + LSTR MSG_CONTROL = _UxGT("控制"); // "Control" + LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); // " " LCD_STR_THERMOMETER " Min" + LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); // " " LCD_STR_THERMOMETER " Max" + LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 因数"); // " " LCD_STR_THERMOMETER " Fact" + LSTR MSG_AUTOTEMP = _UxGT("自动控温"); // "Autotemp" + LSTR MSG_LCD_ON = _UxGT("开"); // "On" + LSTR MSG_LCD_OFF = _UxGT("关"); // "Off" LSTR MSG_PID_AUTOTUNE = _UxGT("自动PID"); LSTR MSG_PID_AUTOTUNE_E = _UxGT("自动PID *"); LSTR MSG_PID_AUTOTUNE_DONE = _UxGT("PID调整完成"); @@ -265,68 +265,68 @@ namespace Language_zh_CN { LSTR MSG_PID_TEMP_TOO_HIGH = _UxGT("自动调失败! 温度太高"); LSTR MSG_PID_TIMEOUT = _UxGT("自动调失败! 超时"); LSTR MSG_SELECT_E = _UxGT("选择 *"); - LSTR MSG_ACC = _UxGT("加速度"); // "Accel" acceleration - LSTR MSG_JERK = _UxGT("抖动速率"); // "Jerk" - LSTR MSG_VA_JERK = _UxGT("轴抖动速率") STR_A; // "Va-jerk" - LSTR MSG_VB_JERK = _UxGT("轴抖动速率") STR_B; // "Vb-jerk" - LSTR MSG_VC_JERK = _UxGT("轴抖动速率") STR_C; // "Vc-jerk" - LSTR MSG_VN_JERK = _UxGT("轴抖动速率@"); // "V@-jerk" - LSTR MSG_VE_JERK = _UxGT("挤出机抖动速率"); // "Ve-jerk" + LSTR MSG_ACC = _UxGT("加速度"); // "Accel" acceleration + LSTR MSG_JERK = _UxGT("抖动速率"); // "Jerk" + LSTR MSG_VA_JERK = _UxGT("轴抖动速率") STR_A; // "Va-jerk" + LSTR MSG_VB_JERK = _UxGT("轴抖动速率") STR_B; // "Vb-jerk" + LSTR MSG_VC_JERK = _UxGT("轴抖动速率") STR_C; // "Vc-jerk" + LSTR MSG_VN_JERK = _UxGT("轴抖动速率@"); // "V@-jerk" + LSTR MSG_VE_JERK = _UxGT("挤出机抖动速率"); // "Ve-jerk" LSTR MSG_JUNCTION_DEVIATION = _UxGT("接点差"); - LSTR MSG_MAX_SPEED = _UxGT("速度"); // "Velocity" - LSTR MSG_VMAX_A = _UxGT("最大进料速率") STR_A; // "Vmax " max_feedrate_mm_s + LSTR MSG_MAX_SPEED = _UxGT("速度"); // "Velocity" + LSTR MSG_VMAX_A = _UxGT("最大进料速率") STR_A; // "Vmax " max_feedrate_mm_s LSTR MSG_VMAX_B = _UxGT("最大进料速率") STR_B; LSTR MSG_VMAX_C = _UxGT("最大进料速率") STR_C; LSTR MSG_VMAX_N = _UxGT("最大进料速率@"); LSTR MSG_VMAX_E = _UxGT("最大进料速率E"); LSTR MSG_VMAX_EN = _UxGT("最大进料速率 *"); - LSTR MSG_VMIN = _UxGT("最小进料速率"); // "Vmin" min_feedrate_mm_s - LSTR MSG_VTRAV_MIN = _UxGT("最小移动速率"); // "VTrav min" min_travel_feedrate_mm_s, (target) speed of the move - LSTR MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" - LSTR MSG_AMAX_A = _UxGT("最大打印加速度") STR_A; // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + LSTR MSG_VMIN = _UxGT("最小进料速率"); // "Vmin" min_feedrate_mm_s + LSTR MSG_VTRAV_MIN = _UxGT("最小移动速率"); // "VTrav min" min_travel_feedrate_mm_s, (target) speed of the move + LSTR MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" + LSTR MSG_AMAX_A = _UxGT("最大打印加速度") STR_A; // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves LSTR MSG_AMAX_B = _UxGT("最大打印加速度") STR_B; LSTR MSG_AMAX_C = _UxGT("最大打印加速度") STR_C; LSTR MSG_AMAX_N = _UxGT("最大打印加速度@"); LSTR MSG_AMAX_E = _UxGT("最大打印加速度E"); LSTR MSG_AMAX_EN = _UxGT("最大打印加速度 *"); - LSTR MSG_A_RETRACT = _UxGT("收进加速度"); // "A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts - LSTR MSG_A_TRAVEL = _UxGT("非打印移动加速度"); // "A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves + LSTR MSG_A_RETRACT = _UxGT("收进加速度"); // "A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts + LSTR MSG_A_TRAVEL = _UxGT("非打印移动加速度"); // "A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves LSTR MSG_XY_FREQUENCY_LIMIT = _UxGT("频率最大"); LSTR MSG_XY_FREQUENCY_FEEDRATE = _UxGT("进给速度"); - LSTR MSG_STEPS_PER_MM = _UxGT("轴步数/mm"); // "Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 - LSTR MSG_A_STEPS = STR_A _UxGT(" 步数/mm"); // "Asteps/mm" + LSTR MSG_STEPS_PER_MM = _UxGT("轴步数/mm"); // "Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 + LSTR MSG_A_STEPS = STR_A _UxGT(" 步数/mm"); // "Asteps/mm" LSTR MSG_B_STEPS = STR_B _UxGT(" 步数/mm"); LSTR MSG_C_STEPS = STR_C _UxGT(" 步数/mm"); LSTR MSG_N_STEPS = _UxGT("@ 步数/mm"); - LSTR MSG_E_STEPS = _UxGT("E 步数/mm"); // "Esteps/mm" + LSTR MSG_E_STEPS = _UxGT("E 步数/mm"); // "Esteps/mm" LSTR MSG_EN_STEPS = _UxGT("* 步数/mm"); - LSTR MSG_TEMPERATURE = _UxGT("温度"); // "Temperature" - LSTR MSG_MOTION = _UxGT("运动"); // "Motion" - LSTR MSG_FILAMENT = _UxGT("料丝"); // "Filament" menu_advanced_filament - LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E 在 mm") SUPERSCRIPT_THREE; // "E in mm3" volumetric_enabled + LSTR MSG_TEMPERATURE = _UxGT("温度"); // "Temperature" + LSTR MSG_MOTION = _UxGT("运动"); // "Motion" + LSTR MSG_FILAMENT = _UxGT("料丝"); // "Filament" menu_advanced_filament + LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("E 在 mm") SUPERSCRIPT_THREE; // "E in mm3" volumetric_enabled LSTR MSG_VOLUMETRIC_LIMIT = _UxGT("E 限制 在 mm") SUPERSCRIPT_THREE; LSTR MSG_VOLUMETRIC_LIMIT_E = _UxGT("E 限制 *"); - LSTR MSG_FILAMENT_DIAM = _UxGT("丝料直径"); // "Fil. Dia." + LSTR MSG_FILAMENT_DIAM = _UxGT("丝料直径"); // "Fil. Dia." LSTR MSG_FILAMENT_DIAM_E = _UxGT("丝料直径 *"); - LSTR MSG_FILAMENT_UNLOAD = _UxGT("卸载 mm"); // "Unload mm" - LSTR MSG_FILAMENT_LOAD = _UxGT("装载 mm"); // "Load mm" + LSTR MSG_FILAMENT_UNLOAD = _UxGT("卸载 mm"); // "Unload mm" + LSTR MSG_FILAMENT_LOAD = _UxGT("装载 mm"); // "Load mm" LSTR MSG_ADVANCE_K = _UxGT("Advance K"); LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *"); - LSTR MSG_CONTRAST = _UxGT("LCD对比度"); // "LCD contrast" - LSTR MSG_STORE_EEPROM = _UxGT("保存设置"); // "Store memory" - LSTR MSG_LOAD_EEPROM = _UxGT("装载设置"); // "Load memory" - LSTR MSG_RESTORE_DEFAULTS = _UxGT("恢复安全值"); // "Restore Defaults" - LSTR MSG_INIT_EEPROM = _UxGT("初始化设置"); // "Initialize EEPROM" - LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM CRC 错误"); - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("EEPROM Index 错误"); - LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM Version 错误"); + LSTR MSG_CONTRAST = _UxGT("LCD对比度"); // "LCD contrast" + LSTR MSG_STORE_EEPROM = _UxGT("保存设置"); // "Store memory" + LSTR MSG_LOAD_EEPROM = _UxGT("装载设置"); // "Load memory" + LSTR MSG_RESTORE_DEFAULTS = _UxGT("恢复安全值"); // "Restore Defaults" + LSTR MSG_INIT_EEPROM = _UxGT("初始化设置"); // "Initialize EEPROM" + LSTR MSG_ERR_EEPROM_CRC = _UxGT("EEPROM 校验和 错误"); + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("EEPROM 尺寸 错误"); + LSTR MSG_ERR_EEPROM_VERSION = _UxGT("EEPROM 版本 错误"); LSTR MSG_SETTINGS_STORED = _UxGT("设置已保存"); LSTR MSG_MEDIA_UPDATE = _UxGT("存储器更新"); LSTR MSG_RESET_PRINTER = _UxGT("复位打印机"); LSTR MSG_REFRESH = LCD_STR_REFRESH _UxGT("刷新"); - LSTR MSG_INFO_SCREEN = _UxGT("信息屏"); // "Info screen" - LSTR MSG_PREPARE = _UxGT("准备"); // "Prepare" - LSTR MSG_TUNE = _UxGT("调整"); // "Tune" + LSTR MSG_INFO_SCREEN = _UxGT("信息屏"); // "Info screen" + LSTR MSG_PREPARE = _UxGT("准备"); // "Prepare" + LSTR MSG_TUNE = _UxGT("调整"); // "Tune" LSTR MSG_POWER_MONITOR = _UxGT("电源监控"); LSTR MSG_CURRENT = _UxGT("电流"); LSTR MSG_VOLTAGE = _UxGT("电压"); @@ -343,33 +343,33 @@ namespace Language_zh_CN { LSTR MSG_BUTTON_BACK = _UxGT("返回"); LSTR MSG_BUTTON_PROCEED = _UxGT("继续"); LSTR MSG_PAUSING = _UxGT("暂停中..."); - LSTR MSG_PAUSE_PRINT = _UxGT("暂停打印"); // "Pause print" - LSTR MSG_RESUME_PRINT = _UxGT("恢复打印"); // "Resume print" - LSTR MSG_STOP_PRINT = _UxGT("停止打印"); // "Stop print" + LSTR MSG_PAUSE_PRINT = _UxGT("暂停打印"); // "Pause print" + LSTR MSG_RESUME_PRINT = _UxGT("恢复打印"); // "Resume print" + LSTR MSG_STOP_PRINT = _UxGT("停止打印"); // "Stop print" LSTR MSG_PRINTING_OBJECT = _UxGT("打印物体"); LSTR MSG_CANCEL_OBJECT = _UxGT("取消物体"); LSTR MSG_CANCEL_OBJECT_N = _UxGT("取消物体 {"); LSTR MSG_OUTAGE_RECOVERY = _UxGT("中断恢复"); - LSTR MSG_MEDIA_MENU = _UxGT("从存储卡上打印"); // "Print from SD" - LSTR MSG_NO_MEDIA = _UxGT("无存储卡"); // "No SD card" - LSTR MSG_DWELL = _UxGT("休眠中 ..."); // "Sleep..." - LSTR MSG_USERWAIT = _UxGT("点击继续 ..."); // "Click to resume..." - LSTR MSG_PRINT_PAUSED = _UxGT("暫停打印"); // "Print paused" + LSTR MSG_MEDIA_MENU = _UxGT("从存储卡上打印"); // "Print from SD" + LSTR MSG_NO_MEDIA = _UxGT("无存储卡"); // "No SD card" + LSTR MSG_DWELL = _UxGT("休眠中 ..."); // "Sleep..." + LSTR MSG_USERWAIT = _UxGT("点击继续 ..."); // "Click to resume..." + LSTR MSG_PRINT_PAUSED = _UxGT("暫停打印"); // "Print paused" LSTR MSG_PRINTING = _UxGT("打印中..."); - LSTR MSG_PRINT_ABORTED = _UxGT("已取消打印"); // "Print aborted" + LSTR MSG_PRINT_ABORTED = _UxGT("已取消打印"); // "Print aborted" LSTR MSG_PRINT_DONE = _UxGT("打印已完成"); - LSTR MSG_NO_MOVE = _UxGT("无移动"); // "No move." - LSTR MSG_KILLED = _UxGT("已杀掉"); // "KILLED. " - LSTR MSG_STOPPED = _UxGT("已停止"); // "STOPPED. " - LSTR MSG_CONTROL_RETRACT = _UxGT("回抽长度mm"); // "Retract mm" retract_length, retract length (positive mm) - LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("换手回抽长度mm"); // "Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change - LSTR MSG_CONTROL_RETRACTF = _UxGT("回抽速率mm/s"); // "Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) - LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); // "Hop mm" retract_zraise, retract Z-lift - LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("回抽恢复长度mm"); // "UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) - LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("换手回抽恢复长度mm"); // "S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) - LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回抽恢复后进料速率mm/s"); // "Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) - LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" - LSTR MSG_AUTORETRACT = _UxGT("自动抽回"); // "Auto-Retract" autoretract_enabled, + LSTR MSG_NO_MOVE = _UxGT("无移动"); // "No move." + LSTR MSG_KILLED = _UxGT("已杀掉"); // "KILLED. " + LSTR MSG_STOPPED = _UxGT("已停止"); // "STOPPED. " + LSTR MSG_CONTROL_RETRACT = _UxGT("回抽长度mm"); // "Retract mm" retract_length, retract length (positive mm) + LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("换手回抽长度mm"); // "Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change + LSTR MSG_CONTROL_RETRACTF = _UxGT("回抽速率mm/s"); // "Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) + LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); // "Hop mm" retract_zraise, retract Z-lift + LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("回抽恢复长度mm"); // "UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) + LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("换手回抽恢复长度mm"); // "S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) + LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回抽恢复后进料速率mm/s"); // "Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) + LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" + LSTR MSG_AUTORETRACT = _UxGT("自动抽回"); // "Auto-Retract" autoretract_enabled, LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("交换长度"); LSTR MSG_FILAMENT_SWAP_EXTRA = _UxGT("额外的交换"); LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("清洗长度"); @@ -387,19 +387,19 @@ namespace Language_zh_CN { LSTR MSG_TOOL_MIGRATION_AUTO = _UxGT("自动迁移"); LSTR MSG_TOOL_MIGRATION_END = _UxGT("上一个挤出机"); LSTR MSG_TOOL_MIGRATION_SWAP = _UxGT("迁移至 *"); - LSTR MSG_FILAMENTCHANGE = _UxGT("更换丝料"); // "Change filament" - LSTR MSG_FILAMENTCHANGE_E = _UxGT("更换丝料 *"); // "Change filament" - LSTR MSG_FILAMENTLOAD = _UxGT("装载丝料"); // "Load filament" - LSTR MSG_FILAMENTLOAD_E = _UxGT("装载丝料 *"); // "Load filament" - LSTR MSG_FILAMENTUNLOAD = _UxGT("卸载丝料"); // "Unload filament" - LSTR MSG_FILAMENTUNLOAD_E = _UxGT("卸载丝料 *"); // "Unload filament" - LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("卸载全部"); // "Unload All" - LSTR MSG_ATTACH_MEDIA = _UxGT("初始化存储卡"); // "Init. SD card" - LSTR MSG_CHANGE_MEDIA = _UxGT("更换存储卡"); // "Change SD card" + LSTR MSG_FILAMENTCHANGE = _UxGT("更换丝料"); // "Change filament" + LSTR MSG_FILAMENTCHANGE_E = _UxGT("更换丝料 *"); // "Change filament" + LSTR MSG_FILAMENTLOAD = _UxGT("装载丝料"); // "Load filament" + LSTR MSG_FILAMENTLOAD_E = _UxGT("装载丝料 *"); // "Load filament" + LSTR MSG_FILAMENTUNLOAD = _UxGT("卸载丝料"); // "Unload filament" + LSTR MSG_FILAMENTUNLOAD_E = _UxGT("卸载丝料 *"); // "Unload filament" + LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("卸载全部"); // "Unload All" + LSTR MSG_ATTACH_MEDIA = _UxGT("初始化存储卡"); // "Init. SD card" + LSTR MSG_CHANGE_MEDIA = _UxGT("更换存储卡"); // "Change SD card" LSTR MSG_RELEASE_MEDIA = _UxGT("释放存储卡"); - LSTR MSG_ZPROBE_OUT = _UxGT("Z探针在热床之外"); // "Z probe out. bed" Z probe is not within the physical limits - LSTR MSG_SKEW_FACTOR = _UxGT("偏斜因数"); // "Skew Factor" - LSTR MSG_BLTOUCH = _UxGT("BLTouch"); // "BLTouch" + LSTR MSG_ZPROBE_OUT = _UxGT("Z探针在热床之外"); // "Z probe out. bed" Z probe is not within the physical limits + LSTR MSG_SKEW_FACTOR = _UxGT("偏斜因数"); // "Skew Factor" + LSTR MSG_BLTOUCH = _UxGT("BLTouch"); // "BLTouch" LSTR MSG_BLTOUCH_SELFTEST = _UxGT("自检"); LSTR MSG_BLTOUCH_RESET = _UxGT("重置"); LSTR MSG_BLTOUCH_STOW = _UxGT("装载"); @@ -419,96 +419,96 @@ namespace Language_zh_CN { LSTR MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("部署TouchMI"); LSTR MSG_MANUAL_DEPLOY = _UxGT("部署Z探针"); LSTR MSG_MANUAL_STOW = _UxGT("收好Z探针"); - LSTR MSG_HOME_FIRST = _UxGT("归位 %s 先"); // "Home ... first" + LSTR MSG_HOME_FIRST = _UxGT("归位 %s 先"); // "Home ... first" LSTR MSG_ZPROBE_OFFSETS = _UxGT("探针偏移量"); LSTR MSG_ZPROBE_XOFFSET = _UxGT("探针X偏移"); LSTR MSG_ZPROBE_YOFFSET = _UxGT("探针Y偏移"); - LSTR MSG_ZPROBE_ZOFFSET = _UxGT("探针Z偏移"); // "Z Offset" - LSTR MSG_BABYSTEP_X = _UxGT("微量调整X轴"); // "Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts - LSTR MSG_BABYSTEP_Y = _UxGT("微量调整Y轴"); // "Babystep Y" - LSTR MSG_BABYSTEP_Z = _UxGT("微量调整Z轴"); // "Babystep Z" + LSTR MSG_ZPROBE_ZOFFSET = _UxGT("探针Z偏移"); // "Z Offset" + LSTR MSG_BABYSTEP_X = _UxGT("微量调整X轴"); // "Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts + LSTR MSG_BABYSTEP_Y = _UxGT("微量调整Y轴"); // "Babystep Y" + LSTR MSG_BABYSTEP_Z = _UxGT("微量调整Z轴"); // "Babystep Z" LSTR MSG_BABYSTEP_TOTAL = _UxGT("总计"); - LSTR MSG_ENDSTOP_ABORT = _UxGT("挡块终止"); // "Endstop abort" - LSTR MSG_HEATING_FAILED_LCD = _UxGT("加热失败"); // "Heating failed" - LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("错误:冗余温度"); // "Err: REDUNDANT TEMP" - LSTR MSG_THERMAL_RUNAWAY = _UxGT("温控失控"); // "THERMAL RUNAWAY" + LSTR MSG_ENDSTOP_ABORT = _UxGT("挡块终止"); // "Endstop abort" + LSTR MSG_HEATING_FAILED_LCD = _UxGT("加热失败"); // "Heating failed" + LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("错误:冗余温度"); // "Err: REDUNDANT TEMP" + LSTR MSG_THERMAL_RUNAWAY = _UxGT("温控失控"); // "THERMAL RUNAWAY" LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("热床热量失控"); LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("机箱热量失控"); - LSTR MSG_ERR_MAXTEMP = _UxGT("错误:最高温度"); // "Err: MAXTEMP" - LSTR MSG_ERR_MINTEMP = _UxGT("错误:最低温度"); // "Err: MINTEMP" - LSTR MSG_HALTED = _UxGT("打印停机"); // "PRINTER HALTED" - LSTR MSG_PLEASE_RESET = _UxGT("请重置"); // "Please reset" - LSTR MSG_HEATING = _UxGT("加热中 ..."); // "Heating..." + LSTR MSG_ERR_MAXTEMP = _UxGT("错误:最高温度"); // "Err: MAXTEMP" + LSTR MSG_ERR_MINTEMP = _UxGT("错误:最低温度"); // "Err: MINTEMP" + LSTR MSG_HALTED = _UxGT("打印停机"); // "PRINTER HALTED" + LSTR MSG_PLEASE_RESET = _UxGT("请重置"); // "Please reset" + LSTR MSG_HEATING = _UxGT("加热中 ..."); // "Heating..." LSTR MSG_COOLING = _UxGT("冷却中 ..."); - LSTR MSG_BED_HEATING = _UxGT("加热热床中 ..."); // "Bed Heating..." + LSTR MSG_BED_HEATING = _UxGT("加热热床中 ..."); // "Bed Heating..." LSTR MSG_BED_COOLING = _UxGT("热床冷却中 ..."); LSTR MSG_CHAMBER_HEATING = _UxGT("机箱加热中 ..."); LSTR MSG_CHAMBER_COOLING = _UxGT("机箱冷却中 ..."); - LSTR MSG_DELTA_CALIBRATE = _UxGT("⊿校准"); // "Delta Calibration" - LSTR MSG_DELTA_CALIBRATE_X = _UxGT("⊿校准X"); // "Calibrate X" - LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校准Y"); // "Calibrate Y" - LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校准Z"); // "Calibrate Z" - LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校准中心"); // "Calibrate Center" - LSTR MSG_DELTA_SETTINGS = _UxGT("⊿设置"); // "Delta Settings" - LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自动校准"); // "Auto Calibration" - LSTR MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" - LSTR MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" - LSTR MSG_DELTA_RADIUS = _UxGT("⊿半径"); // "Radius" - LSTR MSG_INFO_MENU = _UxGT("关于打印机"); // "About Printer" - LSTR MSG_INFO_PRINTER_MENU = _UxGT("打印机信息"); // "Printer Info" - LSTR MSG_3POINT_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" - LSTR MSG_LINEAR_LEVELING = _UxGT("线性调平"); // "Linear Leveling" - LSTR MSG_BILINEAR_LEVELING = _UxGT("双线性调平"); // "Bilinear Leveling" - LSTR MSG_UBL_LEVELING = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" - LSTR MSG_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" - LSTR MSG_INFO_STATS_MENU = _UxGT("打印机统计"); // "Printer Stats" - LSTR MSG_INFO_BOARD_MENU = _UxGT("主板信息"); // "Board Info" - LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("温度计"); // "Thermistors" - LSTR MSG_INFO_EXTRUDERS = _UxGT("挤出机"); // "Extruders" - LSTR MSG_INFO_BAUDRATE = _UxGT("波特率"); // "Baud" - LSTR MSG_INFO_PROTOCOL = _UxGT("协议"); // "Protocol" + LSTR MSG_DELTA_CALIBRATE = _UxGT("⊿校准"); // "Delta Calibration" + LSTR MSG_DELTA_CALIBRATE_X = _UxGT("⊿校准X"); // "Calibrate X" + LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校准Y"); // "Calibrate Y" + LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校准Z"); // "Calibrate Z" + LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校准中心"); // "Calibrate Center" + LSTR MSG_DELTA_SETTINGS = _UxGT("⊿设置"); // "Delta Settings" + LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自动校准"); // "Auto Calibration" + LSTR MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" + LSTR MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" + LSTR MSG_DELTA_RADIUS = _UxGT("⊿半径"); // "Radius" + LSTR MSG_INFO_MENU = _UxGT("关于打印机"); // "About Printer" + LSTR MSG_INFO_PRINTER_MENU = _UxGT("打印机信息"); // "Printer Info" + LSTR MSG_3POINT_LEVELING = _UxGT("三点调平"); // "3-Point Leveling" + LSTR MSG_LINEAR_LEVELING = _UxGT("线性调平"); // "Linear Leveling" + LSTR MSG_BILINEAR_LEVELING = _UxGT("双线性调平"); // "Bilinear Leveling" + LSTR MSG_UBL_LEVELING = _UxGT("统一热床调平(UBL)"); // "Unified Bed Leveling" + LSTR MSG_MESH_LEVELING = _UxGT("网格调平"); // "Mesh Leveling" + LSTR MSG_INFO_STATS_MENU = _UxGT("打印机统计"); // "Printer Stats" + LSTR MSG_INFO_BOARD_MENU = _UxGT("主板信息"); // "Board Info" + LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("温度计"); // "Thermistors" + LSTR MSG_INFO_EXTRUDERS = _UxGT("挤出机"); // "Extruders" + LSTR MSG_INFO_BAUDRATE = _UxGT("波特率"); // "Baud" + LSTR MSG_INFO_PROTOCOL = _UxGT("协议"); // "Protocol" LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("监控温度失控:关"); LSTR MSG_INFO_RUNAWAY_ON = _UxGT("监控温度失控:开"); LSTR MSG_HOTEND_IDLE_TIMEOUT = _UxGT("热端空闲超时"); - LSTR MSG_CASE_LIGHT = _UxGT("外壳灯"); // "Case light" - LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("灯亮度"); // "Light BRIGHTNESS" + LSTR MSG_CASE_LIGHT = _UxGT("外壳灯"); // "Case light" + LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("灯亮度"); // "Light BRIGHTNESS" - LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("打印机不正确"); // "The printer is incorrect" + LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("打印机不正确"); // "The printer is incorrect" #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2 - LSTR MSG_INFO_PRINT_COUNT = _UxGT("打印计数"); // "Print Count" - LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成了"); // "Completed" - LSTR MSG_INFO_PRINT_TIME = _UxGT("总打印时间"); // "Total print time" - LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最长工作时间"); // "Longest job time" - LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("总计挤出"); // "Extruded total" + LSTR MSG_INFO_PRINT_COUNT = _UxGT("打印计数"); // "Print Count" + LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成了"); // "Completed" + LSTR MSG_INFO_PRINT_TIME = _UxGT("总打印时间"); // "Total print time" + LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最长工作时间"); // "Longest job time" + LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("总计挤出"); // "Extruded total" #else - LSTR MSG_INFO_PRINT_COUNT = _UxGT("打印数"); // "Prints" - LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); // "Completed" - LSTR MSG_INFO_PRINT_TIME = _UxGT("总共"); // "Total" - LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最长"); // "Longest" - LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("已挤出"); // "Extruded" + LSTR MSG_INFO_PRINT_COUNT = _UxGT("打印数"); // "Prints" + LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); // "Completed" + LSTR MSG_INFO_PRINT_TIME = _UxGT("总共"); // "Total" + LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最长"); // "Longest" + LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("已挤出"); // "Extruded" #endif - LSTR MSG_INFO_MIN_TEMP = _UxGT("最低温度"); // "Min Temp" - LSTR MSG_INFO_MAX_TEMP = _UxGT("最高温度"); // "Max Temp" - LSTR MSG_INFO_PSU = _UxGT("电源供应"); // "Power Supply" - LSTR MSG_DRIVE_STRENGTH = _UxGT("驱动力度"); // "Drive Strength" - LSTR MSG_DAC_PERCENT_N = _UxGT("@ 驱动 %"); // "E Driver %" + LSTR MSG_INFO_MIN_TEMP = _UxGT("最低温度"); // "Min Temp" + LSTR MSG_INFO_MAX_TEMP = _UxGT("最高温度"); // "Max Temp" + LSTR MSG_INFO_PSU = _UxGT("电源供应"); // "Power Supply" + LSTR MSG_DRIVE_STRENGTH = _UxGT("驱动力度"); // "Drive Strength" + LSTR MSG_DAC_PERCENT_N = _UxGT("@ 驱动 %"); // "E Driver %" LSTR MSG_ERROR_TMC = _UxGT("TMC 连接错误"); - LSTR MSG_DAC_EEPROM_WRITE = _UxGT("保存驱动设置"); // "DAC EEPROM Write" + LSTR MSG_DAC_EEPROM_WRITE = _UxGT("保存驱动设置"); // "DAC EEPROM Write" LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("更换料"); - LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("打印已暂停"); // "PRINT PAUSED" - LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("装载丝料"); // "LOAD FILAMENT" - LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸载丝料"); // "UNLOAD FILAMENT" - LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢复选项:"); // "RESUME OPTIONS:" - LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more" - LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢复打印"); // "Resume print" - LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 喷嘴: "); // " Nozzle: " + LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("打印已暂停"); // "PRINT PAUSED" + LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("装载丝料"); // "LOAD FILAMENT" + LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸载丝料"); // "UNLOAD FILAMENT" + LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢复选项:"); // "RESUME OPTIONS:" + LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more" + LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢复打印"); // "Resume print" + LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 喷嘴: "); // " Nozzle: " LSTR MSG_RUNOUT_SENSOR = _UxGT("断料传感器"); LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("断料距离mm"); - LSTR MSG_KILL_HOMING_FAILED = _UxGT("归原位失败"); // "Homing failed" - LSTR MSG_LCD_PROBING_FAILED = _UxGT("探针探测失败"); // "Probing failed" + LSTR MSG_KILL_HOMING_FAILED = _UxGT("归原位失败"); // "Homing failed" + LSTR MSG_LCD_PROBING_FAILED = _UxGT("探针探测失败"); // "Probing failed" LSTR MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("选择料"); LSTR MSG_MMU2_MENU = _UxGT("MMU"); @@ -566,27 +566,27 @@ namespace Language_zh_CN { #if LCD_HEIGHT >= 4 LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("按下按钮", "恢复打印")); LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停靠中...")); - LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待开始", "丝料", "变更")); // "Wait for start of the filament change" + LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待开始", "丝料", "变更")); // "Wait for start of the filament change" LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入料", "并按下", "以继续")); - LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按钮来", "加热喷嘴.")); // "Press button to heat nozzle." - LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加热喷嘴", "请等待 ...")); // "Heating nozzle Please wait..." - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下丝料")); // "Wait for filament unload" - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "进料")); // "Wait for filament load" - LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "丝料清除")); // "Wait for filament purge" + LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按钮来", "加热喷嘴.")); // "Press button to heat nozzle." + LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加热喷嘴", "请等待 ...")); // "Heating nozzle Please wait..." + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下丝料")); // "Wait for filament unload" + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "进料")); // "Wait for filament load" + LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "丝料清除")); // "Wait for filament purge" LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("按下已完成", "料的清洗")); - LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待打印", "恢复")); // "Wait for print to resume" + LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待打印", "恢复")); // "Wait for print to resume" #else LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("按下继续")); LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停靠中...")); - LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("请等待 ...")); // "Please wait..." - LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入并单击")); // "Insert and Click" + LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("请等待 ...")); // "Please wait..." + LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入并单击")); // "Insert and Click" LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("按下加热")); - LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加热中 ...")); // "Heating..." - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); // "Ejecting..." - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("装载中 ...")); // "Loading..." - LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..." + LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加热中 ...")); // "Heating..." + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); // "Ejecting..." + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("装载中 ...")); // "Loading..." + LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..." LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成")); - LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢复中 ...")); // "Resuming..." + LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢复中 ...")); // "Resuming..." #endif LSTR MSG_TMC_DRIVERS = _UxGT("TMC驱动器"); LSTR MSG_TMC_CURRENT = _UxGT("驱动电流"); @@ -606,7 +606,7 @@ namespace Language_zh_CN { LSTR MSG_REHEAT = _UxGT("重新加热"); LSTR MSG_REHEATING = _UxGT("重新加热中..."); - LSTR MSG_SHORT_DAY = _UxGT("天"); // "d" // One character only - LSTR MSG_SHORT_HOUR = _UxGT("时"); // "h" // One character only - LSTR MSG_SHORT_MINUTE = _UxGT("分"); // "m" // One character only + LSTR MSG_SHORT_DAY = _UxGT("天"); // "d" // One character only + LSTR MSG_SHORT_HOUR = _UxGT("时"); // "h" // One character only + LSTR MSG_SHORT_MINUTE = _UxGT("分"); // "m" // One character only } diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index 570dc292c5..968ad4424e 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -28,87 +28,87 @@ * See also https://marlinfw.org/docs/development/lcd_language.html */ namespace Language_zh_TW { - using namespace Language_en; // Inherit undefined strings from English + using namespace Language_en; // Inherit undefined strings from English constexpr uint8_t CHARSIZE = 3; LSTR LANGUAGE = _UxGT("Traditional Chinese"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT("已就緒."); // " ready." - LSTR MSG_YES = _UxGT("是"); // "YES" - LSTR MSG_NO = _UxGT("否"); // "NO" - LSTR MSG_BACK = _UxGT("返回"); // "Back" - LSTR MSG_MEDIA_ABORTING = _UxGT("正在中止..."); // "Aborting..." - LSTR MSG_MEDIA_INSERTED = _UxGT("記憶卡已插入"); // "Card inserted" - LSTR MSG_MEDIA_REMOVED = _UxGT("記憶卡被拔出"); // "Card removed" - LSTR MSG_MEDIA_WAITING = _UxGT("等待記憶卡"); // "Waiting for media" + LSTR WELCOME_MSG = MACHINE_NAME _UxGT("已就緒."); // " ready." + LSTR MSG_YES = _UxGT("是"); // "YES" + LSTR MSG_NO = _UxGT("否"); // "NO" + LSTR MSG_BACK = _UxGT("返回"); // "Back" + LSTR MSG_MEDIA_ABORTING = _UxGT("正在中止..."); // "Aborting..." + LSTR MSG_MEDIA_INSERTED = _UxGT("記憶卡已插入"); // "Card inserted" + LSTR MSG_MEDIA_REMOVED = _UxGT("記憶卡被拔出"); // "Card removed" + LSTR MSG_MEDIA_WAITING = _UxGT("等待記憶卡"); // "Waiting for media" LSTR MSG_MEDIA_READ_ERROR = _UxGT("記憶卡讀取錯誤"); //"Media read error" - LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB裝置已移除"); // "USB device removed" - LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB啟動失敗"); // "USB start failed" - LSTR MSG_LCD_ENDSTOPS = _UxGT("擋塊"); // "Endstops" // Max length 8 characters - LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("軟體擋塊"); // "Soft Endstops" - LSTR MSG_MAIN_MENU = _UxGT("主選單"); // "Main" - LSTR MSG_ADVANCED_SETTINGS = _UxGT("進階設置"); // "Advanced Settings" - LSTR MSG_CONFIGURATION = _UxGT("設置"); //Configuration - LSTR MSG_RUN_AUTO_FILES = _UxGT("自動開始"); // "Autostart" - LSTR MSG_DISABLE_STEPPERS = _UxGT("關閉步進馬達"); // "Disable steppers" - LSTR MSG_DEBUG_MENU = _UxGT("除錯選單"); // "Debug Menu" - LSTR MSG_PROGRESS_BAR_TEST = _UxGT("進度條測試"); // "Progress Bar Test" - LSTR MSG_AUTO_HOME = _UxGT("自動回原點"); // "Auto home" - LSTR MSG_AUTO_HOME_X = _UxGT("回X原點"); // "Home X" - LSTR MSG_AUTO_HOME_Y = _UxGT("回Y原點"); // "Home Y" - LSTR MSG_AUTO_HOME_Z = _UxGT("回Z原點"); // "Home Z" - LSTR MSG_AUTO_Z_ALIGN = _UxGT("自動Z對齊"); // "Auto Z-Align" - LSTR MSG_LEVEL_BED_HOMING = _UxGT("平台調平XYZ歸原點"); // "Homing XYZ" - LSTR MSG_LEVEL_BED_WAITING = _UxGT("單擊開始熱床調平"); // "Click to Begin" - LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("下個熱床調平點"); // "Next Point" - LSTR MSG_LEVEL_BED_DONE = _UxGT("完成熱床調平"); // "Leveling Done!" - LSTR MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" - LSTR MSG_SET_HOME_OFFSETS = _UxGT("設置原點偏移"); // "Set home offsets" - LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已啟用"); // "Offsets applied" + LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB裝置已移除"); // "USB device removed" + LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB啟動失敗"); // "USB start failed" + LSTR MSG_LCD_ENDSTOPS = _UxGT("擋塊"); // "Endstops" // Max length 8 characters + LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("軟體擋塊"); // "Soft Endstops" + LSTR MSG_MAIN_MENU = _UxGT("主選單"); // "Main" + LSTR MSG_ADVANCED_SETTINGS = _UxGT("進階設置"); // "Advanced Settings" + LSTR MSG_CONFIGURATION = _UxGT("設置"); //Configuration + LSTR MSG_RUN_AUTO_FILES = _UxGT("自動開始"); // "Autostart" + LSTR MSG_DISABLE_STEPPERS = _UxGT("關閉步進馬達"); // "Disable steppers" + LSTR MSG_DEBUG_MENU = _UxGT("除錯選單"); // "Debug Menu" + LSTR MSG_PROGRESS_BAR_TEST = _UxGT("進度條測試"); // "Progress Bar Test" + LSTR MSG_AUTO_HOME = _UxGT("自動回原點"); // "Auto home" + LSTR MSG_AUTO_HOME_X = _UxGT("回X原點"); // "Home X" + LSTR MSG_AUTO_HOME_Y = _UxGT("回Y原點"); // "Home Y" + LSTR MSG_AUTO_HOME_Z = _UxGT("回Z原點"); // "Home Z" + LSTR MSG_AUTO_Z_ALIGN = _UxGT("自動Z對齊"); // "Auto Z-Align" + LSTR MSG_LEVEL_BED_HOMING = _UxGT("平台調平XYZ歸原點"); // "Homing XYZ" + LSTR MSG_LEVEL_BED_WAITING = _UxGT("單擊開始熱床調平"); // "Click to Begin" + LSTR MSG_LEVEL_BED_NEXT_POINT = _UxGT("下個熱床調平點"); // "Next Point" + LSTR MSG_LEVEL_BED_DONE = _UxGT("完成熱床調平"); // "Leveling Done!" + LSTR MSG_Z_FADE_HEIGHT = _UxGT("淡出高度"); // "Fade Height" + LSTR MSG_SET_HOME_OFFSETS = _UxGT("設置原點偏移"); // "Set home offsets" + LSTR MSG_HOME_OFFSETS_APPLIED = _UxGT("偏移已啟用"); // "Offsets applied" #if HAS_PREHEAT - LSTR MSG_PREHEAT_1 = _UxGT("預熱 ") PREHEAT_1_LABEL; // "Preheat PREHEAT_1_LABEL" - LSTR MSG_PREHEAT_1_H = _UxGT("預熱 ") PREHEAT_1_LABEL " ~"; // "Preheat PREHEAT_1_LABEL" - LSTR MSG_PREHEAT_1_END = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_1 " " - LSTR MSG_PREHEAT_1_END_E = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ~"); //MSG_PREHEAT_1 " " - LSTR MSG_PREHEAT_1_ALL = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" - LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_1 " Bed" - LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 設置"); //MSG_PREHEAT_1 " conf" + LSTR MSG_PREHEAT_1 = _UxGT("預熱 ") PREHEAT_1_LABEL; // "Preheat PREHEAT_1_LABEL" + LSTR MSG_PREHEAT_1_H = _UxGT("預熱 ") PREHEAT_1_LABEL " ~"; // "Preheat PREHEAT_1_LABEL" + LSTR MSG_PREHEAT_1_END = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴"); //MSG_PREHEAT_1 " " + LSTR MSG_PREHEAT_1_END_E = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 噴嘴 ~"); //MSG_PREHEAT_1 " " + LSTR MSG_PREHEAT_1_ALL = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 全部"); //MSG_PREHEAT_1 " All" + LSTR MSG_PREHEAT_1_BEDONLY = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 熱床"); //MSG_PREHEAT_1 " Bed" + LSTR MSG_PREHEAT_1_SETTINGS = _UxGT("預熱 ") PREHEAT_1_LABEL _UxGT(" 設置"); //MSG_PREHEAT_1 " conf" - LSTR MSG_PREHEAT_M = _UxGT("預熱 $"); // "Preheat PREHEAT_1_LABEL" - LSTR MSG_PREHEAT_M_H = _UxGT("預熱 $ ~"); // "Preheat PREHEAT_1_LABEL" - LSTR MSG_PREHEAT_M_END = _UxGT("預熱 $ 噴嘴"); //MSG_PREHEAT_1 " " - LSTR MSG_PREHEAT_M_END_E = _UxGT("預熱 $ 噴嘴 ~"); //MSG_PREHEAT_1 " " - LSTR MSG_PREHEAT_M_ALL = _UxGT("預熱 $ 全部"); //MSG_PREHEAT_1 " All" - LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("預熱 $ 熱床"); //MSG_PREHEAT_1 " Bed" - LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("預熱 $ 設置"); //MSG_PREHEAT_1 " conf" + LSTR MSG_PREHEAT_M = _UxGT("預熱 $"); // "Preheat PREHEAT_1_LABEL" + LSTR MSG_PREHEAT_M_H = _UxGT("預熱 $ ~"); // "Preheat PREHEAT_1_LABEL" + LSTR MSG_PREHEAT_M_END = _UxGT("預熱 $ 噴嘴"); //MSG_PREHEAT_1 " " + LSTR MSG_PREHEAT_M_END_E = _UxGT("預熱 $ 噴嘴 ~"); //MSG_PREHEAT_1 " " + LSTR MSG_PREHEAT_M_ALL = _UxGT("預熱 $ 全部"); //MSG_PREHEAT_1 " All" + LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("預熱 $ 熱床"); //MSG_PREHEAT_1 " Bed" + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("預熱 $ 設置"); //MSG_PREHEAT_1 " conf" #endif - LSTR MSG_PREHEAT_CUSTOM = _UxGT("自定預熱"); // "Preheat Custom" - LSTR MSG_COOLDOWN = _UxGT("降溫"); // "Cooldown" - LSTR MSG_LASER_MENU = _UxGT("激光控制"); // "Laser Control" - LSTR MSG_LASER_POWER = _UxGT("激光電源"); // "Laser Power" - LSTR MSG_SPINDLE_MENU = _UxGT("主軸控告制"); // "Spindle Control" - LSTR MSG_SPINDLE_POWER = _UxGT("主軸電源"); // "Spindle Power" - LSTR MSG_SPINDLE_REVERSE = _UxGT("主軸反轉"); // "Spindle Reverse" - LSTR MSG_SWITCH_PS_ON = _UxGT("電源打開"); // "Switch power on" - LSTR MSG_SWITCH_PS_OFF = _UxGT("電源關閉"); // "Switch power off" - LSTR MSG_EXTRUDE = _UxGT("擠出"); // "Extrude" - LSTR MSG_RETRACT = _UxGT("回縮"); // "Retract" - LSTR MSG_MOVE_AXIS = _UxGT("移動軸"); // "Move axis" - LSTR MSG_BED_LEVELING = _UxGT("調平熱床"); // "Bed leveling" - LSTR MSG_LEVEL_BED = _UxGT("調平熱床"); // "Level bed" - LSTR MSG_BED_TRAMMING = _UxGT("調平邊角"); // "Bed Tramming" - LSTR MSG_NEXT_CORNER = _UxGT("下個邊角"); // "Next corner" - LSTR MSG_MESH_EDITOR = _UxGT("網格編輯器"); // "Mesh Editor" - LSTR MSG_EDIT_MESH = _UxGT("編輯網格"); // "Edit Mesh" - LSTR MSG_EDITING_STOPPED = _UxGT("網格編輯已停止"); // "Mesh Editing Stopped" - LSTR MSG_PROBING_POINT = _UxGT("探測點"); // "Probing Point" - LSTR MSG_MESH_X = _UxGT("索引 X"); // "Index X" - LSTR MSG_MESH_Y = _UxGT("索引 Y"); // "Index Y" - LSTR MSG_MESH_EDIT_Z = _UxGT("Z 值"); // "Z Value" - LSTR MSG_CUSTOM_COMMANDS = _UxGT("自定命令"); // "Custom Commands" - LSTR MSG_M48_TEST = _UxGT("M48 探測測試"); // "M48 Probe Test" - LSTR MSG_M48_POINT = _UxGT("M48 探測點"); // "M48 Point" - LSTR MSG_M48_DEVIATION = _UxGT("偏差"); // "Deviation" + LSTR MSG_PREHEAT_CUSTOM = _UxGT("自定預熱"); // "Preheat Custom" + LSTR MSG_COOLDOWN = _UxGT("降溫"); // "Cooldown" + LSTR MSG_LASER_MENU = _UxGT("激光控制"); // "Laser Control" + LSTR MSG_LASER_POWER = _UxGT("激光電源"); // "Laser Power" + LSTR MSG_SPINDLE_MENU = _UxGT("主軸控告制"); // "Spindle Control" + LSTR MSG_SPINDLE_POWER = _UxGT("主軸電源"); // "Spindle Power" + LSTR MSG_SPINDLE_REVERSE = _UxGT("主軸反轉"); // "Spindle Reverse" + LSTR MSG_SWITCH_PS_ON = _UxGT("電源打開"); // "Switch power on" + LSTR MSG_SWITCH_PS_OFF = _UxGT("電源關閉"); // "Switch power off" + LSTR MSG_EXTRUDE = _UxGT("擠出"); // "Extrude" + LSTR MSG_RETRACT = _UxGT("回縮"); // "Retract" + LSTR MSG_MOVE_AXIS = _UxGT("移動軸"); // "Move axis" + LSTR MSG_BED_LEVELING = _UxGT("調平熱床"); // "Bed leveling" + LSTR MSG_LEVEL_BED = _UxGT("調平熱床"); // "Level bed" + LSTR MSG_BED_TRAMMING = _UxGT("調平邊角"); // "Bed Tramming" + LSTR MSG_NEXT_CORNER = _UxGT("下個邊角"); // "Next corner" + LSTR MSG_MESH_EDITOR = _UxGT("網格編輯器"); // "Mesh Editor" + LSTR MSG_EDIT_MESH = _UxGT("編輯網格"); // "Edit Mesh" + LSTR MSG_EDITING_STOPPED = _UxGT("網格編輯已停止"); // "Mesh Editing Stopped" + LSTR MSG_PROBING_POINT = _UxGT("探測點"); // "Probing Point" + LSTR MSG_MESH_X = _UxGT("索引 X"); // "Index X" + LSTR MSG_MESH_Y = _UxGT("索引 Y"); // "Index Y" + LSTR MSG_MESH_EDIT_Z = _UxGT("Z 值"); // "Z Value" + LSTR MSG_CUSTOM_COMMANDS = _UxGT("自定命令"); // "Custom Commands" + LSTR MSG_M48_TEST = _UxGT("M48 探測測試"); // "M48 Probe Test" + LSTR MSG_M48_POINT = _UxGT("M48 探測點"); // "M48 Point" + LSTR MSG_M48_DEVIATION = _UxGT("偏差"); // "Deviation" LSTR MSG_IDEX_MENU = _UxGT("IDEX Mode"); LSTR MSG_OFFSETS_MENU = _UxGT("Tool Offsets"); LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park"); @@ -117,75 +117,75 @@ namespace Language_zh_TW { LSTR MSG_IDEX_MODE_FULL_CTRL = _UxGT("Full Control"); LSTR MSG_HOTEND_OFFSET_Z = _UxGT("2nd Nozzle Z"); LSTR MSG_HOTEND_OFFSET_A = _UxGT("2nd Nozzle @"); - LSTR MSG_UBL_DOING_G29 = _UxGT("執行G29"); // "Doing G29" - LSTR MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" - LSTR MSG_UBL_LEVEL_BED = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" - LSTR MSG_LCD_TILTING_MESH = _UxGT("傾斜點"); // "Tilting Point" - LSTR MSG_UBL_MANUAL_MESH = _UxGT("手工建網"); // "Manually Build Mesh" - LSTR MSG_UBL_BC_INSERT = _UxGT("放置墊片並測量"); // "Place shim & measure" - LSTR MSG_UBL_BC_INSERT2 = _UxGT("測量"); // "Measure" - LSTR MSG_UBL_BC_REMOVE = _UxGT("移除並測量熱床"); // "Remove & measure bed" - LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("移動到下一個"); // "Moving to next" - LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("啟動UBL"); // "Activate UBL" - LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("關閉UBL"); // "Deactivate UBL" - LSTR MSG_UBL_SET_TEMP_BED = _UxGT("置設熱床溫度"); // "Bed Temp" - LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("置設熱床溫度"); // "Bed Temp" - LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("置設噴嘴溫度"); // "Hotend Temp" - LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("熱端溫度"); // "Hotend Temp" - LSTR MSG_UBL_MESH_EDIT = _UxGT("網格編輯"); // "Mesh Edit" - LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("編輯客戶網格"); // "Edit Custom Mesh" - LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("細調網格"); // "Fine Tuning Mesh" - LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("完成編輯網格"); // "Done Editing Mesh" - LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("創設客戶網格"); // "Build Custom Mesh" - LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("創設網格"); // "Build Mesh" + LSTR MSG_UBL_DOING_G29 = _UxGT("執行G29"); // "Doing G29" + LSTR MSG_UBL_TOOLS = _UxGT("UBL工具"); // "UBL Tools" + LSTR MSG_UBL_LEVEL_BED = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" + LSTR MSG_LCD_TILTING_MESH = _UxGT("傾斜點"); // "Tilting Point" + LSTR MSG_UBL_MANUAL_MESH = _UxGT("手工建網"); // "Manually Build Mesh" + LSTR MSG_UBL_BC_INSERT = _UxGT("放置墊片並測量"); // "Place shim & measure" + LSTR MSG_UBL_BC_INSERT2 = _UxGT("測量"); // "Measure" + LSTR MSG_UBL_BC_REMOVE = _UxGT("移除並測量熱床"); // "Remove & measure bed" + LSTR MSG_UBL_MOVING_TO_NEXT = _UxGT("移動到下一個"); // "Moving to next" + LSTR MSG_UBL_ACTIVATE_MESH = _UxGT("啟動UBL"); // "Activate UBL" + LSTR MSG_UBL_DEACTIVATE_MESH = _UxGT("關閉UBL"); // "Deactivate UBL" + LSTR MSG_UBL_SET_TEMP_BED = _UxGT("置設熱床溫度"); // "Bed Temp" + LSTR MSG_UBL_BED_TEMP_CUSTOM = _UxGT("置設熱床溫度"); // "Bed Temp" + LSTR MSG_UBL_SET_TEMP_HOTEND = _UxGT("置設噴嘴溫度"); // "Hotend Temp" + LSTR MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("熱端溫度"); // "Hotend Temp" + LSTR MSG_UBL_MESH_EDIT = _UxGT("網格編輯"); // "Mesh Edit" + LSTR MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("編輯客戶網格"); // "Edit Custom Mesh" + LSTR MSG_UBL_FINE_TUNE_MESH = _UxGT("細調網格"); // "Fine Tuning Mesh" + LSTR MSG_UBL_DONE_EDITING_MESH = _UxGT("完成編輯網格"); // "Done Editing Mesh" + LSTR MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("創設客戶網格"); // "Build Custom Mesh" + LSTR MSG_UBL_BUILD_MESH_MENU = _UxGT("創設網格"); // "Build Mesh" #if HAS_PREHEAT - LSTR MSG_UBL_BUILD_MESH_M = _UxGT("創設 $ 網格"); // "Build PREHEAT_1_LABEL Mesh" - LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 網格"); // "Validate PREHEAT_1_LABEL Mesh" + LSTR MSG_UBL_BUILD_MESH_M = _UxGT("創設 $ 網格"); // "Build PREHEAT_1_LABEL Mesh" + LSTR MSG_UBL_VALIDATE_MESH_M = _UxGT("批准 $ 網格"); // "Validate PREHEAT_1_LABEL Mesh" #endif - LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("創設冷網格"); // "Build Cold Mesh" - LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("調整網格高度"); // "Adjust Mesh Height" - LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合計"); // "Height Amount" - LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准網格"); // "Validate Mesh" - LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客戶網格"); // "Validate Custom Mesh" - LSTR MSG_G26_HEATING_BED = _UxGT("G26 加熱熱床"); // "G26 Heating Bed" + LSTR MSG_UBL_BUILD_COLD_MESH = _UxGT("創設冷網格"); // "Build Cold Mesh" + LSTR MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("調整網格高度"); // "Adjust Mesh Height" + LSTR MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("高度合計"); // "Height Amount" + LSTR MSG_UBL_VALIDATE_MESH_MENU = _UxGT("批准網格"); // "Validate Mesh" + LSTR MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("批准客戶網格"); // "Validate Custom Mesh" + LSTR MSG_G26_HEATING_BED = _UxGT("G26 加熱熱床"); // "G26 Heating Bed" LSTR MSG_G26_HEATING_NOZZLE = _UxGT("G26 加熱噴嘴"); //"G26 Heating Nozzle" - LSTR MSG_G26_MANUAL_PRIME = _UxGT("手動填裝"); // "Manual priming..." - LSTR MSG_G26_FIXED_LENGTH = _UxGT("固定距離填裝"); // "Fixed Length Prime" - LSTR MSG_G26_PRIME_DONE = _UxGT("完成填裝"); // "Done Priming" - LSTR MSG_G26_CANCELED = _UxGT("G26已取消"); // "G26 Canceled" - LSTR MSG_G26_LEAVING = _UxGT("離開 G26"); // "Leaving G26" - LSTR MSG_UBL_CONTINUE_MESH = _UxGT("繼續熱床網格"); // "Continue Bed Mesh" - LSTR MSG_UBL_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" - LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" - LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子網格調平"); // "Grid Mesh Leveling" - LSTR MSG_UBL_MESH_LEVEL = _UxGT("調平網格"); // "Level Mesh" - LSTR MSG_UBL_SIDE_POINTS = _UxGT("邊點"); // "Side Points" - LSTR MSG_UBL_MAP_TYPE = _UxGT("圖類型"); // "Map Type" - LSTR MSG_UBL_OUTPUT_MAP = _UxGT("輸出網格圖"); // "Output Mesh Map" - LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("輸出到主機"); // "Output for Host" - LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("輸出到CSV"); // "Output for CSV" - LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("輸出到備份"); // "Off Printer Backup" - LSTR MSG_UBL_INFO_UBL = _UxGT("輸出UBL信息"); // "Output UBL Info" - LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合計"); // "Fill-in Amount" - LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in" - LSTR MSG_UBL_SMART_FILLIN = _UxGT("聰明填充"); // "Smart Fill-in" - LSTR MSG_UBL_FILLIN_MESH = _UxGT("填充網格"); // "Fill-in Mesh" - LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("作廢所有的"); // "Invalidate All" - LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作廢最近的"); // "Invalidate Closest" - LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("細調所有的"); // "Fine Tune All" - LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("細調最近的"); // "Fine Tune Closest" - LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("網格存儲"); // "Mesh Storage" - LSTR MSG_UBL_STORAGE_SLOT = _UxGT("存儲槽"); // "Memory Slot" - LSTR MSG_UBL_LOAD_MESH = _UxGT("裝載熱床網格"); // "Load Bed Mesh" - LSTR MSG_UBL_SAVE_MESH = _UxGT("保存熱床網格"); // "Save Bed Mesh" - LSTR MSG_MESH_LOADED = _UxGT("網格 %i 已裝載"); // "Mesh %i loaded" - LSTR MSG_MESH_SAVED = _UxGT("網格 %i 已保存"); // "Mesh %i saved" - LSTR MSG_UBL_NO_STORAGE = _UxGT("沒有存儲"); // "No storage" - LSTR MSG_UBL_SAVE_ERROR = _UxGT("錯誤: UBL保存"); // "Err: UBL Save" - LSTR MSG_UBL_RESTORE_ERROR = _UxGT("錯誤: UBL還原"); // "Err: UBL Restore" - LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-偏移:"); // "Z-Offset: " - LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" - LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL" + LSTR MSG_G26_MANUAL_PRIME = _UxGT("手動填裝"); // "Manual priming..." + LSTR MSG_G26_FIXED_LENGTH = _UxGT("固定距離填裝"); // "Fixed Length Prime" + LSTR MSG_G26_PRIME_DONE = _UxGT("完成填裝"); // "Done Priming" + LSTR MSG_G26_CANCELED = _UxGT("G26已取消"); // "G26 Canceled" + LSTR MSG_G26_LEAVING = _UxGT("離開 G26"); // "Leaving G26" + LSTR MSG_UBL_CONTINUE_MESH = _UxGT("繼續熱床網格"); // "Continue Bed Mesh" + LSTR MSG_UBL_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" + LSTR MSG_UBL_3POINT_MESH_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" + LSTR MSG_UBL_GRID_MESH_LEVELING = _UxGT("格子網格調平"); // "Grid Mesh Leveling" + LSTR MSG_UBL_MESH_LEVEL = _UxGT("調平網格"); // "Level Mesh" + LSTR MSG_UBL_SIDE_POINTS = _UxGT("邊點"); // "Side Points" + LSTR MSG_UBL_MAP_TYPE = _UxGT("圖類型"); // "Map Type" + LSTR MSG_UBL_OUTPUT_MAP = _UxGT("輸出網格圖"); // "Output Mesh Map" + LSTR MSG_UBL_OUTPUT_MAP_HOST = _UxGT("輸出到主機"); // "Output for Host" + LSTR MSG_UBL_OUTPUT_MAP_CSV = _UxGT("輸出到CSV"); // "Output for CSV" + LSTR MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("輸出到備份"); // "Off Printer Backup" + LSTR MSG_UBL_INFO_UBL = _UxGT("輸出UBL信息"); // "Output UBL Info" + LSTR MSG_UBL_FILLIN_AMOUNT = _UxGT("填充合計"); // "Fill-in Amount" + LSTR MSG_UBL_MANUAL_FILLIN = _UxGT("手工填充"); // "Manual Fill-in" + LSTR MSG_UBL_SMART_FILLIN = _UxGT("聰明填充"); // "Smart Fill-in" + LSTR MSG_UBL_FILLIN_MESH = _UxGT("填充網格"); // "Fill-in Mesh" + LSTR MSG_UBL_INVALIDATE_ALL = _UxGT("作廢所有的"); // "Invalidate All" + LSTR MSG_UBL_INVALIDATE_CLOSEST = _UxGT("作廢最近的"); // "Invalidate Closest" + LSTR MSG_UBL_FINE_TUNE_ALL = _UxGT("細調所有的"); // "Fine Tune All" + LSTR MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("細調最近的"); // "Fine Tune Closest" + LSTR MSG_UBL_STORAGE_MESH_MENU = _UxGT("網格存儲"); // "Mesh Storage" + LSTR MSG_UBL_STORAGE_SLOT = _UxGT("存儲槽"); // "Memory Slot" + LSTR MSG_UBL_LOAD_MESH = _UxGT("裝載熱床網格"); // "Load Bed Mesh" + LSTR MSG_UBL_SAVE_MESH = _UxGT("保存熱床網格"); // "Save Bed Mesh" + LSTR MSG_MESH_LOADED = _UxGT("網格 %i 已裝載"); // "Mesh %i loaded" + LSTR MSG_MESH_SAVED = _UxGT("網格 %i 已保存"); // "Mesh %i saved" + LSTR MSG_UBL_NO_STORAGE = _UxGT("沒有存儲"); // "No storage" + LSTR MSG_UBL_SAVE_ERROR = _UxGT("錯誤: UBL保存"); // "Err: UBL Save" + LSTR MSG_UBL_RESTORE_ERROR = _UxGT("錯誤: UBL還原"); // "Err: UBL Restore" + LSTR MSG_UBL_Z_OFFSET = _UxGT("Z-偏移:"); // "Z-Offset: " + LSTR MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z偏移已停止"); // "Z-Offset Stopped" + LSTR MSG_UBL_STEP_BY_STEP_MENU = _UxGT("一步步UBL"); // "Step-By-Step UBL" LSTR MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. 創設冷網格"); LSTR MSG_UBL_2_SMART_FILLIN = _UxGT("2. 聰明填充"); LSTR MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. 批准網格"); @@ -194,269 +194,269 @@ namespace Language_zh_TW { LSTR MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. 細調所有的"); LSTR MSG_UBL_7_SAVE_MESH = _UxGT("7. 保存熱床網格"); - LSTR MSG_LED_CONTROL = _UxGT("燈管控制"); // "LED Control" - LSTR MSG_LEDS = _UxGT("燈"); // "Lights" - LSTR MSG_LED_PRESETS = _UxGT("燈預置"); // "Light Presets" - LSTR MSG_SET_LEDS_RED = _UxGT("红"); // "Red" - LSTR MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange" - LSTR MSG_SET_LEDS_YELLOW = _UxGT("黃"); // "Yellow" - LSTR MSG_SET_LEDS_GREEN = _UxGT("綠"); // "Green" - LSTR MSG_SET_LEDS_BLUE = _UxGT("藍"); // "Blue" - LSTR MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo" - LSTR MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet" - LSTR MSG_SET_LEDS_WHITE = _UxGT("白"); // "White" - LSTR MSG_SET_LEDS_DEFAULT = _UxGT("復歸"); // "Default" - LSTR MSG_CUSTOM_LEDS = _UxGT("定制燈"); // "Custom Lights" - LSTR MSG_INTENSITY_R = _UxGT("紅飽和度"); // "Red Intensity" - LSTR MSG_INTENSITY_G = _UxGT("綠飽和度"); // "Green Intensity" - LSTR MSG_INTENSITY_B = _UxGT("藍飽和度"); // "Blue Intensity" - LSTR MSG_INTENSITY_W = _UxGT("白飽和度"); // "White Intensity" - LSTR MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness" + LSTR MSG_LED_CONTROL = _UxGT("燈管控制"); // "LED Control" + LSTR MSG_LEDS = _UxGT("燈"); // "Lights" + LSTR MSG_LED_PRESETS = _UxGT("燈預置"); // "Light Presets" + LSTR MSG_SET_LEDS_RED = _UxGT("红"); // "Red" + LSTR MSG_SET_LEDS_ORANGE = _UxGT("橙"); // "Orange" + LSTR MSG_SET_LEDS_YELLOW = _UxGT("黃"); // "Yellow" + LSTR MSG_SET_LEDS_GREEN = _UxGT("綠"); // "Green" + LSTR MSG_SET_LEDS_BLUE = _UxGT("藍"); // "Blue" + LSTR MSG_SET_LEDS_INDIGO = _UxGT("青"); // "Indigo" + LSTR MSG_SET_LEDS_VIOLET = _UxGT("紫"); // "Violet" + LSTR MSG_SET_LEDS_WHITE = _UxGT("白"); // "White" + LSTR MSG_SET_LEDS_DEFAULT = _UxGT("復歸"); // "Default" + LSTR MSG_CUSTOM_LEDS = _UxGT("定制燈"); // "Custom Lights" + LSTR MSG_INTENSITY_R = _UxGT("紅飽和度"); // "Red Intensity" + LSTR MSG_INTENSITY_G = _UxGT("綠飽和度"); // "Green Intensity" + LSTR MSG_INTENSITY_B = _UxGT("藍飽和度"); // "Blue Intensity" + LSTR MSG_INTENSITY_W = _UxGT("白飽和度"); // "White Intensity" + LSTR MSG_LED_BRIGHTNESS = _UxGT("亮度"); // "Brightness" - LSTR MSG_MOVING = _UxGT("移動 ..."); // "Moving..." - LSTR MSG_FREE_XY = _UxGT("釋放 XY"); // "Free XY" - LSTR MSG_MOVE_X = _UxGT("移動X"); // "Move X" - LSTR MSG_MOVE_Y = _UxGT("移動Y"); // "Move Y" - LSTR MSG_MOVE_Z = _UxGT("移動Z"); // "Move Z" - LSTR MSG_MOVE_N = _UxGT("移動Q"); // "Move @" - LSTR MSG_MOVE_E = _UxGT("擠出機"); // "Extruder" - LSTR MSG_MOVE_EN = _UxGT("擠出機 *"); // "Extruder *" - LSTR MSG_HOTEND_TOO_COLD = _UxGT("噴嘴溫度不夠"); // "Hotend too cold" - LSTR MSG_MOVE_N_MM = _UxGT("移動 $ mm"); // "Move 0.025mm" - LSTR MSG_MOVE_01MM = _UxGT("移動 0.1 mm"); // "Move 0.1mm" - LSTR MSG_MOVE_1MM = _UxGT("移動 1 mm"); // "Move 1mm" - LSTR MSG_MOVE_10MM = _UxGT("移動 10 mm"); // "Move 10mm" - LSTR MSG_MOVE_50MM = _UxGT("移動 50 mm"); // "Move 50mm" - LSTR MSG_MOVE_100MM = _UxGT("移動 100 mm"); // "Move 100mm" - LSTR MSG_SPEED = _UxGT("速率"); // "Speed" - LSTR MSG_MESH_Z_OFFSET = _UxGT("熱床Z"); // "Bed Z" - LSTR MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴"); // "Nozzle" 噴嘴 + LSTR MSG_MOVING = _UxGT("移動 ..."); // "Moving..." + LSTR MSG_FREE_XY = _UxGT("釋放 XY"); // "Free XY" + LSTR MSG_MOVE_X = _UxGT("移動X"); // "Move X" + LSTR MSG_MOVE_Y = _UxGT("移動Y"); // "Move Y" + LSTR MSG_MOVE_Z = _UxGT("移動Z"); // "Move Z" + LSTR MSG_MOVE_N = _UxGT("移動Q"); // "Move @" + LSTR MSG_MOVE_E = _UxGT("擠出機"); // "Extruder" + LSTR MSG_MOVE_EN = _UxGT("擠出機 *"); // "Extruder *" + LSTR MSG_HOTEND_TOO_COLD = _UxGT("噴嘴溫度不夠"); // "Hotend too cold" + LSTR MSG_MOVE_N_MM = _UxGT("移動 $ mm"); // "Move 0.025mm" + LSTR MSG_MOVE_01MM = _UxGT("移動 0.1 mm"); // "Move 0.1mm" + LSTR MSG_MOVE_1MM = _UxGT("移動 1 mm"); // "Move 1mm" + LSTR MSG_MOVE_10MM = _UxGT("移動 10 mm"); // "Move 10mm" + LSTR MSG_MOVE_50MM = _UxGT("移動 50 mm"); // "Move 50mm" + LSTR MSG_MOVE_100MM = _UxGT("移動 100 mm"); // "Move 100mm" + LSTR MSG_SPEED = _UxGT("速率"); // "Speed" + LSTR MSG_MESH_Z_OFFSET = _UxGT("熱床Z"); // "Bed Z" + LSTR MSG_NOZZLE = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴"); // "Nozzle" 噴嘴 LSTR MSG_NOZZLE_N = " " LCD_STR_THERMOMETER _UxGT(" 噴嘴 ~"); - LSTR MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" 熱床"); // "Bed" + LSTR MSG_BED = " " LCD_STR_THERMOMETER _UxGT(" 熱床"); // "Bed" LSTR MSG_CHAMBER = _UxGT("Enclosure"); - LSTR MSG_FAN_SPEED = _UxGT("風扇速率"); // "Fan speed" + LSTR MSG_FAN_SPEED = _UxGT("風扇速率"); // "Fan speed" LSTR MSG_FAN_SPEED_N = _UxGT("風扇速率 {"); LSTR MSG_STORED_FAN_N = _UxGT("Stored Fan {"); - LSTR MSG_EXTRA_FAN_SPEED = _UxGT("額外風扇速率"); // "Extra fan speed" + LSTR MSG_EXTRA_FAN_SPEED = _UxGT("額外風扇速率"); // "Extra fan speed" LSTR MSG_EXTRA_FAN_SPEED_N = _UxGT("額外風扇速率 {"); LSTR MSG_FLOW = _UxGT("擠出速率"); - LSTR MSG_FLOW_N = _UxGT("擠出速率 ~"); // "Flow" - LSTR MSG_CONTROL = _UxGT("控制"); // "Control" - LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); // " " LCD_STR_THERMOMETER " Min" - LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); // " " LCD_STR_THERMOMETER " Max" - LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 系數"); // " " LCD_STR_THERMOMETER " Fact" - LSTR MSG_AUTOTEMP = _UxGT("自動控溫"); // "Autotemp" - LSTR MSG_LCD_ON = _UxGT("開 "); // "On" - LSTR MSG_LCD_OFF = _UxGT("關 "); // "Off" + LSTR MSG_FLOW_N = _UxGT("擠出速率 ~"); // "Flow" + LSTR MSG_CONTROL = _UxGT("控制"); // "Control" + LSTR MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" 最小"); // " " LCD_STR_THERMOMETER " Min" + LSTR MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" 最大"); // " " LCD_STR_THERMOMETER " Max" + LSTR MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" 系數"); // " " LCD_STR_THERMOMETER " Fact" + LSTR MSG_AUTOTEMP = _UxGT("自動控溫"); // "Autotemp" + LSTR MSG_LCD_ON = _UxGT("開 "); // "On" + LSTR MSG_LCD_OFF = _UxGT("關 "); // "Off" LSTR MSG_SELECT_E = _UxGT("選擇 *"); - LSTR MSG_ACC = _UxGT("加速度"); // "Accel" acceleration - LSTR MSG_JERK = _UxGT("抖動速率"); // "Jerk" - LSTR MSG_VA_JERK = _UxGT("軸抖動速率") STR_A; // "Va-jerk" + LSTR MSG_ACC = _UxGT("加速度"); // "Accel" acceleration + LSTR MSG_JERK = _UxGT("抖動速率"); // "Jerk" + LSTR MSG_VA_JERK = _UxGT("軸抖動速率") STR_A; // "Va-jerk" LSTR MSG_VB_JERK = _UxGT("軸抖動速率") STR_B; LSTR MSG_VC_JERK = _UxGT("軸抖動速率") STR_C; LSTR MSG_VN_JERK = _UxGT("軸抖動速率@"); LSTR MSG_VE_JERK = _UxGT("擠出機抖動速率"); - LSTR MSG_MAX_SPEED = _UxGT("速度"); // "Velocity" - LSTR MSG_VMAX_A = _UxGT("最大進料速率") STR_A; // "Vmax " max_feedrate_mm_s + LSTR MSG_MAX_SPEED = _UxGT("速度"); // "Velocity" + LSTR MSG_VMAX_A = _UxGT("最大進料速率") STR_A; // "Vmax " max_feedrate_mm_s LSTR MSG_VMAX_B = _UxGT("最大進料速率") STR_B; LSTR MSG_VMAX_C = _UxGT("最大進料速率") STR_C; LSTR MSG_VMAX_N = _UxGT("最大進料速率@"); LSTR MSG_VMAX_E = _UxGT("最大進料速率E"); - LSTR MSG_VMAX_EN = _UxGT("最大進料速率 *"); // "Vmax " max_feedrate_mm_s - LSTR MSG_VMIN = _UxGT("最小進料速率"); // "Vmin" min_feedrate_mm_s - LSTR MSG_VTRAV_MIN = _UxGT("最小移動速率"); // "VTrav min" min_travel_feedrate_mm_s, (target) speed of the move - LSTR MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" - LSTR MSG_AMAX_A = _UxGT("最大列印加速度") STR_A; // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + LSTR MSG_VMAX_EN = _UxGT("最大進料速率 *"); // "Vmax " max_feedrate_mm_s + LSTR MSG_VMIN = _UxGT("最小進料速率"); // "Vmin" min_feedrate_mm_s + LSTR MSG_VTRAV_MIN = _UxGT("最小移動速率"); // "VTrav min" min_travel_feedrate_mm_s, (target) speed of the move + LSTR MSG_ACCELERATION = _UxGT("加速度"); // "Acceleration" + LSTR MSG_AMAX_A = _UxGT("最大列印加速度") STR_A; // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves LSTR MSG_AMAX_B = _UxGT("最大列印加速度") STR_B; LSTR MSG_AMAX_C = _UxGT("最大列印加速度") STR_C; LSTR MSG_AMAX_N = _UxGT("最大列印加速度@"); LSTR MSG_AMAX_E = _UxGT("最大列印加速度E"); - LSTR MSG_AMAX_EN = _UxGT("最大列印加速度 *"); // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves - LSTR MSG_A_RETRACT = _UxGT("回縮加速度"); // "A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts - LSTR MSG_A_TRAVEL = _UxGT("非列印移動加速度"); // "A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves - LSTR MSG_STEPS_PER_MM = _UxGT("軸步數/mm"); // "Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 - LSTR MSG_A_STEPS = STR_A _UxGT(" 軸步數/mm"); // "Asteps/mm" axis_steps_per_mm, axis steps-per-unit G92 + LSTR MSG_AMAX_EN = _UxGT("最大列印加速度 *"); // "Amax " max_acceleration_mm_per_s2, acceleration in units/s^2 for print moves + LSTR MSG_A_RETRACT = _UxGT("回縮加速度"); // "A-retract" retract_acceleration, E acceleration in mm/s^2 for retracts + LSTR MSG_A_TRAVEL = _UxGT("非列印移動加速度"); // "A-travel" travel_acceleration, X, Y, Z acceleration in mm/s^2 for travel (non printing) moves + LSTR MSG_STEPS_PER_MM = _UxGT("軸步數/mm"); // "Steps/mm" axis_steps_per_mm, axis steps-per-unit G92 + LSTR MSG_A_STEPS = STR_A _UxGT(" 軸步數/mm"); // "Asteps/mm" axis_steps_per_mm, axis steps-per-unit G92 LSTR MSG_B_STEPS = STR_B _UxGT(" 軸步數/mm"); LSTR MSG_C_STEPS = STR_C _UxGT(" 軸步數/mm"); LSTR MSG_N_STEPS = _UxGT("@ 軸步數/mm"); - LSTR MSG_E_STEPS = _UxGT("擠出機步數/mm"); // "Esteps/mm" + LSTR MSG_E_STEPS = _UxGT("擠出機步數/mm"); // "Esteps/mm" LSTR MSG_EN_STEPS = _UxGT("擠出機~步數/mm"); - LSTR MSG_TEMPERATURE = _UxGT("溫度"); // "Temperature" - LSTR MSG_MOTION = _UxGT("運作"); // "Motion" - LSTR MSG_FILAMENT = _UxGT("絲料測容"); // "Filament" menu_control_volumetric - LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("測容積mm") SUPERSCRIPT_THREE; // "E in mm3" volumetric_enabled - LSTR MSG_FILAMENT_DIAM = _UxGT("絲料直徑"); // "Fil. Dia." + LSTR MSG_TEMPERATURE = _UxGT("溫度"); // "Temperature" + LSTR MSG_MOTION = _UxGT("運作"); // "Motion" + LSTR MSG_FILAMENT = _UxGT("絲料測容"); // "Filament" menu_control_volumetric + LSTR MSG_VOLUMETRIC_ENABLED = _UxGT("測容積mm") SUPERSCRIPT_THREE; // "E in mm3" volumetric_enabled + LSTR MSG_FILAMENT_DIAM = _UxGT("絲料直徑"); // "Fil. Dia." LSTR MSG_FILAMENT_DIAM_E = _UxGT("絲料直徑 *"); - LSTR MSG_FILAMENT_UNLOAD = _UxGT("卸載 mm"); // "Unload mm" - LSTR MSG_FILAMENT_LOAD = _UxGT("装載 mm"); // "Load mm" + LSTR MSG_FILAMENT_UNLOAD = _UxGT("卸載 mm"); // "Unload mm" + LSTR MSG_FILAMENT_LOAD = _UxGT("装載 mm"); // "Load mm" LSTR MSG_ADVANCE_K = _UxGT("Advance K"); LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *"); - LSTR MSG_CONTRAST = _UxGT("LCD對比度"); // "LCD contrast" - LSTR MSG_STORE_EEPROM = _UxGT("保存設置"); // "Store memory" - LSTR MSG_LOAD_EEPROM = _UxGT("載入設置"); // "Load memory" - LSTR MSG_RESTORE_DEFAULTS = _UxGT("恢復安全值"); // "Restore failsafe" - LSTR MSG_INIT_EEPROM = _UxGT("初始化設置"); // "Initialize EEPROM" - LSTR MSG_ERR_EEPROM_CRC = _UxGT("錯誤: EEPROM CRC"); // "Err: EEPROM CRC" - LSTR MSG_ERR_EEPROM_INDEX = _UxGT("錯誤: EEPROM Index"); // "Err: EEPROM Index" - LSTR MSG_ERR_EEPROM_VERSION = _UxGT("錯誤: EEPROM Version"); // "EEPROM Version" - LSTR MSG_MEDIA_UPDATE = _UxGT("媒體更新"); // "Media Update" - LSTR MSG_RESET_PRINTER = _UxGT("重置打印機"); // "Reset Printer - LSTR MSG_REFRESH = _UxGT("刷新"); // "Refresh" - LSTR MSG_INFO_SCREEN = _UxGT("資訊界面"); // "Info screen" - LSTR MSG_PREPARE = _UxGT("準備"); // "Prepare" - LSTR MSG_TUNE = _UxGT("調整"); // "Tune" - LSTR MSG_START_PRINT = _UxGT("開始列印"); // "Start Print" - LSTR MSG_BUTTON_NEXT = _UxGT("下一個"); // "Next" - LSTR MSG_BUTTON_INIT = _UxGT("初始 "); // "Init" - LSTR MSG_BUTTON_STOP = _UxGT("停止 "); // "Stop" - LSTR MSG_BUTTON_PRINT = _UxGT("列印 "); // "Print" - LSTR MSG_BUTTON_RESET = _UxGT("復歸 "); // "Reset" - LSTR MSG_BUTTON_CANCEL = _UxGT("放棄 "); // "Cancel" - LSTR MSG_BUTTON_DONE = _UxGT("確認 "); // "Done" - LSTR MSG_BUTTON_BACK = _UxGT("返回 "); // "Back" - LSTR MSG_BUTTON_PROCEED = _UxGT("繼續 "); // "Proceed" - LSTR MSG_PAUSE_PRINT = _UxGT("暫停列印"); // "Pause print" - LSTR MSG_RESUME_PRINT = _UxGT("恢復列印"); // "Resume print" - LSTR MSG_STOP_PRINT = _UxGT("停止列印"); // "Stop print" - LSTR MSG_PRINTING_OBJECT = _UxGT("列印物件"); // "Printing Object" - LSTR MSG_CANCEL_OBJECT = _UxGT("中止物件"); // "Cancel Object" - LSTR MSG_CANCEL_OBJECT_N = _UxGT("中止物件 {"); // "Cancel Object {" - LSTR MSG_OUTAGE_RECOVERY = _UxGT("中斷恢復"); // "Outage Recovery" - LSTR MSG_MEDIA_MENU = _UxGT("從記憶卡上列印"); // "Print from SD" - LSTR MSG_NO_MEDIA = _UxGT("無記憶卡"); // "No SD card" - LSTR MSG_DWELL = _UxGT("休眠 ..."); // "Sleep..." - LSTR MSG_USERWAIT = _UxGT("點擊繼續 ..."); // "Click to resume..." - LSTR MSG_PRINT_PAUSED = _UxGT("列印已暫停"); // "Print paused" - LSTR MSG_PRINTING = _UxGT("列印中 ..."); // "Printing..." - LSTR MSG_PRINT_ABORTED = _UxGT("已取消列印"); // "Print aborted" - LSTR MSG_NO_MOVE = _UxGT("無移動"); // "No move." - LSTR MSG_KILLED = _UxGT("已砍掉"); // "KILLED. " - LSTR MSG_STOPPED = _UxGT("已停止"); // "STOPPED. " - LSTR MSG_CONTROL_RETRACT = _UxGT("回縮長度mm"); // "Retract mm" retract_length, retract length (positive mm) - LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("換手回抽長度mm"); // "Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change - LSTR MSG_CONTROL_RETRACTF = _UxGT("回縮速率mm/s"); // "Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) - LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); // "Hop mm" retract_zraise, retract Z-lift - LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("回縮恢復長度mm"); // "UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) - LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("換手回縮恢復長度mm"); // "S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) - LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回縮恢復後進料速率mm/s"); // "Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) - LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" - LSTR MSG_AUTORETRACT = _UxGT("自動回縮"); // "Auto-Retract" autoretract_enabled, - LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("交換長度"); // "Swap Length" - LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("清除長度"); // "Purge Length" + LSTR MSG_CONTRAST = _UxGT("LCD對比度"); // "LCD contrast" + LSTR MSG_STORE_EEPROM = _UxGT("保存設置"); // "Store memory" + LSTR MSG_LOAD_EEPROM = _UxGT("載入設置"); // "Load memory" + LSTR MSG_RESTORE_DEFAULTS = _UxGT("恢復安全值"); // "Restore failsafe" + LSTR MSG_INIT_EEPROM = _UxGT("初始化設置"); // "Initialize EEPROM" + LSTR MSG_ERR_EEPROM_CRC = _UxGT("錯誤: EEPROM CRC"); // "Err: EEPROM CRC" + LSTR MSG_ERR_EEPROM_SIZE = _UxGT("錯誤: EEPROM 尺寸"); // "Err: EEPROM Index" + LSTR MSG_ERR_EEPROM_VERSION = _UxGT("錯誤: EEPROM 版本"); // "EEPROM Version" + LSTR MSG_MEDIA_UPDATE = _UxGT("媒體更新"); // "Media Update" + LSTR MSG_RESET_PRINTER = _UxGT("重置打印機"); // "Reset Printer + LSTR MSG_REFRESH = _UxGT("刷新"); // "Refresh" + LSTR MSG_INFO_SCREEN = _UxGT("資訊界面"); // "Info screen" + LSTR MSG_PREPARE = _UxGT("準備"); // "Prepare" + LSTR MSG_TUNE = _UxGT("調整"); // "Tune" + LSTR MSG_START_PRINT = _UxGT("開始列印"); // "Start Print" + LSTR MSG_BUTTON_NEXT = _UxGT("下一個"); // "Next" + LSTR MSG_BUTTON_INIT = _UxGT("初始 "); // "Init" + LSTR MSG_BUTTON_STOP = _UxGT("停止 "); // "Stop" + LSTR MSG_BUTTON_PRINT = _UxGT("列印 "); // "Print" + LSTR MSG_BUTTON_RESET = _UxGT("復歸 "); // "Reset" + LSTR MSG_BUTTON_CANCEL = _UxGT("放棄 "); // "Cancel" + LSTR MSG_BUTTON_DONE = _UxGT("確認 "); // "Done" + LSTR MSG_BUTTON_BACK = _UxGT("返回 "); // "Back" + LSTR MSG_BUTTON_PROCEED = _UxGT("繼續 "); // "Proceed" + LSTR MSG_PAUSE_PRINT = _UxGT("暫停列印"); // "Pause print" + LSTR MSG_RESUME_PRINT = _UxGT("恢復列印"); // "Resume print" + LSTR MSG_STOP_PRINT = _UxGT("停止列印"); // "Stop print" + LSTR MSG_PRINTING_OBJECT = _UxGT("列印物件"); // "Printing Object" + LSTR MSG_CANCEL_OBJECT = _UxGT("中止物件"); // "Cancel Object" + LSTR MSG_CANCEL_OBJECT_N = _UxGT("中止物件 {"); // "Cancel Object {" + LSTR MSG_OUTAGE_RECOVERY = _UxGT("中斷恢復"); // "Outage Recovery" + LSTR MSG_MEDIA_MENU = _UxGT("從記憶卡上列印"); // "Print from SD" + LSTR MSG_NO_MEDIA = _UxGT("無記憶卡"); // "No SD card" + LSTR MSG_DWELL = _UxGT("休眠 ..."); // "Sleep..." + LSTR MSG_USERWAIT = _UxGT("點擊繼續 ..."); // "Click to resume..." + LSTR MSG_PRINT_PAUSED = _UxGT("列印已暫停"); // "Print paused" + LSTR MSG_PRINTING = _UxGT("列印中 ..."); // "Printing..." + LSTR MSG_PRINT_ABORTED = _UxGT("已取消列印"); // "Print aborted" + LSTR MSG_NO_MOVE = _UxGT("無移動"); // "No move." + LSTR MSG_KILLED = _UxGT("已砍掉"); // "KILLED. " + LSTR MSG_STOPPED = _UxGT("已停止"); // "STOPPED. " + LSTR MSG_CONTROL_RETRACT = _UxGT("回縮長度mm"); // "Retract mm" retract_length, retract length (positive mm) + LSTR MSG_CONTROL_RETRACT_SWAP = _UxGT("換手回抽長度mm"); // "Swap Re.mm" swap_retract_length, swap retract length (positive mm), for extruder change + LSTR MSG_CONTROL_RETRACTF = _UxGT("回縮速率mm/s"); // "Retract V" retract_feedrate_mm_s, feedrate for retracting (mm/s) + LSTR MSG_CONTROL_RETRACT_ZHOP = _UxGT("Hop mm"); // "Hop mm" retract_zraise, retract Z-lift + LSTR MSG_CONTROL_RETRACT_RECOVER = _UxGT("回縮恢復長度mm"); // "UnRet +mm" retract_recover_extra, additional recover length (mm, added to retract length when recovering) + LSTR MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("換手回縮恢復長度mm"); // "S UnRet+mm" swap_retract_recover_extra, additional swap recover length (mm, added to retract length when recovering from extruder change) + LSTR MSG_CONTROL_RETRACT_RECOVERF = _UxGT("回縮恢復後進料速率mm/s"); // "Unretract V" retract_recover_feedrate_mm_s, feedrate for recovering from retraction (mm/s) + LSTR MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); // "S UnRet V" + LSTR MSG_AUTORETRACT = _UxGT("自動回縮"); // "Auto-Retract" autoretract_enabled, + LSTR MSG_FILAMENT_SWAP_LENGTH = _UxGT("交換長度"); // "Swap Length" + LSTR MSG_FILAMENT_PURGE_LENGTH = _UxGT("清除長度"); // "Purge Length" LSTR MSG_TOOL_CHANGE = _UxGT("交換工具"); //"Tool Change" - LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z軸提昇"); // "Z Raise" - LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("最高速度"); // "Prime Speed" - LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("收回速度"); // "Retract Speed" + LSTR MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z軸提昇"); // "Z Raise" + LSTR MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("最高速度"); // "Prime Speed" + LSTR MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("收回速度"); // "Retract Speed" LSTR MSG_NOZZLE_STANDBY = _UxGT("噴嘴待機"); //"Nozzle Standby" - LSTR MSG_FILAMENTCHANGE = _UxGT("更換絲料"); // "Change filament" + LSTR MSG_FILAMENTCHANGE = _UxGT("更換絲料"); // "Change filament" LSTR MSG_FILAMENTCHANGE_E = _UxGT("更換絲料 *"); - LSTR MSG_FILAMENTLOAD = _UxGT("裝載絲料"); // "Load filament" + LSTR MSG_FILAMENTLOAD = _UxGT("裝載絲料"); // "Load filament" LSTR MSG_FILAMENTLOAD_E = _UxGT("裝載絲料 *"); - LSTR MSG_FILAMENTUNLOAD = _UxGT("卸載絲料"); // "Unload filament" - LSTR MSG_FILAMENTUNLOAD_E = _UxGT("卸載絲料 *"); // "Unload filament" - LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("卸載全部"); // "Unload All" - LSTR MSG_INIT_MEDIA = _UxGT("初始化記憶卡"); // "Init. SD card" - LSTR MSG_ATTACH_MEDIA = _UxGT("連接記憶卡"); // "Attach Media - LSTR MSG_CHANGE_MEDIA = _UxGT("更換記憶卡"); // "Change SD card" - LSTR MSG_RELEASE_MEDIA = _UxGT("釋放媒體"); // "Release Media" - LSTR MSG_ZPROBE_OUT = _UxGT("Z探針在熱床之外"); // "Z probe out. bed" Z probe is not within the physical limits - LSTR MSG_SKEW_FACTOR = _UxGT("偏斜因數"); // "Skew Factor" + LSTR MSG_FILAMENTUNLOAD = _UxGT("卸載絲料"); // "Unload filament" + LSTR MSG_FILAMENTUNLOAD_E = _UxGT("卸載絲料 *"); // "Unload filament" + LSTR MSG_FILAMENTUNLOAD_ALL = _UxGT("卸載全部"); // "Unload All" + LSTR MSG_INIT_MEDIA = _UxGT("初始化記憶卡"); // "Init. SD card" + LSTR MSG_ATTACH_MEDIA = _UxGT("連接記憶卡"); // "Attach Media + LSTR MSG_CHANGE_MEDIA = _UxGT("更換記憶卡"); // "Change SD card" + LSTR MSG_RELEASE_MEDIA = _UxGT("釋放媒體"); // "Release Media" + LSTR MSG_ZPROBE_OUT = _UxGT("Z探針在熱床之外"); // "Z probe out. bed" Z probe is not within the physical limits + LSTR MSG_SKEW_FACTOR = _UxGT("偏斜因數"); // "Skew Factor" - LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch 自檢"); // "BLTouch Self-Test" - LSTR MSG_BLTOUCH_RESET = _UxGT("重置BLTouch"); // "Reset BLTouch" - LSTR MSG_BLTOUCH_STOW = _UxGT("裝載BLTouch"); // "Stow BLTouch" - LSTR MSG_BLTOUCH_DEPLOY = _UxGT("部署BLTouch"); // "Deploy BLTouch" + LSTR MSG_BLTOUCH_SELFTEST = _UxGT("BLTouch 自檢"); // "BLTouch Self-Test" + LSTR MSG_BLTOUCH_RESET = _UxGT("重置BLTouch"); // "Reset BLTouch" + LSTR MSG_BLTOUCH_STOW = _UxGT("裝載BLTouch"); // "Stow BLTouch" + LSTR MSG_BLTOUCH_DEPLOY = _UxGT("部署BLTouch"); // "Deploy BLTouch" - LSTR MSG_HOME_FIRST = _UxGT("歸位 %s 先"); // "Home ... first" - LSTR MSG_ZPROBE_OFFSETS = _UxGT("探針偏移"); //Probe Offsets - LSTR MSG_ZPROBE_XOFFSET = _UxGT("探針X偏移量"); //Probe X Offset - LSTR MSG_ZPROBE_YOFFSET = _UxGT("探針Y偏移量"); //Probe Y Offset - LSTR MSG_ZPROBE_ZOFFSET = _UxGT("探針Z偏移量"); //Probe Z Offset - LSTR MSG_BABYSTEP_X = _UxGT("微量調整X軸"); // "Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts - LSTR MSG_BABYSTEP_Y = _UxGT("微量調整Y軸"); // "Babystep Y" - LSTR MSG_BABYSTEP_Z = _UxGT("微量調整Z軸"); // "Babystep Z" - LSTR MSG_BABYSTEP_TOTAL = _UxGT("總計"); // "Total" - LSTR MSG_ENDSTOP_ABORT = _UxGT("擋塊終止"); // "Endstop abort" - LSTR MSG_HEATING_FAILED_LCD = _UxGT("加熱失敗"); // "Heating failed" - LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("錯誤:冗餘溫度"); // "Err: REDUNDANT TEMP" - LSTR MSG_THERMAL_RUNAWAY = _UxGT("溫度失控"); // "THERMAL RUNAWAY" - LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("熱床溫度失控"); // "BED THERMAL RUNAWAY" - LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("機箱溫度失控"); // "CHAMBER T. RUNAWAY" - LSTR MSG_ERR_MAXTEMP = _UxGT("錯誤:最高溫度"); // "Err: MAXTEMP" - LSTR MSG_ERR_MINTEMP = _UxGT("錯誤:最低溫度"); // "Err: MINTEMP" - LSTR MSG_HALTED = _UxGT("印表機停機"); // "PRINTER HALTED" - LSTR MSG_PLEASE_RESET = _UxGT("請重置"); // "Please reset" - LSTR MSG_HEATING = _UxGT("加熱中 ..."); // "Heating..." - LSTR MSG_COOLING = _UxGT("冷卻中 ..."); // "Cooling..." - LSTR MSG_BED_HEATING = _UxGT("加熱熱床中 ..."); // "Bed Heating..." - LSTR MSG_BED_COOLING = _UxGT("熱床冷卻中 ..."); // "Bed Cooling..." - LSTR MSG_CHAMBER_HEATING = _UxGT("機箱加熱中 .."); // "Chamber Heating..." - LSTR MSG_CHAMBER_COOLING = _UxGT("機箱冷卻中 ..."); //Chamber Cooling... - LSTR MSG_DELTA_CALIBRATE = _UxGT("⊿校準"); // "Delta Calibration" - LSTR MSG_DELTA_CALIBRATE_X = _UxGT("⊿校準X"); // "Calibrate X" - LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校準Y"); // "Calibrate Y" - LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校準Z"); // "Calibrate Z" - LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校準中心"); // "Calibrate Center" - LSTR MSG_DELTA_SETTINGS = _UxGT("⊿設置"); // "Delta Settings" - LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自動校準"); // "Auto Calibration" - LSTR MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" - LSTR MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" - LSTR MSG_DELTA_RADIUS = _UxGT("⊿半徑"); // "Radius" - LSTR MSG_INFO_MENU = _UxGT("關於印表機"); // "About Printer" - LSTR MSG_INFO_PRINTER_MENU = _UxGT("印表機訊息"); // "Printer Info" - LSTR MSG_3POINT_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" - LSTR MSG_LINEAR_LEVELING = _UxGT("線性調平"); // "Linear Leveling" - LSTR MSG_BILINEAR_LEVELING = _UxGT(" 雙線性調平"); // "Bilinear Leveling" - LSTR MSG_UBL_LEVELING = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" - LSTR MSG_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" - LSTR MSG_INFO_STATS_MENU = _UxGT("印表機統計"); // "Printer Stats" - LSTR MSG_INFO_BOARD_MENU = _UxGT("主板訊息"); // "Board Info" - LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("溫度計"); // "Thermistors" - LSTR MSG_INFO_EXTRUDERS = _UxGT(" 擠出機"); // "Extruders" - LSTR MSG_INFO_BAUDRATE = _UxGT("傳輸率"); // "Baud" - LSTR MSG_INFO_PROTOCOL = _UxGT("協議"); // "Protocol" - LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("監測溫度失控:關"); // "Runaway Watch: OFF" - LSTR MSG_INFO_RUNAWAY_ON = _UxGT("監測溫度失控:開"); // "Runaway Watch: ON" + LSTR MSG_HOME_FIRST = _UxGT("歸位 %s 先"); // "Home ... first" + LSTR MSG_ZPROBE_OFFSETS = _UxGT("探針偏移"); //Probe Offsets + LSTR MSG_ZPROBE_XOFFSET = _UxGT("探針X偏移量"); //Probe X Offset + LSTR MSG_ZPROBE_YOFFSET = _UxGT("探針Y偏移量"); //Probe Y Offset + LSTR MSG_ZPROBE_ZOFFSET = _UxGT("探針Z偏移量"); //Probe Z Offset + LSTR MSG_BABYSTEP_X = _UxGT("微量調整X軸"); // "Babystep X" lcd_babystep_x, Babystepping enables the user to control the axis in tiny amounts + LSTR MSG_BABYSTEP_Y = _UxGT("微量調整Y軸"); // "Babystep Y" + LSTR MSG_BABYSTEP_Z = _UxGT("微量調整Z軸"); // "Babystep Z" + LSTR MSG_BABYSTEP_TOTAL = _UxGT("總計"); // "Total" + LSTR MSG_ENDSTOP_ABORT = _UxGT("擋塊終止"); // "Endstop abort" + LSTR MSG_HEATING_FAILED_LCD = _UxGT("加熱失敗"); // "Heating failed" + LSTR MSG_ERR_REDUNDANT_TEMP = _UxGT("錯誤:冗餘溫度"); // "Err: REDUNDANT TEMP" + LSTR MSG_THERMAL_RUNAWAY = _UxGT("溫度失控"); // "THERMAL RUNAWAY" + LSTR MSG_THERMAL_RUNAWAY_BED = _UxGT("熱床溫度失控"); // "BED THERMAL RUNAWAY" + LSTR MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("機箱溫度失控"); // "CHAMBER T. RUNAWAY" + LSTR MSG_ERR_MAXTEMP = _UxGT("錯誤:最高溫度"); // "Err: MAXTEMP" + LSTR MSG_ERR_MINTEMP = _UxGT("錯誤:最低溫度"); // "Err: MINTEMP" + LSTR MSG_HALTED = _UxGT("印表機停機"); // "PRINTER HALTED" + LSTR MSG_PLEASE_RESET = _UxGT("請重置"); // "Please reset" + LSTR MSG_HEATING = _UxGT("加熱中 ..."); // "Heating..." + LSTR MSG_COOLING = _UxGT("冷卻中 ..."); // "Cooling..." + LSTR MSG_BED_HEATING = _UxGT("加熱熱床中 ..."); // "Bed Heating..." + LSTR MSG_BED_COOLING = _UxGT("熱床冷卻中 ..."); // "Bed Cooling..." + LSTR MSG_CHAMBER_HEATING = _UxGT("機箱加熱中 .."); // "Chamber Heating..." + LSTR MSG_CHAMBER_COOLING = _UxGT("機箱冷卻中 ..."); //Chamber Cooling... + LSTR MSG_DELTA_CALIBRATE = _UxGT("⊿校準"); // "Delta Calibration" + LSTR MSG_DELTA_CALIBRATE_X = _UxGT("⊿校準X"); // "Calibrate X" + LSTR MSG_DELTA_CALIBRATE_Y = _UxGT("⊿校準Y"); // "Calibrate Y" + LSTR MSG_DELTA_CALIBRATE_Z = _UxGT("⊿校準Z"); // "Calibrate Z" + LSTR MSG_DELTA_CALIBRATE_CENTER = _UxGT("⊿校準中心"); // "Calibrate Center" + LSTR MSG_DELTA_SETTINGS = _UxGT("⊿設置"); // "Delta Settings" + LSTR MSG_DELTA_AUTO_CALIBRATE = _UxGT("⊿自動校準"); // "Auto Calibration" + LSTR MSG_DELTA_DIAG_ROD = _UxGT("⊿斜柱"); // "Diag Rod" + LSTR MSG_DELTA_HEIGHT = _UxGT("⊿高度"); // "Height" + LSTR MSG_DELTA_RADIUS = _UxGT("⊿半徑"); // "Radius" + LSTR MSG_INFO_MENU = _UxGT("關於印表機"); // "About Printer" + LSTR MSG_INFO_PRINTER_MENU = _UxGT("印表機訊息"); // "Printer Info" + LSTR MSG_3POINT_LEVELING = _UxGT("三點調平"); // "3-Point Leveling" + LSTR MSG_LINEAR_LEVELING = _UxGT("線性調平"); // "Linear Leveling" + LSTR MSG_BILINEAR_LEVELING = _UxGT(" 雙線性調平"); // "Bilinear Leveling" + LSTR MSG_UBL_LEVELING = _UxGT("統一熱床調平(UBL)"); // "Unified Bed Leveling" + LSTR MSG_MESH_LEVELING = _UxGT("網格調平"); // "Mesh Leveling" + LSTR MSG_INFO_STATS_MENU = _UxGT("印表機統計"); // "Printer Stats" + LSTR MSG_INFO_BOARD_MENU = _UxGT("主板訊息"); // "Board Info" + LSTR MSG_INFO_THERMISTOR_MENU = _UxGT("溫度計"); // "Thermistors" + LSTR MSG_INFO_EXTRUDERS = _UxGT(" 擠出機"); // "Extruders" + LSTR MSG_INFO_BAUDRATE = _UxGT("傳輸率"); // "Baud" + LSTR MSG_INFO_PROTOCOL = _UxGT("協議"); // "Protocol" + LSTR MSG_INFO_RUNAWAY_OFF = _UxGT("監測溫度失控:關"); // "Runaway Watch: OFF" + LSTR MSG_INFO_RUNAWAY_ON = _UxGT("監測溫度失控:開"); // "Runaway Watch: ON" - LSTR MSG_CASE_LIGHT = _UxGT("外殼燈"); // "Case light" - LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("燈亮度"); // "Light BRIGHTNESS" - LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("打印機不正確"); // "The printer is incorrect" + LSTR MSG_CASE_LIGHT = _UxGT("外殼燈"); // "Case light" + LSTR MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("燈亮度"); // "Light BRIGHTNESS" + LSTR MSG_KILL_EXPECTED_PRINTER = _UxGT("打印機不正確"); // "The printer is incorrect" #if LCD_WIDTH >= 20 || HAS_DWIN_E3V2 - LSTR MSG_INFO_PRINT_COUNT = _UxGT("列印計數"); // "Print Count" - LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("已完成"); // "Completed" - LSTR MSG_INFO_PRINT_TIME = _UxGT("總列印時間"); // "Total print time" - LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最長工作時間"); // "Longest job time" - LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("總計擠出"); // "Extruded total" + LSTR MSG_INFO_PRINT_COUNT = _UxGT("列印計數"); // "Print Count" + LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("已完成"); // "Completed" + LSTR MSG_INFO_PRINT_TIME = _UxGT("總列印時間"); // "Total print time" + LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最長工作時間"); // "Longest job time" + LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("總計擠出"); // "Extruded total" #else - LSTR MSG_INFO_PRINT_COUNT = _UxGT("列印數"); // "Prints" - LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); // "Completed" - LSTR MSG_INFO_PRINT_TIME = _UxGT("總共"); // "Total" - LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最長"); // "Longest" - LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("已擠出"); // "Extruded" + LSTR MSG_INFO_PRINT_COUNT = _UxGT("列印數"); // "Prints" + LSTR MSG_INFO_COMPLETED_PRINTS = _UxGT("完成"); // "Completed" + LSTR MSG_INFO_PRINT_TIME = _UxGT("總共"); // "Total" + LSTR MSG_INFO_PRINT_LONGEST = _UxGT("最長"); // "Longest" + LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("已擠出"); // "Extruded" #endif - LSTR MSG_INFO_MIN_TEMP = _UxGT("最低溫度"); // "Min Temp" - LSTR MSG_INFO_MAX_TEMP = _UxGT("最高溫度"); // "Max Temp" - LSTR MSG_INFO_PSU = _UxGT("電源供應"); // "Power Supply" - LSTR MSG_DRIVE_STRENGTH = _UxGT("驅動力度"); // "Drive Strength" - LSTR MSG_DAC_PERCENT_N = _UxGT("@ 驅動 %"); //E Driver % - LSTR MSG_ERROR_TMC = _UxGT("TMC連接錯誤"); // "TMC CONNECTION ERROR" - LSTR MSG_DAC_EEPROM_WRITE = _UxGT("保存驅動設置"); // "DAC EEPROM Write" - LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("更換絲料"); // "FILAMENT CHANGE" - LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("列印已暫停"); // "PRINT PAUSED" - LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("裝載絲料"); // "LOAD FILAMENT" - LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸載絲料"); // "UNLOAD FILAMENT" - LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢複選項:"); // "RESUME OPTIONS:" - LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more" - LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢復列印"); // "Resume print" - LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 噴嘴: "); // " Nozzle: " - LSTR MSG_RUNOUT_SENSOR = _UxGT("斷絲偵測"); // "Runout Sensor" - LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("絲距離mm"); // "Runout Dist mm" - LSTR MSG_KILL_HOMING_FAILED = _UxGT("歸原位失敗"); // "Homing failed" - LSTR MSG_LCD_PROBING_FAILED = _UxGT("探針探測失敗"); // "Probing failed" + LSTR MSG_INFO_MIN_TEMP = _UxGT("最低溫度"); // "Min Temp" + LSTR MSG_INFO_MAX_TEMP = _UxGT("最高溫度"); // "Max Temp" + LSTR MSG_INFO_PSU = _UxGT("電源供應"); // "Power Supply" + LSTR MSG_DRIVE_STRENGTH = _UxGT("驅動力度"); // "Drive Strength" + LSTR MSG_DAC_PERCENT_N = _UxGT("@ 驅動 %"); //E Driver % + LSTR MSG_ERROR_TMC = _UxGT("TMC連接錯誤"); // "TMC CONNECTION ERROR" + LSTR MSG_DAC_EEPROM_WRITE = _UxGT("保存驅動設置"); // "DAC EEPROM Write" + LSTR MSG_FILAMENT_CHANGE_HEADER = _UxGT("更換絲料"); // "FILAMENT CHANGE" + LSTR MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("列印已暫停"); // "PRINT PAUSED" + LSTR MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("裝載絲料"); // "LOAD FILAMENT" + LSTR MSG_FILAMENT_CHANGE_HEADER_UNLOAD = _UxGT("卸載絲料"); // "UNLOAD FILAMENT" + LSTR MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("恢複選項:"); // "RESUME OPTIONS:" + LSTR MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("清除更多"); // "Purge more" + LSTR MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("恢復列印"); // "Resume print" + LSTR MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" 噴嘴: "); // " Nozzle: " + LSTR MSG_RUNOUT_SENSOR = _UxGT("斷絲偵測"); // "Runout Sensor" + LSTR MSG_RUNOUT_DISTANCE_MM = _UxGT("絲距離mm"); // "Runout Dist mm" + LSTR MSG_KILL_HOMING_FAILED = _UxGT("歸原位失敗"); // "Homing failed" + LSTR MSG_LCD_PROBING_FAILED = _UxGT("探針探測失敗"); // "Probing failed" // // Filament Change screens show up to 3 lines on a 4-line display @@ -464,31 +464,31 @@ namespace Language_zh_TW { // #if LCD_HEIGHT >= 4 LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("按下按鈕", "恢復列印")); //"Press Button to resume print" - LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); // "Parking..." - LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待開始", "絲料", "變更")); // "Wait for start of the filament change" - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下絲料")); // "Wait for filament unload" - LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入絲料", "並按鍵", "繼續 ...")); // "Insert filament and press button to continue..." - LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按鈕", "加熱噴嘴.")); // "Press button to heat nozzle." - LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加熱噴嘴", "請等待 ...")); // "Heating nozzle Please wait..." - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "進料")); // "Wait for filament load" - LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "絲料清除")); // "Wait for filament purge" + LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); // "Parking..." + LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("等待開始", "絲料", "變更")); // "Wait for start of the filament change" + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("等待", "卸下絲料")); // "Wait for filament unload" + LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("插入絲料", "並按鍵", "繼續 ...")); // "Insert filament and press button to continue..." + LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("按下按鈕", "加熱噴嘴.")); // "Press button to heat nozzle." + LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("加熱噴嘴", "請等待 ...")); // "Heating nozzle Please wait..." + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("等待", "進料")); // "Wait for filament load" + LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("等待", "絲料清除")); // "Wait for filament purge" LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_2_LINE("按下完成","絲料清除")); //"Press button to filament purge" - LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待列印", "恢復")); // "Wait for print to resume" + LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_2_LINE("等待列印", "恢復")); // "Wait for print to resume" #else // LCD_HEIGHT < 4 - LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("按下繼續..")); // "Click to continue" - LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); // "Parking..." - LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("請等待 ...")); // "Please wait..." - LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入並點擊")); // "Insert and Click" - LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("按下加熱..")); // "Click to heat" - LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加熱中 ...")); // "Heating..." - LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); // "Ejecting..." - LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("載入中 ...")); // "Loading..." - LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..." - LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成..")); // "Click to finish" - LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢復中 ...")); // "Resuming..." + LSTR MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("按下繼續..")); // "Click to continue" + LSTR MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("停車中 ...")); // "Parking..." + LSTR MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("請等待 ...")); // "Please wait..." + LSTR MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("插入並點擊")); // "Insert and Click" + LSTR MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("按下加熱..")); // "Click to heat" + LSTR MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("加熱中 ...")); // "Heating..." + LSTR MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("退出中 ...")); // "Ejecting..." + LSTR MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("載入中 ...")); // "Loading..." + LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("清除中 ...")); // "Purging..." + LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("按下完成..")); // "Click to finish" + LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("恢復中 ...")); // "Resuming..." #endif // LCD_HEIGHT < 4 - LSTR MSG_SHORT_DAY = _UxGT("天"); // "d" // One character only - LSTR MSG_SHORT_HOUR = _UxGT("時"); // "h" // One character only - LSTR MSG_SHORT_MINUTE = _UxGT("分"); // "m" // One character only + LSTR MSG_SHORT_DAY = _UxGT("天"); // "d" // One character only + LSTR MSG_SHORT_HOUR = _UxGT("時"); // "h" // One character only + LSTR MSG_SHORT_MINUTE = _UxGT("分"); // "m" // One character only } diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 623c9dd4b9..9ba5147918 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -30,7 +30,7 @@ */ #pragma once -#include "fontutils.h" +#include "utf8.h" #include "../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index b3db930fe4..db5d0a635f 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -24,7 +24,7 @@ #include "../MarlinCore.h" // for printingIsPaused -#if LED_POWEROFF_TIMEOUT > 0 || BOTH(HAS_WIRED_LCD, PRINTER_EVENT_LEDS) || (defined(LCD_BACKLIGHT_TIMEOUT_MINS) && defined(NEOPIXEL_BKGD_INDEX_FIRST)) +#if LED_POWEROFF_TIMEOUT > 0 || ALL(HAS_WIRED_LCD, PRINTER_EVENT_LEDS) || (defined(LCD_BACKLIGHT_TIMEOUT_MINS) && defined(NEOPIXEL_BKGD_INDEX_FIRST)) #include "../feature/leds/leds.h" #endif @@ -32,7 +32,7 @@ #include "../feature/host_actions.h" #endif -#if BOTH(BROWSE_MEDIA_ON_INSERT, PASSWORD_ON_SD_PRINT_MENU) +#if ALL(BROWSE_MEDIA_ON_INSERT, PASSWORD_ON_SD_PRINT_MENU) #include "../feature/password/password.h" #endif @@ -42,7 +42,7 @@ MarlinUI ui; #if HAS_DISPLAY #include "../gcode/queue.h" - #include "fontutils.h" + #include "utf8.h" #endif #if ENABLED(DWIN_CREALITY_LCD) @@ -68,7 +68,7 @@ MarlinUI ui; constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if HAS_STATUS_MESSAGE - #if ENABLED(STATUS_MESSAGE_SCROLLING) && EITHER(HAS_WIRED_LCD, DWIN_LCD_PROUI) + #if ENABLED(STATUS_MESSAGE_SCROLLING) && ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) uint8_t MarlinUI::status_scroll_offset; // = 0 #endif char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1]; @@ -154,7 +154,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; } #endif -#if EITHER(HAS_MARLINUI_MENU, EXTENSIBLE_UI) +#if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI) bool MarlinUI::lcd_clicked; #endif @@ -174,7 +174,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #endif #if HAS_U8GLIB_I2C_OLED && PINS_EXIST(I2C_SCL, I2C_SDA) && DISABLED(SOFT_I2C_EEPROM) - #include "Wire.h" + #include #endif // Encoder Handling @@ -270,7 +270,7 @@ void MarlinUI::init() { #endif // HAS_SHIFT_ENCODER - #if BOTH(HAS_ENCODER_ACTION, HAS_SLOW_BUTTONS) + #if ALL(HAS_ENCODER_ACTION, HAS_SLOW_BUTTONS) slow_buttons = 0; #endif @@ -339,7 +339,7 @@ void MarlinUI::init() { uint8_t MarlinUI::lcd_status_update_delay = 1; // First update one loop delayed - #if BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) + #if ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) millis_t MarlinUI::next_filament_display; // = 0 #endif @@ -402,7 +402,7 @@ void MarlinUI::init() { } #endif - #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) + #if ANY(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) int8_t MarlinUI::encoderDirection = ENCODERBASE; #endif @@ -411,7 +411,7 @@ void MarlinUI::init() { uint8_t MarlinUI::repeat_delay; #endif - #if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) + #if ANY(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) bool MarlinUI::external_control; // = false @@ -424,7 +424,7 @@ void MarlinUI::init() { #if !HAS_GRAPHICAL_TFT - void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, bool wordwrap/*=false*/) { + void _wrap_string(uint8_t &col, uint8_t &row, const char * const string, read_byte_cb_t cb_read_byte, const bool wordwrap/*=false*/) { SETCURSOR(col, row); if (!string) return; @@ -506,7 +506,7 @@ void MarlinUI::init() { ui.manual_move.menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; ui.encoderPosition = dir; switch (axis) { - case X_AXIS: + TERN_(HAS_X_AXIS, case X_AXIS:) TERN_(HAS_Y_AXIS, case Y_AXIS:) TERN_(HAS_Z_AXIS, case Z_AXIS:) lcd_move_axis(axis); @@ -574,7 +574,7 @@ void MarlinUI::init() { #endif if (homed) { - #if EITHER(DELTA, Z_HOME_TO_MAX) + #if ANY(DELTA, Z_HOME_TO_MAX) if (RRK(EN_KEYPAD_F2)) _reprapworld_keypad_move(Z_AXIS, 1); #endif if (RRK(EN_KEYPAD_F3)) _reprapworld_keypad_move(Z_AXIS, -1); @@ -670,7 +670,7 @@ void MarlinUI::init() { #if HAS_MARLINUI_MENU if (use_click()) { - #if BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) + #if ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) pause_filament_display(); #endif goto_screen(menu_main); @@ -702,7 +702,7 @@ void MarlinUI::init() { if (old_frm != new_frm) { feedrate_percentage = new_frm; encoderPosition = 0; - #if BOTH(HAS_SOUND, BEEP_ON_FEEDRATE_CHANGE) + #if ALL(HAS_SOUND, BEEP_ON_FEEDRATE_CHANGE) static millis_t next_beep; #ifndef GOT_MS const millis_t ms = millis(); @@ -1046,7 +1046,7 @@ void MarlinUI::init() { if (encoderPastThreshold || lcd_clicked) { if (encoderPastThreshold && TERN1(IS_TFTGLCD_PANEL, !external_control)) { - #if BOTH(HAS_MARLINUI_MENU, ENCODER_RATE_MULTIPLIER) + #if ALL(HAS_MARLINUI_MENU, ENCODER_RATE_MULTIPLIER) int32_t encoderMultiplier = 1; @@ -1112,7 +1112,7 @@ void MarlinUI::init() { refresh(LCDVIEW_REDRAW_NOW); } - #if BOTH(HAS_MARLINUI_MENU, SCROLL_LONG_FILENAMES) + #if ALL(HAS_MARLINUI_MENU, SCROLL_LONG_FILENAMES) // If scrolling of long file names is enabled and we are in the sd card menu, // cause a refresh to occur until all the text has scrolled into view. if (currentScreen == menu_media && !lcd_status_update_delay--) { @@ -1179,7 +1179,7 @@ void MarlinUI::init() { run_current_screen(); // Apply all DWIN drawing after processing - TERN_(IS_DWIN_MARLINUI, DWIN_UpdateLCD()); + TERN_(IS_DWIN_MARLINUI, dwinUpdateLCD()); #endif @@ -1289,7 +1289,7 @@ void MarlinUI::init() { thermalManager.current_ADCKey_raw = HAL_ADC_RANGE; thermalManager.ADCKey_count = 0; if (currentkpADCValue < adc_other_button) - LOOP_L_N(i, ADC_KEY_NUM) { + for (uint8_t i = 0; i < ADC_KEY_NUM; ++i) { const raw_adc_t lo = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMin), hi = pgm_read_word(&stADCKeyTable[i].ADCKeyValueMax); if (WITHIN(currentkpADCValue, lo, hi)) return pgm_read_byte(&stADCKeyTable[i].ADCKeyNo); @@ -1353,7 +1353,7 @@ void MarlinUI::init() { #endif // UP || DOWN || LEFT || RIGHT buttons = (newbutton | TERN0(HAS_SLOW_BUTTONS, slow_buttons) - #if BOTH(HAS_TOUCH_BUTTONS, HAS_ENCODER_ACTION) + #if ALL(HAS_TOUCH_BUTTONS, HAS_ENCODER_ACTION) | (touch_buttons & TERN(HAS_ENCODER_WHEEL, ~(EN_A | EN_B), 0xFF)) #endif ); @@ -1380,7 +1380,7 @@ void MarlinUI::init() { uint8_t val = 0; WRITE(SHIFT_LD_PIN, LOW); WRITE(SHIFT_LD_PIN, HIGH); - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { val >>= 1; if (READ(SHIFT_OUT_PIN)) SBI(val, 7); WRITE(SHIFT_CLK_PIN, HIGH); @@ -1413,7 +1413,7 @@ void MarlinUI::init() { case 3: ENCODER_SPIN(2, 1); break; case 1: ENCODER_SPIN(3, 0); break; } - #if BOTH(HAS_MARLINUI_MENU, AUTO_BED_LEVELING_UBL) + #if ALL(HAS_MARLINUI_MENU, AUTO_BED_LEVELING_UBL) external_encoder(); #endif lastEncoderBits = enc; @@ -1587,7 +1587,7 @@ void MarlinUI::init() { #if HAS_WIRED_LCD - #if BASIC_PROGRESS_BAR || BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) + #if BASIC_PROGRESS_BAR || ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) const millis_t ms = millis(); #endif @@ -1598,20 +1598,20 @@ void MarlinUI::init() { #endif #endif - #if BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) + #if ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) pause_filament_display(ms); // Show status message for 5s #endif #endif - #if ENABLED(STATUS_MESSAGE_SCROLLING) && EITHER(HAS_WIRED_LCD, DWIN_LCD_PROUI) + #if ENABLED(STATUS_MESSAGE_SCROLLING) && ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) status_scroll_offset = 0; #endif TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); - TERN_(DWIN_CREALITY_LCD, DWIN_StatusChanged(status_message)); + TERN_(DWIN_CREALITY_LCD, dwinStatusChanged(status_message)); TERN_(DWIN_LCD_PROUI, DWIN_CheckStatusMessage()); - TERN_(DWIN_CREALITY_LCD_JYERSUI, CrealityDWIN.Update_Status(status_message)); + TERN_(DWIN_CREALITY_LCD_JYERSUI, crealityDWIN.updateStatus(status_message)); } #if ENABLED(STATUS_MESSAGE_SCROLLING) @@ -1667,10 +1667,10 @@ void MarlinUI::init() { TERN_(HOST_PROMPT_SUPPORT, hostui.prompt_open(PROMPT_INFO, F("UI Aborted"), FPSTR(DISMISS_STR))); LCD_MESSAGE(MSG_PRINT_ABORTED); TERN_(HAS_MARLINUI_MENU, return_to_status()); - TERN_(DWIN_LCD_PROUI, HMI_flag.abort_flag = true); + TERN_(DWIN_LCD_PROUI, hmiFlag.abort_flag = true); } - #if BOTH(HAS_MARLINUI_MENU, PSU_CONTROL) + #if ALL(HAS_MARLINUI_MENU, PSU_CONTROL) void MarlinUI::poweroff() { queue.inject(F("M81" TERN_(POWER_OFF_WAIT_FOR_COOLDOWN, "S"))); @@ -1848,7 +1848,7 @@ void MarlinUI::init() { #endif } - #if EITHER(BABYSTEP_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + #if ANY(BABYSTEP_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) void MarlinUI::zoffset_overlay(const_float_t zvalue) { // Determine whether the user is raising or lowering the nozzle. static int8_t dir; @@ -1863,7 +1863,7 @@ void MarlinUI::init() { #endif -#if BOTH(EXTENSIBLE_UI, ADVANCED_PAUSE_FEATURE) +#if ALL(EXTENSIBLE_UI, ADVANCED_PAUSE_FEATURE) void MarlinUI::pause_show_message( const PauseMessage message, @@ -1913,18 +1913,22 @@ void MarlinUI::init() { #if DISABLED(EEPROM_AUTO_INIT) - static inline FSTR_P eeprom_err(const uint8_t msgid) { - switch (msgid) { - default: - case 0: return GET_TEXT_F(MSG_ERR_EEPROM_CRC); - case 1: return GET_TEXT_F(MSG_ERR_EEPROM_INDEX); - case 2: return GET_TEXT_F(MSG_ERR_EEPROM_VERSION); + static inline FSTR_P eeprom_err(const EEPROM_Error err) { + switch (err) { + case ERR_EEPROM_VERSION: return GET_TEXT_F(MSG_ERR_EEPROM_VERSION); + case ERR_EEPROM_SIZE: return GET_TEXT_F(MSG_ERR_EEPROM_SIZE); + case ERR_EEPROM_CRC: return GET_TEXT_F(MSG_ERR_EEPROM_CRC); + case ERR_EEPROM_CORRUPT: return GET_TEXT_F(MSG_ERR_EEPROM_CORRUPT); + default: return nullptr; } } - void MarlinUI::eeprom_alert(const uint8_t msgid) { + void MarlinUI::eeprom_alert(const EEPROM_Error err) { + FSTR_P const err_msg = eeprom_err(err); + set_status(err_msg); + TERN_(HOST_PROMPT_SUPPORT, hostui.notify(err_msg)); #if HAS_MARLINUI_MENU - editable.uint8 = msgid; + editable.uint8 = err; goto_screen([]{ FSTR_P const restore_msg = GET_TEXT_F(MSG_INIT_EEPROM); char msg[utf8_strlen(restore_msg) + 1]; @@ -1932,11 +1936,9 @@ void MarlinUI::init() { MenuItem_confirm::select_screen( GET_TEXT_F(MSG_BUTTON_RESET), GET_TEXT_F(MSG_BUTTON_IGNORE), init_eeprom, return_to_status, - eeprom_err(editable.uint8), msg, F("?") + eeprom_err((EEPROM_Error)editable.uint8), msg, F("?") ); }); - #else - set_status(eeprom_err(msgid)); #endif } diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 9c5e192fb2..6e0205bdfb 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -27,6 +27,10 @@ #include "../libs/buzzer.h" #include "buttons.h" +#if ENABLED(EEPROM_SETTINGS) + #include "../module/settings.h" +#endif + #if ENABLED(TOUCH_SCREEN_CALIBRATION) #include "tft_io/touch_calibration.h" #endif @@ -84,7 +88,7 @@ typedef bool (*statusResetFunc_t)(); #endif // HAS_WIRED_LCD -#if EITHER(HAS_WIRED_LCD, DWIN_CREALITY_LCD_JYERSUI) +#if ANY(HAS_WIRED_LCD, DWIN_CREALITY_LCD_JYERSUI) #define LCD_WITH_BLINK 1 #define LCD_UPDATE_INTERVAL TERN(HAS_TOUCH_BUTTONS, 50, 100) #endif @@ -242,7 +246,7 @@ public: // LCD implementations static void clear_lcd(); - #if BOTH(HAS_MARLINUI_MENU, TOUCH_SCREEN_CALIBRATION) + #if ALL(HAS_MARLINUI_MENU, TOUCH_SCREEN_CALIBRATION) static void check_touch_calibration() { if (touch_calibration.need_calibration()) currentScreen = touch_calibration_screen; } @@ -293,23 +297,24 @@ public: } #endif + #if HAS_PRINT_PROGRESS_PERMYRIAD + typedef uint16_t progress_t; + #define PROGRESS_SCALE 100U + #define PROGRESS_MASK 0x7FFF + #else + typedef uint8_t progress_t; + #define PROGRESS_SCALE 1U + #define PROGRESS_MASK 0x7F + #endif + #if HAS_PRINT_PROGRESS - #if HAS_PRINT_PROGRESS_PERMYRIAD - typedef uint16_t progress_t; - #define PROGRESS_SCALE 100U - #define PROGRESS_MASK 0x7FFF - #else - typedef uint8_t progress_t; - #define PROGRESS_SCALE 1U - #define PROGRESS_MASK 0x7F - #endif #if ENABLED(SET_PROGRESS_PERCENT) static progress_t progress_override; static void set_progress(const progress_t p) { progress_override = _MIN(p, 100U * (PROGRESS_SCALE)); } static void set_progress_done() { progress_override = (PROGRESS_MASK + 1U) + 100U * (PROGRESS_SCALE); } static void progress_reset() { if (progress_override & (PROGRESS_MASK + 1U)) set_progress(0); } #endif - #if EITHER(SHOW_REMAINING_TIME, SET_PROGRESS_MANUALLY) + #if ANY(SHOW_REMAINING_TIME, SET_PROGRESS_MANUALLY) static uint32_t _calculated_remaining_time() { const duration_t elapsed = print_job_timer.duration(); const progress_t progress = _get_progress(); @@ -357,7 +362,7 @@ public: #if HAS_STATUS_MESSAGE - #if EITHER(HAS_WIRED_LCD, DWIN_LCD_PROUI) + #if ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) #if ENABLED(STATUS_MESSAGE_SCROLLING) #define MAX_MESSAGE_LENGTH _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)) #else @@ -408,7 +413,7 @@ public: static void resume_print(); static void flow_fault(); - #if BOTH(HAS_MARLINUI_MENU, PSU_CONTROL) + #if ALL(HAS_MARLINUI_MENU, PSU_CONTROL) static void poweroff(); #endif @@ -467,7 +472,7 @@ public: FORCE_INLINE static void refresh_contrast() { set_contrast(contrast); } #endif - #if BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) + #if ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) static millis_t next_filament_display; static void pause_filament_display(const millis_t ms=millis()) { next_filament_display = ms + 5000UL; } #endif @@ -506,7 +511,7 @@ public: static bool did_first_redraw; #endif - #if EITHER(BABYSTEP_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + #if ANY(BABYSTEP_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) static void zoffset_overlay(const int8_t dir); static void zoffset_overlay(const_float_t zvalue); #endif @@ -530,7 +535,7 @@ public: #endif #if HAS_MEDIA - #if BOTH(SCROLL_LONG_FILENAMES, HAS_MARLINUI_MENU) + #if ALL(SCROLL_LONG_FILENAMES, HAS_MARLINUI_MENU) #define MARLINUI_SCROLL_NAME 1 #endif #if MARLINUI_SCROLL_NAME @@ -642,7 +647,7 @@ public: #endif - #if EITHER(HAS_MARLINUI_MENU, EXTENSIBLE_UI) + #if ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI) static bool lcd_clicked; static bool use_click() { const bool click = lcd_clicked; @@ -674,18 +679,13 @@ public: static void load_settings(); static void store_settings(); #endif - #if DISABLED(EEPROM_AUTO_INIT) - static void eeprom_alert(const uint8_t msgid); - static void eeprom_alert_crc() { eeprom_alert(0); } - static void eeprom_alert_index() { eeprom_alert(1); } - static void eeprom_alert_version() { eeprom_alert(2); } - #endif + static void eeprom_alert(const EEPROM_Error) TERN_(EEPROM_AUTO_INIT, {}); #endif // // Special handling if a move is underway // - #if ANY(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION, PROBE_OFFSET_WIZARD, X_AXIS_TWIST_COMPENSATION) || (ENABLED(LCD_BED_LEVELING) && EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) + #if ANY(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION, PROBE_OFFSET_WIZARD, X_AXIS_TWIST_COMPENSATION) || (ENABLED(LCD_BED_LEVELING) && ANY(PROBE_MANUALLY, MESH_BED_LEVELING)) #define LCD_HAS_WAIT_FOR_MOVE 1 static bool wait_for_move; #else @@ -695,7 +695,7 @@ public: // // Block interaction while under external control // - #if HAS_MARLINUI_MENU && EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) + #if HAS_MARLINUI_MENU && ANY(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) static bool external_control; FORCE_INLINE static void capture() { external_control = true; } FORCE_INLINE static void release() { external_control = false; } @@ -728,7 +728,7 @@ public: * printer unusable in practice. */ static bool hw_button_pressed() { - LOOP_L_N(s, ENCODER_SAMPLES) { + for (uint8_t s = 0; s < ENCODER_SAMPLES; ++s) { if (!BUTTON_CLICK()) return false; safe_delay(1); } @@ -738,7 +738,7 @@ public: static bool hw_button_pressed() { return BUTTON_CLICK(); } #endif - #if EITHER(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) + #if ANY(AUTO_BED_LEVELING_UBL, G26_MESH_VALIDATION) static void wait_for_release(); #endif @@ -746,14 +746,14 @@ public: #define ENCODERBASE (TERN(REVERSE_ENCODER_DIRECTION, -1, +1)) - #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) + #if ANY(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) static int8_t encoderDirection; #else static constexpr int8_t encoderDirection = ENCODERBASE; #endif FORCE_INLINE static void encoder_direction_normal() { - #if EITHER(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) + #if ANY(REVERSE_MENU_DIRECTION, REVERSE_SELECT_DIRECTION) encoderDirection = ENCODERBASE; #endif } diff --git a/Marlin/src/lcd/menu/game/brickout.cpp b/Marlin/src/lcd/menu/game/brickout.cpp index fc4d19b1d9..078cbbccee 100644 --- a/Marlin/src/lcd/menu/game/brickout.cpp +++ b/Marlin/src/lcd/menu/game/brickout.cpp @@ -44,7 +44,7 @@ brickout_data_t &bdat = marlin_game_data.brickout; inline void reset_bricks(const uint16_t v) { bdat.brick_count = (BRICK_COLS) * (BRICK_ROWS); - LOOP_L_N(i, BRICK_ROWS) bdat.bricks[i] = v; + for (uint8_t i = 0; i < BRICK_ROWS; ++i) bdat.bricks[i] = v; } void reset_ball() { @@ -138,13 +138,13 @@ void BrickoutGame::game_screen() { // Draw bricks if (PAGE_CONTAINS(BRICK_TOP, BRICK_BOT)) { - LOOP_L_N(y, BRICK_ROWS) { + for (uint8_t y = 0; y < BRICK_ROWS; ++y) { const uint8_t yy = y * BRICK_H + BRICK_TOP; if (PAGE_CONTAINS(yy, yy + BRICK_H - 1)) { - LOOP_L_N(x, BRICK_COLS) { + for (uint8_t x = 0; x < BRICK_COLS; ++x) { if (TEST(bdat.bricks[y], x)) { const uint8_t xx = x * BRICK_W; - LOOP_L_N(v, BRICK_H - 1) + for (uint8_t v = 0; v < BRICK_H - 1; ++v) if (PAGE_CONTAINS(yy + v, yy + v)) u8g.drawHLine(xx, yy + v, BRICK_W - 1); } diff --git a/Marlin/src/lcd/menu/game/invaders.cpp b/Marlin/src/lcd/menu/game/invaders.cpp index 56e4c224dd..1cb3e5bf3f 100644 --- a/Marlin/src/lcd/menu/game/invaders.cpp +++ b/Marlin/src/lcd/menu/game/invaders.cpp @@ -166,29 +166,29 @@ inline void update_invader_data() { uint8_t inv_mask = 0; // Get a list of all active invaders uint8_t sc = 0; - LOOP_L_N(y, INVADER_ROWS) { + for (uint8_t y = 0; y < INVADER_ROWS; ++y) { uint8_t m = idat.bugs[y]; if (m) idat.botmost = y + 1; inv_mask |= m; - LOOP_L_N(x, INVADER_COLS) + for (uint8_t x = 0; x < INVADER_COLS; ++x) if (TEST(m, x)) idat.shooters[sc++] = (y << 4) | x; } idat.leftmost = 0; - LOOP_L_N(i, INVADER_COLS) { if (TEST(inv_mask, i)) break; idat.leftmost -= INVADER_COL_W; } + for (uint8_t i = 0; i < INVADER_COLS; ++i) { if (TEST(inv_mask, i)) break; idat.leftmost -= INVADER_COL_W; } idat.rightmost = LCD_PIXEL_WIDTH - (INVADERS_WIDE); for (uint8_t i = INVADER_COLS; i--;) { if (TEST(inv_mask, i)) break; idat.rightmost += INVADER_COL_W; } if (idat.count == 2) idat.dir = idat.dir > 0 ? INVADER_VEL + 1 : -(INVADER_VEL + 1); } inline void reset_bullets() { - LOOP_L_N(i, COUNT(idat.bullet)) idat.bullet[i].v = 0; + for (uint8_t i = 0; i < COUNT(idat.bullet); ++i) idat.bullet[i].v = 0; } inline void reset_invaders() { idat.pos.x = 0; idat.pos.y = INVADER_TOP; idat.dir = INVADER_VEL; idat.count = (INVADER_COLS) * (INVADER_ROWS); - LOOP_L_N(i, INVADER_ROWS) idat.bugs[i] = _BV(INVADER_COLS) - 1; + for (uint8_t i = 0; i < INVADER_ROWS; ++i) idat.bugs[i] = _BV(INVADER_COLS) - 1; update_invader_data(); reset_bullets(); } @@ -274,7 +274,7 @@ void InvadersGame::game_screen() { // Find a free bullet laser_t *b = nullptr; - LOOP_L_N(i, COUNT(idat.bullet)) if (!idat.bullet[i].v) { b = &idat.bullet[i]; break; } + for (uint8_t i = 0; i < COUNT(idat.bullet); ++i) if (!idat.bullet[i].v) { b = &idat.bullet[i]; break; } if (b) { // Pick a random shooter and update the bullet //SERIAL_ECHOLNPGM("free bullet found"); @@ -322,7 +322,7 @@ void InvadersGame::game_screen() { } // laser in invader zone // Handle alien bullets - LOOP_L_N(s, COUNT(idat.bullet)) { + for (uint8_t s = 0; s < COUNT(idat.bullet); ++s) { laser_t *b = &idat.bullet[s]; if (b->v) { // Update alien bullet position @@ -371,11 +371,11 @@ void InvadersGame::game_screen() { // Draw invaders if (PAGE_CONTAINS(idat.pos.y, idat.pos.y + idat.botmost * (INVADER_ROW_H) - 2 - 1)) { int8_t yy = idat.pos.y; - LOOP_L_N(y, INVADER_ROWS) { + for (uint8_t y = 0; y < INVADER_ROWS; ++y) { const uint8_t type = inv_type[y]; if (PAGE_CONTAINS(yy, yy + INVADER_H - 1)) { int8_t xx = idat.pos.x; - LOOP_L_N(x, INVADER_COLS) { + for (uint8_t x = 0; x < INVADER_COLS; ++x) { if (TEST(idat.bugs[y], x)) u8g.drawBitmapP(xx, yy, 2, INVADER_H, invader[type][idat.game_blink]); xx += INVADER_COL_W; @@ -398,7 +398,7 @@ void InvadersGame::game_screen() { u8g.drawVLine(idat.laser.x, idat.laser.y, LASER_H); // Draw invader bullets - LOOP_L_N (i, COUNT(idat.bullet)) { + for (uint8_t i = 0; i < COUNT(idat.bullet); ++i) { if (idat.bullet[i].v && PAGE_CONTAINS(idat.bullet[i].y - (SHOT_H - 1), idat.bullet[i].y)) u8g.drawVLine(idat.bullet[i].x, idat.bullet[i].y - (SHOT_H - 1), SHOT_H); } diff --git a/Marlin/src/lcd/menu/game/maze.cpp b/Marlin/src/lcd/menu/game/maze.cpp index 85f752ee7d..0c77f69e1e 100644 --- a/Marlin/src/lcd/menu/game/maze.cpp +++ b/Marlin/src/lcd/menu/game/maze.cpp @@ -83,7 +83,7 @@ void MazeGame::game_screen() { if (PAGE_UNDER(HEADER_H)) lcd_put_int(0, HEADER_H - 1, score); // Draw the maze - // LOOP_L_N(n, head_ind) { + // for (uint8_t n = 0; n < head_ind; ++n) { // const pos_t &p = maze_walls[n], &q = maze_walls[n + 1]; // if (p.x == q.x) { // const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); diff --git a/Marlin/src/lcd/menu/game/snake.cpp b/Marlin/src/lcd/menu/game/snake.cpp index c88893a6e6..2a78c089cf 100644 --- a/Marlin/src/lcd/menu/game/snake.cpp +++ b/Marlin/src/lcd/menu/game/snake.cpp @@ -84,14 +84,14 @@ void shorten_tail() { } if (shift) { sdat.head_ind--; - LOOP_LE_N(i, sdat.head_ind) + for (uint8_t i = 0; i <= sdat.head_ind; ++i) sdat.snake_tail[i] = sdat.snake_tail[i + 1]; } } // The food is on a line inline bool food_on_line() { - LOOP_L_N(n, sdat.head_ind) { + for (uint8_t n = 0; n < sdat.head_ind; ++n) { pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; if (p.x == q.x) { if ((sdat.foodx == p.x - 1 || sdat.foodx == p.x) && WITHIN(sdat.foody, _MIN(p.y, q.y), _MAX(p.y, q.y))) @@ -151,7 +151,7 @@ bool snake_overlap() { // VERTICAL head segment? if (h1.x == h2.x) { // Loop from oldest to segment two away from head - LOOP_L_N(n, sdat.head_ind - 2) { + for (uint8_t n = 0; n < sdat.head_ind - 2; ++n) { // Segment p to q const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; if (p.x != q.x) { @@ -163,7 +163,7 @@ bool snake_overlap() { } else { // Loop from oldest to segment two away from head - LOOP_L_N(n, sdat.head_ind - 2) { + for (uint8_t n = 0; n < sdat.head_ind - 2; ++n) { // Segment p to q const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; if (p.y != q.y) { @@ -240,7 +240,7 @@ void SnakeGame::game_screen() { #if SNAKE_WH < 2 // At this scale just draw a line - LOOP_L_N(n, sdat.head_ind) { + for (uint8_t n = 0; n < sdat.head_ind; ++n) { const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; if (p.x == q.x) { const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); @@ -256,7 +256,7 @@ void SnakeGame::game_screen() { #elif SNAKE_WH == 2 // At this scale draw two lines - LOOP_L_N(n, sdat.head_ind) { + for (uint8_t n = 0; n < sdat.head_ind; ++n) { const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; if (p.x == q.x) { const int8_t y1 = GAMEY(_MIN(p.y, q.y)), y2 = GAMEY(_MAX(p.y, q.y)); @@ -275,7 +275,7 @@ void SnakeGame::game_screen() { #else // Draw a series of boxes - LOOP_L_N(n, sdat.head_ind) { + for (uint8_t n = 0; n < sdat.head_ind; ++n) { const pos_t &p = sdat.snake_tail[n], &q = sdat.snake_tail[n + 1]; if (p.x == q.x) { const int8_t y1 = _MIN(p.y, q.y), y2 = _MAX(p.y, q.y); diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index 5c4dc12d26..a9574dd4d9 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -138,7 +138,7 @@ void MenuEditItemBase::goto_edit_screen( void * const ev, // Edit value pointer const int32_t minv, // Encoder minimum const int32_t maxv, // Encoder maximum - const uint16_t ep, // Initial encoder value + const uint32_t ep, // Initial encoder value const screenFunc_t cs, // MenuItem_type::draw_edit_screen => MenuEditItemBase::edit() const screenFunc_t cb, // Callback after edit const bool le // Flag to call cb() during editing @@ -176,7 +176,7 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co TERN_(SET_PROGRESS_PERCENT, progress_reset()); - #if BOTH(DOUBLECLICK_FOR_Z_BABYSTEPPING, BABYSTEPPING) + #if ALL(DOUBLECLICK_FOR_Z_BABYSTEPPING, BABYSTEPPING) static millis_t doubleclick_expire_ms = 0; // Going to menu_main from status screen? Remember first click time. // Going back to status screen within a very short time? Go to Z babystepping. diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index 9d824e2a4c..d4cbfd7a73 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -168,7 +168,7 @@ class MenuEditItemBase : public MenuItemBase { void * const ev, // Edit value pointer const int32_t minv, // Encoder minimum const int32_t maxv, // Encoder maximum - const uint16_t ep, // Initial encoder value + const uint32_t ep, // Initial encoder value const screenFunc_t cs, // MenuItem_type::draw_edit_screen => MenuEditItemBase::edit() const screenFunc_t cb, // Callback after edit const bool le // Flag to call cb() during editing @@ -242,23 +242,16 @@ void _lcd_draw_homing(); #else void lcd_babystep_z(); #endif - - #if ENABLED(BABYSTEP_MILLIMETER_UNITS) - #define BABYSTEP_SIZE_X int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[X_AXIS]) - #define BABYSTEP_SIZE_Y int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[Y_AXIS]) - #define BABYSTEP_SIZE_Z int32_t((BABYSTEP_MULTIPLICATOR_Z) * planner.settings.axis_steps_per_mm[Z_AXIS]) - #else - #define BABYSTEP_SIZE_X BABYSTEP_MULTIPLICATOR_XY - #define BABYSTEP_SIZE_Y BABYSTEP_MULTIPLICATOR_XY - #define BABYSTEP_SIZE_Z BABYSTEP_MULTIPLICATOR_Z - #endif - #endif #if ENABLED(TOUCH_SCREEN_CALIBRATION) void touch_screen_calibration(); #endif +#if ENABLED(ONE_CLICK_PRINT) + void one_click_print(); +#endif + extern uint8_t screen_history_depth; inline void clear_menu_history() { screen_history_depth = 0; } diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 719838f6be..7ef11d0e06 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -268,7 +268,7 @@ void menu_backlash(); } #endif -#if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) || ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU, MPC_AUTOTUNE_MENU, MPC_EDIT_MENU) +#if ALL(AUTOTEMP, HAS_TEMP_HOTEND) || ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU, MPC_AUTOTUNE_MENU, MPC_EDIT_MENU) #define SHOW_MENU_ADVANCED_TEMPERATURE 1 #endif @@ -277,7 +277,7 @@ void menu_backlash(); // #if SHOW_MENU_ADVANCED_TEMPERATURE - #if BOTH(MPC_EDIT_MENU, MPC_INCLUDE_FAN) + #if ALL(MPC_EDIT_MENU, MPC_INCLUDE_FAN) #define MPC_EDIT_DEFS(N) editable.decimal = thermalManager.temp_hotend[N].fanCoefficient() #else #define MPC_EDIT_DEFS(...) @@ -294,7 +294,7 @@ void menu_backlash(); // // Autotemp, Min, Max, Fact // - #if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) + #if ALL(AUTOTEMP, HAS_TEMP_HOTEND) 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); @@ -309,7 +309,7 @@ void menu_backlash(); // PID-P E5, PID-I E5, PID-D E5, PID-C E5, PID Autotune E5 // - #if BOTH(PIDTEMP, PID_EDIT_MENU) + #if ALL(PIDTEMP, PID_EDIT_MENU) #define __PID_HOTEND_MENU_ITEMS(N) \ raw_Kp = thermalManager.temp_hotend[N].pid.p(); \ raw_Ki = thermalManager.temp_hotend[N].pid.i(); \ @@ -342,7 +342,7 @@ void menu_backlash(); #endif - #if ENABLED(PID_EDIT_MENU) && EITHER(PIDTEMPBED, PIDTEMPCHAMBER) + #if ENABLED(PID_EDIT_MENU) && ANY(PIDTEMPBED, PIDTEMPCHAMBER) #define _PID_EDIT_ITEMS_TMPL(N,T) \ raw_Kp = T.pid.p(); \ raw_Ki = T.pid.i(); \ @@ -460,7 +460,7 @@ void menu_backlash(); EDIT_ITEM_FAST_N(float5, E_AXIS, MSG_VMAX_N, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e); #endif #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(n, E_STEPPERS) + for (uint8_t n = 0; n < E_STEPPERS; ++n) EDIT_ITEM_FAST_N(float5, n, MSG_VMAX_EN, &planner.settings.max_feedrate_mm_s[E_AXIS_N(n)], 1, max_fr_edit_scaled.e); #endif @@ -475,9 +475,23 @@ void menu_backlash(); // M201 / M204 Accelerations void menu_advanced_acceleration() { - float max_accel = planner.settings.max_acceleration_mm_per_s2[A_AXIS]; - TERN_(HAS_Y_AXIS, NOLESS(max_accel, planner.settings.max_acceleration_mm_per_s2[B_AXIS])); - TERN_(HAS_Z_AXIS, NOLESS(max_accel, planner.settings.max_acceleration_mm_per_s2[C_AXIS])); + float max_accel = ( + #if NUM_AXES + _MAX(NUM_AXIS_LIST( + planner.settings.max_acceleration_mm_per_s2[A_AXIS], + planner.settings.max_acceleration_mm_per_s2[B_AXIS], + planner.settings.max_acceleration_mm_per_s2[C_AXIS], + planner.settings.max_acceleration_mm_per_s2[I_AXIS], + planner.settings.max_acceleration_mm_per_s2[J_AXIS], + planner.settings.max_acceleration_mm_per_s2[K_AXIS], + planner.settings.max_acceleration_mm_per_s2[U_AXIS], + planner.settings.max_acceleration_mm_per_s2[V_AXIS], + planner.settings.max_acceleration_mm_per_s2[W_AXIS] + )) + #else + 0 + #endif + ); // M201 settings constexpr xyze_ulong_t max_accel_edit = @@ -518,7 +532,7 @@ void menu_backlash(); #if ENABLED(DISTINCT_E_FACTORS) EDIT_ITEM_FAST(long5_25, MSG_AMAX_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(active_extruder)], 100, max_accel_edit_scaled.e, []{ planner.refresh_acceleration_rates(); }); - LOOP_L_N(n, E_STEPPERS) + for (uint8_t n = 0; n < E_STEPPERS; ++n) EDIT_ITEM_FAST_N(long5_25, n, MSG_AMAX_EN, &planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(n)], 100, max_accel_edit_scaled.e, []{ if (MenuItemBase::itemIndex == active_extruder) planner.refresh_acceleration_rates(); @@ -642,7 +656,7 @@ void menu_advanced_steps_per_mm() { EDIT_ITEM_FAST_N(float72, a, MSG_N_STEPS, &planner.settings.axis_steps_per_mm[a], 5, 9999, []{ planner.refresh_positioning(); }); #if ENABLED(DISTINCT_E_FACTORS) - LOOP_L_N(n, E_STEPPERS) + for (uint8_t n = 0; n < E_STEPPERS; ++n) EDIT_ITEM_FAST_N(float72, n, MSG_EN_STEPS, &planner.settings.axis_steps_per_mm[E_AXIS_N(n)], 5, 9999, []{ const uint8_t e = MenuItemBase::itemIndex; if (e == active_extruder) diff --git a/Marlin/src/lcd/menu/menu_backlash.cpp b/Marlin/src/lcd/menu/menu_backlash.cpp index 2b9404b0f6..a5f1f3746b 100644 --- a/Marlin/src/lcd/menu/menu_backlash.cpp +++ b/Marlin/src/lcd/menu/menu_backlash.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, BACKLASH_GCODE) +#if ALL(HAS_MARLINUI_MENU, BACKLASH_GCODE) #include "menu_item.h" @@ -39,7 +39,7 @@ void menu_backlash() { editable.uint8 = backlash.get_correction_uint8(); EDIT_ITEM_FAST(percent, MSG_BACKLASH_CORRECTION, &editable.uint8, backlash.all_off, backlash.all_on, []{ backlash.set_correction_uint8(editable.uint8); }); - #if DISABLED(CORE_BACKLASH) || EITHER(MARKFORGED_XY, MARKFORGED_YX) + #if DISABLED(CORE_BACKLASH) || ANY(MARKFORGED_XY, MARKFORGED_YX) #define _CAN_CALI AXIS_CAN_CALIBRATE #else #define _CAN_CALI(A) true @@ -50,7 +50,9 @@ void menu_backlash() { EDIT_ITEM_FAST_N(float43, _AXIS(N), MSG_BACKLASH_N, &editable.decimal, 0.0f, 9.9f, []{ backlash.set_distance_mm(_AXIS(N), editable.decimal); }); \ } while (0); - if (_CAN_CALI(A)) EDIT_BACKLASH_DISTANCE(A); + #if HAS_X_AXIS && _CAN_CALI(A) + EDIT_BACKLASH_DISTANCE(A); + #endif #if HAS_Y_AXIS && _CAN_CALI(B) EDIT_BACKLASH_DISTANCE(B); #endif diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index a7fb54f68d..efc05aabde 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -43,7 +43,7 @@ #endif #endif -#if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) +#if ANY(PROBE_MANUALLY, MESH_BED_LEVELING) #include "../../module/motion.h" #include "../../gcode/queue.h" @@ -53,7 +53,7 @@ // // LCD probed points are from defaults - constexpr uint8_t total_probe_points = TERN(AUTO_BED_LEVELING_3POINT, 3, GRID_MAX_POINTS); + constexpr grid_count_t total_probe_points = TERN(AUTO_BED_LEVELING_3POINT, 3, GRID_MAX_POINTS); // // Bed leveling is done. Wait for G29 to complete. @@ -169,7 +169,7 @@ if (ui.should_draw()) { MenuItem_static::draw(1, GET_TEXT_F(MSG_LEVEL_BED_WAITING)); // Color UI needs a control to detect a touch - #if BOTH(TOUCH_SCREEN, HAS_GRAPHICAL_TFT) + #if ALL(TOUCH_SCREEN, HAS_GRAPHICAL_TFT) touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT); #endif } @@ -249,7 +249,7 @@ void menu_bed_leveling() { #endif // Level Bed - #if EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) + #if ANY(PROBE_MANUALLY, MESH_BED_LEVELING) // Manual leveling uses a guided procedure SUBMENU(MSG_LEVEL_BED, _lcd_level_bed_continue); #else @@ -292,6 +292,10 @@ void menu_bed_leveling() { EDIT_ITEM(LCD_Z_OFFSET_TYPE, MSG_ZPROBE_ZOFFSET, &probe.offset.z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX); #endif + #if ENABLED(PROBE_OFFSET_WIZARD) + SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); + #endif + #if ENABLED(LCD_BED_TRAMMING) SUBMENU(MSG_BED_TRAMMING, _lcd_bed_tramming); #endif diff --git a/Marlin/src/lcd/menu/menu_bed_tramming.cpp b/Marlin/src/lcd/menu/menu_bed_tramming.cpp index 8129a347c3..b6b3e72124 100644 --- a/Marlin/src/lcd/menu/menu_bed_tramming.cpp +++ b/Marlin/src/lcd/menu/menu_bed_tramming.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, LCD_BED_TRAMMING) +#if ALL(HAS_MARLINUI_MENU, LCD_BED_TRAMMING) #include "menu_item.h" #include "../../module/motion.h" @@ -43,7 +43,7 @@ #define BED_TRAMMING_HEIGHT 0.0 #endif -#if BOTH(HAS_STOWABLE_PROBE, BED_TRAMMING_USE_PROBE) && DISABLED(BLTOUCH) +#if ALL(HAS_STOWABLE_PROBE, BED_TRAMMING_USE_PROBE) && DISABLED(BLTOUCH) #define NEEDS_PROBE_DEPLOY 1 #endif @@ -152,7 +152,7 @@ static void _lcd_goto_next_corner() { } float z = BED_TRAMMING_Z_HOP; - #if BOTH(BED_TRAMMING_USE_PROBE, BLTOUCH) + #if ALL(BED_TRAMMING_USE_PROBE, BLTOUCH) z += bltouch.z_extra_clearance(); #endif line_to_z(z); @@ -187,7 +187,7 @@ static void _lcd_goto_next_corner() { if (PAGE_CONTAINS(y - (MENU_FONT_HEIGHT), y)) { SETCURSOR(TERN(TFT_COLOR_UI, 2, 0), cy); lcd_put_u8str(GET_TEXT_F(MSG_BED_TRAMMING_GOOD_POINTS)); - IF_ENABLED(TFT_COLOR_UI, lcd_moveto(12, cy)); + TERN_(TFT_COLOR_UI, lcd_moveto(12, cy)); lcd_put_u8str(GOOD_POINTS_TO_STR(good_points)); lcd_put_u8str(F("/")); lcd_put_u8str(GOOD_POINTS_TO_STR(nr_edge_points)); @@ -200,7 +200,7 @@ static void _lcd_goto_next_corner() { if (PAGE_CONTAINS(y - (MENU_FONT_HEIGHT), y)) { SETCURSOR(TERN(TFT_COLOR_UI, 2, 0), cy); lcd_put_u8str(GET_TEXT_F(MSG_BED_TRAMMING_LAST_Z)); - IF_ENABLED(TFT_COLOR_UI, lcd_moveto(12, 2)); + TERN_(TFT_COLOR_UI, lcd_moveto(12, 2)); lcd_put_u8str(LAST_Z_TO_STR(last_z)); } } diff --git a/Marlin/src/lcd/menu/menu_cancelobject.cpp b/Marlin/src/lcd/menu/menu_cancelobject.cpp index b2784bcd41..bcbd90ee3a 100644 --- a/Marlin/src/lcd/menu/menu_cancelobject.cpp +++ b/Marlin/src/lcd/menu/menu_cancelobject.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, CANCEL_OBJECTS) +#if ALL(HAS_MARLINUI_MENU, CANCEL_OBJECTS) #include "menu_item.h" #include "menu_addon.h" diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 2fe4b77018..32b6f15995 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -59,19 +59,21 @@ #include "../../libs/buzzer.h" #endif +#if ANY(LCD_PROGRESS_BAR_TEST, LCD_ENDSTOP_TEST) + #include "../lcdprint.h" + #define HAS_DEBUG_MENU 1 +#endif + +//#define DEBUG_OUT 1 #include "../../core/debug_out.h" -#define HAS_DEBUG_MENU EITHER(LCD_PROGRESS_BAR_TEST, LCD_ENDSTOP_TEST) - void menu_advanced_settings(); -#if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) +#if ANY(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) void menu_delta_calibrate(); #endif #if ENABLED(LCD_PROGRESS_BAR_TEST) - #include "../lcdprint.h" - static void progress_bar_test() { static int8_t bar_percent = 0; if (ui.use_click()) { @@ -96,8 +98,6 @@ void menu_advanced_settings(); #if ENABLED(LCD_ENDSTOP_TEST) - #include "../lcdprint.h" - #define __STOP_ITEM(F,S) PSTRING_ITEM_F_P(F, TEST(stops, S) ? PSTR(STR_ENDSTOP_HIT) : PSTR(STR_ENDSTOP_OPEN), SS_FULL) #define _STOP_ITEM(L,S) __STOP_ITEM(F(L), S) #define STOP_ITEM(A,I) _STOP_ITEM(STRINGIFY(A) STRINGIFY(I) " " TERN(A##_HOME_TO_MAX, "Max", "Min"), A##I##_ENDSTOP) @@ -307,14 +307,11 @@ void menu_advanced_settings(); #if ENABLED(BLTOUCH_LCD_VOLTAGE_MENU) void bltouch_report() { - PGMSTR(mode0, "OD"); - PGMSTR(mode1, "5V"); - DEBUG_ECHOPGM("BLTouch Mode: "); - DEBUG_ECHOPGM_P(bltouch.od_5v_mode ? mode1 : mode0); - DEBUG_ECHOLNPGM(" (Default " TERN(BLTOUCH_SET_5V_MODE, "5V", "OD") ")"); + FSTR_P const mode0 = F("OD"), mode1 = F("5V"); + DEBUG_ECHOLNPGM("BLTouch Mode: ", bltouch.od_5v_mode ? mode1 : mode0, " (Default ", TERN(BLTOUCH_SET_5V_MODE, mode1, mode0), ")"); char mess[21]; strcpy_P(mess, PSTR("BLTouch Mode: ")); - strcpy_P(&mess[15], bltouch.od_5v_mode ? mode1 : mode0); + strcpy_P(&mess[15], bltouch.od_5v_mode ? FTOP(mode1) : FTOP(mode0)); ui.set_status(mess); ui.return_to_status(); } @@ -592,7 +589,7 @@ void menu_configuration() { #endif if (!busy) { - #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) + #if ANY(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) SUBMENU(MSG_DELTA_CALIBRATE, menu_delta_calibrate); #endif @@ -657,7 +654,7 @@ void menu_configuration() { // Preheat configurations #if HAS_PREHEAT && DISABLED(SLIM_LCD_MENUS) - LOOP_L_N(m, PREHEAT_COUNT) + for (uint8_t m = 0; m < PREHEAT_COUNT; ++m) SUBMENU_N_f(m, ui.get_preheat_label(m), MSG_PREHEAT_M_SETTINGS, _menu_configuration_preheat_settings); #endif diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index fe0be04398..c7da12a61e 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_MENU && EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) +#if HAS_MARLINUI_MENU && ANY(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) #include "menu_item.h" #include "../../module/delta.h" diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 6fdcc2b488..073ffc1838 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, ADVANCED_PAUSE_FEATURE) +#if ALL(HAS_MARLINUI_MENU, ADVANCED_PAUSE_FEATURE) #include "menu_item.h" #include "../../module/temperature.h" @@ -96,7 +96,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { if (LCD_HEIGHT >= 4) STATIC_ITEM_F(change_filament_header(mode), SS_DEFAULT|SS_INVERT); BACK_ITEM(MSG_BACK); #if HAS_PREHEAT - LOOP_L_N(m, PREHEAT_COUNT) + for (uint8_t m = 0; m < PREHEAT_COUNT; ++m) ACTION_ITEM_N_f(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, @@ -141,7 +141,7 @@ void menu_change_filament() { GCODES_ITEM_F(fmsg, F("M600 B0")); #else FSTR_P const fmsg = GET_TEXT_F(MSG_FILAMENTCHANGE_E); - LOOP_L_N(s, E_STEPPERS) { + for (uint8_t s = 0; s < E_STEPPERS; ++s) { if (thermalManager.targetTooColdToExtrude(s)) SUBMENU_N_F(s, fmsg, []{ _menu_temp_filament_op(PAUSE_MODE_CHANGE_FILAMENT, MenuItemBase::itemIndex); }); else { @@ -166,7 +166,7 @@ void menu_change_filament() { GCODES_ITEM_F(msg_load, F("M701")); #else FSTR_P const msg_load = GET_TEXT_F(MSG_FILAMENTLOAD_E); - LOOP_L_N(s, E_STEPPERS) { + for (uint8_t s = 0; s < E_STEPPERS; ++s) { if (thermalManager.targetTooColdToExtrude(s)) SUBMENU_N_F(s, msg_load, []{ _menu_temp_filament_op(PAUSE_MODE_LOAD_FILAMENT, MenuItemBase::itemIndex); }); else { @@ -194,7 +194,7 @@ void menu_change_filament() { GCODES_ITEM(MSG_FILAMENTUNLOAD_ALL, F("M702")); #endif FSTR_P const msg_unload = GET_TEXT_F(MSG_FILAMENTUNLOAD_E); - LOOP_L_N(s, E_STEPPERS) { + for (uint8_t s = 0; s < E_STEPPERS; ++s) { if (thermalManager.targetTooColdToExtrude(s)) SUBMENU_N_F(s, msg_unload, []{ _menu_temp_filament_op(PAUSE_MODE_UNLOAD_FILAMENT, MenuItemBase::itemIndex); }); else { diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index e2dd6c6475..59ed52e6f1 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, LCD_INFO_MENU) +#if ALL(HAS_MARLINUI_MENU, LCD_INFO_MENU) #include "menu_item.h" diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 805caa1d90..ecc1ac4047 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -79,10 +79,10 @@ template class TMenuEditItem : MenuEditItemBase { private: typedef typename NAME::type_t type_t; - static float scale(const_float_t value) { return NAME::scale(value); } - static 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); } + static int32_t scaleToEncoder(const type_t &value) { return NAME::scaleToEncoder(value); } + static type_t unscaleEncoder(const int32_t value) { return NAME::unscaleEncoder(value); } + static const char* to_string(const int32_t value) { return NAME::strfunc(unscaleEncoder(value)); } + static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscaleEncoder(value); } public: FORCE_INLINE static void draw(const bool sel, const uint8_t row, FSTR_P const fstr, type_t * const data, ...) { MenuEditItemBase::draw(sel, row, fstr, NAME::strfunc(*(data))); @@ -101,9 +101,9 @@ class TMenuEditItem : MenuEditItemBase { const bool live=false // Callback during editing ) { // Make sure minv and maxv fit within int32_t - const int32_t minv = _MAX(scale(minValue), INT32_MIN), - maxv = _MIN(scale(maxValue), INT32_MAX); - goto_edit_screen(fstr, ptr, minv, maxv - minv, scale(*ptr) - minv, + const int32_t minv = _MAX(scaleToEncoder(minValue), INT32_MIN), + maxv = _MIN(scaleToEncoder(maxValue), INT32_MAX); + goto_edit_screen(fstr, ptr, minv, maxv - minv, scaleToEncoder(*ptr) - minv, edit_screen, callback, live); } }; @@ -119,9 +119,9 @@ class TMenuEditItem : MenuEditItemBase { * * struct MenuEditItemInfo_percent { * typedef uint8_t type_t; - * static float scale(const_float_t value) { return value * (100.f/255.f) +0.5f; } - * static float unscale(const_float_t value) { return value / (100.f/255.f) +0.5f; } - * static const char* strfunc(const_float_t value) { return ui8tostr4pctrj(_DOFIX(uint8_t,value)); } + * static int32_t scaleToEncoder(const type_t &value) { return value * (100.f/255.f) +0.5f; } + * static type_t unscaleEncoder(const int32_t value) { return type_t(value) / (100.f/255.f) +0.5f; } + * static const char* strfunc(const type_t &value) { return ui8tostr4pctrj(_DOFIX(uint8_t,value)); } * }; * typedef TMenuEditItem MenuItem_percent */ @@ -130,36 +130,37 @@ class TMenuEditItem : MenuEditItemBase { #define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, ETC...) \ struct MenuEditItemInfo_##NAME { \ typedef TYPE type_t; \ - static float scale(const_float_t value) { return value * (SCALE) ETC; } \ - static float unscale(const_float_t value) { return value / (SCALE) ETC; } \ - static const char* strfunc(const_float_t value) { return STRFUNC(_DOFIX(TYPE,value)); } \ + /* scale the given value to the encoder */ \ + static int32_t scaleToEncoder(const type_t &value) { return value * (SCALE) ETC; } \ + static type_t unscaleEncoder(const int32_t value) { return type_t(value) / (SCALE) ETC; } \ + static const char* strfunc(const type_t &value) { return STRFUNC(_DOFIX(TYPE,value)); } \ }; \ typedef TMenuEditItem MenuItem_##NAME // NAME TYPE STRFUNC SCALE ROUND -DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, +0.5f); // 100% right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(percent_3 ,uint8_t ,pcttostrpctrj , 1 ); // 100% right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint8 ,uint8_t ,ui8tostr3rj , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_3 ,uint16_t ,ui16tostr3rj , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_4 ,uint16_t ,ui16tostr4rj , 0.1f ); // 1234 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3 , 1 ); // 123 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 ); // _2.34, 12.34, -2.34 or 123.45, -23.45 -DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 ); // -1.234, _1.234, +1.234 -DEFINE_MENU_EDIT_ITEM_TYPE(float4 ,float ,ftostr4sign , 1 ); // 1234 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) -DEFINE_MENU_EDIT_ITEM_TYPE(float61 ,float ,ftostr61rj , 10 ); // 12345.6 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float72 ,float ,ftostr72rj , 100 ); // 12345.67 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 ); // +12.3 -DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 ); // +123.4 -DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 ); // +1234.5 -DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 ); // +123.45 -DEFINE_MENU_EDIT_ITEM_TYPE(long5 ,uint32_t ,ftostr5rj , 0.01f ); // 12345 right-justified -DEFINE_MENU_EDIT_ITEM_TYPE(long5_25 ,uint32_t ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) +DEFINE_MENU_EDIT_ITEM_TYPE(percent ,uint8_t ,ui8tostr4pctrj , 100.f/255.f, + 0.5f ); // 100% right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(percent_3 ,uint8_t ,pcttostrpctrj , 1 ); // 100% right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int3 ,int16_t ,i16tostr3rj , 1 ); // 123, -12 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int4 ,int16_t ,i16tostr4signrj , 1 ); // 1234, -123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(int8 ,int8_t ,i8tostr3rj , 1 ); // 123, -12 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint8 ,uint8_t ,ui8tostr3rj , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_3 ,uint16_t ,ui16tostr3rj , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_4 ,uint16_t ,ui16tostr4rj , 0.1f ); // 1234 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(uint16_5 ,uint16_t ,ui16tostr5rj , 0.01f ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float3 ,float ,ftostr3rj , 1 ); // 123 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float42_52 ,float ,ftostr42_52 , 100 , + 0.001f ); // _2.34, 12.34, -2.34 or 123.45, -23.45 +DEFINE_MENU_EDIT_ITEM_TYPE(float43 ,float ,ftostr43sign ,1000 , + 0.0001f); // -1.234, _1.234, +1.234 +DEFINE_MENU_EDIT_ITEM_TYPE(float4 ,float ,ftostr4sign , 1 ); // 1234 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float5 ,float ,ftostr5rj , 1 ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float5_25 ,float ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) +DEFINE_MENU_EDIT_ITEM_TYPE(float61 ,float ,ftostr61rj , 10 , + 0.01f ); // 12345.6 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float72 ,float ,ftostr72rj , 100 , + 0.001f ); // 12345.67 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(float31sign ,float ,ftostr31sign , 10 , + 0.01f ); // +12.3 +DEFINE_MENU_EDIT_ITEM_TYPE(float41sign ,float ,ftostr41sign , 10 , + 0.01f ); // +123.4 +DEFINE_MENU_EDIT_ITEM_TYPE(float51sign ,float ,ftostr51sign , 10 , + 0.01f ); // +1234.5 +DEFINE_MENU_EDIT_ITEM_TYPE(float52sign ,float ,ftostr52sign , 100 , + 0.001f ); // +123.45 +DEFINE_MENU_EDIT_ITEM_TYPE(long5 ,uint32_t ,ftostr5rj , 0.01f ); // 12345 right-justified +DEFINE_MENU_EDIT_ITEM_TYPE(long5_25 ,uint32_t ,ftostr5rj , 0.04f ); // 12345 right-justified (25 increment) #if HAS_BED_PROBE #if Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 @@ -580,10 +581,10 @@ class MenuItem_bool : public MenuEditItemBase { }while(0) #if FAN_COUNT > 1 - #define FAN_EDIT_ITEMS(F) _FAN_EDIT_ITEMS(F,FAN_SPEED_N) + #define FAN_EDIT_ITEMS(F) _FAN_EDIT_ITEMS(F, FAN_SPEED_N) #endif - #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && EXTRUDERS > N) + #define SNFAN(N) (ENABLED(SINGLENOZZLE_STANDBY_FAN) && !HAS_FAN##N && (N) < EXTRUDERS) #if SNFAN(1) || SNFAN(2) || SNFAN(3) || SNFAN(4) || SNFAN(5) || SNFAN(6) || SNFAN(7) #define DEFINE_SINGLENOZZLE_ITEM() \ diff --git a/Marlin/src/lcd/menu/menu_job_recovery.cpp b/Marlin/src/lcd/menu/menu_job_recovery.cpp index 6329c58397..b2276aeb0c 100644 --- a/Marlin/src/lcd/menu/menu_job_recovery.cpp +++ b/Marlin/src/lcd/menu/menu_job_recovery.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, POWER_LOSS_RECOVERY) +#if ALL(HAS_MARLINUI_MENU, POWER_LOSS_RECOVERY) #include "menu_item.h" #include "../../gcode/queue.h" diff --git a/Marlin/src/lcd/menu/menu_language.cpp b/Marlin/src/lcd/menu/menu_language.cpp index 9361d595f7..c92b860950 100644 --- a/Marlin/src/lcd/menu/menu_language.cpp +++ b/Marlin/src/lcd/menu/menu_language.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfig.h" -#if HAS_MULTI_LANGUAGE +#if HAS_MENU_MULTI_LANGUAGE #include "menu_item.h" #include "../../MarlinCore.h" @@ -56,4 +56,4 @@ void menu_language() { END_MENU(); } -#endif // HAS_MULTI_LANGUAGE +#endif // HAS_MENU_MULTI_LANGUAGE diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index dea5ecceeb..c7390b98cb 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if HAS_MARLINUI_MENU && EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) +#if HAS_MARLINUI_MENU && ANY(LED_CONTROL_MENU, CASE_LIGHT_MENU) #include "menu_item.h" diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index a202f624f7..4ccdb60bf1 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -43,7 +43,7 @@ #include "game/game.h" #endif -#if EITHER(HAS_MEDIA, HOST_PROMPT_SUPPORT) || defined(ACTION_ON_CANCEL) +#if ANY(HAS_MEDIA, HOST_PROMPT_SUPPORT) || defined(ACTION_ON_CANCEL) #define MACHINE_CAN_STOP 1 #endif #if ANY(HAS_MEDIA, HOST_PROMPT_SUPPORT, PARK_HEAD_ON_PAUSE) || defined(ACTION_ON_PAUSE) @@ -88,7 +88,7 @@ void menu_configuration(); void menu_info(); #endif -#if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) +#if ANY(LED_CONTROL_MENU, CASE_LIGHT_MENU) void menu_led(); #endif @@ -273,7 +273,7 @@ void menu_main() { #endif } else { - #if BOTH(HAS_MEDIA, MEDIA_MENU_AT_TOP) + #if ALL(HAS_MEDIA, MEDIA_MENU_AT_TOP) // BEGIN MEDIA MENU #if ENABLED(MENU_ADDAUTOSTART) ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files @@ -326,7 +326,7 @@ void menu_main() { SUBMENU(MSG_MOTION, menu_motion); } - #if BOTH(ADVANCED_PAUSE_FEATURE, DISABLE_ENCODER) + #if ALL(ADVANCED_PAUSE_FEATURE, DISABLE_ENCODER) FILAMENT_CHANGE_ITEM(); #endif @@ -366,7 +366,7 @@ void menu_main() { SUBMENU(MSG_INFO_MENU, menu_info); #endif - #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) + #if ANY(LED_CONTROL_MENU, CASE_LIGHT_MENU) SUBMENU(MSG_LEDS, menu_led); #endif diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp index e32f41a9a6..26f7a0517d 100644 --- a/Marlin/src/lcd/menu/menu_media.cpp +++ b/Marlin/src/lcd/menu/menu_media.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, HAS_MEDIA) +#if ALL(HAS_MARLINUI_MENU, HAS_MEDIA) #include "menu_item.h" #include "../../sd/cardreader.h" @@ -73,14 +73,11 @@ class MenuItem_sdfile : public MenuItem_sdbase { #endif #if ENABLED(SD_MENU_CONFIRM_START) MenuItem_submenu::action(fstr, []{ - char * const longest = card.longest_filename(); - char buffer[strlen(longest) + 2]; - buffer[0] = ' '; - strcpy(buffer + 1, longest); + char * const filename = card.longest_filename(); MenuItem_confirm::select_screen( GET_TEXT_F(MSG_BUTTON_PRINT), GET_TEXT_F(MSG_BUTTON_CANCEL), sdcard_start_selected_file, nullptr, - GET_TEXT_F(MSG_START_PRINT), buffer, F("?") + GET_TEXT_F(MSG_START_PRINT), filename, F("?") ); }); #else diff --git a/Marlin/src/lcd/menu/menu_mixer.cpp b/Marlin/src/lcd/menu/menu_mixer.cpp index 478792479c..21c18c8209 100644 --- a/Marlin/src/lcd/menu/menu_mixer.cpp +++ b/Marlin/src/lcd/menu/menu_mixer.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, MIXING_EXTRUDER) +#if ALL(HAS_MARLINUI_MENU, MIXING_EXTRUDER) #include "menu_item.h" #include "menu_addon.h" @@ -170,7 +170,7 @@ void lcd_mixer_mix_edit() { #if CHANNEL_MIX_EDITING - LOOP_S_LE_N(n, 1, MIXING_STEPPERS) + for (uint8_t n = 1; n <= MIXING_STEPPERS; ++n) EDIT_ITEM_FAST_N(float42_52, n, MSG_MIX_COMPONENT_N, &mixer.collector[n-1], 0, 10); ACTION_ITEM(MSG_CYCLE_MIX, _lcd_mixer_cycle_mix); diff --git a/Marlin/src/lcd/menu/menu_mmu2.cpp b/Marlin/src/lcd/menu/menu_mmu2.cpp index 22230687e4..c9d163357b 100644 --- a/Marlin/src/lcd/menu/menu_mmu2.cpp +++ b/Marlin/src/lcd/menu/menu_mmu2.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfig.h" -#if BOTH(HAS_MARLINUI_MENU, MMU2_MENUS) +#if ALL(HAS_MARLINUI_MENU, MMU2_MENUS) #include "../../MarlinCore.h" #include "../../feature/mmu/mmu2.h" @@ -33,22 +33,21 @@ // Load Filament // -inline void action_mmu2_load_filament_to_nozzle(const uint8_t tool) { - ui.reset_status(); +inline void action_mmu2_load_to_nozzle(const uint8_t tool) { ui.return_to_status(); ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(tool + 1)); - if (mmu2.load_filament_to_nozzle(tool)) ui.reset_status(); - ui.return_to_status(); + if (mmu2.load_to_nozzle(tool)) ui.reset_status(); } -void _mmu2_load_filament(uint8_t index) { +void _mmu2_load_to_feeder(const uint8_t index) { ui.return_to_status(); ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); - mmu2.load_filament(index); + mmu2.load_to_feeder(index); ui.reset_status(); } + void action_mmu2_load_all() { - EXTRUDER_LOOP() _mmu2_load_filament(e); + EXTRUDER_LOOP() _mmu2_load_to_feeder(e); ui.return_to_status(); } @@ -56,14 +55,14 @@ void menu_mmu2_load_filament() { START_MENU(); BACK_ITEM(MSG_MMU2_MENU); ACTION_ITEM(MSG_MMU2_ALL, action_mmu2_load_all); - EXTRUDER_LOOP() ACTION_ITEM_N(e, MSG_MMU2_FILAMENT_N, []{ _mmu2_load_filament(MenuItemBase::itemIndex); }); + EXTRUDER_LOOP() ACTION_ITEM_N(e, MSG_MMU2_FILAMENT_N, []{ _mmu2_load_to_feeder(MenuItemBase::itemIndex); }); END_MENU(); } void menu_mmu2_load_to_nozzle() { START_MENU(); BACK_ITEM(MSG_MMU2_MENU); - EXTRUDER_LOOP() ACTION_ITEM_N(e, MSG_MMU2_FILAMENT_N, []{ action_mmu2_load_filament_to_nozzle(MenuItemBase::itemIndex); }); + EXTRUDER_LOOP() ACTION_ITEM_N(e, MSG_MMU2_FILAMENT_N, []{ action_mmu2_load_to_nozzle(MenuItemBase::itemIndex); }); END_MENU(); } @@ -117,7 +116,7 @@ void menu_mmu2() { // T* Choose Filament // -uint8_t feeder_index; +int8_t feeder_index; bool wait_for_mmu_menu; inline void action_mmu2_chosen(const uint8_t index) { @@ -144,10 +143,10 @@ void menu_mmu2_pause() { #if LCD_HEIGHT > 2 STATIC_ITEM(MSG_FILAMENT_CHANGE_HEADER, SS_DEFAULT|SS_INVERT); #endif - ACTION_ITEM(MSG_MMU2_RESUME, []{ wait_for_mmu_menu = false; }); + ACTION_ITEM(MSG_MMU2_RESUME, []{ wait_for_mmu_menu = false; }); ACTION_ITEM(MSG_MMU2_UNLOAD_FILAMENT, []{ mmu2.unload(); }); - ACTION_ITEM(MSG_MMU2_LOAD_FILAMENT, []{ mmu2.load_filament(feeder_index); }); - ACTION_ITEM(MSG_MMU2_LOAD_TO_NOZZLE, []{ mmu2.load_filament_to_nozzle(feeder_index); }); + ACTION_ITEM(MSG_MMU2_LOAD_FILAMENT, []{ mmu2.load_to_feeder(feeder_index); }); + ACTION_ITEM(MSG_MMU2_LOAD_TO_NOZZLE, []{ mmu2.load_to_nozzle(feeder_index); }); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 200d46a8af..67fcbdd851 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -28,7 +28,7 @@ #if HAS_MARLINUI_MENU -#define HAS_LARGE_AREA ((X_BED_SIZE) >= 1000 || TERN0(HAS_Y_AXIS, (Y_BED_SIZE) >= 1000) || TERN0(HAS_Z_AXIS, (Z_MAX_POS) >= 1000)) +#define HAS_LARGE_AREA (TERN0(HAS_X_AXIS, (X_BED_SIZE) >= 1000) || TERN0(HAS_Y_AXIS, (Y_BED_SIZE) >= 1000) || TERN0(HAS_Z_AXIS, (Z_MAX_POS) >= 1000)) #if ENABLED(LARGE_MOVE_ITEMS) #define HAS_LARGE_MOVES true #elif ENABLED(SLIM_LCD_MENUS) @@ -119,7 +119,7 @@ void lcd_move_axis(const AxisEnum axis) { #endif // E_MANUAL -#if EITHER(PROBE_OFFSET_WIZARD, X_AXIS_TWIST_COMPENSATION) +#if ANY(PROBE_OFFSET_WIZARD, X_AXIS_TWIST_COMPENSATION) void _goto_manual_move_z(const_float_t scale) { ui.manual_move.menu_scale = scale; @@ -207,14 +207,16 @@ void menu_move() { START_MENU(); BACK_ITEM(MSG_MOTION); - #if BOTH(HAS_SOFTWARE_ENDSTOPS, SOFT_ENDSTOPS_MENU_ITEM) + #if ALL(HAS_SOFTWARE_ENDSTOPS, SOFT_ENDSTOPS_MENU_ITEM) EDIT_ITEM(bool, MSG_LCD_SOFT_ENDSTOPS, &soft_endstop._enabled); #endif // Move submenu for each axis if (NONE(IS_KINEMATIC, NO_MOTION_BEFORE_HOMING) || all_axes_homed()) { if (TERN1(DELTA, current_position.z <= delta_clip_start_height)) { - SUBMENU_N(X_AXIS, MSG_MOVE_N, []{ _menu_move_distance(X_AXIS, []{ lcd_move_axis(X_AXIS); }); }); + #if HAS_X_AXIS + SUBMENU_N(X_AXIS, MSG_MOVE_N, []{ _menu_move_distance(X_AXIS, []{ lcd_move_axis(X_AXIS); }); }); + #endif #if HAS_Y_AXIS SUBMENU_N(Y_AXIS, MSG_MOVE_N, []{ _menu_move_distance(Y_AXIS, []{ lcd_move_axis(Y_AXIS); }); }); #endif @@ -311,7 +313,136 @@ void menu_move() { void goto_tramming_wizard(); #endif +#if ENABLED(FT_MOTION_MENU) + + #include "../../module/ft_motion.h" + #include "../../gcode/gcode.h" + + void _M493_S(const ftMotionMode_t s) { + char cmd[10]; + sprintf_P(cmd, PSTR("M493S%i"), int(s)); + gcode.process_subcommands_now(cmd); + ui.go_back(); + } + + inline void menu_ftm_mode() { + const ftMotionMode_t mode = fxdTiCtrl.cfg.mode; + + START_MENU(); + BACK_ITEM(MSG_FIXED_TIME_MOTION); + + if (mode != ftMotionMode_DISABLED) ACTION_ITEM(MSG_LCD_OFF, []{ _M493_S(ftMotionMode_DISABLED); }); + if (mode != ftMotionMode_ENABLED) ACTION_ITEM(MSG_LCD_ON, []{ _M493_S(ftMotionMode_ENABLED); }); + #if HAS_X_AXIS + if (mode != ftMotionMode_ZV) ACTION_ITEM(MSG_FTM_ZV, []{ _M493_S(ftMotionMode_ZV); }); + if (mode != ftMotionMode_ZVD) ACTION_ITEM(MSG_FTM_ZVD, []{ _M493_S(ftMotionMode_ZVD); }); + if (mode != ftMotionMode_EI) ACTION_ITEM(MSG_FTM_EI, []{ _M493_S(ftMotionMode_EI); }); + if (mode != ftMotionMode_2HEI) ACTION_ITEM(MSG_FTM_2HEI, []{ _M493_S(ftMotionMode_2HEI); }); + if (mode != ftMotionMode_3HEI) ACTION_ITEM(MSG_FTM_3HEI, []{ _M493_S(ftMotionMode_3HEI); }); + if (mode != ftMotionMode_MZV) ACTION_ITEM(MSG_FTM_MZV, []{ _M493_S(ftMotionMode_MZV); }); + //if (mode != ftMotionMode_ULENDO_FBS) ACTION_ITEM(MSG_FTM_ULENDO_FBS, []{ _M493_S(ftMotionMode_ULENDO_FBS); }); + //if (mode != ftMotionMode_DISCTF) ACTION_ITEM(MSG_FTM_DISCTF, []{ _M493_S(ftMotionMode_DISCTF); }); + #endif + + END_MENU(); + } + + #if HAS_DYNAMIC_FREQ + + void _M493_D(const dynFreqMode_t d) { + char cmd[10]; + sprintf_P(cmd, PSTR("M493D%i"), int(d)); + gcode.process_subcommands_now(cmd); + ui.go_back(); + } + + inline void menu_ftm_dyn_mode() { + const dynFreqMode_t dmode = fxdTiCtrl.cfg.dynFreqMode; + + START_MENU(); + BACK_ITEM(MSG_FIXED_TIME_MOTION); + + if (dmode != dynFreqMode_DISABLED) ACTION_ITEM(MSG_LCD_OFF, []{ _M493_D(dynFreqMode_DISABLED); }); + #if HAS_DYNAMIC_FREQ_MM + if (dmode != dynFreqMode_Z_BASED) ACTION_ITEM(MSG_FTM_Z_BASED, []{ _M493_D(dynFreqMode_Z_BASED); }); + #endif + #if HAS_DYNAMIC_FREQ_G + if (dmode != dynFreqMode_MASS_BASED) ACTION_ITEM(MSG_FTM_MASS_BASED, []{ _M493_D(dynFreqMode_MASS_BASED); }); + #endif + + END_MENU(); + } + + #endif // HAS_DYNAMIC_FREQ + + void menu_ft_motion() { + ft_config_t &c = fxdTiCtrl.cfg; + + FSTR_P ftmode; + switch (c.mode) { + default: + case ftMotionMode_DISABLED: ftmode = GET_TEXT_F(MSG_LCD_OFF); break; + case ftMotionMode_ENABLED: ftmode = GET_TEXT_F(MSG_LCD_ON); break; + case ftMotionMode_ZV: ftmode = GET_TEXT_F(MSG_FTM_ZV); break; + case ftMotionMode_ZVD: ftmode = GET_TEXT_F(MSG_FTM_ZVD); break; + case ftMotionMode_EI: ftmode = GET_TEXT_F(MSG_FTM_EI); break; + case ftMotionMode_2HEI: ftmode = GET_TEXT_F(MSG_FTM_2HEI); break; + case ftMotionMode_3HEI: ftmode = GET_TEXT_F(MSG_FTM_3HEI); break; + case ftMotionMode_MZV: ftmode = GET_TEXT_F(MSG_FTM_MZV); break; + //case ftMotionMode_ULENDO_FBS: ftmode = GET_TEXT_F(MSG_FTM_ULENDO_FBS); break; + //case ftMotionMode_DISCTF: ftmode = GET_TEXT_F(MSG_FTM_DISCTF); break; + } + + #if HAS_DYNAMIC_FREQ + FSTR_P dmode; + switch (c.dynFreqMode) { + default: + case dynFreqMode_DISABLED: dmode = GET_TEXT_F(MSG_LCD_OFF); break; + case dynFreqMode_Z_BASED: dmode = GET_TEXT_F(MSG_FTM_Z_BASED); break; + case dynFreqMode_MASS_BASED: dmode = GET_TEXT_F(MSG_FTM_MASS_BASED); break; + } + #endif + + START_MENU(); + BACK_ITEM(MSG_ADVANCED_SETTINGS); + + SUBMENU(MSG_FTM_MODE, menu_ftm_mode); + MENU_ITEM_ADDON_START_RJ(5); lcd_put_u8str(ftmode); MENU_ITEM_ADDON_END(); + + #if HAS_X_AXIS + EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq[X_AXIS], FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, fxdTiCtrl.refreshShapingN); + #endif + #if HAS_Y_AXIS + EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq[Y_AXIS], FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, fxdTiCtrl.refreshShapingN); + #endif + + #if HAS_DYNAMIC_FREQ + if (c.modeHasShaper()) { + SUBMENU(MSG_FTM_DYN_MODE, menu_ftm_dyn_mode); + MENU_ITEM_ADDON_START_RJ(11); lcd_put_u8str(dmode); MENU_ITEM_ADDON_END(); + #if HAS_X_AXIS + EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_DFREQ_K_N, &c.dynFreqK[X_AXIS], 0.0f, 20.0f); + #endif + #if HAS_Y_AXIS + EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_DFREQ_K_N, &c.dynFreqK[Y_AXIS], 0.0f, 20.0f); + #endif + } + #endif + #if HAS_EXTRUDERS + EDIT_ITEM(bool, MSG_LINEAR_ADVANCE, &c.linearAdvEna); + EDIT_ITEM(float42_52, MSG_ADVANCE_K, &c.linearAdvK, 0, 10); + #endif + + END_MENU(); + } + +#endif // FT_MOTION_MENU + void menu_motion() { + #if ENABLED(FT_MOTION_MENU) + const bool is_busy = printer_busy(); + #endif + START_MENU(); // @@ -338,25 +469,10 @@ void menu_motion() { #endif // - // Auto-calibration + // M493 - Fixed-Time Motion // - #if ENABLED(CALIBRATION_GCODE) - GCODES_ITEM(MSG_AUTO_CALIBRATE, F("G425")); - #endif - - // - // Auto Z-Align - // - #if EITHER(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) - GCODES_ITEM(MSG_AUTO_Z_ALIGN, F("G34")); - #endif - - // - // Probe Deploy/Stow - // - #if ENABLED(PROBE_DEPLOY_STOW_MENU) - GCODES_ITEM(MSG_MANUAL_DEPLOY, F("M401")); - GCODES_ITEM(MSG_MANUAL_STOW, F("M402")); + #if ENABLED(FT_MOTION_MENU) + if (!is_busy) SUBMENU(MSG_FIXED_TIME_MOTION, menu_ft_motion); #endif // @@ -367,19 +483,6 @@ void menu_motion() { GCODES_ITEM(MSG_MANUAL_PENDOWN, F("M280 P0 S50")); #endif - // Probe Offset Wizard - // - #if ENABLED(PROBE_OFFSET_WIZARD) - SUBMENU(MSG_PROBE_WIZARD, goto_probe_offset_wizard); - #endif - - // - // Assisted Bed Tramming - // - #if ENABLED(ASSISTED_TRAMMING_WIZARD) - SUBMENU(MSG_TRAMMING_WIZARD, goto_tramming_wizard); - #endif - // // Level Bed // @@ -410,14 +513,49 @@ void menu_motion() { #endif + // + // Assisted Bed Tramming + // + #if ENABLED(ASSISTED_TRAMMING_WIZARD) + SUBMENU(MSG_TRAMMING_WIZARD, goto_tramming_wizard); + #endif + + // + // Bed Tramming Submenu + // #if ENABLED(LCD_BED_TRAMMING) && DISABLED(LCD_BED_LEVELING) SUBMENU(MSG_BED_TRAMMING, _lcd_bed_tramming); #endif + // + // Auto Z-Align + // + #if ANY(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) + GCODES_ITEM(MSG_AUTO_Z_ALIGN, F("G34")); + #endif + + // + // Probe Deploy/Stow + // + #if ENABLED(PROBE_DEPLOY_STOW_MENU) + GCODES_ITEM(MSG_MANUAL_DEPLOY, F("M401")); + GCODES_ITEM(MSG_MANUAL_STOW, F("M402")); + #endif + + // + // Probe Repeatability Test + // #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) GCODES_ITEM(MSG_M48_TEST, F("G28O\nM48 P10")); #endif + // + // Auto-calibration with Object + // + #if ENABLED(CALIBRATION_GCODE) + GCODES_ITEM(MSG_AUTO_CALIBRATE, F("G425")); + #endif + // // Disable Steppers // diff --git a/Marlin/src/lcd/menu/menu_one_click_print.cpp b/Marlin/src/lcd/menu/menu_one_click_print.cpp new file mode 100644 index 0000000000..f1ed92d0d5 --- /dev/null +++ b/Marlin/src/lcd/menu/menu_one_click_print.cpp @@ -0,0 +1,44 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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(ONE_CLICK_PRINT) + +#include "menu.h" + +void one_click_print() { + ui.goto_screen([]{ + char * const filename = card.longest_filename(); + MenuItem_confirm::select_screen( + GET_TEXT_F(MSG_BUTTON_PRINT), GET_TEXT_F(MSG_BUTTON_CANCEL), + []{ + card.openAndPrintFile(card.filename); + ui.return_to_status(); + ui.reset_status(); + }, nullptr, + GET_TEXT_F(MSG_START_PRINT), filename, F("?") + ); + }); +} + +#endif // ONE_CLICK_PRINT diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp index b50194d60d..33d4231cd5 100644 --- a/Marlin/src/lcd/menu/menu_password.cpp +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, PASSWORD_FEATURE) +#if ALL(HAS_MARLINUI_MENU, PASSWORD_FEATURE) #include "../../feature/password/password.h" @@ -85,7 +85,7 @@ void Password::authentication_done() { // A single digit was completed void Password::digit_entered() { uint32_t multiplier = CAT(1e, PASSWORD_LENGTH); // 1e5 = 100000 - LOOP_LE_N(i, digit_no) multiplier /= 10; + for (uint8_t i = 0; i <= digit_no; ++i) multiplier /= 10; value_entry += editable.uint8 * multiplier; string[digit_no++] = '0' + editable.uint8; diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 62704cdede..82bf23ca84 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -59,7 +59,7 @@ void probe_offset_wizard_menu() { STATIC_ITEM(MSG_MOVE_NOZZLE_TO_BED, SS_CENTER|SS_INVERT); STATIC_ITEM_F(F("Z"), SS_CENTER, ftostr42_52(current_position.z)); - STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_LEFT, ftostr42_52(calculated_z_offset)); + STATIC_ITEM(MSG_ZPROBE_ZOFFSET, SS_FULL, ftostr42_52(calculated_z_offset)); SUBMENU(MSG_MOVE_1MM, []{ _goto_manual_move_z( 1); }); SUBMENU(MSG_MOVE_01MM, []{ _goto_manual_move_z( 0.1f); }); @@ -102,7 +102,7 @@ void prepare_for_probe_offset_wizard() { // Probe for Z reference ui.wait_for_move = true; - z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_RAISE, 0, true); + z_offset_ref = probe.probe_at_point(wizard_pos, PROBE_PT_RAISE); ui.wait_for_move = false; // Stow the probe, as the last call to probe.probe_at_point(...) left diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index ec6d49c16f..710cef6468 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 EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) +#if ANY(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif @@ -179,7 +179,7 @@ void menu_temperature() { #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - LOOP_S_L_N(e, 1, EXTRUDERS) + for (uint8_t e = 1; e < EXTRUDERS; ++e) EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.hotend_max_target(0)); #endif @@ -221,40 +221,40 @@ void menu_temperature() { DEFINE_SINGLENOZZLE_ITEM(); - #if HAS_FAN0 - _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); + #if FAN_IS_M106ABLE(0) + _FAN_EDIT_ITEMS(0, FIRST_FAN_SPEED); #endif - #if HAS_FAN1 && REDUNDANT_PART_COOLING_FAN != 1 + #if FAN_IS_M106ABLE(1) FAN_EDIT_ITEMS(1); #elif SNFAN(1) singlenozzle_item(1); #endif - #if HAS_FAN2 && REDUNDANT_PART_COOLING_FAN != 2 + #if FAN_IS_M106ABLE(2) FAN_EDIT_ITEMS(2); #elif SNFAN(2) singlenozzle_item(2); #endif - #if HAS_FAN3 && REDUNDANT_PART_COOLING_FAN != 3 + #if FAN_IS_M106ABLE(3) FAN_EDIT_ITEMS(3); #elif SNFAN(3) singlenozzle_item(3); #endif - #if HAS_FAN4 && REDUNDANT_PART_COOLING_FAN != 4 + #if FAN_IS_M106ABLE(4) FAN_EDIT_ITEMS(4); #elif SNFAN(4) singlenozzle_item(4); #endif - #if HAS_FAN5 && REDUNDANT_PART_COOLING_FAN != 5 + #if FAN_IS_M106ABLE(5) FAN_EDIT_ITEMS(5); #elif SNFAN(5) singlenozzle_item(5); #endif - #if HAS_FAN6 && REDUNDANT_PART_COOLING_FAN != 6 + #if FAN_IS_M106ABLE(6) FAN_EDIT_ITEMS(6); #elif SNFAN(6) singlenozzle_item(6); #endif - #if HAS_FAN7 && REDUNDANT_PART_COOLING_FAN != 7 + #if FAN_IS_M106ABLE(7) FAN_EDIT_ITEMS(7); #elif SNFAN(7) singlenozzle_item(7); @@ -266,7 +266,7 @@ void menu_temperature() { // // Preheat for all Materials // - LOOP_L_N(m, PREHEAT_COUNT) { + for (uint8_t m = 0; m < PREHEAT_COUNT; ++m) { editable.int8 = m; #if HAS_MULTI_HOTEND || HAS_HEATED_BED SUBMENU_f(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); @@ -293,7 +293,7 @@ void menu_temperature() { START_MENU(); BACK_ITEM(MSG_MAIN_MENU); - LOOP_L_N(m, PREHEAT_COUNT) { + for (uint8_t m = 0; m < PREHEAT_COUNT; ++m) { editable.int8 = m; #if HAS_MULTI_HOTEND || HAS_HEATED_BED SUBMENU_f(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); diff --git a/Marlin/src/lcd/menu/menu_touch_screen.cpp b/Marlin/src/lcd/menu/menu_touch_screen.cpp index 130308dadf..93380cb0e0 100644 --- a/Marlin/src/lcd/menu/menu_touch_screen.cpp +++ b/Marlin/src/lcd/menu/menu_touch_screen.cpp @@ -22,7 +22,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, TOUCH_SCREEN_CALIBRATION) +#if ALL(HAS_MARLINUI_MENU, TOUCH_SCREEN_CALIBRATION) #include "menu_item.h" #include "../marlinui.h" diff --git a/Marlin/src/lcd/menu/menu_tramming_wizard.cpp b/Marlin/src/lcd/menu/menu_tramming_wizard.cpp index 4ce2cd6460..e0f88ea1bb 100644 --- a/Marlin/src/lcd/menu/menu_tramming_wizard.cpp +++ b/Marlin/src/lcd/menu/menu_tramming_wizard.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, ASSISTED_TRAMMING_WIZARD) +#if ALL(HAS_MARLINUI_MENU, ASSISTED_TRAMMING_WIZARD) #include "menu_item.h" @@ -53,7 +53,7 @@ static int8_t reference_index; // = 0 #endif static bool probe_single_point() { - const float z_probed_height = probe.probe_at_point(tramming_points[tram_index], PROBE_PT_RAISE, 0, true); + const float z_probed_height = probe.probe_at_point(tramming_points[tram_index], PROBE_PT_RAISE); z_measured[tram_index] = z_probed_height; if (reference_index < 0) reference_index = tram_index; move_to_tramming_wait_pos(); diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 8a2636ba5d..c36ac013b8 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -119,7 +119,7 @@ void menu_tune() { // // Manual bed leveling, Bed Z: // - #if BOTH(MESH_BED_LEVELING, LCD_BED_LEVELING) + #if ALL(MESH_BED_LEVELING, LCD_BED_LEVELING) EDIT_ITEM(float43, MSG_MESH_Z_OFFSET, &bedlevel.z_offset, -1, 1); #endif @@ -135,7 +135,7 @@ void menu_tune() { #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - LOOP_S_L_N(e, 1, EXTRUDERS) + for (uint8_t e = 1; e < EXTRUDERS; ++e) EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.hotend_max_target(0)); #endif @@ -153,40 +153,40 @@ void menu_tune() { DEFINE_SINGLENOZZLE_ITEM(); - #if HAS_FAN0 - _FAN_EDIT_ITEMS(0,FIRST_FAN_SPEED); + #if FAN_IS_M106ABLE(0) + _FAN_EDIT_ITEMS(0, FIRST_FAN_SPEED); #endif - #if HAS_FAN1 && REDUNDANT_PART_COOLING_FAN != 1 + #if FAN_IS_M106ABLE(1) FAN_EDIT_ITEMS(1); #elif SNFAN(1) singlenozzle_item(1); #endif - #if HAS_FAN2 && REDUNDANT_PART_COOLING_FAN != 2 + #if FAN_IS_M106ABLE(2) FAN_EDIT_ITEMS(2); #elif SNFAN(2) singlenozzle_item(2); #endif - #if HAS_FAN3 && REDUNDANT_PART_COOLING_FAN != 3 + #if FAN_IS_M106ABLE(3) FAN_EDIT_ITEMS(3); #elif SNFAN(3) singlenozzle_item(3); #endif - #if HAS_FAN4 && REDUNDANT_PART_COOLING_FAN != 4 + #if FAN_IS_M106ABLE(4) FAN_EDIT_ITEMS(4); #elif SNFAN(4) singlenozzle_item(4); #endif - #if HAS_FAN5 && REDUNDANT_PART_COOLING_FAN != 5 + #if FAN_IS_M106ABLE(5) FAN_EDIT_ITEMS(5); #elif SNFAN(5) singlenozzle_item(5); #endif - #if HAS_FAN6 && REDUNDANT_PART_COOLING_FAN != 6 + #if FAN_IS_M106ABLE(6) FAN_EDIT_ITEMS(6); #elif SNFAN(6) singlenozzle_item(6); #endif - #if HAS_FAN7 && REDUNDANT_PART_COOLING_FAN != 7 + #if FAN_IS_M106ABLE(7) FAN_EDIT_ITEMS(7); #elif SNFAN(7) singlenozzle_item(7); diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index d6f42faa55..c8fd33d26d 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -26,7 +26,7 @@ #include "../../inc/MarlinConfigPre.h" -#if BOTH(HAS_MARLINUI_MENU, AUTO_BED_LEVELING_UBL) +#if ALL(HAS_MARLINUI_MENU, AUTO_BED_LEVELING_UBL) #include "menu_item.h" #include "../../gcode/gcode.h" diff --git a/Marlin/src/lcd/menu/menu_x_twist.cpp b/Marlin/src/lcd/menu/menu_x_twist.cpp index 86ef3be7b9..56872b73ee 100644 --- a/Marlin/src/lcd/menu/menu_x_twist.cpp +++ b/Marlin/src/lcd/menu/menu_x_twist.cpp @@ -150,12 +150,12 @@ void xatc_wizard_goto_next_point() { else { // Compute the z-offset by averaging the values found with this wizard z_offset = 0; - LOOP_L_N(i, XATC_MAX_POINTS) z_offset += xatc.z_offset[i]; + for (uint8_t i = 0; i < XATC_MAX_POINTS; ++i) z_offset += xatc.z_offset[i]; z_offset /= XATC_MAX_POINTS; // Subtract the average from the values found with this wizard. // This way they are indipendent from the z-offset - LOOP_L_N(i, XATC_MAX_POINTS) xatc.z_offset[i] -= z_offset; + for (uint8_t i = 0; i < XATC_MAX_POINTS; ++i) xatc.z_offset[i] -= z_offset; ui.goto_screen(xatc_wizard_update_z_offset); } @@ -170,7 +170,7 @@ void xatc_wizard_homing_done() { MenuItem_static::draw(1, GET_TEXT_F(MSG_LEVEL_BED_WAITING)); // Color UI needs a control to detect a touch - #if BOTH(TOUCH_SCREEN, HAS_GRAPHICAL_TFT) + #if ALL(TOUCH_SCREEN, HAS_GRAPHICAL_TFT) touch.add_control(CLICK, 0, 0, TFT_WIDTH, TFT_HEIGHT); #endif } diff --git a/Marlin/src/lcd/tft/bitmaps/time_elapsed.bmp b/Marlin/src/lcd/tft/bitmaps/time_elapsed.bmp new file mode 100644 index 0000000000..6bb4b1a439 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/time_elapsed.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/time_elapsed.svg b/Marlin/src/lcd/tft/bitmaps/time_elapsed.svg new file mode 100644 index 0000000000..da2d37b56b --- /dev/null +++ b/Marlin/src/lcd/tft/bitmaps/time_elapsed.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Marlin/src/lcd/tft/bitmaps/time_remaining.bmp b/Marlin/src/lcd/tft/bitmaps/time_remaining.bmp new file mode 100644 index 0000000000..36e40c9c57 Binary files /dev/null and b/Marlin/src/lcd/tft/bitmaps/time_remaining.bmp differ diff --git a/Marlin/src/lcd/tft/bitmaps/time_remaining.svg b/Marlin/src/lcd/tft/bitmaps/time_remaining.svg new file mode 100644 index 0000000000..ff4cdb8e24 --- /dev/null +++ b/Marlin/src/lcd/tft/bitmaps/time_remaining.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Marlin/src/lcd/tft/canvas.cpp b/Marlin/src/lcd/tft/canvas.cpp index 3fb500e8e2..4a056524a2 100644 --- a/Marlin/src/lcd/tft/canvas.cpp +++ b/Marlin/src/lcd/tft/canvas.cpp @@ -26,31 +26,31 @@ #include "canvas.h" -uint16_t CANVAS::width, CANVAS::height; -uint16_t CANVAS::startLine, CANVAS::endLine; -uint16_t CANVAS::background_color; -uint16_t *CANVAS::buffer = TFT::buffer; +uint16_t Canvas::width, Canvas::height; +uint16_t Canvas::startLine, Canvas::endLine; +uint16_t Canvas::background_color; +uint16_t *Canvas::buffer = TFT::buffer; -void CANVAS::New(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { - CANVAS::width = width; - CANVAS::height = height; +void Canvas::instantiate(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { + Canvas::width = width; + Canvas::height = height; startLine = 0; endLine = 0; tft.set_window(x, y, x + width - 1, y + height - 1); } -void CANVAS::Continue() { +void Canvas::next() { startLine = endLine; endLine = TFT_BUFFER_SIZE < width * (height - startLine) ? startLine + TFT_BUFFER_SIZE / width : height; } -bool CANVAS::ToScreen() { +bool Canvas::toScreen() { tft.write_sequence(buffer, width * (endLine - startLine)); return endLine == height; } -void CANVAS::SetBackground(uint16_t color) { +void Canvas::setBackground(uint16_t color) { /* TODO: test and optimize performance */ /* uint32_t count = (endLine - startLine) * width; @@ -67,44 +67,44 @@ void CANVAS::SetBackground(uint16_t color) { extern uint16_t gradient(uint16_t colorA, uint16_t colorB, uint16_t factor); -void CANVAS::AddText(uint16_t x, uint16_t y, uint16_t color, uint16_t *string, uint16_t maxWidth) { - if (endLine < y || startLine > y + GetFontHeight()) return; +void Canvas::addText(uint16_t x, uint16_t y, uint16_t color, uint16_t *string, uint16_t maxWidth) { + if (endLine < y || startLine > y + getFontHeight()) return; if (maxWidth == 0) maxWidth = width - x; uint16_t colors[16]; uint16_t stringWidth = 0; - if (GetFontType() == FONT_MARLIN_GLYPHS_2BPP) { + if (getFontType() == FONT_MARLIN_GLYPHS_2BPP) { for (uint8_t i = 0; i < 3; i++) { colors[i] = gradient(ENDIAN_COLOR(color), ENDIAN_COLOR(background_color), ((i+1) << 8) / 3); colors[i] = ENDIAN_COLOR(colors[i]); } } for (uint16_t i = 0 ; *(string + i) ; i++) { - glyph_t *glyph = Glyph(string + i); - if (stringWidth + glyph->BBXWidth > maxWidth) break; - switch (GetFontType()) { + glyph_t *pGlyph = glyph(string + i); + if (stringWidth + pGlyph->bbxWidth > maxWidth) break; + switch (getFontType()) { case FONT_MARLIN_GLYPHS_1BPP: - AddImage(x + stringWidth + glyph->BBXOffsetX, y + GetFontAscent() - glyph->BBXHeight - glyph->BBXOffsetY, glyph->BBXWidth, glyph->BBXHeight, GREYSCALE1, ((uint8_t *)glyph) + sizeof(glyph_t), &color); + addImage(x + stringWidth + pGlyph->bbxOffsetX, y + getFontAscent() - pGlyph->bbxHeight - pGlyph->bbxOffsetY, pGlyph->bbxWidth, pGlyph->bbxHeight, GREYSCALE1, ((uint8_t *)pGlyph) + sizeof(glyph_t), &color); break; case FONT_MARLIN_GLYPHS_2BPP: - AddImage(x + stringWidth + glyph->BBXOffsetX, y + GetFontAscent() - glyph->BBXHeight - glyph->BBXOffsetY, glyph->BBXWidth, glyph->BBXHeight, GREYSCALE2, ((uint8_t *)glyph) + sizeof(glyph_t), colors); + addImage(x + stringWidth + pGlyph->bbxOffsetX, y + getFontAscent() - pGlyph->bbxHeight - pGlyph->bbxOffsetY, pGlyph->bbxWidth, pGlyph->bbxHeight, GREYSCALE2, ((uint8_t *)pGlyph) + sizeof(glyph_t), colors); break; } - stringWidth += glyph->DWidth; + stringWidth += pGlyph->dWidth; } } -void CANVAS::AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { - uint16_t *data = (uint16_t *)Images[image].data; +void Canvas::addImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) { + uint16_t *data = (uint16_t *)images[image].data; if (!data) return; - uint16_t image_width = Images[image].width, - image_height = Images[image].height; - colorMode_t color_mode = Images[image].colorMode; + uint16_t image_width = images[image].width, + image_height = images[image].height; + colorMode_t color_mode = images[image].colorMode; if (color_mode != HIGHCOLOR) - return AddImage(x, y, image_width, image_height, color_mode, (uint8_t *)data, colors); + return addImage(x, y, image_width, image_height, color_mode, (uint8_t *)data, colors); // HIGHCOLOR - 16 bits per pixel @@ -123,7 +123,7 @@ void CANVAS::AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) } } -void CANVAS::AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors) { +void Canvas::addImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors) { uint8_t bitsPerPixel; switch (color_mode) { case GREYSCALE1: bitsPerPixel = 1; break; @@ -161,7 +161,7 @@ void CANVAS::AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_h } } -void CANVAS::AddRectangle(uint16_t x, uint16_t y, uint16_t rectangleWidth, uint16_t rectangleHeight, uint16_t color) { +void Canvas::addRect(uint16_t x, uint16_t y, uint16_t rectangleWidth, uint16_t rectangleHeight, uint16_t color) { if (endLine < y || startLine > y + rectangleHeight) return; for (uint16_t i = 0; i < rectangleHeight; i++) { @@ -180,7 +180,7 @@ void CANVAS::AddRectangle(uint16_t x, uint16_t y, uint16_t rectangleWidth, uint1 } } -void CANVAS::AddBar(uint16_t x, uint16_t y, uint16_t barWidth, uint16_t barHeight, uint16_t color) { +void Canvas::addBar(uint16_t x, uint16_t y, uint16_t barWidth, uint16_t barHeight, uint16_t color) { if (endLine < y || startLine > y + barHeight) return; for (uint16_t i = 0; i < barHeight; i++) { @@ -192,6 +192,6 @@ void CANVAS::AddBar(uint16_t x, uint16_t y, uint16_t barWidth, uint16_t barHeigh } } -CANVAS Canvas; +Canvas tftCanvas; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/canvas.h b/Marlin/src/lcd/tft/canvas.h index 1c9c7bb13a..d271ae7af3 100644 --- a/Marlin/src/lcd/tft/canvas.h +++ b/Marlin/src/lcd/tft/canvas.h @@ -28,32 +28,32 @@ #include "../../inc/MarlinConfig.h" -class CANVAS { +class Canvas { private: static uint16_t background_color; static uint16_t width, height; static uint16_t startLine, endLine; static uint16_t *buffer; - inline static glyph_t *Glyph(uint16_t *character) { return TFT_String::glyph(character); } - inline static uint16_t GetFontType() { return TFT_String::font_type(); } - inline static uint16_t GetFontAscent() { return TFT_String::font_ascent(); } - inline static uint16_t GetFontHeight() { return TFT_String::font_height(); } + inline static glyph_t *glyph(uint16_t *character) { return TFT_String::glyph(character); } + inline static uint16_t getFontType() { return TFT_String::font_type(); } + inline static uint16_t getFontAscent() { return TFT_String::font_ascent(); } + inline static uint16_t getFontHeight() { return TFT_String::font_height(); } - static void AddImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors); - static void AddImage(uint16_t x, uint16_t y, uint16_t imageWidth, uint16_t imageHeight, uint16_t color, uint16_t bgColor, uint8_t *image); + static void addImage(int16_t x, int16_t y, uint8_t image_width, uint8_t image_height, colorMode_t color_mode, uint8_t *data, uint16_t *colors); + static void addImage(uint16_t x, uint16_t y, uint16_t imageWidth, uint16_t imageHeight, uint16_t color, uint16_t bgColor, uint8_t *image); public: - static void New(uint16_t x, uint16_t y, uint16_t width, uint16_t height); - static void Continue(); - static bool ToScreen(); + static void instantiate(uint16_t x, uint16_t y, uint16_t width, uint16_t height); + static void next(); + static bool toScreen(); - static void SetBackground(uint16_t color); - static void AddText(uint16_t x, uint16_t y, uint16_t color, uint16_t *string, uint16_t maxWidth); - static void AddImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors); + static void setBackground(uint16_t color); + static void addText(uint16_t x, uint16_t y, uint16_t color, uint16_t *string, uint16_t maxWidth); + static void addImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors); - static void AddRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); - static void AddBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); + static void addRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); + static void addBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color); }; -extern CANVAS Canvas; +extern Canvas tftCanvas; diff --git a/Marlin/src/lcd/tft/images/time_elapsed_32x32x4.cpp b/Marlin/src/lcd/tft/images/time_elapsed_32x32x4.cpp new file mode 100644 index 0000000000..e6626f4c87 --- /dev/null +++ b/Marlin/src/lcd/tft/images/time_elapsed_32x32x4.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2022 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * 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 HAS_GRAPHICAL_TFT + +extern const uint8_t time_elapsed_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xad, 0xca, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xff, 0xff, 0xfe, 0xb8, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xce, 0xc8, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xff, 0xfa, 0x6a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xff, 0xfa, 0x58, 0x9d, 0xcd, 0xff, 0xff, 0xff, 0xf9, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xdf, 0xe6, 0x58, 0x85, 0x55, 0x69, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xbb, 0x88, 0x66, 0x55, 0x68, 0x88, 0x88, 0x76, 0x6b, 0xff, 0xff, 0xf6, 0x88, 0x88, + 0x88, 0x8c, 0xff, 0xe6, 0x87, 0x67, 0x88, 0x88, 0x88, 0x88, 0x86, 0x9f, 0xff, 0xfd, 0x68, 0x88, + 0x88, 0x8e, 0xff, 0xf7, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, 0xff, 0xff, 0x67, 0x88, + 0x88, 0x8b, 0xff, 0xd5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xb6, 0x88, + 0x88, 0x88, 0x89, 0x65, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xe5, 0x88, + 0x88, 0x88, 0x76, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xf7, 0x78, + 0x88, 0x9c, 0x98, 0x88, 0x88, 0x88, 0x88, 0x9e, 0xdb, 0x98, 0x88, 0x88, 0x8d, 0xff, 0xf8, 0x68, + 0x89, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x89, 0xff, 0xff, 0xff, 0xec, 0xa9, 0x8d, 0xff, 0xfa, 0x68, + 0x8b, 0xff, 0xfa, 0x68, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, 0xfd, 0x58, + 0x89, 0xff, 0xf7, 0x58, 0x88, 0x88, 0x89, 0xff, 0xff, 0xff, 0xeb, 0x96, 0x59, 0xff, 0xf9, 0x58, + 0x88, 0x89, 0x75, 0x68, 0x88, 0x88, 0x88, 0x8d, 0xda, 0x86, 0x55, 0x55, 0x67, 0x9c, 0x95, 0x58, + 0x88, 0x86, 0x56, 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x56, 0x67, 0x88, 0x88, 0x75, 0x55, 0x78, + 0x88, 0x88, 0xbb, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, 0xa8, 0x88, 0x88, + 0x88, 0x8c, 0xff, 0xe6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xef, 0xfb, 0x78, 0x88, + 0x88, 0x8e, 0xff, 0xf6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xfd, 0x58, 0x88, + 0x88, 0x8b, 0xff, 0xd5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xef, 0xfa, 0x57, 0x88, + 0x88, 0x88, 0x89, 0x65, 0x79, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x95, 0x58, 0x88, + 0x88, 0x88, 0x76, 0x58, 0xef, 0xe8, 0x88, 0x88, 0x88, 0x88, 0xef, 0xd8, 0x86, 0x55, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x8b, 0xff, 0xf9, 0x68, 0x9b, 0x98, 0x8b, 0xff, 0xf9, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xff, 0xf8, 0x59, 0xff, 0xf8, 0x8b, 0xff, 0xf8, 0x58, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xad, 0xa5, 0x5b, 0xff, 0xf9, 0x68, 0xbe, 0xa5, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x79, 0xff, 0xf7, 0x58, 0x75, 0x55, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x8a, 0x75, 0x68, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +}; +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/images/time_remaining_32x32x4.cpp b/Marlin/src/lcd/tft/images/time_remaining_32x32x4.cpp new file mode 100644 index 0000000000..8c64403a2b --- /dev/null +++ b/Marlin/src/lcd/tft/images/time_remaining_32x32x4.cpp @@ -0,0 +1,57 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2022 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * 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 HAS_GRAPHICAL_TFT + +extern const uint8_t time_remaining_32x32x4[512] = { + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9a, 0xbd, 0xb8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x89, 0xce, 0xff, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xef, 0xff, 0xff, 0xff, 0xfd, 0x58, 0xbe, 0xb8, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5a, 0xff, 0xf9, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0x95, 0x5b, 0xff, 0xfa, 0x58, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x9f, 0xff, 0xff, 0xf9, 0x65, 0x55, 0x55, 0x78, 0xef, 0xe6, 0x58, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xff, 0xff, 0xfb, 0x55, 0x56, 0x78, 0x88, 0x88, 0x67, 0x55, 0x6a, 0x98, 0x88, 0x88, + 0x88, 0x8e, 0xff, 0xff, 0x95, 0x56, 0x88, 0x88, 0x88, 0x88, 0x86, 0x66, 0xdf, 0xfa, 0x78, 0x88, + 0x88, 0x9f, 0xff, 0xfb, 0x55, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xfe, 0x58, 0x88, + 0x88, 0xcf, 0xff, 0xf5, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xef, 0xfc, 0x57, 0x88, + 0x88, 0xef, 0xff, 0x95, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, 0xa6, 0x57, 0x88, + 0x89, 0xff, 0xff, 0x65, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x55, 0x68, 0x88, + 0x8a, 0xff, 0xfd, 0x56, 0x88, 0x88, 0xac, 0xdd, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9b, 0x98, 0x88, + 0x8c, 0xff, 0xfc, 0x58, 0xbd, 0xef, 0xff, 0xff, 0xf7, 0x88, 0x88, 0x88, 0x89, 0xff, 0xf8, 0x88, + 0x8d, 0xff, 0xfd, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x68, 0x88, 0x88, 0x8b, 0xff, 0xfa, 0x68, + 0x8a, 0xff, 0xf9, 0x57, 0x9c, 0xef, 0xff, 0xff, 0xf6, 0x58, 0x88, 0x88, 0x89, 0xff, 0xf8, 0x58, + 0x88, 0x9c, 0x85, 0x57, 0x65, 0x56, 0x8a, 0xdd, 0x75, 0x68, 0x88, 0x88, 0x88, 0x8a, 0x85, 0x68, + 0x88, 0x75, 0x55, 0x88, 0x88, 0x87, 0x66, 0x55, 0x56, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, + 0x88, 0x88, 0xbb, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, 0xa8, 0x88, 0x88, + 0x88, 0x8c, 0xff, 0xe6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xef, 0xfb, 0x78, 0x88, + 0x88, 0x8e, 0xff, 0xf6, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xfd, 0x58, 0x88, + 0x88, 0x8b, 0xff, 0xd5, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xef, 0xfa, 0x57, 0x88, + 0x88, 0x88, 0x89, 0x65, 0x79, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x95, 0x58, 0x88, + 0x88, 0x88, 0x76, 0x58, 0xef, 0xe8, 0x88, 0x88, 0x88, 0x88, 0xef, 0xd8, 0x86, 0x55, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x8b, 0xff, 0xf9, 0x68, 0x9b, 0x98, 0x8b, 0xff, 0xf9, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xff, 0xf8, 0x59, 0xff, 0xf8, 0x8b, 0xff, 0xf8, 0x58, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xad, 0xa5, 0x5b, 0xff, 0xf9, 0x68, 0xbe, 0xa5, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x55, 0x79, 0xff, 0xf7, 0x58, 0x75, 0x55, 0x78, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x78, 0x88, 0x8a, 0x75, 0x68, 0x88, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x56, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +}; +#endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft.cpp b/Marlin/src/lcd/tft/tft.cpp index fa3c2c241f..868a89d2dc 100644 --- a/Marlin/src/lcd/tft/tft.cpp +++ b/Marlin/src/lcd/tft/tft.cpp @@ -33,8 +33,8 @@ uint16_t TFT::buffer[]; void TFT::init() { - io.Init(); - io.InitTFT(); + io.init(); + io.initTFT(); } TFT tft; diff --git a/Marlin/src/lcd/tft/tft.h b/Marlin/src/lcd/tft/tft.h index 7dc3996148..4a1d1d8304 100644 --- a/Marlin/src/lcd/tft/tft.h +++ b/Marlin/src/lcd/tft/tft.h @@ -69,9 +69,9 @@ class TFT { static void add_glyphs(const uint8_t *Font) { string.add_glyphs(Font); } static bool is_busy() { return io.isBusy(); } - static void abort() { io.Abort(); } - static void write_multiple(uint16_t Data, uint16_t Count) { io.WriteMultipleDMA(Data, Count); } - static void write_sequence(uint16_t *Data, uint16_t Count) { io.WriteSequenceDMA(Data, Count); } + static void abort() { io.abort(); } + static void write_multiple(uint16_t data, uint16_t count) { io.WriteMultipleDMA(data, count); } + static void write_sequence(uint16_t *data, uint16_t count) { io.writeSequenceDMA(data, count); } static void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { io.set_window(Xmin, Ymin, Xmax, Ymax); } static void fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { queue.fill(x, y, width, height, color); } diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index 3651899dd7..6309de032e 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -72,10 +72,12 @@ const tImage Left_32x32x4 = { (void *)left_32x32x4, 32, 32, GREYSCALE4 const tImage Right_32x32x4 = { (void *)right_32x32x4, 32, 32, GREYSCALE4 }; const tImage Refresh_32x32x4 = { (void *)refresh_32x32x4, 32, 32, GREYSCALE4 }; const tImage Leveling_32x32x4 = { (void *)leveling_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Time_Elapsed_32x32x4 = { (void *)time_elapsed_32x32x4, 32, 32, GREYSCALE4 }; +const tImage Time_Remaining_32x32x4 = { (void *)time_remaining_32x32x4, 32, 32, GREYSCALE4 }; const tImage Slider8x16x4 = { (void *)slider_8x16x4, 8, 16, GREYSCALE4 }; -const tImage Images[imgCount] = { +const tImage images[imgCount] = { TERN(SHOW_BOOTSCREEN, TERN(BOOT_MARLIN_LOGO_SMALL, MarlinLogo195x59x16, MARLIN_LOGO_FULL_SIZE), NoLogo), HotEnd_64x64x4, Bed_64x64x4, @@ -108,6 +110,8 @@ const tImage Images[imgCount] = { Home_64x64x4, BtnRounded_64x52x4, BtnRounded_42x39x4, + Time_Elapsed_32x32x4, + Time_Remaining_32x32x4, }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h index aeb1ca2bf5..7761a72dc3 100644 --- a/Marlin/src/lcd/tft/tft_image.h +++ b/Marlin/src/lcd/tft/tft_image.h @@ -61,6 +61,8 @@ extern const uint8_t left_32x32x4[]; extern const uint8_t right_32x32x4[]; extern const uint8_t refresh_32x32x4[]; extern const uint8_t leveling_32x32x4[]; +extern const uint8_t time_elapsed_32x32x4[]; +extern const uint8_t time_remaining_32x32x4[]; extern const uint8_t slider_8x16x4[]; @@ -97,6 +99,9 @@ enum MarlinImage : uint8_t { imgHome, imgBtn52Rounded, imgBtn39Rounded, + imgTimeElapsed, + imgTimeRemaining, + // Special values - must be at the end! imgCount, noImage = imgCount, imgPageUp = imgLeft, @@ -172,7 +177,9 @@ extern const tImage Left_32x32x4; extern const tImage Right_32x32x4; extern const tImage Refresh_32x32x4; extern const tImage Leveling_32x32x4; +extern const tImage Time_Elapsed_32x32x4; +extern const tImage Time_Remaining_32x32x4; extern const tImage Slider8x16x4; -extern const tImage Images[imgCount]; +extern const tImage images[imgCount]; diff --git a/Marlin/src/lcd/tft/tft_queue.cpp b/Marlin/src/lcd/tft/tft_queue.cpp index 1cec4a7159..f66418a25b 100644 --- a/Marlin/src/lcd/tft/tft_queue.cpp +++ b/Marlin/src/lcd/tft/tft_queue.cpp @@ -107,17 +107,17 @@ void TFT_Queue::canvas(queueTask_t *task) { if (task->state == TASK_STATE_READY) { task->state = TASK_STATE_IN_PROGRESS; - Canvas.New(task_parameters->x, task_parameters->y, task_parameters->width, task_parameters->height); + tftCanvas.instantiate(task_parameters->x, task_parameters->y, task_parameters->width, task_parameters->height); } - Canvas.Continue(); + tftCanvas.next(); for (i = 0; i < task_parameters->count; i++) { switch (*item) { case CANVAS_SET_BACKGROUND: - Canvas.SetBackground(((parametersCanvasBackground_t *)item)->color); + tftCanvas.setBackground(((parametersCanvasBackground_t *)item)->color); break; case CANVAS_ADD_TEXT: - Canvas.AddText(((parametersCanvasText_t *)item)->x, ((parametersCanvasText_t *)item)->y, ((parametersCanvasText_t *)item)->color, (uint16_t*)(item + sizeof(parametersCanvasText_t)), ((parametersCanvasText_t *)item)->maxWidth); + tftCanvas.addText(((parametersCanvasText_t *)item)->x, ((parametersCanvasText_t *)item)->y, ((parametersCanvasText_t *)item)->color, (uint16_t*)(item + sizeof(parametersCanvasText_t)), ((parametersCanvasText_t *)item)->maxWidth); break; case CANVAS_ADD_IMAGE: @@ -126,20 +126,20 @@ void TFT_Queue::canvas(queueTask_t *task) { image = ((parametersCanvasImage_t *)item)->image; colors = (uint16_t *)(item + sizeof(parametersCanvasImage_t)); - Canvas.AddImage(((parametersCanvasImage_t *)item)->x, ((parametersCanvasImage_t *)item)->y, image, colors); + tftCanvas.addImage(((parametersCanvasImage_t *)item)->x, ((parametersCanvasImage_t *)item)->y, image, colors); break; case CANVAS_ADD_BAR: - Canvas.AddBar(((parametersCanvasBar_t *)item)->x, ((parametersCanvasBar_t *)item)->y, ((parametersCanvasBar_t *)item)->width, ((parametersCanvasBar_t *)item)->height, ((parametersCanvasBar_t *)item)->color); + tftCanvas.addBar(((parametersCanvasBar_t *)item)->x, ((parametersCanvasBar_t *)item)->y, ((parametersCanvasBar_t *)item)->width, ((parametersCanvasBar_t *)item)->height, ((parametersCanvasBar_t *)item)->color); break; - case CANVAS_ADD_RECTANGLE: - Canvas.AddRectangle(((parametersCanvasRectangle_t *)item)->x, ((parametersCanvasRectangle_t *)item)->y, ((parametersCanvasRectangle_t *)item)->width, ((parametersCanvasRectangle_t *)item)->height, ((parametersCanvasRectangle_t *)item)->color); + case CANVAS_ADD_RECT: + tftCanvas.addRect(((parametersCanvasRectangle_t *)item)->x, ((parametersCanvasRectangle_t *)item)->y, ((parametersCanvasRectangle_t *)item)->width, ((parametersCanvasRectangle_t *)item)->height, ((parametersCanvasRectangle_t *)item)->color); break; } item = ((parametersCanvasBackground_t *)item)->nextParameter; } - if (Canvas.ToScreen()) task->state = TASK_STATE_COMPLETED; + if (tftCanvas.toScreen()) task->state = TASK_STATE_COMPLETED; } void TFT_Queue::fill(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) { @@ -265,7 +265,7 @@ void TFT_Queue::add_text(uint16_t x, uint16_t y, uint16_t color, const uint16_t end_of_queue += sizeof(parametersCanvasText_t); uint16_t *character = (uint16_t *)end_of_queue; - /* TODO: Deal with maxWidth */ + // TODO: Deal with maxWidth while ((*character++ = *pointer++) != 0); end_of_queue = (uint8_t *)character; @@ -289,7 +289,7 @@ void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t *col task_parameters->count++; parameters->nextParameter = end_of_queue; - colorMode_t color_mode = Images[image].colorMode; + colorMode_t color_mode = images[image].colorMode; if (color_mode == HIGHCOLOR) return; @@ -325,7 +325,7 @@ uint16_t gradient(uint16_t colorA, uint16_t colorB, uint16_t factor) { void TFT_Queue::add_image(int16_t x, int16_t y, MarlinImage image, uint16_t color_main, uint16_t color_background, uint16_t color_shadow) { uint16_t colors[16]; - colorMode_t color_mode = Images[image].colorMode; + colorMode_t color_mode = images[image].colorMode; uint16_t i; switch (color_mode) { @@ -373,7 +373,7 @@ void TFT_Queue::add_rectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t h parametersCanvasRectangle_t *parameters = (parametersCanvasRectangle_t *)end_of_queue; last_parameter = end_of_queue; - parameters->type = CANVAS_ADD_RECTANGLE; + parameters->type = CANVAS_ADD_RECT; parameters->x = x; parameters->y = y; parameters->width = width; diff --git a/Marlin/src/lcd/tft/tft_queue.h b/Marlin/src/lcd/tft/tft_queue.h index ed929166cb..59a13dd43a 100644 --- a/Marlin/src/lcd/tft/tft_queue.h +++ b/Marlin/src/lcd/tft/tft_queue.h @@ -47,7 +47,7 @@ enum CanvasSubtype : uint8_t { CANVAS_ADD_TEXT, CANVAS_ADD_IMAGE, CANVAS_ADD_BAR, - CANVAS_ADD_RECTANGLE, + CANVAS_ADD_RECT, }; typedef struct __attribute__((__packed__)) { diff --git a/Marlin/src/lcd/tft/tft_string.cpp b/Marlin/src/lcd/tft/tft_string.cpp index 82444a4398..6ee1bab6d3 100644 --- a/Marlin/src/lcd/tft/tft_string.cpp +++ b/Marlin/src/lcd/tft/tft_string.cpp @@ -25,7 +25,7 @@ #if HAS_GRAPHICAL_TFT #include "tft_string.h" -#include "../fontutils.h" +#include "../utf8.h" #include "../marlinui.h" //#define DEBUG_TFT_FONT @@ -59,11 +59,11 @@ void TFT_String::set_font(const uint8_t *font) { #endif DEBUG_ECHOLNPGM("Format: ", ((unifont_t *)font_header)->Format); - DEBUG_ECHOLNPGM("CapitalAHeight: ", ((unifont_t *)font_header)->CapitalAHeight); - DEBUG_ECHOLNPGM("FontStartEncoding: ", ((unifont_t *)font_header)->FontStartEncoding); - DEBUG_ECHOLNPGM("FontEndEncoding: ", ((unifont_t *)font_header)->FontEndEncoding); - DEBUG_ECHOLNPGM("FontAscent: ", ((unifont_t *)font_header)->FontAscent); - DEBUG_ECHOLNPGM("FontDescent: ", ((unifont_t *)font_header)->FontDescent); + DEBUG_ECHOLNPGM("capitalAHeight: ", ((unifont_t *)font_header)->capitalAHeight); + DEBUG_ECHOLNPGM("fontStartEncoding: ", ((unifont_t *)font_header)->fontStartEncoding); + DEBUG_ECHOLNPGM("fontEndEncoding: ", ((unifont_t *)font_header)->fontEndEncoding); + DEBUG_ECHOLNPGM("fontAscent: ", ((unifont_t *)font_header)->fontAscent); + DEBUG_ECHOLNPGM("fontDescent: ", ((unifont_t *)font_header)->fontDescent); add_glyphs(font); } @@ -72,15 +72,15 @@ void TFT_String::add_glyphs(const uint8_t *font) { uint16_t unicode, fontStartEncoding, fontEndEncoding; uint8_t *pointer; - fontStartEncoding = ((unifont_t *)font)->FontStartEncoding; - fontEndEncoding = ((unifont_t *)font)->FontEndEncoding; + fontStartEncoding = ((unifont_t *)font)->fontStartEncoding; + fontEndEncoding = ((unifont_t *)font)->fontEndEncoding; pointer = (uint8_t *)font + sizeof(unifont_t); if (fontEndEncoding < 0x0100) { // base and symbol fonts for (unicode = fontStartEncoding; unicode <= fontEndEncoding; unicode++) { if (*pointer != NO_GLYPH) { glyphs[unicode] = (glyph_t *)pointer; - pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->DataSize; + pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->dataSize; } else pointer++; @@ -98,7 +98,7 @@ void TFT_String::add_glyphs(const uint8_t *font) { } if (*pointer != NO_GLYPH) { glyphs_extra[unicode - fontStartEncoding] = pointer; - pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->DataSize; + pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->dataSize; } else pointer++; @@ -112,7 +112,7 @@ void TFT_String::add_glyphs(const uint8_t *font) { } glyphs_extra[i] = pointer; unicode = *(uint16_t *) pointer; - pointer += sizeof(uniglyph_t) + ((uniglyph_t *)pointer)->glyph.DataSize; + pointer += sizeof(uniglyph_t) + ((uniglyph_t *)pointer)->glyph.dataSize; extra_count = i + 1; if (unicode == fontEndEncoding) break; @@ -127,11 +127,11 @@ glyph_t *TFT_String::glyph(uint16_t character) { if (character < 0x00ff) return glyphs[character] ?: glyphs['?']; /* Use '?' for unknown glyphs */ #if EXTRA_GLYPHS - if (font_header_extra == nullptr || character < font_header_extra->FontStartEncoding || character > font_header_extra->FontEndEncoding) return glyphs['?']; + if (font_header_extra == nullptr || character < font_header_extra->fontStartEncoding || character > font_header_extra->fontEndEncoding) return glyphs['?']; if ((font_header_extra->Format & 0xF0) == FONT_MARLIN_GLYPHS) { - if (glyphs_extra[character - font_header_extra->FontStartEncoding]) - return (glyph_t *)glyphs_extra[character - font_header_extra->FontStartEncoding]; + if (glyphs_extra[character - font_header_extra->fontStartEncoding]) + return (glyph_t *)glyphs_extra[character - font_header_extra->fontStartEncoding]; } else { #if 0 @@ -232,7 +232,7 @@ void TFT_String::add_character(const uint16_t character) { if (length < MAX_STRING_LENGTH) { data[length] = character; length++; - span += glyph(character)->DWidth; + span += glyph(character)->dWidth; } } @@ -240,7 +240,7 @@ void TFT_String::rtrim(const uint16_t character) { while (length) { if (data[length - 1] == 0x20 || data[length - 1] == character) { length--; - span -= glyph(data[length])->DWidth; + span -= glyph(data[length])->dWidth; eol(); } else @@ -251,7 +251,7 @@ void TFT_String::rtrim(const uint16_t character) { void TFT_String::ltrim(const uint16_t character) { uint16_t i, j; for (i = 0; (i < length) && (data[i] == 0x20 || data[i] == character); i++) { - span -= glyph(data[i])->DWidth; + span -= glyph(data[i])->dWidth; } if (i == 0) return; for (j = 0; i < length; data[j++] = data[i++]); diff --git a/Marlin/src/lcd/tft/tft_string.h b/Marlin/src/lcd/tft/tft_string.h index 8596667047..1284d282f1 100644 --- a/Marlin/src/lcd/tft/tft_string.h +++ b/Marlin/src/lcd/tft/tft_string.h @@ -23,13 +23,13 @@ #include -#include "../fontutils.h" +#include "../utf8.h" #define NO_GLYPH 0xFF /* * Marlin fonts with optional antialiasing. Fonts use unifont_t font header and glyph_t glyphs headers. - * Number of glyphs (FontEndEncoding - FontStartEncoding) can not exceed 256 (TBD). + * Number of glyphs (fontEndEncoding - fontStartEncoding) can not exceed 256 (TBD). * Some glyphs may be left undefined with NO_GLYPH */ #define FONT_MARLIN_GLYPHS 0x80 @@ -44,7 +44,7 @@ * * IMPORTANT NOTES: * - glyphs fast search method REQUIRES glyphs to be ordered by unicode - * - last glyph's code MUST be FontEndEncoding + * - last glyph's code MUST be fontEndEncoding */ #define FONT_MARLIN_HIEROGLYPHS 0xA0 #define FONT_MARLIN_HIEROGLYPHS_1BPP 0xA1 @@ -146,22 +146,22 @@ // TFT font with unicode support typedef struct __attribute__((__packed__)) { - uint8_t Format; - uint8_t CapitalAHeight; // Not really needed, but helps with data alingment for uint16_t variables - uint16_t FontStartEncoding; - uint16_t FontEndEncoding; - int8_t FontAscent; - int8_t FontDescent; + uint8_t format; + uint8_t capitalAHeight; // Not really needed, but helps with data alignment for uint16_t variables + uint16_t fontStartEncoding; + uint16_t fontEndEncoding; + int8_t fontAscent; + int8_t fontDescent; } unifont_t; // TFT glyphs typedef struct __attribute__((__packed__)) { - uint8_t BBXWidth; - uint8_t BBXHeight; - uint8_t DataSize; - int8_t DWidth; - int8_t BBXOffsetX; - int8_t BBXOffsetY; + uint8_t bbxWidth; + uint8_t bbxHeight; + uint8_t dataSize; + int8_t dWidth; + int8_t bbxOffsetX; + int8_t bbxOffsetY; } glyph_t; // unicode-prepended TFT glyphs @@ -194,9 +194,9 @@ class TFT_String { static void set_font(const uint8_t *font); static void add_glyphs(const uint8_t *font); - static uint8_t font_type() { return font_header->Format; }; - static uint16_t font_ascent() { return font_header->FontAscent; } - static uint16_t font_height() { return font_header->FontAscent - font_header->FontDescent; } + static uint8_t font_type() { return font_header->format; }; + static uint16_t font_ascent() { return font_header->fontAscent; } + static uint16_t font_height() { return font_header->fontAscent - font_header->fontDescent; } static glyph_t *glyph(uint16_t character); static glyph_t *glyph(uint16_t *character) { return glyph(*character); } @@ -264,7 +264,7 @@ class TFT_String { static uint16_t *string() { return data; } static uint16_t width() { return span; } static uint16_t center(const uint16_t width) { return span > width ? 0 : (width - span) / 2; } - static uint16_t vcenter(const uint16_t height) { return (height + font_header->CapitalAHeight + 1) / 2 > font_header->FontAscent ? (height + font_header->CapitalAHeight + 1) / 2 - font_header->FontAscent : 0 ; } + static uint16_t vcenter(const uint16_t height) { return (height + font_header->capitalAHeight + 1) / 2 > font_header->fontAscent ? (height + font_header->capitalAHeight + 1) / 2 - font_header->fontAscent : 0 ; } }; extern TFT_String tft_string; diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 9482c85a47..0c742071ff 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -58,7 +58,7 @@ TouchControlType Touch::touch_control_type = NONE; void Touch::init() { TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset()); reset(); - io.Init(); + io.init(); TERN_(HAS_TOUCH_SLEEP, wakeUp()); enable(); } @@ -222,15 +222,19 @@ void Touch::touch(touch_control_t *control) { ui.clear_lcd(); MenuItem_int3::action(GET_TEXT_F(MSG_SPEED), &feedrate_percentage, 10, 999); break; - case FLOWRATE: - ui.clear_lcd(); - MenuItemBase::itemIndex = control->data; - #if EXTRUDERS == 1 - MenuItem_int3::action(GET_TEXT_F(MSG_FLOW), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); - #else - MenuItem_int3::action(GET_TEXT_F(MSG_FLOW_N), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); - #endif - break; + + #if HAS_EXTRUDERS + case FLOWRATE: + ui.clear_lcd(); + MenuItemBase::itemIndex = control->data; + #if EXTRUDERS == 1 + MenuItem_int3::action(GET_TEXT_F(MSG_FLOW), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); + #else + MenuItem_int3::action(GET_TEXT_F(MSG_FLOW_N), &planner.flow_percentage[MenuItemBase::itemIndex], 10, 999, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }); + #endif + break; + #endif + case STOP: ui.goto_screen([]{ MenuItem_confirm::select_screen(GET_TEXT_F(MSG_BUTTON_STOP), @@ -266,19 +270,18 @@ void Touch::hold(touch_control_t *control, millis_t delay) { bool Touch::get_point(int16_t *x, int16_t *y) { #if ENABLED(TFT_TOUCH_DEVICE_XPT2046) #if ENABLED(TOUCH_SCREEN_CALIBRATION) - bool is_touched = (touch_calibration.calibration.orientation == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); - + const bool is_touched = (touch_calibration.calibration.orientation == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); if (is_touched && touch_calibration.calibration.orientation != TOUCH_ORIENTATION_NONE) { *x = int16_t((int32_t(*x) * touch_calibration.calibration.x) >> 16) + touch_calibration.calibration.offset_x; *y = int16_t((int32_t(*y) * touch_calibration.calibration.y) >> 16) + touch_calibration.calibration.offset_y; } #else - bool is_touched = (TOUCH_ORIENTATION == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); + const bool is_touched = (TOUCH_ORIENTATION == TOUCH_PORTRAIT ? io.getRawPoint(y, x) : io.getRawPoint(x, y)); *x = uint16_t((uint32_t(*x) * TOUCH_CALIBRATION_X) >> 16) + TOUCH_OFFSET_X; *y = uint16_t((uint32_t(*y) * TOUCH_CALIBRATION_Y) >> 16) + TOUCH_OFFSET_Y; #endif #elif ENABLED(TFT_TOUCH_DEVICE_GT911) - bool is_touched = (TOUCH_ORIENTATION == TOUCH_PORTRAIT ? io.getPoint(y, x) : io.getPoint(x, y)); + const bool is_touched = (TOUCH_ORIENTATION == TOUCH_PORTRAIT ? io.getPoint(y, x) : io.getPoint(x, y)); #endif #if HAS_TOUCH_SLEEP if (is_touched) @@ -321,12 +324,10 @@ bool MarlinUI::touch_pressed() { } void add_control(uint16_t x, uint16_t y, TouchControlType control_type, intptr_t data, MarlinImage image, bool is_enabled, uint16_t color_enabled, uint16_t color_disabled) { - uint16_t width = Images[image].width; - uint16_t height = Images[image].height; + const uint16_t width = images[image].width, height = images[image].height; tft.canvas(x, y, width, height); tft.add_image(0, 0, image, is_enabled ? color_enabled : color_disabled); - if (is_enabled) - touch.add_control(control_type, x, y, width, height, data); + if (is_enabled) touch.add_control(control_type, x, y, width, height, data); } #endif // TOUCH_SCREEN diff --git a/Marlin/src/lcd/tft/touch.h b/Marlin/src/lcd/tft/touch.h index bebd9d01e3..91e863573b 100644 --- a/Marlin/src/lcd/tft/touch.h +++ b/Marlin/src/lcd/tft/touch.h @@ -31,10 +31,10 @@ #endif #if ENABLED(TFT_TOUCH_DEVICE_GT911) - #include HAL_PATH(../../HAL, tft/gt911.h) + #include HAL_PATH(../.., tft/gt911.h) #define TOUCH_DRIVER_CLASS GT911 #elif ENABLED(TFT_TOUCH_DEVICE_XPT2046) - #include HAL_PATH(../../HAL, tft/xpt2046.h) + #include HAL_PATH(../.., tft/xpt2046.h) #define TOUCH_DRIVER_CLASS XPT2046 #else #error "Unknown Touch Screen Type." diff --git a/Marlin/src/lcd/tft/ui_1024x600.cpp b/Marlin/src/lcd/tft/ui_1024x600.cpp index cf5911cdc1..ddb606674c 100644 --- a/Marlin/src/lcd/tft/ui_1024x600.cpp +++ b/Marlin/src/lcd/tft/ui_1024x600.cpp @@ -36,7 +36,7 @@ #include "../../module/planner.h" #include "../../module/motion.h" -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) +#if DISABLED(LCD_PROGRESS_BAR) && ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) #include "../../feature/filwidth.h" #include "../../gcode/parser.h" #endif @@ -118,23 +118,26 @@ void MarlinUI::draw_kill_screen() { tft.queue.sync(); } -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { +void draw_heater_status(uint16_t x, uint16_t y, const int8_t heater) { MarlinImage image = imgHotEnd; - uint16_t Color; celsius_t currentTemperature, targetTemperature; - if (Heater >= 0) { // HotEnd - currentTemperature = thermalManager.wholeDegHotend(Heater); - targetTemperature = thermalManager.degTargetHotend(Heater); + if (heater >= 0) { // HotEnd + #if HAS_EXTRUDERS + currentTemperature = thermalManager.wholeDegHotend(heater); + targetTemperature = thermalManager.degTargetHotend(heater); + #else + return; + #endif } #if HAS_HEATED_BED - else if (Heater == H_BED) { + else if (heater == H_BED) { currentTemperature = thermalManager.wholeDegBed(); targetTemperature = thermalManager.degTargetBed(); } #endif #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { + else if (heater == H_CHAMBER) { currentTemperature = thermalManager.wholeDegChamber(); #if HAS_HEATED_CHAMBER targetTemperature = thermalManager.degTargetChamber(); @@ -144,54 +147,54 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { } #endif #if HAS_TEMP_COOLER - else if (Heater == H_COOLER) { + else if (heater == H_COOLER) { currentTemperature = thermalManager.wholeDegCooler(); 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)); + TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, heater)); tft.canvas(x, y, 80, 120); tft.set_background(COLOR_BACKGROUND); - Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; + uint16_t color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; - if (Heater >= 0) { // HotEnd - if (currentTemperature >= 50) Color = COLOR_HOTEND; + if (heater >= 0) { // HotEnd + if (currentTemperature >= 50) color = COLOR_HOTEND; } #if HAS_HEATED_BED - else if (Heater == H_BED) { - if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + else if (heater == H_BED) { + if (currentTemperature >= 50) color = COLOR_HEATED_BED; image = targetTemperature > 0 ? imgBedHeated : imgBed; } #endif #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - if (currentTemperature >= 50) Color = COLOR_CHAMBER; + else if (heater == H_CHAMBER) { + if (currentTemperature >= 50) color = COLOR_CHAMBER; 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; + 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(8, 28, image, Color); + tft.add_image(8, 28, image, color); tft_string.set(i16tostr3rj(currentTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); - tft.add_text(tft_string.center(80) + 2, 82, Color, tft_string); + tft.add_text(tft_string.center(80) + 2, 82, color, tft_string); if (targetTemperature >= 0) { tft_string.set(i16tostr3rj(targetTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); - tft.add_text(tft_string.center(80) + 2, 8, Color, tft_string); + tft.add_text(tft_string.center(80) + 2, 8, color, tft_string); } } @@ -222,11 +225,10 @@ void MarlinUI::draw_status_screen() { TERN_(TOUCH_SCREEN, touch.clear()); - // heaters and fan - uint16_t i, x, y = TFT_STATUS_TOP_Y; - - for (i = 0 ; i < ITEMS_COUNT; i++) { - x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); + // Statuses of heaters and fans + uint16_t y = TFT_STATUS_TOP_Y; + for (uint16_t i = 0 ; i < ITEMS_COUNT; i++) { + const uint16_t x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); switch (i) { #if HAS_EXTRUDERS case ITEM_E0: draw_heater_status(x, y, H_E0); break; @@ -254,14 +256,14 @@ void MarlinUI::draw_status_screen() { y += 200; - // coordinates + // Coordinates tft.canvas(4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT); tft.set_background(COLOR_BACKGROUND); tft.add_rectangle(0, 0, TFT_WIDTH - 8, FONT_LINE_HEIGHT, COLOR_AXIS_HOMED); if (TERN0(LCD_SHOW_E_TOTAL, printingIsActive())) { #if ENABLED(LCD_SHOW_E_TOTAL) - tft.add_text(200, 3, COLOR_AXIS_HOMED , "E"); + tft.add_text(200, 3, COLOR_AXIS_HOMED, "E"); const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm tft_string.set(ftostr4sign(e_move_accumulator / escale)); tft_string.add(escale == 10 ? 'c' : 'm'); @@ -270,59 +272,69 @@ void MarlinUI::draw_status_screen() { #endif } else { - tft.add_text(200, 3, COLOR_AXIS_HOMED , "X"); - const bool nhx = axis_should_home(X_AXIS); - if (blink && nhx) - tft_string.set('?'); - else - tft_string.set(ftostr4sign(LOGICAL_X_POSITION(current_position.x))); - tft.add_text(300 - tft_string.width(), 3, nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + #if HAS_X_AXIS + tft.add_text(200, 3, COLOR_AXIS_HOMED, "X"); + const bool nhx = axis_should_home(X_AXIS); + if (blink && nhx) + tft_string.set('?'); + else + tft_string.set(ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft.add_text(300 - tft_string.width(), 3, nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + #endif - tft.add_text(500, 3, COLOR_AXIS_HOMED , "Y"); - const bool nhy = axis_should_home(Y_AXIS); - if (blink && nhy) - tft_string.set('?'); - else - tft_string.set(ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); - tft.add_text(600 - tft_string.width(), 3, nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + #if HAS_Y_AXIS + tft.add_text(500, 3, COLOR_AXIS_HOMED, "Y"); + const bool nhy = axis_should_home(Y_AXIS); + if (blink && nhy) + tft_string.set('?'); + else + tft_string.set(ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text(600 - tft_string.width(), 3, nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + #endif } - tft.add_text(800, 3, COLOR_AXIS_HOMED , "Z"); - uint16_t offset = 32; - const bool nhz = axis_should_home(Z_AXIS); - if (blink && nhz) - tft_string.set('?'); - else { - const float z = LOGICAL_Z_POSITION(current_position.z); - tft_string.set(ftostr52sp((int16_t)z)); - tft_string.rtrim(); - offset += tft_string.width(); - tft_string.set(ftostr52sp(z)); - offset -= tft_string.width(); - } - tft.add_text(900 - tft_string.width() - offset, 3, nhz ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + #if HAS_Z_AXIS + tft.add_text(800, 3, COLOR_AXIS_HOMED, "Z"); + uint16_t offset = 32; + const bool nhz = axis_should_home(Z_AXIS); + if (blink && nhz) + tft_string.set('?'); + else { + const float z = LOGICAL_Z_POSITION(current_position.z); + tft_string.set(ftostr52sp((int16_t)z)); + tft_string.rtrim(); + offset += tft_string.width(); + + tft_string.set(ftostr52sp(z)); + offset -= tft_string.width(); + } + tft.add_text(900 - tft_string.width() - offset, 3, nhz ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + #endif // HAS_Z_AXIS + TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT)); y += 100; - // feed rate - tft.canvas(274, y, 128, 32); + // Feed rate + tft.canvas(274, y, 200, 32); tft.set_background(COLOR_BACKGROUND); uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; tft.add_image(0, 0, imgFeedRate, color); tft_string.set(i16tostr3rj(feedrate_percentage)); tft_string.add('%'); - tft.add_text(36, 1, color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 274, y, 128, 32)); + tft.add_text(36, 1, color, tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 274, y, 200, 32)); - // flow rate - tft.canvas(650, y, 128, 32); - tft.set_background(COLOR_BACKGROUND); - color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; - tft.add_image(0, 0, imgFlowRate, color); - tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); - tft_string.add('%'); - tft.add_text(36, 1, color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 650, y, 128, 32, active_extruder)); + // Flow rate + #if HAS_EXTRUDERS + tft.canvas(650, y, 128, 32); + tft.set_background(COLOR_BACKGROUND); + color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + tft.add_image(0, 0, imgFlowRate, color); + tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); + tft_string.add('%'); + tft.add_text(36, 1, color, tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 650, y, 200, 32, active_extruder)); + #endif #if ENABLED(TOUCH_SCREEN) add_control(900, y, menu_main, imgSettings); @@ -336,32 +348,115 @@ void MarlinUI::draw_status_screen() { #endif y += 100; - // print duration - char buffer[14]; - duration_t elapsed = print_job_timer.duration(); - elapsed.toDigital(buffer); + const progress_t progress = TERN(HAS_PRINT_PROGRESS_PERMYRIAD, get_progress_permyriad, get_progress_percent)(); + #if ENABLED(SHOW_ELAPSED_TIME) && DISABLED(SHOW_REMAINING_TIME) + // Print duration so far (time elapsed) - centered + char elapsed_str[22]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toString(elapsed_str); - tft.canvas((TFT_WIDTH - 128) / 2, y, 128, 29); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(buffer); - tft.add_text(tft_string.center(128), 0, COLOR_PRINT_TIME, tft_string); + // Same width constraints as feedrate/flowrate controls + constexpr uint16_t time_str_width = 476, image_width = 36; + + tft.canvas((TFT_WIDTH - time_str_width) / 2, y, time_str_width, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(elapsed_str); + uint16_t text_pos_x = tft_string.center(time_str_width - image_width); + tft.add_image(text_pos_x, 0, imgTimeElapsed, COLOR_PRINT_TIME); + tft.add_text(text_pos_x + image_width, 1, COLOR_PRINT_TIME, tft_string); + + #elif DISABLED(SHOW_ELAPSED_TIME) && ENABLED(SHOW_REMAINING_TIME) + // Print time remaining estimation - centered + char estimate_str[22]; + duration_t elapsed = print_job_timer.duration(); + + // Get the estimate, first from M73 + uint32_t estimate_remaining = (0 + #if ALL(SET_PROGRESS_MANUALLY, SET_REMAINING_TIME) + + get_remaining_time() + #endif + ); + // If no M73 estimate is available but we have progress data, calculate time remaining assuming time elapsed is linear with progress + if (!estimate_remaining && progress > 0) + estimate_remaining = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + + // Generate estimate string + if (!estimate_remaining) + tft_string.set("-"); + else { + duration_t estimation = estimate_remaining; + estimation.toString(estimate_str); + tft_string.set(estimate_str); + } + + // Same width constraints as feedrate/flowrate controls + constexpr uint16_t time_str_width = 476, image_width = 36; + + tft.canvas((TFT_WIDTH - time_str_width) / 2, y, time_str_width, 32); + tft.set_background(COLOR_BACKGROUND); + color = printingIsActive() ? COLOR_PRINT_TIME : COLOR_INACTIVE; + uint16_t text_pos_x = tft_string.center(time_str_width - image_width); + tft.add_image(text_pos_x, 0, imgTimeRemaining, color); + tft.add_text(text_pos_x + image_width, 1, color, tft_string); + + #elif ALL(SHOW_REMAINING_TIME, SHOW_ELAPSED_TIME) + // Print duration so far (time elapsed) - aligned under feed rate + char elapsed_str[22]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toString(elapsed_str); + + tft.canvas(274, y, 200, 32); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgTimeElapsed, COLOR_PRINT_TIME); + tft_string.set(elapsed_str); + tft.add_text(36, 1, COLOR_PRINT_TIME, tft_string); + + // Print time remaining estimation - aligned under flow rate + char estimate_str[22]; + + // Get the estimate, first from M73 + uint32_t estimate_remaining = (0 + #if ALL(SET_PROGRESS_MANUALLY, SET_REMAINING_TIME) + + get_remaining_time() + #endif + ); + // If no M73 estimate is available but we have progress data, calculate time remaining assuming time elapsed is linear with progress + if (!estimate_remaining && progress > 0) + estimate_remaining = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + + // Generate estimate string + if (!estimate_remaining) + tft_string.set("-"); + else { + duration_t estimation = estimate_remaining; + estimation.toString(estimate_str); + tft_string.set(estimate_str); + } + + // Push out the estimate to the screen + tft.canvas(650, y, 200, 32); + tft.set_background(COLOR_BACKGROUND); + color = printingIsActive() ? COLOR_PRINT_TIME : COLOR_INACTIVE; + tft.add_image(0, 0, imgTimeRemaining, color); + tft.add_text(36, 1, color, tft_string); + #endif y += 50; - // progress bar - const uint8_t progress = ui.get_progress_percent(); + // Progress bar tft.canvas(4, y, TFT_WIDTH - 8, 9); tft.set_background(COLOR_PROGRESS_BG); tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME); if (progress) - tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR); + tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress / (PROGRESS_SCALE)) / 100, 7, COLOR_PROGRESS_BAR); y += 50; - // status message - tft.canvas(0, y, TFT_WIDTH, FONT_LINE_HEIGHT); + // Status message + const uint16_t status_height = TFT_HEIGHT - y; + tft.canvas(0, y, TFT_WIDTH, status_height); tft.set_background(COLOR_BACKGROUND); tft_string.set(status_message); tft_string.trim(); - tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_STATUS_MESSAGE, tft_string); + tft.add_text(tft_string.center(TFT_WIDTH), (status_height - FONT_LINE_HEIGHT) / 2, COLOR_STATUS_MESSAGE, tft_string); } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace @@ -481,7 +576,7 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con #if ENABLED(TOUCH_SCREEN) touch.clear(); draw_menu_navigation = false; - touch.add_control(RESUME_CONTINUE , 0, 0, TFT_WIDTH, TFT_HEIGHT); + touch.add_control(RESUME_CONTINUE, 0, 0, TFT_WIDTH, TFT_HEIGHT); #endif menu_line(row); @@ -584,16 +679,26 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con #define Z_SELECTION_Z 1 #define Z_SELECTION_Z_PROBE -1 -struct MotionAxisState { - xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos; +struct { + #if HAS_X_AXIS + xy_int_t xValuePos; + #endif + #if HAS_Y_AXIS + xy_int_t yValuePos; + #endif + #if HAS_Z_AXIS + xy_int_t zValuePos, zTypePos; + int z_selection = Z_SELECTION_Z; + #endif + #if HAS_EXTRUDERS + xy_int_t eValuePos, eNamePos; + uint8_t e_selection = 0; + #endif + xy_int_t stepValuePos; float currentStepSize = 10.0; - int z_selection = Z_SELECTION_Z; - uint8_t e_selection = 0; bool blocked = false; char message[32]; -}; - -MotionAxisState motionAxisState; +} motionAxisState; #define BTN_WIDTH 64 #define BTN_HEIGHT 52 @@ -603,7 +708,7 @@ MotionAxisState motionAxisState; static void quick_feedback() { #if HAS_CHIRP ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle? - #if BOTH(HAS_MARLINUI_MENU, HAS_BEEPER) + #if ALL(HAS_MARLINUI_MENU, HAS_BEEPER) for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } #elif HAS_MARLINUI_MENU delay(10); @@ -620,27 +725,32 @@ static void drawCurStepValue() { tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string); } -static void drawCurZSelection() { - tft_string.set('Z'); - tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(0, 0, Z_BTN_COLOR, tft_string); - tft.queue.sync(); - tft_string.set(F("Offset")); - tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34); - tft.set_background(COLOR_BACKGROUND); - if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { +#if HAS_Z_AXIS + static void drawCurZSelection() { + tft_string.set('Z'); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34); + tft.set_background(COLOR_BACKGROUND); tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + tft.queue.sync(); + tft_string.set(F("Offset")); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34); + tft.set_background(COLOR_BACKGROUND); + #if HAS_BED_PROBE + if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + #endif } -} +#endif -static void drawCurESelection() { - tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft_string.set('E'); - tft.add_text(0, 0, E_BTN_COLOR , tft_string); - tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); -} +#if HAS_EXTRUDERS + static void drawCurESelection() { + tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set('E'); + tft.add_text(0, 0, E_BTN_COLOR, tft_string); + tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); + } +#endif static void drawMessage(PGM_P const msg) { tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34); @@ -658,10 +768,18 @@ static void drawAxisValue(const AxisEnum axis) { xy_int_t pos; uint16_t color; switch (axis) { - case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; - case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; - case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; - case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + #if HAS_X_AXIS + case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; + #endif + #if HAS_Y_AXIS + case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; + #endif + #if HAS_Z_AXIS + case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; + #endif + #if HAS_EXTRUDERS + case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + #endif default: return; } tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, BTN_HEIGHT); @@ -673,53 +791,58 @@ static void drawAxisValue(const AxisEnum axis) { static void moveAxis(const AxisEnum axis, const int8_t direction) { quick_feedback(); - if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { - drawMessage(F("Too cold")); - return; - } + #if HAS_EXTRUDERS + if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { + drawMessage(F("Too cold")); + return; + } + #endif const float diff = motionAxisState.currentStepSize * direction; - if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; - const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; - const float bsDiff = planner.mm_per_step[Z_AXIS] * babystep_increment, - new_probe_offset = probe.offset.z + bsDiff, - new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET - , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff - , new_probe_offset - ); - if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { - babystep.add_steps(Z_AXIS, babystep_increment); - if (do_probe) - probe.offset.z = new_offs; + #if HAS_BED_PROBE + + if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; + const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; + const float bsDiff = planner.mm_per_step[Z_AXIS] * babystep_increment, + new_probe_offset = probe.offset.z + bsDiff, + new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET + , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff + , new_probe_offset + ); + if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + babystep.add_steps(Z_AXIS, babystep_increment); + if (do_probe) + probe.offset.z = new_offs; + else + TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); + drawMessage(F("")); // Clear the error + drawAxisValue(axis); + } else - TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); - drawMessage(F("")); // clear the error + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + + #else + // Only change probe.offset.z + probe.offset.z += diff; + if (direction < 0 && current_position.z < Z_PROBE_OFFSET_RANGE_MIN) { + current_position.z = Z_PROBE_OFFSET_RANGE_MIN; + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position.z > Z_PROBE_OFFSET_RANGE_MAX) { + current_position.z = Z_PROBE_OFFSET_RANGE_MAX; + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + } + else + drawMessage(F("")); // Clear the error + drawAxisValue(axis); - } - else - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + #endif + } - #elif HAS_BED_PROBE - // only change probe.offset.z - probe.offset.z += diff; - if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) { - current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN; - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - } - else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) { - current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX; - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - } - else - drawMessage(F("")); // clear the error - - drawAxisValue(axis); - #endif - return; - } + #endif // HAS_BED_PROBE if (!ui.manual_move.processing) { // Get motion limit from software endstops, if any @@ -729,7 +852,7 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) { // Delta limits XY based on the current offset from center // This assumes the center is 0,0 #if ENABLED(DELTA) - if (axis != Z_AXIS && axis != E_AXIS) { + if (axis != Z_AXIS && TERN1(HAS_EXTRUDERS, axis != E_AXIS)) { max = SQRT(sq(float(PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis min = -max; } @@ -750,35 +873,44 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) { drawAxisValue(axis); } -static void e_plus() { moveAxis(E_AXIS, 1); } -static void e_minus() { moveAxis(E_AXIS, -1); } -static void x_minus() { moveAxis(X_AXIS, -1); } -static void x_plus() { moveAxis(X_AXIS, 1); } -static void y_plus() { moveAxis(Y_AXIS, 1); } -static void y_minus() { moveAxis(Y_AXIS, -1); } -static void z_plus() { moveAxis(Z_AXIS, 1); } -static void z_minus() { moveAxis(Z_AXIS, -1); } +#if HAS_EXTRUDERS + static void e_plus() { moveAxis(E_AXIS, 1); } + static void e_minus() { moveAxis(E_AXIS, -1); } +#endif +#if HAS_X_AXIS + static void x_minus() { moveAxis(X_AXIS, -1); } + static void x_plus() { moveAxis(X_AXIS, 1); } +#endif +#if HAS_Y_AXIS + static void y_plus() { moveAxis(Y_AXIS, 1); } + static void y_minus() { moveAxis(Y_AXIS, -1); } +#endif +#if HAS_Z_AXIS + static void z_plus() { moveAxis(Z_AXIS, 1); } + static void z_minus() { moveAxis(Z_AXIS, -1); } +#endif #if ENABLED(TOUCH_SCREEN) - static void e_select() { - if (++motionAxisState.e_selection >= EXTRUDERS) - motionAxisState.e_selection = 0; - - quick_feedback(); - drawCurESelection(); - drawAxisValue(E_AXIS); - } + #if HAS_EXTRUDERS + static void e_select() { + if (++motionAxisState.e_selection >= EXTRUDERS) + motionAxisState.e_selection = 0; + quick_feedback(); + drawCurESelection(); + drawAxisValue(E_AXIS); + } + #endif static void do_home() { quick_feedback(); drawMessage(GET_TEXT_F(MSG_LEVEL_BED_HOMING)); queue.inject_P(G28_STR); // Disable touch until home is done - TERN_(TOUCH_SCREEN, touch.disable()); - drawAxisValue(E_AXIS); - drawAxisValue(X_AXIS); - drawAxisValue(Y_AXIS); - drawAxisValue(Z_AXIS); + touch.disable(); + TERN_(HAS_EXTRUDERS, drawAxisValue(E_AXIS)); + TERN_(HAS_X_AXIS, drawAxisValue(X_AXIS)); + TERN_(HAS_Y_AXIS, drawAxisValue(Y_AXIS)); + TERN_(HAS_Z_AXIS, drawAxisValue(Z_AXIS)); } static void step_size() { @@ -789,7 +921,7 @@ static void z_minus() { moveAxis(Z_AXIS, -1); } } #endif -#if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) +#if ALL(HAS_BED_PROBE, TOUCH_SCREEN) static void z_select() { motionAxisState.z_selection *= -1; quick_feedback(); @@ -803,9 +935,9 @@ static void disable_steppers() { queue.inject(F("M84")); } -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, - height = Images[imgBtn52Rounded].height; +static void drawBtn(const int x, const int y, const char *label, intptr_t data, const MarlinImage img, uint16_t bgColor, const bool enabled=true) { + const uint16_t width = images[imgBtn52Rounded].width, + height = images[imgBtn52Rounded].height; if (!enabled) bgColor = COLOR_CONTROL_DISABLED; @@ -819,9 +951,8 @@ static void drawBtn(int x, int y, const char *label, intptr_t data, MarlinImage tft_string.trim(); tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); } - else { + else tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); - } TERN_(TOUCH_SCREEN, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); } @@ -839,52 +970,67 @@ void MarlinUI::move_axis_screen() { const bool busy = printingIsActive(); // Babysteps during printing? Select babystep for Z probe offset - if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) - motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + if (busy) motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + #endif // ROW 1 -> E- Y- CurY Z+ int x = X_MARGIN, y = Y_MARGIN, spacing = 0; - drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy); + TERN_(HAS_EXTRUDERS, drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy)); spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy); + + TERN_(HAS_Y_AXIS, drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy)); + + x += BTN_WIDTH; // Cur Y - x += BTN_WIDTH; - motionAxisState.yValuePos.x = x + 2; - motionAxisState.yValuePos.y = y; - drawAxisValue(Y_AXIS); + #if HAS_Y_AXIS + motionAxisState.yValuePos.set(x + 2, y); + drawAxisValue(Y_AXIS); + #endif x += spacing; - drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + #if HAS_Z_AXIS + drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); // Only enabled when not busy or have baby step + #endif // ROW 2 -> "Ex" X- HOME X+ "Z" y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; x = X_MARGIN; spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; - motionAxisState.eNamePos.x = x; - motionAxisState.eNamePos.y = y; - drawCurESelection(); - TERN_(TOUCH_SCREEN, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + #if HAS_EXTRUDERS + motionAxisState.eNamePos.set(x, y); + drawCurESelection(); + TERN_(TOUCH_SCREEN, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + #endif x += BTN_WIDTH + spacing; - drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + + TERN_(HAS_X_AXIS, drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy)); x += BTN_WIDTH + spacing; //imgHome is 64x64 - TERN_(TOUCH_SCREEN, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); + + #if ALL(HAS_X_AXIS, TOUCH_SCREEN) + add_control(TFT_WIDTH / 2 - images[imgHome].width / 2, y - (images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy); + #endif x += BTN_WIDTH + spacing; - uint16_t xplus_x = x; - drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); + const uint16_t xplus_x = x; + + TERN_(HAS_X_AXIS, drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy)); x += BTN_WIDTH + spacing; - motionAxisState.zTypePos.x = x; - motionAxisState.zTypePos.y = y; - drawCurZSelection(); - #if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) + + #if HAS_Z_AXIS + motionAxisState.zTypePos.set(x, y); + drawCurZSelection(); + #endif + + #if ALL(HAS_BED_PROBE, TOUCH_SCREEN) if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); #endif @@ -893,43 +1039,45 @@ void MarlinUI::move_axis_screen() { x = X_MARGIN; spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; - drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); - - // Cur E - motionAxisState.eValuePos.x = x; - motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(E_AXIS); + #if HAS_EXTRUDERS + drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); + motionAxisState.eValuePos.set(x, y + BTN_HEIGHT + 2); + TERN_(HAS_EXTRUDERS, drawAxisValue(E_AXIS)); + #endif // Cur X - motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos - motionAxisState.xValuePos.y = y - 10; - drawAxisValue(X_AXIS); + #if HAS_X_AXIS + motionAxisState.xValuePos.set(BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4, y - 10); + drawAxisValue(X_AXIS); + #endif x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + + // Cur Y + TERN_(HAS_Y_AXIS, drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy)); x += BTN_WIDTH + spacing; - drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step // Cur Z - motionAxisState.zValuePos.x = x; - motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(Z_AXIS); + #if HAS_Z_AXIS + drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); // Only enabled when not busy or have babystep + motionAxisState.zValuePos.set(x, y + BTN_HEIGHT + 2); + drawAxisValue(Z_AXIS); + #endif // ROW 4 -> step_size disable steppers back - y = TFT_HEIGHT - Y_MARGIN - 32; // + y = TFT_HEIGHT - Y_MARGIN - 32; x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2; - motionAxisState.stepValuePos.x = x; - motionAxisState.stepValuePos.y = y; + motionAxisState.stepValuePos.set(x, y); if (!busy) { drawCurStepValue(); - TERN_(TOUCH_SCREEN, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); + TERN_(TOUCH_SCREEN, touch.add_control(BUTTON, x, y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); } - // aligned with x+ + // Aligned with x+ drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); TERN_(TOUCH_SCREEN, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); } -#endif // HAS_UI_480x320 +#endif // HAS_UI_1024x600 diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index bac7586a25..dcbfa935b4 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -36,7 +36,7 @@ #include "../../module/planner.h" #include "../../module/motion.h" -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) +#if DISABLED(LCD_PROGRESS_BAR) && ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) #include "../../feature/filwidth.h" #include "../../gcode/parser.h" #endif @@ -120,23 +120,26 @@ void MarlinUI::draw_kill_screen() { tft.queue.sync(); } -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { +void draw_heater_status(uint16_t x, uint16_t y, const int8_t heater) { MarlinImage image = imgHotEnd; - uint16_t Color; celsius_t currentTemperature, targetTemperature; - if (Heater >= 0) { // HotEnd - currentTemperature = thermalManager.wholeDegHotend(Heater); - targetTemperature = thermalManager.degTargetHotend(Heater); + if (heater >= 0) { // HotEnd + #if HAS_EXTRUDERS + currentTemperature = thermalManager.wholeDegHotend(heater); + targetTemperature = thermalManager.degTargetHotend(heater); + #else + return; + #endif } #if HAS_HEATED_BED - else if (Heater == H_BED) { + else if (heater == H_BED) { currentTemperature = thermalManager.wholeDegBed(); targetTemperature = thermalManager.degTargetBed(); } #endif #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { + else if (heater == H_CHAMBER) { currentTemperature = thermalManager.wholeDegChamber(); #if HAS_HEATED_CHAMBER targetTemperature = thermalManager.degTargetChamber(); @@ -146,54 +149,54 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { } #endif #if HAS_TEMP_COOLER - else if (Heater == H_COOLER) { + else if (heater == H_COOLER) { currentTemperature = thermalManager.wholeDegCooler(); 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)); + TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 64, 100, heater)); tft.canvas(x, y, 64, 100); tft.set_background(COLOR_BACKGROUND); - Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; + uint16_t color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; - if (Heater >= 0) { // HotEnd - if (currentTemperature >= 50) Color = COLOR_HOTEND; + if (heater >= 0) { // HotEnd + if (currentTemperature >= 50) color = COLOR_HOTEND; } #if HAS_HEATED_BED - else if (Heater == H_BED) { - if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + else if (heater == H_BED) { + if (currentTemperature >= 50) color = COLOR_HEATED_BED; image = targetTemperature > 0 ? imgBedHeated : imgBed; } #endif #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - if (currentTemperature >= 50) Color = COLOR_CHAMBER; + else if (heater == H_CHAMBER) { + if (currentTemperature >= 50) color = COLOR_CHAMBER; 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; + 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); + tft.add_image(0, 18, image, color); tft_string.set(i16tostr3rj(currentTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); - tft.add_text(tft_string.center(64) + 2, 69 + tft_string.vcenter(FONT_LINE_HEIGHT), Color, tft_string); + tft.add_text(tft_string.center(64) + 2, 69 + tft_string.vcenter(FONT_LINE_HEIGHT), color, tft_string); if (targetTemperature >= 0) { tft_string.set(i16tostr3rj(targetTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); - tft.add_text(tft_string.center(64) + 2, 5 + tft_string.vcenter(FONT_LINE_HEIGHT), Color, tft_string); + tft.add_text(tft_string.center(64) + 2, 5 + tft_string.vcenter(FONT_LINE_HEIGHT), color, tft_string); } } @@ -224,11 +227,10 @@ void MarlinUI::draw_status_screen() { TERN_(TOUCH_SCREEN, touch.clear()); - // heaters and fan - uint16_t i, x, y = TFT_STATUS_TOP_Y; - - for (i = 0 ; i < ITEMS_COUNT; i++) { - x = (TFT_WIDTH / ITEMS_COUNT - 64) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); + // Statuses of heaters and fans + constexpr uint16_t y = TFT_STATUS_TOP_Y; + for (uint16_t i = 0 ; i < ITEMS_COUNT; i++) { + const uint16_t x = (TFT_WIDTH / ITEMS_COUNT - 64) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); switch (i) { #if HAS_EXTRUDERS case ITEM_E0: draw_heater_status(x, y, H_E0); break; @@ -254,27 +256,16 @@ void MarlinUI::draw_status_screen() { } } - // coordinates - tft.canvas(4, 103, - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 232, FONT_LINE_HEIGHT * 2 - #else - 312, FONT_LINE_HEIGHT - #endif - ); + // 2nd horizontal group - current coordinates (height = 24, top margin = 3) + uint16_t width = TERN(TFT_COLOR_UI_PORTRAIT, 232, 312), + height = FONT_LINE_HEIGHT * TERN(TFT_COLOR_UI_PORTRAIT, 2, 1); + tft.canvas(4, 103, width, height); tft.set_background(COLOR_BACKGROUND); - tft.add_rectangle(0, 0, - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 232, FONT_LINE_HEIGHT * 2 - #else - 312, FONT_LINE_HEIGHT - #endif - , COLOR_AXIS_HOMED - ); + tft.add_rectangle(0, 0, width, height, COLOR_AXIS_HOMED); if (TERN0(LCD_SHOW_E_TOTAL, printingIsActive())) { #if ENABLED(LCD_SHOW_E_TOTAL) - tft.add_text( 10, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "E"); + tft.add_text(10, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, "E"); const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm tft_string.set(ftostr4sign(e_move_accumulator / escale)); tft_string.add(escale == 10 ? 'c' : 'm'); @@ -283,156 +274,205 @@ void MarlinUI::draw_status_screen() { #endif } else { - tft.add_text(TERN(TFT_COLOR_UI_PORTRAIT, 32, 10), tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "X"); - const bool nhx = axis_should_home(X_AXIS); - tft_string.set(blink && nhx ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); - tft.add_text( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 32 - tft_string.width() / 2, FONT_LINE_HEIGHT + tft_string.vcenter(FONT_LINE_HEIGHT), - #else - 68 - tft_string.width(), tft_string.vcenter(FONT_LINE_HEIGHT), - #endif - nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string - ); + #if HAS_X_AXIS + tft.add_text(TERN(TFT_COLOR_UI_PORTRAIT, 32, 10), tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, "X"); + const bool nhx = axis_should_home(X_AXIS); + tft_string.set(blink && nhx ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + uint16_t pos_x = TERN(TFT_COLOR_UI_PORTRAIT, 32 - tft_string.width() / 2, 68 - tft_string.width()), + pos_y = SUM_TERN(TFT_COLOR_UI_PORTRAIT, tft_string.vcenter(FONT_LINE_HEIGHT), FONT_LINE_HEIGHT); + tft.add_text(pos_x, pos_y, nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + #endif - tft.add_text(TERN(TFT_COLOR_UI_PORTRAIT, 110, 127), tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "Y"); - const bool nhy = axis_should_home(Y_AXIS); - tft_string.set(blink && nhy ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); - tft.add_text( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 110 - tft_string.width() / 2, FONT_LINE_HEIGHT + tft_string.vcenter(FONT_LINE_HEIGHT), - #else - 185 - tft_string.width(), tft_string.vcenter(FONT_LINE_HEIGHT), - #endif - nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string - ); + #if HAS_Y_AXIS + tft.add_text(TERN(TFT_COLOR_UI_PORTRAIT, 110, 127), tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, "Y"); + const bool nhy = axis_should_home(Y_AXIS); + tft_string.set(blink && nhy ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft.add_text( + #if ENABLED(TFT_COLOR_UI_PORTRAIT) + 110 - tft_string.width() / 2, FONT_LINE_HEIGHT + tft_string.vcenter(FONT_LINE_HEIGHT), + #else + 185 - tft_string.width(), tft_string.vcenter(FONT_LINE_HEIGHT), + #endif + nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string + ); + #endif } - tft.add_text(TERN(TFT_COLOR_UI_PORTRAIT, 192, 219), tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "Z"); - const bool nhz = axis_should_home(Z_AXIS); - uint16_t offset = 25; - if (blink && nhz) - tft_string.set('?'); - else { - const float z = LOGICAL_Z_POSITION(current_position.z); - tft_string.set(ftostr52sp((int16_t)z)); - tft_string.rtrim(); - offset += tft_string.width(); + #if HAS_Z_AXIS + tft.add_text(TERN(TFT_COLOR_UI_PORTRAIT, 192, 219), tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, "Z"); + const bool nhz = axis_should_home(Z_AXIS); + uint16_t offset = 25; + if (blink && nhz) + tft_string.set('?'); + else { + const float z = LOGICAL_Z_POSITION(current_position.z); + tft_string.set(ftostr52sp((int16_t)z)); + tft_string.rtrim(); + offset += tft_string.width(); - tft_string.set(ftostr52sp(z)); - offset -= tft_string.width(); - } - tft.add_text( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 192 - tft_string.width() / 2, FONT_LINE_HEIGHT + tft_string.vcenter(FONT_LINE_HEIGHT), - #else - 301 - tft_string.width() - offset, tft_string.vcenter(FONT_LINE_HEIGHT), - #endif - nhz ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 0, 103, - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 232, FONT_LINE_HEIGHT * 2 - #else - 312, FONT_LINE_HEIGHT - #endif - )); + tft_string.set(ftostr52sp(z)); + offset -= tft_string.width(); + } + #endif - // feed rate + uint16_t pos_x = TERN(TFT_COLOR_UI_PORTRAIT, 192 - tft_string.width() / 2, 301 - tft_string.width() - offset), + pos_y = SUM_TERN(TFT_COLOR_UI_PORTRAIT, tft_string.vcenter(FONT_LINE_HEIGHT), FONT_LINE_HEIGHT); + tft.add_text(pos_x, pos_y, nhz ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + + // 3rd horizontal group - controls and times (height = 64, top margin = 3) + // 3rd group, subgroup A - controls (on the sides) + #if ENABLED(TOUCH_SCREEN) + width = TERN(TFT_COLOR_UI_PORTRAIT, 232, 312); + height = TERN(TFT_COLOR_UI_PORTRAIT, FONT_LINE_HEIGHT * 2, FONT_LINE_HEIGHT); + touch.add_control(MOVE_AXIS, 0, 103, width, height); + add_control(256, 130, menu_main, imgSettings); + TERN_(SDSUPPORT, add_control(0, 130, menu_media, imgSD, !printingIsActive(), COLOR_CONTROL_ENABLED, card.isMounted() && printingIsActive() ? COLOR_BUSY : COLOR_CONTROL_DISABLED)); + #endif + + // 3rd group, subgroup B - speeds (center, top half) + + // Feed rate tft.canvas( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 30, 172, 80 - #else - 70, 136, 84 - #endif - , 32 + TERN(TFT_COLOR_UI_PORTRAIT, 30, 70), + TERN(TFT_COLOR_UI_PORTRAIT, 172, 132), + TERN(TFT_COLOR_UI_PORTRAIT, 80, 88), + MENU_ITEM_HEIGHT ); tft.set_background(COLOR_BACKGROUND); uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; tft.add_image(0, 0, imgFeedRate, color); tft_string.set(i16tostr3rj(feedrate_percentage)); tft_string.add('%'); - tft.add_text(32, tft_string.vcenter(30), color , tft_string); + tft.add_text(32, tft_string.vcenter(30), color, tft_string); TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 30, 172, 80 - #else - 70, 136, 84 - #endif - , 32 + TERN(TFT_COLOR_UI_PORTRAIT, 30, 70), + TERN(TFT_COLOR_UI_PORTRAIT, 172, 132), + 80, MENU_ITEM_HEIGHT )); - // flow rate + // Flow rate tft.canvas( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 140, 172, 80 - #else - 170, 136, 84 - #endif - , 32 + TERN(TFT_COLOR_UI_PORTRAIT, 140, 162), + TERN(TFT_COLOR_UI_PORTRAIT, 172, 132), + TERN(TFT_COLOR_UI_PORTRAIT, 80, 88), + MENU_ITEM_HEIGHT ); tft.set_background(COLOR_BACKGROUND); color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; tft.add_image(0, 0, imgFlowRate, color); tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); tft_string.add('%'); - tft.add_text(32, tft_string.vcenter(30), color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 140, 172, 80 - #else - 170, 136, 84 - #endif - , 32, active_extruder - )); + tft.add_text(32, tft_string.vcenter(30), color, tft_string); + #if ENABLED(TOUCH_SCREEN) + touch.add_control(FLOWRATE, + TERN(TFT_COLOR_UI_PORTRAIT, 140, 170), + TERN(TFT_COLOR_UI_PORTRAIT, 172, 132), + 80, MENU_ITEM_HEIGHT, active_extruder + ); + #endif - // print duration - char buffer[14]; - duration_t elapsed = print_job_timer.duration(); - elapsed.toDigital(buffer); + // 3rd group, subgroup C - times (center, bottom half) + const progress_t progress = TERN(HAS_PRINT_PROGRESS_PERMYRIAD, get_progress_permyriad, get_progress_percent)(); + const uint16_t time_str_width = 180, image_width = 34; + pos_x = (TFT_WIDTH - time_str_width) / 2; + pos_y = TERN(TFT_COLOR_UI_PORTRAIT, 256, 164); + #if ENABLED(SHOW_ELAPSED_TIME) && DISABLED(SHOW_REMAINING_TIME) + // Print duration so far (time elapsed) - centered + char elapsed_str[18]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toCompactString(elapsed_str); - tft.canvas( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 56, 256, 128 - #else - 96, 173, 128 - #endif - , FONT_LINE_HEIGHT - ); - tft.set_background(COLOR_BACKGROUND); - tft_string.set(buffer); - tft.add_text(tft_string.center(128), tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_PRINT_TIME, tft_string); + tft.canvas(pos_x, pos_y, time_str_width, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(elapsed_str); + uint16_t text_pos_x = tft_string.center(time_str_width - image_width); + tft.add_image(text_pos_x, 0, imgTimeElapsed, COLOR_PRINT_TIME); + tft.add_text(text_pos_x + image_width, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_PRINT_TIME, tft_string); - // progress bar - const uint8_t progress = ui.get_progress_percent(); - tft.canvas( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 4, 278, 232 - #else - 4, 198, 312 - #endif - , 9 - ); + #elif DISABLED(SHOW_ELAPSED_TIME) && ENABLED(SHOW_REMAINING_TIME) + // Print time remaining estimation - centered + char estimate_str[18]; + duration_t elapsed = print_job_timer.duration(); + + // Get the estimate, first from M73 + uint32_t estimate_remaining = (0 + #if ALL(SET_PROGRESS_MANUALLY, SET_REMAINING_TIME) + + get_remaining_time() + #endif + ); + // If no M73 estimate is available but we have progress data, calculate time remaining assuming time elapsed is linear with progress + if (!estimate_remaining && progress > 0) + estimate_remaining = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + + // Generate estimate string + if (!estimate_remaining) + tft_string.set("-"); + else { + duration_t estimation = estimate_remaining; + estimation.toCompactString(estimate_str); + tft_string.set(estimate_str); + } + + tft.canvas(pos_x, pos_y, time_str_width, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + color = printingIsActive() ? COLOR_PRINT_TIME : COLOR_INACTIVE; + uint16_t text_pos_x = tft_string.center(time_str_width - image_width); + tft.add_image(text_pos_x, 0, imgTimeRemaining, color); + tft.add_text(text_pos_x + image_width, tft_string.vcenter(FONT_LINE_HEIGHT), color, tft_string); + + #elif ALL(SHOW_REMAINING_TIME, SHOW_ELAPSED_TIME) + // Print duration so far (time elapsed) - aligned under feed rate + char elapsed_str[18]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toCompactString(elapsed_str); + + tft.canvas(pos_x, pos_y, time_str_width / 2 - 2, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgTimeElapsed, COLOR_PRINT_TIME); + tft_string.set(elapsed_str); + tft.add_text(32, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_PRINT_TIME, tft_string); + + // Print time remaining estimation - aligned under flow rate + char estimate_str[18]; + + // Get the estimate, first from M73 + uint32_t estimate_remaining = (0 + #if ALL(SET_PROGRESS_MANUALLY, SET_REMAINING_TIME) + + get_remaining_time() + #endif + ); + // If no M73 estimate is available but we have progress data, calculate time remaining assuming time elapsed is linear with progress + if (!estimate_remaining && progress > 0) + estimate_remaining = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + + // Generate estimate string + if (!estimate_remaining) + tft_string.set("-"); + else { + duration_t estimation = estimate_remaining; + estimation.toCompactString(estimate_str); + tft_string.set(estimate_str); + } + + // Push out the estimate to the screen + tft.canvas(pos_x + time_str_width / 2 + 2, pos_y, time_str_width / 2 - 2, MENU_ITEM_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + color = printingIsActive() ? COLOR_PRINT_TIME : COLOR_INACTIVE; + tft.add_image(0, 0, imgTimeRemaining, color); + tft.add_text(32, tft_string.vcenter(FONT_LINE_HEIGHT), color, tft_string); + #endif + + // Fourth horizontal group - progress bar (height = 9, top margin = 4) + pos_y = TERN(TFT_COLOR_UI_PORTRAIT, 278, 198); + tft.canvas(4, pos_y, TFT_WIDTH - 8, 9); tft.set_background(COLOR_PROGRESS_BG); - tft.add_rectangle(0, 0, - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 232, 9 - #else - 312, 9 - #endif - , COLOR_PROGRESS_FRAME - ); + tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME); if (progress) - tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR); + tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress / (PROGRESS_SCALE)) / 100, 7, COLOR_PROGRESS_BAR); - // status message - tft.canvas( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 0, 296, 240 - #else - 0, 212, 320 - #endif - , FONT_LINE_HEIGHT - ); + // Status message + pos_y += 9 + 7; + tft.canvas(0, pos_y, TFT_WIDTH, TFT_HEIGHT - pos_y); tft.set_background(COLOR_BACKGROUND); tft_string.set(status_message); tft_string.trim(); @@ -441,12 +481,9 @@ void MarlinUI::draw_status_screen() { #if ENABLED(TOUCH_SCREEN) { add_control( - #if ENABLED(TFT_COLOR_UI_PORTRAIT) - 176, 210 - #else - 256, 130 - #endif - , menu_main, imgSettings + TERN(TFT_COLOR_UI_PORTRAIT, 176, 256), + TERN(TFT_COLOR_UI_PORTRAIT, 210, 130), + menu_main, imgSettings ); #if HAS_MEDIA const bool cm = card.isMounted(), pa = printingIsActive(); @@ -552,8 +589,8 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con tft.add_text(tft_string.center(TFT_WIDTH), MENU_TEXT_Y_OFFSET, COLOR_MENU_TEXT, tft_string); } #if ENABLED(TOUCH_SCREEN) - if (no) add_control(TERN(TFT_COLOR_UI_PORTRAIT, 16, 48), TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); - if (yes) add_control(TERN(TFT_COLOR_UI_PORTRAIT, 160, 208), TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + if (no) add_control(TERN(TFT_COLOR_UI_PORTRAIT, 32,48), TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + if (yes) add_control(TERN(TFT_COLOR_UI_PORTRAIT, 172, 208), TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); #endif } @@ -563,7 +600,7 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con #if ENABLED(TOUCH_SCREEN) touch.clear(); draw_menu_navigation = false; - touch.add_control(RESUME_CONTINUE , 0, 0, TFT_WIDTH, TFT_HEIGHT); + touch.add_control(RESUME_CONTINUE, 0, 0, TFT_WIDTH, TFT_HEIGHT); #endif menu_line(row); @@ -666,16 +703,26 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con #define Z_SELECTION_Z 1 #define Z_SELECTION_Z_PROBE -1 -struct MotionAxisState { - xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos; +struct { + #if HAS_X_AXIS + xy_int_t xValuePos; + #endif + #if HAS_Y_AXIS + xy_int_t yValuePos; + #endif + #if HAS_Z_AXIS + xy_int_t zValuePos, zTypePos; + int z_selection = Z_SELECTION_Z; + #endif + #if HAS_EXTRUDERS + xy_int_t eValuePos, eNamePos; + uint8_t e_selection = 0; + #endif + xy_int_t stepValuePos; float currentStepSize = 10.0; - int z_selection = Z_SELECTION_Z; - uint8_t e_selection = 0; bool blocked = false; char message[32]; -}; - -MotionAxisState motionAxisState; +} motionAxisState; #define BTN_WIDTH 48 #define BTN_HEIGHT 39 @@ -685,7 +732,7 @@ MotionAxisState motionAxisState; static void quick_feedback() { #if HAS_CHIRP ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle? - #if BOTH(HAS_MARLINUI_MENU, HAS_BEEPER) + #if ALL(HAS_MARLINUI_MENU, HAS_BEEPER) for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } #elif HAS_MARLINUI_MENU delay(10); @@ -706,27 +753,32 @@ static void drawCurStepValue() { tft.add_text(CUR_STEP_VALUE_WIDTH - tft_string.width(), 0, COLOR_AXIS_HOMED, tft_string); } -static void drawCurZSelection() { - tft_string.set('Z'); - tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 20); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(0, 0, Z_BTN_COLOR, tft_string); - tft.queue.sync(); - tft_string.set(F("Offset")); - tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 20); - tft.set_background(COLOR_BACKGROUND); - if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { +#if HAS_Z_AXIS + static void drawCurZSelection() { + tft_string.set('Z'); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 20); + tft.set_background(COLOR_BACKGROUND); tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + tft.queue.sync(); + tft_string.set(F("Offset")); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 20); + tft.set_background(COLOR_BACKGROUND); + #if HAS_BED_PROBE + if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + #endif } -} +#endif -static void drawCurESelection() { - tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft_string.set('E'); - tft.add_text(0, 0, E_BTN_COLOR , tft_string); - tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); -} +#if HAS_EXTRUDERS + static void drawCurESelection() { + tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set('E'); + tft.add_text(0, 0, E_BTN_COLOR, tft_string); + tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); + } +#endif static void drawMessage(PGM_P const msg) { tft.canvas(X_MARGIN, @@ -751,10 +803,18 @@ static void drawAxisValue(const AxisEnum axis) { xy_int_t pos; uint16_t color; switch (axis) { - case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; - case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; - case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; - case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + #if HAS_X_AXIS + case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; + #endif + #if HAS_Y_AXIS + case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; + #endif + #if HAS_Z_AXIS + case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; + #endif + #if HAS_EXTRUDERS + case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + #endif default: return; } tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, FONT_LINE_HEIGHT); @@ -766,53 +826,58 @@ static void drawAxisValue(const AxisEnum axis) { static void moveAxis(const AxisEnum axis, const int8_t direction) { quick_feedback(); - if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { - drawMessage(F("Too cold")); - return; - } + #if HAS_EXTRUDERS + if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { + drawMessage(F("Too cold")); + return; + } + #endif const float diff = motionAxisState.currentStepSize * direction; - if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; - const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; - const float bsDiff = planner.mm_per_step[Z_AXIS] * babystep_increment, - new_probe_offset = probe.offset.z + bsDiff, - new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET - , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff - , new_probe_offset - ); - if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { - babystep.add_steps(Z_AXIS, babystep_increment); - if (do_probe) - probe.offset.z = new_offs; + #if HAS_BED_PROBE + + if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; + const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; + const float bsDiff = planner.mm_per_step[Z_AXIS] * babystep_increment, + new_probe_offset = probe.offset.z + bsDiff, + new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET + , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff + , new_probe_offset + ); + if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + babystep.add_steps(Z_AXIS, babystep_increment); + if (do_probe) + probe.offset.z = new_offs; + else + TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); + drawMessage(NUL_STR); // Clear the error + drawAxisValue(axis); + } else - TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); - drawMessage(NUL_STR); // clear the error + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + + #else + // Only change probe.offset.z + probe.offset.z += diff; + if (direction < 0 && current_position.z < Z_PROBE_OFFSET_RANGE_MIN) { + current_position.z = Z_PROBE_OFFSET_RANGE_MIN; + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position.z > Z_PROBE_OFFSET_RANGE_MAX) { + current_position.z = Z_PROBE_OFFSET_RANGE_MAX; + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + } + else + drawMessage(NUL_STR); // Clear the error + drawAxisValue(axis); - } - else { - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - } - #elif HAS_BED_PROBE - // only change probe.offset.z - probe.offset.z += diff; - if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) { - current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN; - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - } - else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) { - current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX; - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - } - else { - drawMessage(NUL_STR); // clear the error - } - drawAxisValue(axis); - #endif - return; - } + #endif + } + + #endif // HAS_BED_PROBE if (!ui.manual_move.processing) { // Get motion limit from software endstops, if any @@ -822,7 +887,7 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) { // Delta limits XY based on the current offset from center // This assumes the center is 0,0 #if ENABLED(DELTA) - if (axis != Z_AXIS && axis != E_AXIS) { + if (axis != Z_AXIS && TERN1(HAS_EXTRUDERS, axis != E_AXIS)) { max = SQRT(sq(float(PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis min = -max; } @@ -843,35 +908,44 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) { drawAxisValue(axis); } -static void e_plus() { moveAxis(E_AXIS, 1); } -static void e_minus() { moveAxis(E_AXIS, -1); } -static void x_minus() { moveAxis(X_AXIS, -1); } -static void x_plus() { moveAxis(X_AXIS, 1); } -static void y_plus() { moveAxis(Y_AXIS, 1); } -static void y_minus() { moveAxis(Y_AXIS, -1); } -static void z_plus() { moveAxis(Z_AXIS, 1); } -static void z_minus() { moveAxis(Z_AXIS, -1); } +#if HAS_EXTRUDERS + static void e_plus() { moveAxis(E_AXIS, 1); } + static void e_minus() { moveAxis(E_AXIS, -1); } +#endif +#if HAS_X_AXIS + static void x_minus() { moveAxis(X_AXIS, -1); } + static void x_plus() { moveAxis(X_AXIS, 1); } +#endif +#if HAS_Y_AXIS + static void y_plus() { moveAxis(Y_AXIS, 1); } + static void y_minus() { moveAxis(Y_AXIS, -1); } +#endif +#if HAS_Z_AXIS + static void z_plus() { moveAxis(Z_AXIS, 1); } + static void z_minus() { moveAxis(Z_AXIS, -1); } +#endif #if ENABLED(TOUCH_SCREEN) - static void e_select() { - if (++motionAxisState.e_selection >= EXTRUDERS) - motionAxisState.e_selection = 0; - - quick_feedback(); - drawCurESelection(); - drawAxisValue(E_AXIS); - } + #if HAS_EXTRUDERS + static void e_select() { + if (++motionAxisState.e_selection >= EXTRUDERS) + motionAxisState.e_selection = 0; + quick_feedback(); + drawCurESelection(); + drawAxisValue(E_AXIS); + } + #endif static void do_home() { quick_feedback(); drawMessage(GET_TEXT_F(MSG_LEVEL_BED_HOMING)); queue.inject_P(G28_STR); // Disable touch until home is done - TERN_(HAS_TFT_XPT2046, touch.disable()); - drawAxisValue(E_AXIS); - drawAxisValue(X_AXIS); - drawAxisValue(Y_AXIS); - drawAxisValue(Z_AXIS); + touch.disable(); + TERN_(HAS_EXTRUDERS, drawAxisValue(E_AXIS)); + TERN_(HAS_X_AXIS, drawAxisValue(X_AXIS)); + TERN_(HAS_Y_AXIS, drawAxisValue(Y_AXIS)); + TERN_(HAS_Z_AXIS, drawAxisValue(Z_AXIS)); } static void step_size() { @@ -897,9 +971,9 @@ static void disable_steppers() { queue.inject(F("M84")); } -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[imgBtn39Rounded].width; - uint16_t height = Images[imgBtn39Rounded].height; +static void drawBtn(const int x, const int y, const char *label, intptr_t data, const MarlinImage img, uint16_t bgColor, const bool enabled=true) { + const uint16_t width = images[imgBtn39Rounded].width, + height = images[imgBtn39Rounded].height; if (!enabled) bgColor = COLOR_CONTROL_DISABLED; @@ -916,14 +990,14 @@ static void drawBtn(int x, int y, const char *label, intptr_t data, MarlinImage else tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); - TERN_(HAS_TFT_XPT2046, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); + TERN_(TOUCH_SCREEN, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); } void MarlinUI::move_axis_screen() { // Reset defer_status_screen(true); motionAxisState.blocked = false; - TERN_(HAS_TFT_XPT2046, touch.enable()); + TERN_(TOUCH_SCREEN, touch.enable()); ui.clear_lcd(); @@ -932,97 +1006,105 @@ void MarlinUI::move_axis_screen() { const bool busy = printingIsActive(); // Babysteps during printing? Select babystep for Z probe offset - if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) - motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + if (busy) motionAxisState.z_selection = Z_SELECTION_Z_PROBE; + #endif #if ENABLED(TFT_COLOR_UI_PORTRAIT) // ROW 1 -> E+ Y+ Z+ int x = X_MARGIN, y = Y_MARGIN, spacing = 0; - drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy); + TERN_(HAS_EXTRUDERS, drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy)); spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; x += BTN_WIDTH + spacing; uint16_t yplus_x = x; - drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy); + + TERN_(HAS_Y_AXIS, drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy)); x += BTN_WIDTH + spacing; uint16_t zplus_x = x; - drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + #if HAS_Z_AXIS + drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); // Only enabled when not busy or have baby step + #endif // ROW 2 -> "Ex" CurY "Z" x = X_MARGIN; y += BTN_HEIGHT + 2; - motionAxisState.eNamePos.x = x; - motionAxisState.eNamePos.y = y; - drawCurESelection(); - TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + #if HAS_EXTRUDERS + motionAxisState.eNamePos.set(x, y); + drawCurESelection(); + TERN_(TOUCH_SCREEN, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + #endif - motionAxisState.yValuePos.x = yplus_x; - motionAxisState.yValuePos.y = y; - drawAxisValue(Y_AXIS); + #if HAS_Y_AXIS + motionAxisState.yValuePos.set(yplus_x, y); + drawAxisValue(Y_AXIS); + #endif - motionAxisState.zTypePos.x = zplus_x; - motionAxisState.zTypePos.y = y; - drawCurZSelection(); + #if HAS_Z_AXIS + motionAxisState.zTypePos.set(zplus_x, y); + drawCurZSelection(); + #endif // ROW 3 -> X- HOME X+ y += (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3 - 2; x = X_MARGIN; - drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + #if HAS_X_AXIS + drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + TERN_(TOUCH_SCREEN, add_control(TFT_WIDTH / 2 - images[imgHome].width / 2, y - (images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); + drawBtn(zplus_x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); + #endif - TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); - - drawBtn(zplus_x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); - - #if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) + #if ALL(HAS_BED_PROBE, TOUCH_SCREEN) if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); #endif // ROW 4 -> Cur X y += BTN_HEIGHT + 2; - motionAxisState.xValuePos.x = x; - motionAxisState.xValuePos.y = y; - drawAxisValue(X_AXIS); + #if HAS_X_AXIS + motionAxisState.xValuePos.set(x, y); + drawAxisValue(X_AXIS); + #endif // ROW 5 -> E- CurX Y- Z- y += (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3 - 2; x = X_MARGIN; - drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); - - // Cur E - motionAxisState.eValuePos.x = x; - motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(E_AXIS); + #if HAS_EXTRUDERS + drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); + motionAxisState.eValuePos.set(x, y + BTN_HEIGHT + 2); + TERN_(HAS_EXTRUDERS, drawAxisValue(E_AXIS)); + #endif x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + + TERN_(HAS_Y_AXIS, drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy)); x += BTN_WIDTH + spacing; - drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step - // Cur Z - motionAxisState.zValuePos.x = x; - motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(Z_AXIS); + #if HAS_Z_AXIS + drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + motionAxisState.zValuePos.set(x, y + BTN_HEIGHT + 2); + drawAxisValue(Z_AXIS); + #endif // ROW 6 -> step_size disable steppers back - y = TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT; // + y = TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT; x = zplus_x - CUR_STEP_VALUE_WIDTH - 10; - motionAxisState.stepValuePos.x = X_MARGIN + BTN_WIDTH - CUR_STEP_VALUE_WIDTH; - motionAxisState.stepValuePos.y = TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT; + motionAxisState.stepValuePos.set(X_MARGIN + BTN_WIDTH - CUR_STEP_VALUE_WIDTH, y); if (!busy) { - drawCurStepValue(); - TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); + drawCurStepValue(); + TERN_(TOUCH_SCREEN, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); } - // aligned with x+ + // Aligned with x+ drawBtn(yplus_x, y, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); #else // !TFT_COLOR_UI_PORTRAIT @@ -1030,48 +1112,62 @@ void MarlinUI::move_axis_screen() { // ROW 1 -> E+ Y+ CurY Z+ int x = X_MARGIN, y = Y_MARGIN, spacing = 0; - drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy); + TERN_(HAS_EXTRUDERS, drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy)); spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; x += BTN_WIDTH + spacing; uint16_t yplus_x = x; - drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy); - // Cur Y + TERN_(HAS_Y_AXIS, drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy)); + x += BTN_WIDTH; - motionAxisState.yValuePos.x = x + 2; - motionAxisState.yValuePos.y = y; - drawAxisValue(Y_AXIS); + + #if HAS_Y_AXIS + motionAxisState.yValuePos.set(x + 2, y); + drawAxisValue(Y_AXIS); + #endif x += spacing; - drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + + #if HAS_Z_AXIS + drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + #endif // ROW 2 -> "Ex" X- HOME X+ "Z" y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; x = X_MARGIN; spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; - motionAxisState.eNamePos.x = x; - motionAxisState.eNamePos.y = y; - drawCurESelection(); - TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + #if HAS_EXTRUDERS + motionAxisState.eNamePos.set(x, y); + drawCurESelection(); + TERN_(TOUCH_SCREEN, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + #endif x += BTN_WIDTH + spacing; - drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + + TERN_(HAS_X_AXIS, drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy)); x += BTN_WIDTH + spacing; //imgHome is 64x64 - TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); + + #if ALL(HAS_X_AXIS, TOUCH_SCREEN) + add_control(TFT_WIDTH / 2 - images[imgHome].width / 2, y - (images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy); + #endif x += BTN_WIDTH + spacing; - uint16_t xplus_x = x; - drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); + const uint16_t xplus_x = x; + + TERN_(HAS_X_AXIS, drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy)); x += BTN_WIDTH + spacing; - motionAxisState.zTypePos.x = x; - motionAxisState.zTypePos.y = y; - drawCurZSelection(); - #if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) - if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); + + #if HAS_Z_AXIS + motionAxisState.zTypePos.set(x, y); + drawCurZSelection(); + #endif + + #if ALL(HAS_BED_PROBE, TOUCH_SCREEN) + if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); #endif // ROW 3 -> E- CurX Y- Z- @@ -1079,45 +1175,47 @@ void MarlinUI::move_axis_screen() { x = X_MARGIN; spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; - drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); - - // Cur E - motionAxisState.eValuePos.x = x; - motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(E_AXIS); + #if HAS_EXTRUDERS + drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); + motionAxisState.eValuePos.set(x, y + BTN_HEIGHT + 2); + TERN_(HAS_EXTRUDERS, drawAxisValue(E_AXIS)); + #endif // Cur X - motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos - motionAxisState.xValuePos.y = y - 10; - drawAxisValue(X_AXIS); + #if HAS_X_AXIS + motionAxisState.xValuePos.set(BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4, y - 10); + drawAxisValue(X_AXIS); + #endif x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + + // Cur Y + TERN_(HAS_Y_AXIS, drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy)); x += BTN_WIDTH + spacing; - drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step // Cur Z - motionAxisState.zValuePos.x = x; - motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(Z_AXIS); + #if HAS_Z_AXIS + drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + motionAxisState.zValuePos.set(x, y + BTN_HEIGHT + 2); + drawAxisValue(Z_AXIS); + #endif // ROW 4 -> step_size disable steppers back - y = TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT; // + y = TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT; x = xplus_x - CUR_STEP_VALUE_WIDTH - 10; - motionAxisState.stepValuePos.x = yplus_x + BTN_WIDTH - CUR_STEP_VALUE_WIDTH; - motionAxisState.stepValuePos.y = TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT; + motionAxisState.stepValuePos.set(yplus_x + BTN_WIDTH - CUR_STEP_VALUE_WIDTH, y); if (!busy) { - drawCurStepValue(); - TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); + drawCurStepValue(); + TERN_(TOUCH_SCREEN, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); } - // aligned with x+ + // Aligned with x+ drawBtn(xplus_x, y, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); #endif // !TFT_COLOR_UI_PORTRAIT - TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); + TERN_(TOUCH_SCREEN, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); } #endif // HAS_UI_320x240 diff --git a/Marlin/src/lcd/tft/ui_320x240.h b/Marlin/src/lcd/tft/ui_320x240.h index 555ca3616a..1d3aa86f81 100644 --- a/Marlin/src/lcd/tft/ui_320x240.h +++ b/Marlin/src/lcd/tft/ui_320x240.h @@ -37,6 +37,7 @@ #define MENU_ITEM_HEIGHT 32 #define MENU_LINE_HEIGHT (MENU_ITEM_HEIGHT + 2) +#define FONT_LINE_HEIGHT 24 #if (TFT_FONT == NOTOSANS) || (TFT_FONT == HELVETICA) #define FONT_SIZE 14 diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index efb58754c7..8e554cf413 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -36,7 +36,7 @@ #include "../../module/planner.h" #include "../../module/motion.h" -#if DISABLED(LCD_PROGRESS_BAR) && BOTH(FILAMENT_LCD_DISPLAY, HAS_MEDIA) +#if DISABLED(LCD_PROGRESS_BAR) && ALL(FILAMENT_LCD_DISPLAY, HAS_MEDIA) #include "../../feature/filwidth.h" #include "../../gcode/parser.h" #endif @@ -49,9 +49,9 @@ void MarlinUI::tft_idle() { #if ENABLED(TOUCH_SCREEN) if (TERN0(HAS_TOUCH_SLEEP, lcd_sleep_task())) return; if (draw_menu_navigation) { - add_control(104, TFT_HEIGHT - 34, PAGE_UP, imgPageUp, encoderTopLine > 0); - add_control(344, TFT_HEIGHT - 34, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); - add_control(224, TFT_HEIGHT - 34, BACK, imgBack); + add_control(TFT_WIDTH / 6 - 16, TFT_HEIGHT - 34, PAGE_UP, imgPageUp, encoderTopLine > 0); + add_control(TFT_WIDTH / 2 - 16, TFT_HEIGHT - 34, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items); + add_control(5 * TFT_WIDTH / 6 - 16, TFT_HEIGHT - 34, BACK, imgBack); draw_menu_navigation = false; } #endif @@ -118,23 +118,26 @@ void MarlinUI::draw_kill_screen() { tft.queue.sync(); } -void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { +void draw_heater_status(uint16_t x, uint16_t y, const int8_t heater) { MarlinImage image = imgHotEnd; - uint16_t Color; celsius_t currentTemperature, targetTemperature; - if (Heater >= 0) { // HotEnd - currentTemperature = thermalManager.wholeDegHotend(Heater); - targetTemperature = thermalManager.degTargetHotend(Heater); + if (heater >= 0) { // HotEnd + #if HAS_EXTRUDERS + currentTemperature = thermalManager.wholeDegHotend(heater); + targetTemperature = thermalManager.degTargetHotend(heater); + #else + return; + #endif } #if HAS_HEATED_BED - else if (Heater == H_BED) { + else if (heater == H_BED) { currentTemperature = thermalManager.wholeDegBed(); targetTemperature = thermalManager.degTargetBed(); } #endif #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { + else if (heater == H_CHAMBER) { currentTemperature = thermalManager.wholeDegChamber(); #if HAS_HEATED_CHAMBER targetTemperature = thermalManager.degTargetChamber(); @@ -144,54 +147,54 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { } #endif #if HAS_TEMP_COOLER - else if (Heater == H_COOLER) { + else if (heater == H_COOLER) { currentTemperature = thermalManager.wholeDegCooler(); 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)); + TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, heater)); tft.canvas(x, y, 80, 120); tft.set_background(COLOR_BACKGROUND); - Color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; + uint16_t color = currentTemperature < 0 ? COLOR_INACTIVE : COLOR_COLD; - if (Heater >= 0) { // HotEnd - if (currentTemperature >= 50) Color = COLOR_HOTEND; + if (heater >= 0) { // HotEnd + if (currentTemperature >= 50) color = COLOR_HOTEND; } #if HAS_HEATED_BED - else if (Heater == H_BED) { - if (currentTemperature >= 50) Color = COLOR_HEATED_BED; + else if (heater == H_BED) { + if (currentTemperature >= 50) color = COLOR_HEATED_BED; image = targetTemperature > 0 ? imgBedHeated : imgBed; } #endif #if HAS_TEMP_CHAMBER - else if (Heater == H_CHAMBER) { - if (currentTemperature >= 50) Color = COLOR_CHAMBER; + else if (heater == H_CHAMBER) { + if (currentTemperature >= 50) color = COLOR_CHAMBER; 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; + 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(8, 28, image, Color); + tft.add_image(8, 28, image, color); tft_string.set(i16tostr3rj(currentTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); - tft.add_text(tft_string.center(80) + 2, 80 + tft_string.vcenter(FONT_LINE_HEIGHT), Color, tft_string); + tft.add_text(tft_string.center(80) + 2, 80 + tft_string.vcenter(FONT_LINE_HEIGHT), color, tft_string); if (targetTemperature >= 0) { tft_string.set(i16tostr3rj(targetTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); - tft.add_text(tft_string.center(80) + 2, 6 + tft_string.vcenter(FONT_LINE_HEIGHT) , Color, tft_string); + tft.add_text(tft_string.center(80) + 2, 6 + tft_string.vcenter(FONT_LINE_HEIGHT), color, tft_string); } } @@ -222,11 +225,10 @@ void MarlinUI::draw_status_screen() { TERN_(TOUCH_SCREEN, touch.clear()); - // heaters and fan - uint16_t i, x, y = TFT_STATUS_TOP_Y; - - for (i = 0 ; i < ITEMS_COUNT; i++) { - x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); + // Statuses of heaters and fans + uint16_t y = STATUS_MARGIN_SIZE; + for (uint16_t i = 0; i < ITEMS_COUNT; i++) { + uint16_t x = (TFT_WIDTH / ITEMS_COUNT - 80) / 2 + (TFT_WIDTH * i / ITEMS_COUNT); switch (i) { #if HAS_EXTRUDERS case ITEM_E0: draw_heater_status(x, y, H_E0); break; @@ -252,16 +254,17 @@ void MarlinUI::draw_status_screen() { } } - y += TERN(HAS_UI_480x272, 120, 128); + y += STATUS_MARGIN_SIZE + 114; - // coordinates - tft.canvas(4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT); + // Coordinates + constexpr uint16_t coords_width = TFT_WIDTH - 8; + tft.canvas((TFT_WIDTH - coords_width) / 2, y, coords_width, FONT_LINE_HEIGHT); tft.set_background(COLOR_BACKGROUND); - tft.add_rectangle(0, 0, TFT_WIDTH - 8, FONT_LINE_HEIGHT, COLOR_AXIS_HOMED); + tft.add_rectangle(0, 0, coords_width, FONT_LINE_HEIGHT, COLOR_AXIS_HOMED); if (TERN0(LCD_SHOW_E_TOTAL, printingIsActive())) { #if ENABLED(LCD_SHOW_E_TOTAL) - tft.add_text( 16, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "E"); + tft.add_text(16, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, "E"); const uint8_t escale = e_move_accumulator >= 100000.0f ? 10 : 1; // After 100m switch to cm tft_string.set(ftostr4sign(e_move_accumulator / escale)); tft_string.add(escale == 10 ? 'c' : 'm'); @@ -270,88 +273,183 @@ void MarlinUI::draw_status_screen() { #endif } else { - tft.add_text( 16, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "X"); - const bool nhx = axis_should_home(X_AXIS); - tft_string.set(blink && nhx ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); - tft.add_text(102 - tft_string.width(), tft_string.vcenter(FONT_LINE_HEIGHT), nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + // Coords in mask "X____Y____Z____" + #if HAS_X_AXIS + tft_string.set("X"); + tft.add_text(coords_width / 30 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, tft_string); - tft.add_text(192, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "Y"); - const bool nhy = axis_should_home(Y_AXIS); - tft_string.set(blink && nhy ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); - tft.add_text(280 - tft_string.width(), tft_string.vcenter(FONT_LINE_HEIGHT), nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); - } - tft.add_text(330, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED , "Z"); - uint16_t offset = 32; - const bool nhz = axis_should_home(Z_AXIS); - if (blink && nhz) - tft_string.set('?'); - else { - const float z = LOGICAL_Z_POSITION(current_position.z); - tft_string.set(ftostr52sp((int16_t)z)); - tft_string.rtrim(); - offset += tft_string.width(); - - tft_string.set(ftostr52sp(z)); - offset -= tft_string.width(); - } - tft.add_text(455 - tft_string.width() - offset, tft_string.vcenter(FONT_LINE_HEIGHT), nhz ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT)); - - y += TERN(HAS_UI_480x272, 34, 48); - // feed rate - tft.canvas(96, y, 128, 32); - tft.set_background(COLOR_BACKGROUND); - uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; - tft.add_image(0, 0, imgFeedRate, color); - tft_string.set(i16tostr3rj(feedrate_percentage)); - tft_string.add('%'); - tft.add_text(36, tft_string.vcenter(30), color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, 96, y, 128, 32)); - - // flow rate - tft.canvas(284, y, 128, 32); - tft.set_background(COLOR_BACKGROUND); - color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; - tft.add_image(0, 0, imgFlowRate, color); - tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); - tft_string.add('%'); - tft.add_text(36, tft_string.vcenter(30), color , tft_string); - TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, 284, y, 128, 32, active_extruder)); - - #if ENABLED(TOUCH_SCREEN) - add_control(404, y, menu_main, imgSettings); - #if HAS_MEDIA - const bool cm = card.isMounted(), pa = printingIsActive(); - if (cm && pa) - add_control(12, y, STOP, imgCancel, true, COLOR_CONTROL_CANCEL); - else - add_control(12, y, menu_media, imgSD, cm && !pa, COLOR_CONTROL_ENABLED, COLOR_CONTROL_DISABLED); + const bool nhx = axis_should_home(X_AXIS); + tft_string.set(blink && nhx ? "?" : ftostr4sign(LOGICAL_X_POSITION(current_position.x))); + tft_string.ltrim(); + tft.add_text(coords_width / 5 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), nhx ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); #endif + + #if HAS_Y_AXIS + tft_string.set("Y"); + tft.add_text(11 * coords_width / 30 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, tft_string); + + const bool nhy = axis_should_home(Y_AXIS); + tft_string.set(blink && nhy ? "?" : ftostr4sign(LOGICAL_Y_POSITION(current_position.y))); + tft_string.ltrim(); + tft.add_text(8 * coords_width / 15 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), nhy ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); + #endif + } + + #if HAS_Z_AXIS + tft_string.set("Z"); + tft.add_text(7 * coords_width / 10 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), COLOR_AXIS_HOMED, tft_string); + + const bool nhz = axis_should_home(Z_AXIS); + tft_string.set(blink && nhz ? "?" : ftostr52sp(LOGICAL_Z_POSITION(current_position.z))); + tft_string.ltrim(); + tft_string.rtrim(); + tft.add_text(13 * coords_width / 15 - tft_string.width() / 2, tft_string.vcenter(FONT_LINE_HEIGHT), nhz ? COLOR_AXIS_NOT_HOMED : COLOR_AXIS_HOMED, tft_string); #endif - y += TERN(HAS_UI_480x272, 39, 44); - // print duration - char buffer[14]; - duration_t elapsed = print_job_timer.duration(); - elapsed.toDigital(buffer); + TERN_(TOUCH_SCREEN, touch.add_control(MOVE_AXIS, 4, y, TFT_WIDTH - 8, FONT_LINE_HEIGHT)); - tft.canvas((TFT_WIDTH - 128) / 2, y, 128, 29); + y += STATUS_MARGIN_SIZE + 34; + + // Feed rate (preparing) + tft_string.set(i16tostr3rj(feedrate_percentage)); + tft_string.add("%"); + uint16_t component_width = 36 + tft_string.width(); // 32px icon size + 4px margin before text + uint16_t color = feedrate_percentage == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + uint16_t x = FEEDRATE_X(component_width); + + // Feed rate (drawing) + tft.canvas(x, y, component_width, 32); tft.set_background(COLOR_BACKGROUND); - tft_string.set(buffer); - tft.add_text(tft_string.center(128), tft_string.vcenter(29), COLOR_PRINT_TIME, tft_string); + tft.add_image(0, 0, imgFeedRate, color); + tft.add_text(36, tft_string.vcenter(30), color, tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FEEDRATE, x, y, component_width, 32)); - y += TERN(HAS_UI_480x272, 29, 36); - // progress bar - const uint8_t progress = ui.get_progress_percent(); + #if HAS_EXTRUDERS + // Flow rate (preparing) + tft_string.set(i16tostr3rj(planner.flow_percentage[active_extruder])); + tft_string.add('%'); + component_width = 36 + tft_string.width(); + color = planner.flow_percentage[0] == 100 ? COLOR_RATE_100 : COLOR_RATE_ALTERED; + x = FLOWRATE_X(component_width); + + // Flow rate (drawing) + tft.canvas(x, y, component_width, 32); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgFlowRate, color); + tft.add_text(36, tft_string.vcenter(30), color, tft_string); + TERN_(TOUCH_SCREEN, touch.add_control(FLOWRATE, x, y, component_width, 32, active_extruder)); + #endif + + y += TERN(HAS_UI_480x272, 36, 44); + + const progress_t progress = TERN(HAS_PRINT_PROGRESS_PERMYRIAD, get_progress_permyriad, get_progress_percent)(); + #if ENABLED(SHOW_ELAPSED_TIME) && DISABLED(SHOW_REMAINING_TIME) + // Print duration so far (time elapsed) - centered + char elapsed_str[22]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toString(elapsed_str); + + // Same width constraints as feedrate/flowrate controls + constexpr uint16_t time_str_width = 288, image_width = 36; + + tft.canvas((TFT_WIDTH - time_str_width) / 2, y, time_str_width, 32); + tft.set_background(COLOR_BACKGROUND); + tft_string.set(elapsed_str); + uint16_t text_pos_x = tft_string.center(time_str_width - image_width); + tft.add_image(text_pos_x, 0, imgTimeElapsed, COLOR_PRINT_TIME); + tft.add_text(text_pos_x + image_width, tft_string.vcenter(29), COLOR_PRINT_TIME, tft_string); + + #elif DISABLED(SHOW_ELAPSED_TIME) && ENABLED(SHOW_REMAINING_TIME) + // Print time remaining estimation - centered + char estimate_str[22]; + duration_t elapsed = print_job_timer.duration(); + + // Get the estimate, first from M73 + uint32_t estimate_remaining = (0 + #if ALL(SET_PROGRESS_MANUALLY, SET_REMAINING_TIME) + + get_remaining_time() + #endif + ); + // If no M73 estimate is available but we have progress data, calculate time remaining assuming time elapsed is linear with progress + if (!estimate_remaining && progress > 0) + estimate_remaining = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + + // Generate estimate string + if (!estimate_remaining) + tft_string.set("-"); + else { + duration_t estimation = estimate_remaining; + estimation.toString(estimate_str); + tft_string.set(estimate_str); + } + + // Same width constraints as feedrate/flowrate controls + constexpr uint16_t time_str_width = 288, image_width = 36; + + tft.canvas((TFT_WIDTH - time_str_width) / 2, y, time_str_width, 32); + tft.set_background(COLOR_BACKGROUND); + color = printingIsActive() ? COLOR_PRINT_TIME : COLOR_INACTIVE; + uint16_t text_pos_x = tft_string.center(time_str_width - image_width); + tft.add_image(text_pos_x, 0, imgTimeRemaining, color); + tft.add_text(text_pos_x + image_width, tft_string.vcenter(29), color, tft_string); + + #elif ALL(SHOW_REMAINING_TIME, SHOW_ELAPSED_TIME) + // Print duration so far (time elapsed) - aligned under feed rate + char elapsed_str[18]; + duration_t elapsed = print_job_timer.duration(); + elapsed.toCompactString(elapsed_str); + + tft.canvas(96, y, 144, 32); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgTimeElapsed, COLOR_PRINT_TIME); + tft_string.set(elapsed_str); + tft.add_text(36, tft_string.vcenter(29), COLOR_PRINT_TIME, tft_string); + + // Print time remaining estimation - aligned under flow rate + char estimate_str[18]; + + // Get the estimate, first from M73 + uint32_t estimate_remaining = (0 + #if ALL(SET_PROGRESS_MANUALLY, SET_REMAINING_TIME) + + get_remaining_time() + #endif + ); + // If no M73 estimate is available but we have progress data, calculate time remaining assuming time elapsed is linear with progress + if (!estimate_remaining && progress > 0) + estimate_remaining = elapsed.value * (100 * (PROGRESS_SCALE) - progress) / progress; + + // Generate estimate string + if (!estimate_remaining) + tft_string.set("-"); + else { + duration_t estimation = estimate_remaining; + estimation.toCompactString(estimate_str); + tft_string.set(estimate_str); + } + + // Push out the estimate to the screen + tft.canvas(256, y, 144, 32); + tft.set_background(COLOR_BACKGROUND); + color = printingIsActive() ? COLOR_PRINT_TIME : COLOR_INACTIVE; + tft.add_image(0, 0, imgTimeRemaining, color); + tft.add_text(36, tft_string.vcenter(29), color, tft_string); + #endif + + y += TERN(HAS_UI_480x272, 36, 44); + + // Progress bar + // TODO: print percentage text for SHOW_PROGRESS_PERCENT tft.canvas(4, y, TFT_WIDTH - 8, 9); tft.set_background(COLOR_PROGRESS_BG); tft.add_rectangle(0, 0, TFT_WIDTH - 8, 9, COLOR_PROGRESS_FRAME); if (progress) - tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress) / 100, 7, COLOR_PROGRESS_BAR); + tft.add_bar(1, 1, ((TFT_WIDTH - 10) * progress / (PROGRESS_SCALE)) / 100, 7, COLOR_PROGRESS_BAR); - y += 15; - // status message - tft.canvas(0, y, TFT_WIDTH, FONT_LINE_HEIGHT); + y += 12; + // Status message + // Canvas height should be 40px on 480x320 and 28 on 480x272 + const uint16_t status_height = TFT_HEIGHT - y; + tft.canvas(0, y, TFT_WIDTH, status_height); tft.set_background(COLOR_BACKGROUND); tft_string.set(status_message); tft_string.trim(); @@ -397,7 +495,7 @@ void MenuEditItemBase::draw_edit_screen(FSTR_P const fstr, const char * const va if (ui.can_show_slider()) { - #define SLIDER_LENGTH 336 + #define SLIDER_LENGTH TFT_WIDTH * 0.7 #define SLIDER_Y_POSITION 186 tft.canvas((TFT_WIDTH - SLIDER_LENGTH) / 2, SLIDER_Y_POSITION, SLIDER_LENGTH, 16); @@ -420,9 +518,9 @@ void MenuEditItemBase::draw_edit_screen(FSTR_P const fstr, const char * const va void TFT::draw_edit_screen_buttons() { #if ENABLED(TOUCH_SCREEN) - add_control(64, TFT_HEIGHT - 64, DECREASE, imgDecrease); - add_control(352, TFT_HEIGHT - 64, INCREASE, imgIncrease); - add_control(208, TFT_HEIGHT - 64, CLICK, imgConfirm); + add_control((TFT_WIDTH - 3 * 64) / 6, TFT_HEIGHT - 64, DECREASE, imgDecrease); + add_control((TFT_WIDTH - 64) / 2, TFT_HEIGHT - 64, INCREASE, imgIncrease); + add_control((TFT_WIDTH * 5 - 3 * 64) / 6, TFT_HEIGHT - 64, CLICK, imgConfirm); #endif } @@ -451,8 +549,8 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); } #if ENABLED(TOUCH_SCREEN) - if (no) add_control( 88, TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); - if (yes) add_control(328, TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); + if (no) add_control(TFT_WIDTH / 4 - 32, TFT_HEIGHT - 64, CANCEL, imgCancel, true, yesno ? HALF(COLOR_CONTROL_CANCEL) : COLOR_CONTROL_CANCEL); + if (yes) add_control(TFT_WIDTH * 3 / 4 - 32, TFT_HEIGHT - 64, CONFIRM, imgConfirm, true, yesno ? COLOR_CONTROL_CONFIRM : HALF(COLOR_CONTROL_CONFIRM)); #endif } @@ -462,7 +560,7 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con #if ENABLED(TOUCH_SCREEN) touch.clear(); draw_menu_navigation = false; - touch.add_control(RESUME_CONTINUE , 0, 0, TFT_WIDTH, TFT_HEIGHT); + touch.add_control(RESUME_CONTINUE, 0, 0, TFT_WIDTH, TFT_HEIGHT); #endif menu_line(row); @@ -565,26 +663,37 @@ void MenuItem_confirm::draw_select_screen(FSTR_P const yes, FSTR_P const no, con #define Z_SELECTION_Z 1 #define Z_SELECTION_Z_PROBE -1 -struct MotionAxisState { - xy_int_t xValuePos, yValuePos, zValuePos, eValuePos, stepValuePos, zTypePos, eNamePos; +struct { + #if HAS_X_AXIS + xy_int_t xValuePos; + #endif + #if HAS_Y_AXIS + xy_int_t yValuePos; + #endif + #if HAS_Z_AXIS + xy_int_t zValuePos, zTypePos; + int z_selection = Z_SELECTION_Z; + #endif + #if HAS_EXTRUDERS + xy_int_t eValuePos, eNamePos; + uint8_t e_selection = 0; + #endif + xy_int_t stepValuePos; float currentStepSize = 10.0; - int z_selection = Z_SELECTION_Z; - uint8_t e_selection = 0; bool blocked = false; char message[32]; -}; - -MotionAxisState motionAxisState; +} motionAxisState; #define BTN_WIDTH 64 #define BTN_HEIGHT 52 #define X_MARGIN 20 #define Y_MARGIN 15 +#define Y_OFFSET TERN(HAS_UI_480x272, 28, 34) static void quick_feedback() { #if HAS_CHIRP ui.chirp(); // Buzz and wait. Is the delay needed for buttons to settle? - #if BOTH(HAS_MARLINUI_MENU, HAS_BEEPER) + #if ALL(HAS_MARLINUI_MENU, HAS_BEEPER) for (int8_t i = 5; i--;) { buzzer.tick(); delay(2); } #elif HAS_MARLINUI_MENU delay(10); @@ -595,36 +704,48 @@ static void quick_feedback() { #define CUR_STEP_VALUE_WIDTH 104 static void drawCurStepValue() { tft_string.set(ftostr52sp(motionAxisState.currentStepSize)); + tft_string.trim(); tft_string.add(F("mm")); tft.canvas(motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT); tft.set_background(COLOR_BACKGROUND); - tft.add_text(tft_string.center(CUR_STEP_VALUE_WIDTH), 0, COLOR_AXIS_HOMED, tft_string); + tft.add_text(0, 0, COLOR_AXIS_HOMED, tft_string); } -static void drawCurZSelection() { - tft_string.set('Z'); - tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), 34); - tft.set_background(COLOR_BACKGROUND); - tft.add_text(0, 0, Z_BTN_COLOR, tft_string); - tft.queue.sync(); - tft_string.set(F("Offset")); - tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + 34, tft_string.width(), 34); - tft.set_background(COLOR_BACKGROUND); - if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { +#if HAS_Z_AXIS + static void drawCurZSelection() { + tft_string.set('Z'); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, tft_string.width(), FONT_LINE_HEIGHT); + tft.set_background(COLOR_BACKGROUND); tft.add_text(0, 0, Z_BTN_COLOR, tft_string); - } -} -static void drawCurESelection() { - tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); - tft.set_background(COLOR_BACKGROUND); - tft_string.set('E'); - tft.add_text(0, 0, E_BTN_COLOR , tft_string); - tft.add_text(tft_string.width(), 0, E_BTN_COLOR, ui8tostr3rj(motionAxisState.e_selection)); -} + tft.queue.sync(); + + tft_string.set(F("Offset")); + tft.canvas(motionAxisState.zTypePos.x, motionAxisState.zTypePos.y + Y_OFFSET, tft_string.width(), Y_OFFSET TERN_(HAS_UI_480x272, - 10)); + tft.set_background(COLOR_BACKGROUND); + #if HAS_BED_PROBE + if (motionAxisState.z_selection == Z_SELECTION_Z_PROBE) + tft.add_text(0, 0, Z_BTN_COLOR, tft_string); + #endif + } +#endif + +#if HAS_EXTRUDERS + static void drawCurESelection() { + tft.canvas(motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft_string.set('E'); + tft_string.add(utostr3(motionAxisState.e_selection)); + tft.add_text(tft_string.center(BTN_WIDTH), 0, E_BTN_COLOR, tft_string); + } +#endif static void drawMessage(PGM_P const msg) { - tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - 34, TFT_HEIGHT / 2, 34); + #if ENABLED(TFT_COLOR_UI_PORTRAIT) + tft.canvas(X_MARGIN, TFT_HEIGHT - 2 * MOVE_AXIS_MARGIN_SIZE - BTN_HEIGHT - FONT_LINE_HEIGHT, TFT_WIDTH - X_MARGIN * 2, FONT_LINE_HEIGHT); + #else + tft.canvas(X_MARGIN, TFT_HEIGHT - Y_MARGIN - Y_OFFSET, TFT_HEIGHT / 2, Y_OFFSET); + #endif tft.set_background(COLOR_BACKGROUND); tft.add_text(0, 0, COLOR_YELLOW, msg); } @@ -639,68 +760,82 @@ static void drawAxisValue(const AxisEnum axis) { xy_int_t pos; uint16_t color; switch (axis) { - case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; - case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; - case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; - case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + #if HAS_X_AXIS + case X_AXIS: pos = motionAxisState.xValuePos; color = X_BTN_COLOR; break; + #endif + #if HAS_Y_AXIS + case Y_AXIS: pos = motionAxisState.yValuePos; color = Y_BTN_COLOR; break; + #endif + #if HAS_Z_AXIS + case Z_AXIS: pos = motionAxisState.zValuePos; color = Z_BTN_COLOR; break; + #endif + #if HAS_EXTRUDERS + case E_AXIS: pos = motionAxisState.eValuePos; color = E_BTN_COLOR; break; + #endif default: return; } - tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, BTN_HEIGHT); + tft.canvas(pos.x, pos.y, BTN_WIDTH + X_MARGIN, BTN_HEIGHT TERN_(HAS_UI_480x272, / 2)); tft.set_background(COLOR_BACKGROUND); tft_string.set(ftostr52sp(value)); - tft.add_text(0, 0, color, tft_string); + tft_string.trim(); + tft.add_text(tft_string.center(BTN_WIDTH + X_MARGIN), 0, color, tft_string); } static void moveAxis(const AxisEnum axis, const int8_t direction) { quick_feedback(); - if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { - drawMessage(F("Too cold")); - return; - } + #if HAS_EXTRUDERS + if (axis == E_AXIS && thermalManager.tooColdToExtrude(motionAxisState.e_selection)) { + drawMessage(F("Too cold")); + return; + } + #endif const float diff = motionAxisState.currentStepSize * direction; - if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { - #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; - const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; - const float bsDiff = planner.mm_per_step[Z_AXIS] * babystep_increment, - new_probe_offset = probe.offset.z + bsDiff, - new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET - , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff - , new_probe_offset - ); - if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { - babystep.add_steps(Z_AXIS, babystep_increment); - if (do_probe) - probe.offset.z = new_offs; + #if HAS_BED_PROBE + + if (axis == Z_AXIS && motionAxisState.z_selection == Z_SELECTION_Z_PROBE) { + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + const int16_t babystep_increment = direction * BABYSTEP_SIZE_Z; + const bool do_probe = DISABLED(BABYSTEP_HOTEND_Z_OFFSET) || active_extruder == 0; + const float bsDiff = planner.mm_per_step[Z_AXIS] * babystep_increment, + new_probe_offset = probe.offset.z + bsDiff, + new_offs = TERN(BABYSTEP_HOTEND_Z_OFFSET + , do_probe ? new_probe_offset : hotend_offset[active_extruder].z - bsDiff + , new_probe_offset + ); + if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) { + babystep.add_steps(Z_AXIS, babystep_increment); + if (do_probe) + probe.offset.z = new_offs; + else + TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); + drawMessage(NUL_STR); // Clear the error + drawAxisValue(axis); + } else - TERN(BABYSTEP_HOTEND_Z_OFFSET, hotend_offset[active_extruder].z = new_offs, NOOP); - drawMessage(NUL_STR); // clear the error + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + + #else + // Only change probe.offset.z + probe.offset.z += diff; + if (direction < 0 && current_position.z < Z_PROBE_OFFSET_RANGE_MIN) { + current_position.z = Z_PROBE_OFFSET_RANGE_MIN; + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + } + else if (direction > 0 && current_position.z > Z_PROBE_OFFSET_RANGE_MAX) { + current_position.z = Z_PROBE_OFFSET_RANGE_MAX; + drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); + } + else + drawMessage(NUL_STR); // Clear the error + drawAxisValue(axis); - } - else { - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - } - #elif HAS_BED_PROBE - // only change probe.offset.z - probe.offset.z += diff; - if (direction < 0 && current_position[axis] < Z_PROBE_OFFSET_RANGE_MIN) { - current_position[axis] = Z_PROBE_OFFSET_RANGE_MIN; - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - } - else if (direction > 0 && current_position[axis] > Z_PROBE_OFFSET_RANGE_MAX) { - current_position[axis] = Z_PROBE_OFFSET_RANGE_MAX; - drawMessage(GET_TEXT_F(MSG_LCD_SOFT_ENDSTOPS)); - } - else { - drawMessage(NUL_STR); // clear the error - } - drawAxisValue(axis); - #endif - return; - } + #endif + } + + #endif // HAS_BED_PROBE if (!ui.manual_move.processing) { // Get motion limit from software endstops, if any @@ -710,7 +845,7 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) { // Delta limits XY based on the current offset from center // This assumes the center is 0,0 #if ENABLED(DELTA) - if (axis != Z_AXIS && axis != E_AXIS) { + if (axis != Z_AXIS && TERN1(HAS_EXTRUDERS, axis != E_AXIS)) { max = SQRT(sq(float(PRINTABLE_RADIUS)) - sq(current_position[Y_AXIS - axis])); // (Y_AXIS - axis) == the other axis min = -max; } @@ -731,35 +866,44 @@ static void moveAxis(const AxisEnum axis, const int8_t direction) { drawAxisValue(axis); } -static void e_plus() { moveAxis(E_AXIS, 1); } -static void e_minus() { moveAxis(E_AXIS, -1); } -static void x_minus() { moveAxis(X_AXIS, -1); } -static void x_plus() { moveAxis(X_AXIS, 1); } -static void y_plus() { moveAxis(Y_AXIS, 1); } -static void y_minus() { moveAxis(Y_AXIS, -1); } -static void z_plus() { moveAxis(Z_AXIS, 1); } -static void z_minus() { moveAxis(Z_AXIS, -1); } +#if HAS_EXTRUDERS + static void e_plus() { moveAxis(E_AXIS, 1); } + static void e_minus() { moveAxis(E_AXIS, -1); } +#endif +#if HAS_X_AXIS + static void x_minus() { moveAxis(X_AXIS, -1); } + static void x_plus() { moveAxis(X_AXIS, 1); } +#endif +#if HAS_Y_AXIS + static void y_plus() { moveAxis(Y_AXIS, 1); } + static void y_minus() { moveAxis(Y_AXIS, -1); } +#endif +#if HAS_Z_AXIS + static void z_plus() { moveAxis(Z_AXIS, 1); } + static void z_minus() { moveAxis(Z_AXIS, -1); } +#endif #if ENABLED(TOUCH_SCREEN) - static void e_select() { - if (++motionAxisState.e_selection >= EXTRUDERS) - motionAxisState.e_selection = 0; - - quick_feedback(); - drawCurESelection(); - drawAxisValue(E_AXIS); - } + #if HAS_EXTRUDERS + static void e_select() { + if (++motionAxisState.e_selection >= EXTRUDERS) + motionAxisState.e_selection = 0; + quick_feedback(); + drawCurESelection(); + drawAxisValue(E_AXIS); + } + #endif static void do_home() { quick_feedback(); drawMessage(GET_TEXT_F(MSG_LEVEL_BED_HOMING)); queue.inject_P(G28_STR); // Disable touch until home is done - TERN_(HAS_TFT_XPT2046, touch.disable()); - drawAxisValue(E_AXIS); - drawAxisValue(X_AXIS); - drawAxisValue(Y_AXIS); - drawAxisValue(Z_AXIS); + touch.disable(); + TERN_(HAS_EXTRUDERS, drawAxisValue(E_AXIS)); + TERN_(HAS_X_AXIS, drawAxisValue(X_AXIS)); + TERN_(HAS_Y_AXIS, drawAxisValue(Y_AXIS)); + TERN_(HAS_Z_AXIS, drawAxisValue(Z_AXIS)); } static void step_size() { @@ -768,9 +912,9 @@ static void z_minus() { moveAxis(Z_AXIS, -1); } quick_feedback(); drawCurStepValue(); } -#endif +#endif // TOUCH_SCREEN -#if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) +#if ALL(HAS_BED_PROBE, TOUCH_SCREEN) static void z_select() { motionAxisState.z_selection *= -1; quick_feedback(); @@ -784,9 +928,9 @@ static void disable_steppers() { queue.inject(F("M84")); } -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, - height = Images[imgBtn52Rounded].height; +static void drawBtn(const int x, const int y, const char *label, intptr_t data, const MarlinImage img, uint16_t bgColor, const bool enabled=true) { + const uint16_t width = images[imgBtn52Rounded].width, + height = images[imgBtn52Rounded].height; if (!enabled) bgColor = COLOR_CONTROL_DISABLED; @@ -800,18 +944,17 @@ static void drawBtn(int x, int y, const char *label, intptr_t data, MarlinImage tft_string.trim(); tft.add_text(tft_string.center(width), height / 2 - tft_string.font_height() / 2, bgColor, tft_string); } - else { + else tft.add_image(0, 0, img, bgColor, COLOR_BACKGROUND, COLOR_DARKGREY); - } - TERN_(HAS_TFT_XPT2046, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); + TERN_(TOUCH_SCREEN, if (enabled) touch.add_control(BUTTON, x, y, width, height, data)); } void MarlinUI::move_axis_screen() { // Reset defer_status_screen(true); motionAxisState.blocked = false; - TERN_(HAS_TFT_XPT2046, touch.enable()); + TERN_(TOUCH_SCREEN, touch.enable()); ui.clear_lcd(); @@ -820,97 +963,234 @@ void MarlinUI::move_axis_screen() { const bool busy = printingIsActive(); // Babysteps during printing? Select babystep for Z probe offset - if (busy && ENABLED(BABYSTEP_ZPROBE_OFFSET)) - motionAxisState.z_selection = Z_SELECTION_Z_PROBE; - - // ROW 1 -> E- Y- CurY Z+ - int x = X_MARGIN, y = Y_MARGIN, spacing = 0; - - drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy); - - spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; - x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy); - - // Cur Y - x += BTN_WIDTH; - motionAxisState.yValuePos.x = x + 2; - motionAxisState.yValuePos.y = y; - drawAxisValue(Y_AXIS); - - x += spacing; - drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step - - // ROW 2 -> "Ex" X- HOME X+ "Z" - y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; - x = X_MARGIN; - spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; - - motionAxisState.eNamePos.x = x; - motionAxisState.eNamePos.y = y; - drawCurESelection(); - TERN_(HAS_TFT_XPT2046, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); - - x += BTN_WIDTH + spacing; - drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); - - x += BTN_WIDTH + spacing; //imgHome is 64x64 - TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH / 2 - Images[imgHome].width / 2, y - (Images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); - - x += BTN_WIDTH + spacing; - uint16_t xplus_x = x; - drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); - - x += BTN_WIDTH + spacing; - motionAxisState.zTypePos.x = x; - motionAxisState.zTypePos.y = y; - drawCurZSelection(); - #if BOTH(HAS_BED_PROBE, TOUCH_SCREEN) - if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, 34 * 2, (intptr_t)z_select); + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + if (busy) motionAxisState.z_selection = Z_SELECTION_Z_PROBE; #endif - // ROW 3 -> E- CurX Y- Z- - y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; - x = X_MARGIN; - spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + #if ENABLED(TFT_COLOR_UI_PORTRAIT) - drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); + int y = MOVE_AXIS_MARGIN_SIZE; - // Cur E - motionAxisState.eValuePos.x = x; - motionAxisState.eValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(E_AXIS); + /************************************************************************** + * 1st: | Button "E+" | Button "Y+" | Button "Z+" | + *************************************************************************/ - // Cur X - motionAxisState.xValuePos.x = BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; //X- pos - motionAxisState.xValuePos.y = y - 10; - drawAxisValue(X_AXIS); + TERN_(HAS_EXTRUDERS, drawBtn(TFT_WIDTH / 6 - BTN_WIDTH / 2, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy)); + TERN_(HAS_Y_AXIS, drawBtn(TFT_WIDTH / 2 - BTN_WIDTH / 2, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy)); + TERN_(HAS_Z_AXIS, drawBtn(TFT_WIDTH * 5 / 6 - BTN_WIDTH / 2, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET))); - x += BTN_WIDTH + spacing; - drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy); + y += BTN_HEIGHT + 4; - x += BTN_WIDTH + spacing; - drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + /************************************************************************** + * 2nd: | Label "Ex" (E0, E1, etc.) | Y value | Label "Z" | + *************************************************************************/ - // Cur Z - motionAxisState.zValuePos.x = x; - motionAxisState.zValuePos.y = y + BTN_HEIGHT + 2; - drawAxisValue(Z_AXIS); + // Label "Ex" (E0, E1, etc.) + #if HAS_EXTRUDERS + motionAxisState.eNamePos.set(TFT_WIDTH / 6 - BTN_WIDTH / 2, y); + drawCurESelection(); + #if ENABLED(TOUCH_SCREEN) + if (!busy) touch.add_control(BUTTON, motionAxisState.eNamePos.x, motionAxisState.eNamePos.y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select); + #endif + #endif - // ROW 4 -> step_size disable steppers back - y = TFT_HEIGHT - Y_MARGIN - 32; // - x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2; - motionAxisState.stepValuePos.x = x; - motionAxisState.stepValuePos.y = y; - if (!busy) { - drawCurStepValue(); - TERN_(HAS_TFT_XPT2046, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); - } + // Y value + #if HAS_Y_AXIS + motionAxisState.yValuePos.set(TFT_WIDTH / 2 - (BTN_WIDTH + X_MARGIN) / 2, y); + drawAxisValue(Y_AXIS); + #endif - // aligned with x+ - drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); + // Label "Z" + #ifdef HAS_Z_AXIS + motionAxisState.zTypePos.set(TFT_WIDTH * 5 / 6 - BTN_WIDTH / 2, y); + drawCurZSelection(); + #if ALL(HAS_BED_PROBE, TOUCH_SCREEN) + if (!busy) touch.add_control(BUTTON, motionAxisState.zTypePos.x, motionAxisState.zTypePos.y, BTN_WIDTH, FONT_LINE_HEIGHT * 2, (intptr_t)z_select); + #endif + #endif - TERN_(HAS_TFT_XPT2046, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); + y += BTN_HEIGHT + MOVE_AXIS_MARGIN_SIZE; + + /************************************************************************** + * 3rd: | Button "X-" | Button "Homing" | Button "X+" | + *************************************************************************/ + + #if HAS_X_AXIS + drawBtn(TFT_WIDTH / 6 - BTN_WIDTH / 2, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy); + TERN_(TOUCH_SCREEN, add_control(TFT_WIDTH / 2 - images[imgHome].width / 2, y - (images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy)); + drawBtn(TFT_WIDTH * 5 / 6 - BTN_WIDTH / 2, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy); + #endif + + y += BTN_HEIGHT + 4; + + /************************************************************************** + * 4th: | X value | + *************************************************************************/ + + #ifdef HAS_X_AXIS + motionAxisState.xValuePos.set(TFT_WIDTH / 6 - (BTN_WIDTH + X_MARGIN) / 2, y); + drawAxisValue(X_AXIS); + #endif + + y += BTN_HEIGHT + MOVE_AXIS_MARGIN_SIZE; + + /************************************************************************** + * 5th: | Button "E-" | Button "Y-" | Button "Z-" + *************************************************************************/ + + TERN_(HAS_EXTRUDERS, drawBtn(TFT_WIDTH / 6 - BTN_WIDTH / 2, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy)); + TERN_(HAS_Y_AXIS, drawBtn(TFT_WIDTH / 2 - BTN_WIDTH / 2, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy)); + TERN_(HAS_Z_AXIS, drawBtn(TFT_WIDTH * 5 / 6 - BTN_WIDTH / 2, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET))); + + y += BTN_HEIGHT + 4; + + /************************************************************************** + * 6th: | Current Ex value | Z value | + *************************************************************************/ + + // Current Ex value + #ifdef HAS_EXTRUDERS + motionAxisState.eValuePos.set(TFT_WIDTH / 6 - (BTN_WIDTH + X_MARGIN) / 2, y); + drawAxisValue(E_AXIS); + #endif + + #ifdef HAS_Z_AXIS + motionAxisState.zValuePos.set(TFT_WIDTH * 5 / 6 - (BTN_WIDTH + X_MARGIN) / 2, y); + drawAxisValue(Z_AXIS); + #endif + + y += BTN_HEIGHT + MOVE_AXIS_MARGIN_SIZE; + + /************************************************************************** + * 7th: | Message - drawMessage(...) function | + *************************************************************************/ + + y += FONT_LINE_HEIGHT + MOVE_AXIS_MARGIN_SIZE; + + /************************************************************************** + * 8th: | Step size | Button "Disable steppers" | Button "Back" | + *************************************************************************/ + + // Step size + motionAxisState.stepValuePos.set(X_MARGIN, y + 12); + if (!busy) { + drawCurStepValue(); + TERN_(TOUCH_SCREEN, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y + 12, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); + } + + // Button "Disable steppers" + drawBtn(TFT_WIDTH / 2, y, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); + + // Button "Back" + TERN_(TOUCH_SCREEN, add_control(TFT_WIDTH * 5 / 6 - images[imgBack].width / 2, y + 12, BACK, imgBack)); + + #else // !TFT_COLOR_UI_PORTRAIT + + // ROW 1 -> E- Y- CurY Z+ + int x = X_MARGIN, y = Y_MARGIN, spacing = 0; + + TERN_(HAS_EXTRUDERS, drawBtn(x, y, "E+", (intptr_t)e_plus, imgUp, E_BTN_COLOR, !busy)); + + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + x += BTN_WIDTH + spacing; + + TERN_(HAS_Y_AXIS, drawBtn(x, y, "Y+", (intptr_t)y_plus, imgUp, Y_BTN_COLOR, !busy)); + + x += BTN_WIDTH; + + // Cur Y + #if HAS_Y_AXIS + motionAxisState.yValuePos.set(x + 2, y); + drawAxisValue(Y_AXIS); + #endif + + x += spacing; + #if HAS_Z_AXIS + drawBtn(x, y, "Z+", (intptr_t)z_plus, imgUp, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); // Only enabled when not busy or have baby step + #endif + + // ROW 2 -> "Ex" X- HOME X+ "Z" + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4; + + #if HAS_EXTRUDERS + motionAxisState.eNamePos.set(x, y); + drawCurESelection(); + TERN_(TOUCH_SCREEN, if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, BTN_HEIGHT, (intptr_t)e_select)); + #endif + + x += BTN_WIDTH + spacing; + + TERN_(HAS_X_AXIS, drawBtn(x, y, "X-", (intptr_t)x_minus, imgLeft, X_BTN_COLOR, !busy)); + + x += BTN_WIDTH + spacing; //imgHome is 64x64 + + #if ALL(HAS_X_AXIS, TOUCH_SCREEN) + add_control(TFT_WIDTH / 2 - images[imgHome].width / 2, y - (images[imgHome].width - BTN_HEIGHT) / 2, BUTTON, (intptr_t)do_home, imgHome, !busy); + #endif + + x += BTN_WIDTH + spacing; + const uint16_t xplus_x = x; + + TERN_(HAS_X_AXIS, drawBtn(x, y, "X+", (intptr_t)x_plus, imgRight, X_BTN_COLOR, !busy)); + + x += BTN_WIDTH + spacing; + + #if HAS_Z_AXIS + motionAxisState.zTypePos.set(x, y); + drawCurZSelection(); + #if ALL(HAS_BED_PROBE, TOUCH_SCREEN) + if (!busy) touch.add_control(BUTTON, x, y, BTN_WIDTH, Y_OFFSET * 2, (intptr_t)z_select); + #endif + #endif + + // ROW 3 -> E- CurX Y- Z- + y += BTN_HEIGHT + (TFT_HEIGHT - Y_MARGIN * 2 - 4 * BTN_HEIGHT) / 3; + x = X_MARGIN; + spacing = (TFT_WIDTH - X_MARGIN * 2 - 3 * BTN_WIDTH) / 2; + + #if HAS_EXTRUDERS + drawBtn(x, y, "E-", (intptr_t)e_minus, imgDown, E_BTN_COLOR, !busy); + motionAxisState.eValuePos.set(x, y + BTN_HEIGHT + 2); + drawAxisValue(E_AXIS); + #endif + + // Cur X + #if HAS_X_AXIS + motionAxisState.xValuePos.set(BTN_WIDTH + (TFT_WIDTH - X_MARGIN * 2 - 5 * BTN_WIDTH) / 4, y - 10); + TERN_(HAS_X_AXIS, drawAxisValue(X_AXIS)); + #endif + + x += BTN_WIDTH + spacing; + + // Cur Y + TERN_(HAS_Y_AXIS, drawBtn(x, y, "Y-", (intptr_t)y_minus, imgDown, Y_BTN_COLOR, !busy)); + + x += BTN_WIDTH + spacing; + + // Cur Z + #if HAS_Z_AXIS + drawBtn(x, y, "Z-", (intptr_t)z_minus, imgDown, Z_BTN_COLOR, !busy || ENABLED(BABYSTEP_ZPROBE_OFFSET)); //only enabled when not busy or have baby step + motionAxisState.zValuePos.set(x, y + BTN_HEIGHT + 2); + drawAxisValue(Z_AXIS); + #endif + + // ROW 4 -> step_size disable steppers back + y = TFT_HEIGHT - Y_MARGIN - TERN(HAS_UI_480x272, BTN_WIDTH / 2, 32); + x = TFT_WIDTH / 2 - CUR_STEP_VALUE_WIDTH / 2; + motionAxisState.stepValuePos.set(x, y); + if (!busy) { + drawCurStepValue(); + TERN_(TOUCH_SCREEN, touch.add_control(BUTTON, motionAxisState.stepValuePos.x, motionAxisState.stepValuePos.y, CUR_STEP_VALUE_WIDTH, BTN_HEIGHT, (intptr_t)step_size)); + } + + // Aligned with x+ + drawBtn(xplus_x, TFT_HEIGHT - Y_MARGIN - BTN_HEIGHT, "off", (intptr_t)disable_steppers, imgCancel, COLOR_WHITE, !busy); + + TERN_(TOUCH_SCREEN, add_control(TFT_WIDTH - X_MARGIN - BTN_WIDTH, y, BACK, imgBack)); + + #endif // !TFT_COLOR_UI_PORTRAIT } -#endif // HAS_UI_480x320 +#endif // HAS_UI_480x320 || HAS_UI_480x272 diff --git a/Marlin/src/lcd/tft/ui_480x320.h b/Marlin/src/lcd/tft/ui_480x320.h index d63ae02c09..d3036d0981 100644 --- a/Marlin/src/lcd/tft/ui_480x320.h +++ b/Marlin/src/lcd/tft/ui_480x320.h @@ -63,4 +63,73 @@ #define MENU_LINE_HEIGHT (MENU_ITEM_HEIGHT + 2) +/** + * Status screen - portrait layout: + * + * | FAN E0 BED .. | - 120px + * | Coordinates | - FONT_LINE_HEIGHT + * | Feedrate Flowrate | - 32px + * | SD Settings | - 64px if ENABLED(TOUCHSCREEN), else 0px + * | Print duration time | - 29px + * | Progress bar | - 7px + * | Status message | - FONT_LINE_HEIGHT + * + * Summary with touchscreen: + * - Total height: 252px + 2 * FONT_LINE_HEIGHT (320px if FONT_LINE_HEIGHT is 34px) + * - Rows count: 7 + * - Margins count: 8 + * + * Summary without touchscreen: + * - Total height: 188px + 2 * FONT_LINE_HEIGHT (256px if FONT_LINE_HEIGHT is 34px) + * - Rows count: 6 + * - Margins count: 7 + * + * Status screen - landscape layout: + * + * | FAN E0 BED ... | - 120px + * | Coordinates | - FONT_LINE_HEIGHT + * | SD Flowrate Feedrate Settings | - 44px for TOUCHSCREEN, else 32px + * | Print duration time | - 29px + * | Progress bar | - 7px + * | Status message | - FONT_LINE_HEIGHT + * + * Summary with touchscreen: + * - Total height: 200px (268px if FONT_LINE_HEIGHT is 34px) + * - Rows count: 6 + * - Margins count: 7 + * + * Summary without touchscreen: + * - Total height: 188px + 2 * FONT_LINE_HEIGHT (256px if FONT_LINE_HEIGHT is 34px) + * - Rows count: 6 + * - Margins count: 7 + */ +#if ENABLED(TFT_COLOR_UI_PORTRAIT) + #if ENABLED(TOUCH_SCREEN) + #define STATUS_TOTAL_ROWS_HEIGHT (2 * FONT_LINE_HEIGHT + 120 + 32 + 64 + 29 + 7) + #define STATUS_MARGINS_REGIONS 8 + + #define MOVE_AXIS_TOTAL_ROWS_HEIGHT (7 * BTN_HEIGHT + FONT_LINE_HEIGHT + 12) + #define MOVE_AXIS_MARGIN_REGIONS 6 + #define MOVE_AXIS_MARGIN_SIZE ((TFT_HEIGHT - MOVE_AXIS_TOTAL_ROWS_HEIGHT) / MOVE_AXIS_MARGIN_REGIONS) + #else + #define STATUS_TOTAL_ROWS_HEIGHT (2 * FONT_LINE_HEIGHT + 120 + 32 + 29 + 7) + #define STATUS_MARGINS_REGIONS 7 + #endif + + #define FEEDRATE_X(W) ((TFT_WIDTH - 2 * (W)) / 4) + #define FLOWRATE_X(W) ((3 * TFT_WIDTH - 2 * (W)) / 4) + #define SETTINGS_X (3 * TFT_WIDTH / 4 - 32) + #define SDCARD_X (TFT_WIDTH / 4 - 32) +#else + #define STATUS_TOTAL_ROWS_HEIGHT (2 * FONT_LINE_HEIGHT + 120 + TERN(TOUCH_SCREEN, 44, 32) + 29 + 7) + #define STATUS_MARGINS_REGIONS 7 + + #define FEEDRATE_X(W) (3 * TFT_WIDTH / 8 - (W) / 2) + #define FLOWRATE_X(W) (5 * TFT_WIDTH / 8 - (W) / 2) + #define SETTINGS_X (TFT_WIDTH / 8 - 32) + #define SDCARD_X (7 * TFT_WIDTH / 8 - 32) +#endif + +#define STATUS_MARGIN_SIZE ((TFT_HEIGHT - STATUS_TOTAL_ROWS_HEIGHT) / STATUS_MARGINS_REGIONS) + #include "tft_font.h" diff --git a/Marlin/src/lcd/tft_io/ili9488.h b/Marlin/src/lcd/tft_io/ili9488.h index fc2add662d..f28d411bbd 100644 --- a/Marlin/src/lcd/tft_io/ili9488.h +++ b/Marlin/src/lcd/tft_io/ili9488.h @@ -146,16 +146,6 @@ #define ILI9488_ADJCTL6 0xFC // Adjust Control 6 #define ILI9488_ADJCTL7 0xFF // Adjust Control 7 -#if 0 - // https://forum.mikroe.com/viewtopic.php?t=74586 - #if ANY(MKS_ROBIN_TFT35, TFT_TRONXY_X5SA, ANYCUBIC_TFT35) // ILI9488 - #define TFT_DRIVER ILI9488 - #define TFT_DEFAULT_ORIENTATION (TFT_EXCHANGE_XY | TFT_INVERT_X | TFT_INVERT_Y) - #define TFT_RES_480x320 - #define TFT_INTERFACE_FSMC - #endif -#endif - static const uint16_t ili9488_init[] = { DATASIZE_8BIT, ESC_REG(ILI9488_SWRESET), ESC_DELAY(120), diff --git a/Marlin/src/lcd/tft_io/tft_io.cpp b/Marlin/src/lcd/tft_io/tft_io.cpp index 294c146d5c..d46c2de418 100644 --- a/Marlin/src/lcd/tft_io/tft_io.cpp +++ b/Marlin/src/lcd/tft_io/tft_io.cpp @@ -59,7 +59,7 @@ TFT_IO_DRIVER TFT_IO::io; uint32_t TFT_IO::lcd_id = 0xFFFFFFFF; -void TFT_IO::InitTFT() { +void TFT_IO::initTFT() { if (lcd_id != 0xFFFFFFFF) return; #if PIN_EXISTS(TFT_BACKLIGHT) @@ -81,7 +81,7 @@ void TFT_IO::InitTFT() { #endif #endif - // io.Init(); + //io.init(); delay(100); #if TFT_DRIVER != AUTO @@ -106,7 +106,7 @@ void TFT_IO::InitTFT() { write_esc_sequence(ili9488_init); #elif TFT_DRIVER == AUTO // autodetect - lcd_id = io.GetID() & 0xFFFF; + lcd_id = io.getID() & 0xFFFF; switch (lcd_id) { case LTDC_RGB: @@ -156,25 +156,25 @@ void TFT_IO::InitTFT() { #endif } -void TFT_IO::set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax) { +void TFT_IO::set_window(uint16_t xMin, uint16_t yMin, uint16_t xMax, uint16_t yMax) { #ifdef OFFSET_X - Xmin += OFFSET_X; Xmax += OFFSET_X; + xMin += OFFSET_X; xMax += OFFSET_X; #endif #ifdef OFFSET_Y - Ymin += OFFSET_Y; Ymax += OFFSET_Y; + yMin += OFFSET_Y; yMax += OFFSET_Y; #endif switch (lcd_id) { case LTDC_RGB: - io.WriteReg(0x01); - io.WriteData(Xmin); - io.WriteReg(0x02); - io.WriteData(Xmax); - io.WriteReg(0x03); - io.WriteData(Ymin); - io.WriteReg(0x04); - io.WriteData(Ymax); - io.WriteReg(0x00); + io.writeReg(0x01); + io.writeData(xMin); + io.writeReg(0x02); + io.writeData(xMax); + io.writeReg(0x03); + io.writeData(yMin); + io.writeReg(0x04); + io.writeData(yMax); + io.writeReg(0x00); break; case ST7735: // ST7735 160x128 case ST7789: // ST7789V 320x240 @@ -183,76 +183,76 @@ void TFT_IO::set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ym case ILI9488: // ILI9488 480x320 case SSD1963: // SSD1963 case ILI9488_ID1: // 0x8066 ILI9488 480x320 - io.DataTransferBegin(DATASIZE_8BIT); + io.dataTransferBegin(DATASIZE_8BIT); // CASET: Column Address Set - io.WriteReg(ILI9341_CASET); - io.WriteData((Xmin >> 8) & 0xFF); - io.WriteData(Xmin & 0xFF); - io.WriteData((Xmax >> 8) & 0xFF); - io.WriteData(Xmax & 0xFF); + io.writeReg(ILI9341_CASET); + io.writeData((xMin >> 8) & 0xFF); + io.writeData(xMin & 0xFF); + io.writeData((xMax >> 8) & 0xFF); + io.writeData(xMax & 0xFF); // RASET: Row Address Set - io.WriteReg(ILI9341_PASET); - io.WriteData((Ymin >> 8) & 0xFF); - io.WriteData(Ymin & 0xFF); - io.WriteData((Ymax >> 8) & 0xFF); - io.WriteData(Ymax & 0xFF); + io.writeReg(ILI9341_PASET); + io.writeData((yMin >> 8) & 0xFF); + io.writeData(yMin & 0xFF); + io.writeData((yMax >> 8) & 0xFF); + io.writeData(yMax & 0xFF); // RAMWR: Memory Write - io.WriteReg(ILI9341_RAMWR); + io.writeReg(ILI9341_RAMWR); break; case R61505: // R61505U 320x240 case ILI9328: // ILI9328 320x240 - io.DataTransferBegin(DATASIZE_16BIT); + io.dataTransferBegin(DATASIZE_16BIT); // Mind the mess: with landscape screen orientation 'Horizontal' is Y and 'Vertical' is X - io.WriteReg(ILI9328_HASTART); - io.WriteData(Ymin); - io.WriteReg(ILI9328_HAEND); - io.WriteData(Ymax); - io.WriteReg(ILI9328_VASTART); - io.WriteData(Xmin); - io.WriteReg(ILI9328_VAEND); - io.WriteData(Xmax); + io.writeReg(ILI9328_HASTART); + io.writeData(yMin); + io.writeReg(ILI9328_HAEND); + io.writeData(yMax); + io.writeReg(ILI9328_VASTART); + io.writeData(xMin); + io.writeReg(ILI9328_VAEND); + io.writeData(xMax); - io.WriteReg(ILI9328_HASET); - io.WriteData(Ymin); - io.WriteReg(ILI9328_VASET); - io.WriteData(Xmin); + io.writeReg(ILI9328_HASET); + io.writeData(yMin); + io.writeReg(ILI9328_VASET); + io.writeData(xMin); - io.WriteReg(ILI9328_RAMWR); + io.writeReg(ILI9328_RAMWR); break; default: break; } - io.DataTransferEnd(); + io.dataTransferEnd(); } -void TFT_IO::write_esc_sequence(const uint16_t *Sequence) { +void TFT_IO::write_esc_sequence(const uint16_t *sequence) { uint16_t dataWidth, data; - dataWidth = *Sequence++; - io.DataTransferBegin(dataWidth); + dataWidth = *sequence++; + io.dataTransferBegin(dataWidth); for (;;) { - data = *Sequence++; + data = *sequence++; if (data != 0xFFFF) { - io.WriteData(data); + io.writeData(data); continue; } - data = *Sequence++; + data = *sequence++; if (data == 0x7FFF) break; if (data == 0xFFFF) - io.WriteData(0xFFFF); + io.writeData(0xFFFF); else if (data & 0x8000) delay(data & 0x7FFF); else if ((data & 0xFF00) == 0) - io.WriteReg(data); + io.writeReg(data); } - io.DataTransferEnd(); + io.dataTransferEnd(); } #endif // HAS_SPI_TFT || HAS_FSMC_TFT || HAS_LTDC_TFT diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h index 7dd973ef70..cbe554436e 100644 --- a/Marlin/src/lcd/tft_io/tft_io.h +++ b/Marlin/src/lcd/tft_io/tft_io.h @@ -24,11 +24,11 @@ #include "../../inc/MarlinConfig.h" #if HAS_SPI_TFT - #include HAL_PATH(../../HAL, tft/tft_spi.h) + #include HAL_PATH(../.., tft/tft_spi.h) #elif HAS_FSMC_TFT - #include HAL_PATH(../../HAL, tft/tft_fsmc.h) + #include HAL_PATH(../.., tft/tft_fsmc.h) #elif HAS_LTDC_TFT - #include HAL_PATH(../../HAL, tft/tft_ltdc.h) + #include HAL_PATH(../.., tft/tft_ltdc.h) #else #error "TFT IO only supports SPI, FSMC or LTDC interface." #endif @@ -37,8 +37,6 @@ #error "DMA_MAX_SIZE is not configured for this platform." #endif -#include "tft_orientation.h" - #ifndef TFT_DRIVER #define TFT_DRIVER AUTO #endif @@ -52,36 +50,36 @@ class TFT_IO { public: static TFT_IO_DRIVER io; - static void InitTFT(); - static void set_window(uint16_t Xmin, uint16_t Ymin, uint16_t Xmax, uint16_t Ymax); - static void write_esc_sequence(const uint16_t *Sequence); + static void initTFT(); + static void set_window(uint16_t xMin, uint16_t yMin, uint16_t xMax, uint16_t yMax); + static void write_esc_sequence(const uint16_t *sequence); // Deletaged methods - inline static void Init() { io.Init(); } + inline static void init() { io.init(); } inline static bool isBusy() { return io.isBusy(); } - inline static void Abort() { io.Abort(); } - inline static uint32_t GetID() { return io.GetID(); } + inline static void abort() { io.abort(); } + inline static uint32_t getID() { return io.getID(); } - inline static void DataTransferBegin(uint16_t DataWidth=DATASIZE_16BIT) { io.DataTransferBegin(DataWidth); } - inline static void DataTransferEnd() { io.DataTransferEnd(); } + inline static void dataTransferBegin(uint16_t dataWidth=DATASIZE_16BIT) { io.dataTransferBegin(dataWidth); } + inline static void dataTransferEnd() { io.dataTransferEnd(); } - inline static void WriteData(uint16_t Data) { io.WriteData(Data); } - inline static void WriteReg(uint16_t Reg) { io.WriteReg(Reg); } + inline static void writeData(uint16_t data) { io.writeData(data); } + inline static void writeReg(uint16_t reg) { io.writeReg(reg); } // Blocking IO used by TFT_CLASSIC_UI and TFT_LVGL_UI // These functions start data transfer and WAIT for data transfer completion - inline static void WriteSequence(uint16_t *Data, uint16_t Count) { io.WriteSequence(Data, Count); } - inline static void WriteMultiple(uint16_t Color, uint32_t Count) { io.WriteMultiple(Color, Count); } + inline static void writeSequence(uint16_t *data, uint16_t count) { io.writeSequence(data, count); } + inline static void writeMultiple(uint16_t color, uint32_t count) { io.writeMultiple(color, count); } // Non-blocking DMA-based IO used by TFT_COLOR_UI only // These functions start data transfer using DMA and do NOT wait for data transfer completion - inline static void WriteSequenceDMA(uint16_t *Data, uint16_t Count) { io.WriteSequence_DMA(Data, Count); } - inline static void WriteMultipleDMA(uint16_t Color, uint16_t Count) { io.WriteMultiple_DMA(Color, Count); } + inline static void writeSequenceDMA(uint16_t *data, uint16_t count) { io.writeSequence_DMA(data, count); } + inline static void WriteMultipleDMA(uint16_t color, uint16_t count) { io.writeMultiple_DMA(color, count); } // Non-blocking DMA-based IO with IRQ callback used by TFT_LVGL_UI only // This function starts data transfer using DMA and does NOT wait for data transfer completion #if ENABLED(USE_SPI_DMA_TC) - inline static void WriteSequenceIT(uint16_t *Data, uint16_t Count) { io.WriteSequenceIT(Data, Count); } + inline static void writeSequenceIT(uint16_t *data, uint16_t count) { io.writeSequenceIT(data, count); } #endif protected: diff --git a/Marlin/src/lcd/tft_io/tft_orientation.h b/Marlin/src/lcd/tft_io/tft_orientation.h index c2c86435b2..99c6a13c64 100644 --- a/Marlin/src/lcd/tft_io/tft_orientation.h +++ b/Marlin/src/lcd/tft_io/tft_orientation.h @@ -66,19 +66,3 @@ #define TOUCH_ORIENTATION_NONE 0 #define TOUCH_LANDSCAPE 1 #define TOUCH_PORTRAIT 2 - -#ifndef TOUCH_CALIBRATION_X - #define TOUCH_CALIBRATION_X 0 -#endif -#ifndef TOUCH_CALIBRATION_Y - #define TOUCH_CALIBRATION_Y 0 -#endif -#ifndef TOUCH_OFFSET_X - #define TOUCH_OFFSET_X 0 -#endif -#ifndef TOUCH_OFFSET_Y - #define TOUCH_OFFSET_Y 0 -#endif -#ifndef TOUCH_ORIENTATION - #define TOUCH_ORIENTATION TOUCH_LANDSCAPE -#endif diff --git a/Marlin/src/lcd/tft_io/touch_calibration.h b/Marlin/src/lcd/tft_io/touch_calibration.h index 030b4977db..e9d3110c56 100644 --- a/Marlin/src/lcd/tft_io/touch_calibration.h +++ b/Marlin/src/lcd/tft_io/touch_calibration.h @@ -21,13 +21,11 @@ */ #pragma once -#include "../../inc/MarlinConfigPre.h" -#include "tft_io.h" +#include "../../inc/MarlinConfig.h" #ifndef TOUCH_SCREEN_CALIBRATION_PRECISION #define TOUCH_SCREEN_CALIBRATION_PRECISION 80 #endif - #ifndef TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS #define TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS 2500 #endif diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp index 08554de0d3..856594c31a 100644 --- a/Marlin/src/lcd/touch/touch_buttons.cpp +++ b/Marlin/src/lcd/touch/touch_buttons.cpp @@ -28,10 +28,10 @@ #include "../scaled_tft.h" #if ENABLED(TFT_TOUCH_DEVICE_GT911) - #include HAL_PATH(../../HAL, tft/gt911.h) + #include HAL_PATH(../.., tft/gt911.h) GT911 touchIO; #elif ENABLED(TFT_TOUCH_DEVICE_XPT2046) - #include HAL_PATH(../../HAL, tft/xpt2046.h) + #include HAL_PATH(../.., tft/xpt2046.h) XPT2046 touchIO; #else #error "Unknown Touch Screen Type." @@ -60,12 +60,12 @@ TouchButtons touchBt; void TouchButtons::init() { - touchIO.Init(); + touchIO.init(); TERN_(HAS_TOUCH_SLEEP, next_sleep_ms = millis() + SEC_TO_MS(ui.sleep_timeout_minutes * 60)); } uint8_t TouchButtons::read_buttons() { - #ifdef HAS_WIRED_LCD + #if HAS_WIRED_LCD int16_t x, y; #if ENABLED(TFT_TOUCH_DEVICE_XPT2046) diff --git a/Marlin/src/lcd/fontutils.cpp b/Marlin/src/lcd/utf8.cpp similarity index 94% rename from Marlin/src/lcd/fontutils.cpp rename to Marlin/src/lcd/utf8.cpp index 46329fd4be..6957fffc64 100644 --- a/Marlin/src/lcd/fontutils.cpp +++ b/Marlin/src/lcd/utf8.cpp @@ -21,14 +21,18 @@ */ /** - * @file fontutils.cpp - * @brief help functions for font and char + * @file utf8.cpp + * @brief Helper functions for UTF-8 strings * @author Yunhui Fu (yhfudev@gmail.com) * @version 1.0 * @date 2016-08-19 * @copyright GPL/BSD */ +#include "../inc/MarlinConfigPre.h" + +#if HAS_UTF8_UTILS + #include "../inc/MarlinConfig.h" #if HAS_WIRED_LCD @@ -36,7 +40,7 @@ #include "../MarlinCore.h" #endif -#include "fontutils.h" +#include "utf8.h" uint8_t read_byte_ram(const uint8_t *str) { return *str; } uint8_t read_byte_rom(const uint8_t *str) { return pgm_read_byte(str); } @@ -173,13 +177,8 @@ static inline uint8_t utf8_strlen_cb(const char *pstart, read_byte_cb_t cb_read_ return cnt; } -uint8_t utf8_strlen(const char *pstart) { - return utf8_strlen_cb(pstart, read_byte_ram); -} - -uint8_t utf8_strlen_P(PGM_P pstart) { - return utf8_strlen_cb(pstart, read_byte_rom); -} +uint8_t utf8_strlen(const char *pstart) { return utf8_strlen_cb(pstart, read_byte_ram); } +uint8_t utf8_strlen_P(PGM_P pstart) { return utf8_strlen_cb(pstart, read_byte_rom); } static inline uint8_t utf8_byte_pos_by_char_num_cb(const char *pstart, read_byte_cb_t cb_read_byte, const uint8_t charnum) { uint8_t *p = (uint8_t *)pstart; @@ -203,3 +202,5 @@ uint8_t utf8_byte_pos_by_char_num(const char *pstart, const uint8_t charnum) { uint8_t utf8_byte_pos_by_char_num_P(PGM_P pstart, const uint8_t charnum) { return utf8_byte_pos_by_char_num_cb(pstart, read_byte_rom, charnum); } + +#endif // HAS_UTF8_UTILS diff --git a/Marlin/src/lcd/fontutils.h b/Marlin/src/lcd/utf8.h similarity index 97% rename from Marlin/src/lcd/fontutils.h rename to Marlin/src/lcd/utf8.h index 69edf1a0c8..6031818571 100644 --- a/Marlin/src/lcd/fontutils.h +++ b/Marlin/src/lcd/utf8.h @@ -21,8 +21,8 @@ */ /** - * @file fontutils.h - * @brief help functions for font and char + * @file utf8.h + * @brief Helper functions for UTF-8 strings * @author Yunhui Fu (yhfudev@gmail.com) * @version 1.0 * @date 2016-08-19 diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp index 4b5a23e4c5..adfdc1387c 100644 --- a/Marlin/src/libs/BL24CXX.cpp +++ b/Marlin/src/libs/BL24CXX.cpp @@ -141,7 +141,7 @@ void IIC::nAck() { void IIC::send_byte(uint8_t txd) { SDA_OUT(); IIC_SCL_0(); // Pull down the clock to start data transmission - LOOP_L_N(t, 8) { + for (uint8_t t = 0; t < 8; ++t) { // IIC_SDA = (txd & 0x80) >> 7; if (txd & 0x80) IIC_SDA_1(); else IIC_SDA_0(); txd <<= 1; @@ -157,7 +157,7 @@ void IIC::send_byte(uint8_t txd) { uint8_t IIC::read_byte(unsigned char ack_chr) { unsigned char receive = 0; SDA_IN(); // SDA is set as input - LOOP_L_N(i, 8) { + for (uint8_t i = 0; i < 8; ++i) { IIC_SCL_0(); delay_us(2); IIC_SCL_1(); @@ -228,7 +228,7 @@ void BL24CXX::writeOneByte(uint16_t WriteAddr, uint8_t DataToWrite) { // DataToWrite: the first address of the data array // Len: The length of the data to be written 2, 4 void BL24CXX::writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len) { - LOOP_L_N(t, Len) + for (uint8_t t = 0; t < Len; ++t) writeOneByte(WriteAddr + t, (DataToWrite >> (8 * t)) & 0xFF); } @@ -239,7 +239,7 @@ void BL24CXX::writeLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len // Len: The length of the data to be read 2,4 uint32_t BL24CXX::readLenByte(uint16_t ReadAddr, uint8_t Len) { uint32_t temp = 0; - LOOP_L_N(t, Len) { + for (uint8_t t = 0; t < Len; ++t) { temp <<= 8; temp += readOneByte(ReadAddr + Len - t - 1); } diff --git a/Marlin/src/libs/MAX31865.h b/Marlin/src/libs/MAX31865.h index 95bde756ce..3e9b0c139f 100644 --- a/Marlin/src/libs/MAX31865.h +++ b/Marlin/src/libs/MAX31865.h @@ -45,7 +45,7 @@ #include "../inc/MarlinConfig.h" #include "../HAL/shared/Delay.h" -#include HAL_PATH(../HAL, MarlinSPI.h) +#include HAL_PATH(.., MarlinSPI.h) #define MAX31865_CONFIG_REG 0x00 #define MAX31865_CONFIG_BIAS 0x80 diff --git a/Marlin/src/libs/W25Qxx.h b/Marlin/src/libs/W25Qxx.h index 778463477d..55490b0252 100644 --- a/Marlin/src/libs/W25Qxx.h +++ b/Marlin/src/libs/W25Qxx.h @@ -23,7 +23,7 @@ #include -#include HAL_PATH(../HAL, MarlinSPI.h) +#include HAL_PATH(.., MarlinSPI.h) #define W25X_WriteEnable 0x06 #define W25X_WriteDisable 0x04 diff --git a/Marlin/src/libs/duration_t.h b/Marlin/src/libs/duration_t.h index 69a648441f..d648924dc9 100644 --- a/Marlin/src/libs/duration_t.h +++ b/Marlin/src/libs/duration_t.h @@ -67,7 +67,7 @@ struct duration_t { } /** - * @brief Formats the duration as years + * @brief Format the duration as years * @return The number of years */ inline uint8_t year() const { @@ -75,7 +75,7 @@ struct duration_t { } /** - * @brief Formats the duration as days + * @brief Format the duration as days * @return The number of days */ inline uint16_t day() const { @@ -83,7 +83,7 @@ struct duration_t { } /** - * @brief Formats the duration as hours + * @brief Format the duration as hours * @return The number of hours */ inline uint32_t hour() const { @@ -91,7 +91,7 @@ struct duration_t { } /** - * @brief Formats the duration as minutes + * @brief Format the duration as minutes * @return The number of minutes */ inline uint32_t minute() const { @@ -99,7 +99,7 @@ struct duration_t { } /** - * @brief Formats the duration as seconds + * @brief Format the duration as seconds * @return The number of seconds */ inline uint32_t second() const { @@ -112,11 +112,12 @@ struct duration_t { #endif /** - * @brief Formats the duration as a string + * @brief Format the duration as a string * @details String will be formatted using a "full" representation of duration * * @param buffer The array pointed to must be able to accommodate 22 bytes * (21 for the string, 1 more for the terminating nul) + * @param dense Whether to skip spaces in the resulting string * * Output examples: * 123456789012345678901 (strlen) @@ -142,10 +143,42 @@ struct duration_t { } /** - * @brief Formats the duration as a string + * @brief Format the duration as a compact string + * @details String will be formatted using a "full" representation of duration + * + * @param buffer The array pointed to must be able to accommodate 18 bytes + * (17 for the string, 1 more for the terminating nul) + * @param dense Whether to skip spaces in the resulting string + * + * Output examples: + * 12345678901234567 (strlen) + * 135y364d23h59m59s + * 364d23h59m59s + * 23h59m59s + * 59m59s + * 59s + */ + char* toCompactString(char * const buffer) const { + const uint16_t y = this->year(), + d = this->day() % 365, + h = this->hour() % 24, + m = this->minute() % 60, + s = this->second() % 60; + + if (y) sprintf_P(buffer, PSTR("%iy%id%ih%im%is"), y, d, h, m, s); + else if (d) sprintf_P(buffer, PSTR("%id%ih%im%is"), d, h, m, s); + else if (h) sprintf_P(buffer, PSTR("%ih%im%is"), h, m, s); + else if (m) sprintf_P(buffer, PSTR("%im%is"), m, s); + else sprintf_P(buffer, PSTR("%is"), s); + return buffer; + } + + /** + * @brief Format the duration as a string * @details String will be formatted using a "digital" representation of duration * * @param buffer The array pointed to must be able to accommodate 10 bytes + * @return length of the formatted string (without terminating nul) * * Output examples: * 123456789 (strlen) diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 8f44c69c5c..10ebd71efd 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -22,7 +22,7 @@ #include "../inc/MarlinConfig.h" -#if EITHER(NOZZLE_CLEAN_FEATURE, NOZZLE_PARK_FEATURE) +#if ANY(NOZZLE_CLEAN_FEATURE, NOZZLE_PARK_FEATURE) #include "nozzle.h" @@ -46,7 +46,7 @@ Nozzle nozzle; * @param end xyz_pos_t defining the ending point * @param strokes number of strokes to execute */ - void Nozzle::stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) { + void Nozzle::stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t strokes) { #if ENABLED(NOZZLE_CLEAN_GOBACK) const xyz_pos_t oldpos = current_position; #endif @@ -63,7 +63,7 @@ Nozzle nozzle; #endif // Start the stroke pattern - LOOP_L_N(i, strokes >> 1) { + for (uint8_t i = 0; i < strokes >> 1; ++i) { #if ENABLED(NOZZLE_CLEAN_NO_Y) do_blocking_move_to_x(end.x); do_blocking_move_to_x(start.x); @@ -87,7 +87,7 @@ Nozzle nozzle; * @param strokes number of strokes to execute * @param objects number of triangles to do */ - void Nozzle::zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes, const uint8_t &objects) { + void Nozzle::zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t strokes, const uint8_t objects) { const xy_pos_t diff = end - start; if (!diff.x || !diff.y) return; @@ -105,7 +105,7 @@ Nozzle nozzle; const bool horiz = ABS(diff.x) >= ABS(diff.y); // Do a horizontal wipe? const float P = (horiz ? diff.x : diff.y) / zigs; // Period of each zig / zag const xyz_pos_t *side; - LOOP_L_N(j, strokes) { + for (uint8_t j = 0; j < strokes; ++j) { for (int8_t i = 0; i < zigs; i++) { side = (i & 1) ? &end : &start; if (horiz) @@ -135,7 +135,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_t 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) @@ -143,8 +143,8 @@ Nozzle nozzle; #endif TERN(NOZZLE_CLEAN_NO_Z, do_blocking_move_to_xy, do_blocking_move_to)(start); - LOOP_L_N(s, strokes) - LOOP_L_N(i, NOZZLE_CLEAN_CIRCLE_FN) + for (uint8_t s = 0; s < strokes; ++s) + for (uint8_t i = 0; i < NOZZLE_CLEAN_CIRCLE_FN; ++i) do_blocking_move_to_xy( middle.x + sin((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius, middle.y + cos((RADIANS(360) / NOZZLE_CLEAN_CIRCLE_FN) * i) * radius @@ -164,13 +164,13 @@ 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_t 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; #if ENABLED(NOZZLE_CLEAN_PATTERN_CIRCLE) xyz_pos_t middle[HOTENDS] = NOZZLE_CLEAN_CIRCLE_MIDDLE; #endif - const uint8_t arrPos = EITHER(SINGLENOZZLE, MIXING_EXTRUDER) ? 0 : active_extruder; + const uint8_t arrPos = ANY(SINGLENOZZLE, MIXING_EXTRUDER) ? 0 : active_extruder; switch (pattern) { #if DISABLED(NOZZLE_CLEAN_PATTERN_LINE) @@ -230,10 +230,9 @@ Nozzle nozzle; } if (!TEST(cleans, Z_AXIS)) start[arrPos].z = end[arrPos].z = current_position.z; - switch (pattern) { - default: + switch (pattern) { // no default clause as pattern is already validated #if ENABLED(NOZZLE_CLEAN_PATTERN_LINE) - case 0: stroke(start[arrPos], end[arrPos], strokes); + case 0: stroke(start[arrPos], end[arrPos], strokes); break; #endif #if ENABLED(NOZZLE_CLEAN_PATTERN_ZIGZAG) case 1: zigzag(start[arrPos], end[arrPos], strokes, objects); break; diff --git a/Marlin/src/libs/nozzle.h b/Marlin/src/libs/nozzle.h index 69790f5a67..fb47c867f2 100644 --- a/Marlin/src/libs/nozzle.h +++ b/Marlin/src/libs/nozzle.h @@ -41,7 +41,7 @@ class Nozzle { * @param end xyz_pos_t defining the ending point * @param strokes number of strokes to execute */ - static void stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) __Os; + static void stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t strokes) __Os; /** * @brief Zig-zag clean pattern @@ -52,7 +52,7 @@ class Nozzle { * @param strokes number of strokes to execute * @param objects number of objects to create */ - static void zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes, const uint8_t &objects) __Os; + static void zigzag(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t strokes, const uint8_t objects) __Os; /** * @brief Circular clean pattern @@ -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_t 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_t 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 2938229a7a..e273732635 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -25,14 +25,25 @@ #include "../inc/MarlinConfigPre.h" #include "../core/utility.h" -char conv[9] = { 0 }; +constexpr char DIGIT(const uint8_t n) { return '0' + n; } -#define DIGIT(n) ('0' + (n)) -#define DIGIMOD(n, f) DIGIT(((n)/(f)) % 10) -#define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') -#define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) -#define INTFLOAT(V,N) (((V) * 10 * pow(10, N) + ((V) < 0 ? -5: 5)) / 10) // pow10? -#define UINTFLOAT(V,N) INTFLOAT((V) < 0 ? -(V) : (V), N) +template +constexpr char DIGIMOD(const T1 n, const T2 f) { return DIGIT((n / f) % 10); } + +template +constexpr char RJDIGIT(const T1 n, const T2 f) { return (n >= (T1)f ? DIGIMOD(n, f) : ' '); } + +template +constexpr char MINUSOR(T &n, const char alt) { return (n >= 0) ? alt : (n = -n) ? '-' : '-'; } + +constexpr long INTFLOAT(const float V, const int N) { + return long((V * 10.0f * pow(10.0f, N) + (V < 0.0f ? -5.0f : 5.0f)) / 10.0f); +} +constexpr long UINTFLOAT(const float V, const int N) { + return INTFLOAT(V < 0.0f ? -V : V, N); +} + +char conv[9] = { 0 }; // Format uint8_t (0-100) as rj string with 123% / _12% / __1% format const char* pcttostrpctrj(const uint8_t i) { diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index 31e8db0048..f8af09ebee 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -120,7 +120,7 @@ const char* ftostr61rj(const_float_t x); const char* ftostr72rj(const_float_t x); // Convert float to rj string with 123 or -12 format -FORCE_INLINE const char* ftostr3(const_float_t x) { return i16tostr3rj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } +FORCE_INLINE const char* ftostr3rj(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 diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index 02945fe687..5668d2f392 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -76,10 +76,11 @@ void vector_3::apply_rotation(const matrix_3x3 &matrix) { } void vector_3::debug(FSTR_P const title) { - SERIAL_ECHOF(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); + SERIAL_ECHOLN(title, + FPSTR(SP_X_STR), p_float_t(x, 6), + FPSTR(SP_Y_STR), p_float_t(y, 6), + FPSTR(SP_Z_STR), p_float_t(z, 6) + ); } /** @@ -93,8 +94,8 @@ void matrix_3x3::apply_rotation_xyz(float &_x, float &_y, float &_z) { // Reset to identity. No rotate or translate. void matrix_3x3::set_to_identity() { - LOOP_L_N(i, 3) - LOOP_L_N(j, 3) + for (uint8_t i = 0; i < 3; ++i) + for (uint8_t j = 0; j < 3; ++j) vectors[i][j] = float(i == j); } @@ -131,16 +132,16 @@ matrix_3x3 matrix_3x3::create_look_at(const vector_3 &target) { // Get a transposed copy of the matrix matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) { matrix_3x3 new_matrix; - LOOP_L_N(i, 3) - LOOP_L_N(j, 3) + for (uint8_t i = 0; i < 3; ++i) + for (uint8_t j = 0; j < 3; ++j) new_matrix.vectors[i][j] = original.vectors[j][i]; return new_matrix; } void matrix_3x3::debug(FSTR_P const title) { - if (title) SERIAL_ECHOLNF(title); - LOOP_L_N(i, 3) { - LOOP_L_N(j, 3) { + if (title) SERIAL_ECHOLN(title); + for (uint8_t i = 0; i < 3; ++i) { + for (uint8_t j = 0; j < 3; ++j) { serial_offset(vectors[i][j], 2); SERIAL_CHAR(' '); } diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h index 58bdb43c7b..ab719c6a7f 100644 --- a/Marlin/src/libs/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -50,9 +50,9 @@ struct vector_3 { float pos[3]; }; vector_3(const_float_t _x, const_float_t _y, const_float_t _z) : x(_x), y(_y), z(_z) {} - vector_3(const xy_float_t &in) { x = in.x; TERN_(HAS_Y_AXIS, y = in.y); } - vector_3(const xyz_float_t &in) { x = in.x; TERN_(HAS_Y_AXIS, y = in.y); TERN_(HAS_Z_AXIS, z = in.z); } - vector_3(const xyze_float_t &in) { x = in.x; TERN_(HAS_Y_AXIS, y = in.y); TERN_(HAS_Z_AXIS, z = in.z); } + vector_3(const xy_float_t &in) { TERN_(HAS_X_AXIS, x = in.x); TERN_(HAS_Y_AXIS, y = in.y); } + vector_3(const xyz_float_t &in) { TERN_(HAS_X_AXIS, x = in.x); TERN_(HAS_Y_AXIS, y = in.y); TERN_(HAS_Z_AXIS, z = in.z); } + vector_3(const xyze_float_t &in) { TERN_(HAS_X_AXIS, x = in.x); TERN_(HAS_Y_AXIS, y = in.y); TERN_(HAS_Z_AXIS, z = in.z); } vector_3() { x = y = z = 0; } // Factory method @@ -75,8 +75,8 @@ struct vector_3 { vector_3 operator-(const vector_3 &v) { return vector_3(x - v.x, y - v.y, z - v.z); } vector_3 operator*(const float &v) { return vector_3(x * v, y * v, z * v); } - operator xy_float_t() { return xy_float_t({ x OPTARG(HAS_Y_AXIS, y) }); } - operator xyz_float_t() { return xyz_float_t({ x OPTARG(HAS_Y_AXIS, y) OPTARG(HAS_Z_AXIS, z) }); } + operator xy_float_t() { return xy_float_t({ TERN_(HAS_X_AXIS, x) OPTARG(HAS_Y_AXIS, y) }); } + operator xyz_float_t() { return xyz_float_t({ TERN_(HAS_X_AXIS, x) OPTARG(HAS_Y_AXIS, y) OPTARG(HAS_Z_AXIS, z) }); } void debug(FSTR_P const title); }; diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 56444d1aee..3c1fcc72a9 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -31,14 +31,14 @@ #include "temperature.h" #include "../lcd/marlinui.h" -#define DEBUG_OUT BOTH(USE_SENSORLESS, DEBUG_LEVELING_FEATURE) +#define DEBUG_OUT ALL(USE_SENSORLESS, DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" #if ENABLED(ENDSTOP_INTERRUPTS_FEATURE) - #include HAL_PATH(../HAL, endstop_interrupts.h) + #include HAL_PATH(.., endstop_interrupts.h) #endif -#if BOTH(SD_ABORT_ON_ENDSTOP_HIT, HAS_MEDIA) +#if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) #include "printcounter.h" // for print_job_timer #endif @@ -65,7 +65,11 @@ Endstops::endstop_mask_t Endstops::live_state = 0; #if ENABLED(BD_SENSOR) bool Endstops::bdp_state; // = false - #define READ_ENDSTOP(P) ((P == Z_MIN_PIN) ? bdp_state : READ(P)) + #if HOMING_Z_WITH_PROBE + #define READ_ENDSTOP(P) ((P == TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN_PIN, Z_MIN_PROBE_PIN)) ? bdp_state : READ(P)) + #else + #define READ_ENDSTOP(P) READ(P) + #endif #else #define READ_ENDSTOP(P) READ(P) #endif @@ -110,88 +114,88 @@ Endstops::endstop_mask_t Endstops::live_state = 0; void Endstops::init() { #define _INIT_ENDSTOP(T,A,N) TERN(ENDSTOPPULLUP_##A##T, SET_INPUT_PULLUP, TERN(ENDSTOPPULLDOWN_##A##T, SET_INPUT_PULLDOWN, SET_INPUT))(A##N##_##T##_PIN) - #if HAS_X_MIN + #if USE_X_MIN _INIT_ENDSTOP(MIN,X,); #endif - #if HAS_X_MAX + #if USE_X_MAX _INIT_ENDSTOP(MAX,X,); #endif - #if HAS_X2_MIN + #if USE_X2_MIN _INIT_ENDSTOP(MIN,X,2); #endif - #if HAS_X2_MAX + #if USE_X2_MAX _INIT_ENDSTOP(MAX,X,2); #endif - #if HAS_Y_MIN + #if USE_Y_MIN _INIT_ENDSTOP(MIN,Y,); #endif - #if HAS_Y_MAX + #if USE_Y_MAX _INIT_ENDSTOP(MAX,Y,); #endif - #if HAS_Y2_MIN + #if USE_Y2_MIN _INIT_ENDSTOP(MIN,Y,2); #endif - #if HAS_Y2_MAX + #if USE_Y2_MAX _INIT_ENDSTOP(MAX,Y,2); #endif - #if HAS_Z_MIN + #if HAS_Z_MIN_PIN _INIT_ENDSTOP(MIN,Z,); #endif - #if HAS_Z_MAX + #if USE_Z_MAX _INIT_ENDSTOP(MAX,Z,); #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN _INIT_ENDSTOP(MIN,Z,2); #endif - #if HAS_Z2_MAX + #if USE_Z2_MAX _INIT_ENDSTOP(MAX,Z,2); #endif - #if HAS_Z3_MIN + #if USE_Z3_MIN _INIT_ENDSTOP(MIN,Z,3); #endif - #if HAS_Z3_MAX + #if USE_Z3_MAX _INIT_ENDSTOP(MAX,Z,3); #endif - #if HAS_Z4_MIN + #if USE_Z4_MIN _INIT_ENDSTOP(MIN,Z,4); #endif - #if HAS_Z4_MAX + #if USE_Z4_MAX _INIT_ENDSTOP(MAX,Z,4); #endif - #if HAS_I_MIN + #if USE_I_MIN _INIT_ENDSTOP(MIN,I,); #endif - #if HAS_I_MAX + #if USE_I_MAX _INIT_ENDSTOP(MAX,I,); #endif - #if HAS_J_MIN + #if USE_J_MIN _INIT_ENDSTOP(MIN,J,); #endif - #if HAS_J_MAX + #if USE_J_MAX _INIT_ENDSTOP(MAX,J,); #endif - #if HAS_K_MIN + #if USE_K_MIN _INIT_ENDSTOP(MIN,K,); #endif - #if HAS_K_MAX + #if USE_K_MAX _INIT_ENDSTOP(MAX,K,); #endif - #if HAS_U_MIN + #if USE_U_MIN _INIT_ENDSTOP(MIN,U,); #endif - #if HAS_U_MAX + #if USE_U_MAX _INIT_ENDSTOP(MAX,U,); #endif - #if HAS_V_MIN + #if USE_V_MIN _INIT_ENDSTOP(MIN,V,); #endif - #if HAS_V_MAX + #if USE_V_MAX _INIT_ENDSTOP(MAX,V,); #endif - #if HAS_W_MIN + #if USE_W_MIN _INIT_ENDSTOP(MIN,W,); #endif - #if HAS_W_MAX + #if USE_W_MAX _INIT_ENDSTOP(MAX,W,); #endif @@ -205,7 +209,7 @@ void Endstops::init() { #endif #endif - #if USES_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE #if ENABLED(ENDSTOPPULLUP_ZMIN_PROBE) SET_INPUT_PULLUP(Z_MIN_PROBE_PIN); #elif ENABLED(ENDSTOPPULLDOWN_ZMIN_PROBE) @@ -300,7 +304,7 @@ void Endstops::event_handler() { prev_hit_state = hit_state; if (hit_state) { #if HAS_STATUS_MESSAGE - char NUM_AXIS_LIST(chrX = ' ', chrY = ' ', chrZ = ' ', chrI = ' ', chrJ = ' ', chrK = ' ', chrU = ' ', chrV = ' ', chrW = ' '), + char NUM_AXIS_LIST_(chrX = ' ', chrY = ' ', chrZ = ' ', chrI = ' ', chrJ = ' ', chrK = ' ', chrU = ' ', chrV = ' ', chrW = ' ') chrP = ' '; #define _SET_STOP_CHAR(A,C) (chr## A = C) #else @@ -311,7 +315,7 @@ void Endstops::event_handler() { SERIAL_ECHOPGM(" " STRINGIFY(A) ":", planner.triggered_position_mm(_AXIS(A))); _SET_STOP_CHAR(A,C); }while(0) #define _ENDSTOP_HIT_TEST(A,C) \ - if (TERN0(HAS_##A##_MIN, TEST(hit_state, A##_MIN)) || TERN0(HAS_##A##_MAX, TEST(hit_state, A##_MAX))) \ + if (TERN0(USE_##A##_MIN, TEST(hit_state, ES_ENUM(A,MIN))) || TERN0(USE_##A##_MAX, TEST(hit_state, ES_ENUM(A,MAX)))) \ _ENDSTOP_HIT_ECHO(A,C) #define ENDSTOP_HIT_TEST_X() _ENDSTOP_HIT_TEST(X,'X') @@ -338,7 +342,7 @@ void Endstops::event_handler() { _ENDSTOP_HIT_TEST(W,'W') ); - #if USES_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE #define P_AXIS Z_AXIS if (TEST(hit_state, Z_MIN_PROBE)) _ENDSTOP_HIT_ECHO(P, 'P'); #endif @@ -348,11 +352,11 @@ void Endstops::event_handler() { ui.status_printf(0, F(S_FMT GANG_N_1(NUM_AXES, " %c") " %c"), GET_TEXT(MSG_LCD_ENDSTOPS), - NUM_AXIS_LIST(chrX, chrY, chrZ, chrI, chrJ, chrK, chrU, chrV, chrW), chrP + NUM_AXIS_LIST_(chrX, chrY, chrZ, chrI, chrJ, chrK, chrU, chrV, chrW) chrP ) ); - #if BOTH(SD_ABORT_ON_ENDSTOP_HIT, HAS_MEDIA) + #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) if (planner.abort_on_endstop_hit) { card.abortFilePrintNow(); quickstop_stepper(); @@ -367,116 +371,119 @@ void Endstops::event_handler() { } } -#pragma GCC diagnostic push -#if GCC_VERSION <= 50000 - #pragma GCC diagnostic ignored "-Wunused-function" +#if NUM_AXES + + #pragma GCC diagnostic push + #if GCC_VERSION <= 50000 + #pragma GCC diagnostic ignored "-Wunused-function" + #endif + + static void print_es_state(const bool is_hit, FSTR_P const flabel=nullptr) { + if (flabel) SERIAL_ECHO(flabel); + SERIAL_ECHOLN(F(": "), is_hit ? F(STR_ENDSTOP_HIT) : F(STR_ENDSTOP_OPEN)); + } + + #pragma GCC diagnostic pop + #endif -static void print_es_state(const bool is_hit, FSTR_P const flabel=nullptr) { - if (flabel) SERIAL_ECHOF(flabel); - SERIAL_ECHOPGM(": "); - SERIAL_ECHOLNF(is_hit ? F(STR_ENDSTOP_HIT) : F(STR_ENDSTOP_OPEN)); -} - -#pragma GCC diagnostic pop - void __O2 Endstops::report_states() { TERN_(BLTOUCH, bltouch._set_SW_mode()); SERIAL_ECHOLNPGM(STR_M119_REPORT); #define ES_REPORT(S) print_es_state(READ_ENDSTOP(S##_PIN) == S##_ENDSTOP_HIT_STATE, F(STR_##S)) - #if HAS_X_MIN + #if USE_X_MIN ES_REPORT(X_MIN); #endif - #if HAS_X2_MIN + #if USE_X2_MIN ES_REPORT(X2_MIN); #endif - #if HAS_X_MAX + #if USE_X_MAX ES_REPORT(X_MAX); #endif - #if HAS_X2_MAX + #if USE_X2_MAX ES_REPORT(X2_MAX); #endif - #if HAS_Y_MIN + #if USE_Y_MIN ES_REPORT(Y_MIN); #endif - #if HAS_Y2_MIN + #if USE_Y2_MIN ES_REPORT(Y2_MIN); #endif - #if HAS_Y_MAX + #if USE_Y_MAX ES_REPORT(Y_MAX); #endif - #if HAS_Y2_MAX + #if USE_Y2_MAX ES_REPORT(Y2_MAX); #endif - #if HAS_Z_MIN + #if USE_Z_MIN ES_REPORT(Z_MIN); #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN ES_REPORT(Z2_MIN); #endif - #if HAS_Z3_MIN + #if USE_Z3_MIN ES_REPORT(Z3_MIN); #endif - #if HAS_Z4_MIN + #if USE_Z4_MIN ES_REPORT(Z4_MIN); #endif - #if HAS_Z_MAX + #if USE_Z_MAX ES_REPORT(Z_MAX); #endif - #if HAS_Z2_MAX + #if USE_Z2_MAX ES_REPORT(Z2_MAX); #endif - #if HAS_Z3_MAX + #if USE_Z3_MAX ES_REPORT(Z3_MAX); #endif - #if HAS_Z4_MAX + #if USE_Z4_MAX ES_REPORT(Z4_MAX); #endif - #if HAS_I_MIN + #if USE_I_MIN ES_REPORT(I_MIN); #endif - #if HAS_I_MAX + #if USE_I_MAX ES_REPORT(I_MAX); #endif - #if HAS_J_MIN + #if USE_J_MIN ES_REPORT(J_MIN); #endif - #if HAS_J_MAX + #if USE_J_MAX ES_REPORT(J_MAX); #endif - #if HAS_K_MIN + #if USE_K_MIN ES_REPORT(K_MIN); #endif - #if HAS_K_MAX + #if USE_K_MAX ES_REPORT(K_MAX); #endif - #if HAS_U_MIN + #if USE_U_MIN ES_REPORT(U_MIN); #endif - #if HAS_U_MAX + #if USE_U_MAX ES_REPORT(U_MAX); #endif - #if HAS_V_MIN + #if USE_V_MIN ES_REPORT(V_MIN); #endif - #if HAS_V_MAX + #if USE_V_MAX ES_REPORT(V_MAX); #endif - #if HAS_W_MIN + #if USE_W_MIN ES_REPORT(W_MIN); #endif - #if HAS_W_MAX + #if USE_W_MAX ES_REPORT(W_MAX); #endif #if ENABLED(PROBE_ACTIVATION_SWITCH) print_es_state(probe_switch_activated(), F(STR_PROBE_EN)); #endif - #if USES_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE print_es_state(PROBE_TRIGGERED(), F(STR_Z_PROBE)); #endif #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) { + for (uint8_t i = 1; i <= NUM_RUNOUT_SENSORS; ++i) { pin_t pin; uint8_t state; switch (i) { @@ -514,17 +521,17 @@ void Endstops::update() { #endif // Macros to update / copy the live_state - #define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT_TO(live_state, _ENDSTOP(AXIS, MINMAX), (READ_ENDSTOP(_ENDSTOP_PIN(AXIS, MINMAX)) == _ENDSTOP_HIT_STATE(AXIS, MINMAX))) + #define UPDATE_LIVE_STATE(AXIS, MINMAX) SET_BIT_TO(live_state, _ENDSTOP(AXIS, MINMAX), (READ_ENDSTOP(_ENDSTOP_PIN(AXIS, MINMAX)) == _ENDSTOP_HIT_STATE(AXIS, MINMAX))) #define COPY_LIVE_STATE(SRC_BIT, DST_BIT) SET_BIT_TO(live_state, DST_BIT, TEST(live_state, SRC_BIT)) #if ENABLED(G38_PROBE_TARGET) // For G38 moves check the probe's pin for ALL movement - if (G38_move) UPDATE_ENDSTOP_BIT(Z, TERN(USES_Z_MIN_PROBE_PIN, MIN_PROBE, MIN)); + if (G38_move) UPDATE_LIVE_STATE(Z, TERN(USE_Z_MIN_PROBE, MIN_PROBE, MIN)); #endif // With Dual X, endstops are only checked in the homing direction for the active extruder - #define X_MIN_TEST() TERN1(DUAL_X_CARRIAGE, TERN0(X_HOME_TO_MIN, stepper.last_moved_extruder == 0) || TERN0(X2_HOME_TO_MIN, stepper.last_moved_extruder != 0)) - #define X_MAX_TEST() TERN1(DUAL_X_CARRIAGE, TERN0(X_HOME_TO_MAX, stepper.last_moved_extruder == 0) || TERN0(X2_HOME_TO_MAX, stepper.last_moved_extruder != 0)) + #define X_MIN_TEST() TERN1(DUAL_X_CARRIAGE, stepper.last_moved_extruder == 0) // Check min for the left carriage + #define X_MAX_TEST() TERN1(DUAL_X_CARRIAGE, stepper.last_moved_extruder != 0) // Check max for the right carriage // Use HEAD for core axes, AXIS for others #if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY, MARKFORGED_YX) @@ -553,68 +560,70 @@ void Endstops::update() { /** * Check and update endstops */ - #if HAS_X_MIN && !X_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(X, MIN); + #if USE_X_MIN && !X_SPI_SENSORLESS + UPDATE_LIVE_STATE(X, MIN); #if ENABLED(X_DUAL_ENDSTOPS) - #if HAS_X2_MIN - UPDATE_ENDSTOP_BIT(X2, MIN); + #if USE_X2_MIN + UPDATE_LIVE_STATE(X2, MIN); #else COPY_LIVE_STATE(X_MIN, X2_MIN); #endif #endif #endif - #if HAS_X_MAX && !X_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(X, MAX); + #if USE_X_MAX && !X_SPI_SENSORLESS + UPDATE_LIVE_STATE(X, MAX); #if ENABLED(X_DUAL_ENDSTOPS) - #if HAS_X2_MAX - UPDATE_ENDSTOP_BIT(X2, MAX); + #if USE_X2_MAX + UPDATE_LIVE_STATE(X2, MAX); #else COPY_LIVE_STATE(X_MAX, X2_MAX); #endif #endif #endif - #if HAS_Y_MIN && !Y_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(Y, MIN); + #if USE_Y_MIN && !Y_SPI_SENSORLESS + UPDATE_LIVE_STATE(Y, MIN); #if ENABLED(Y_DUAL_ENDSTOPS) - #if HAS_Y2_MIN - UPDATE_ENDSTOP_BIT(Y2, MIN); + #if USE_Y2_MIN + UPDATE_LIVE_STATE(Y2, MIN); #else COPY_LIVE_STATE(Y_MIN, Y2_MIN); #endif #endif #endif - #if HAS_Y_MAX && !Y_SPI_SENSORLESS - UPDATE_ENDSTOP_BIT(Y, MAX); + #if USE_Y_MAX && !Y_SPI_SENSORLESS + UPDATE_LIVE_STATE(Y, MAX); #if ENABLED(Y_DUAL_ENDSTOPS) - #if HAS_Y2_MAX - UPDATE_ENDSTOP_BIT(Y2, MAX); + #if USE_Y2_MAX + UPDATE_LIVE_STATE(Y2, MAX); #else COPY_LIVE_STATE(Y_MAX, Y2_MAX); #endif #endif #endif - #if HAS_Z_MIN && NONE(Z_SPI_SENSORLESS, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) - UPDATE_ENDSTOP_BIT(Z, MIN); + #if USE_Z_MIN && NONE(Z_SPI_SENSORLESS, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #if HAS_Z_MIN_PIN + UPDATE_LIVE_STATE(Z, MIN); + #endif #if ENABLED(Z_MULTI_ENDSTOPS) - #if HAS_Z2_MIN - UPDATE_ENDSTOP_BIT(Z2, MIN); + #if USE_Z2_MIN + UPDATE_LIVE_STATE(Z2, MIN); #else COPY_LIVE_STATE(Z_MIN, Z2_MIN); #endif #if NUM_Z_STEPPERS >= 3 - #if HAS_Z3_MIN - UPDATE_ENDSTOP_BIT(Z3, MIN); + #if USE_Z3_MIN + UPDATE_LIVE_STATE(Z3, MIN); #else COPY_LIVE_STATE(Z_MIN, Z3_MIN); #endif #endif #if NUM_Z_STEPPERS >= 4 - #if HAS_Z4_MIN - UPDATE_ENDSTOP_BIT(Z4, MIN); + #if USE_Z4_MIN + UPDATE_LIVE_STATE(Z4, MIN); #else COPY_LIVE_STATE(Z_MIN, Z4_MIN); #endif @@ -625,189 +634,129 @@ void Endstops::update() { #if HAS_BED_PROBE // When closing the gap check the enabled probe if (probe_switch_activated()) - UPDATE_ENDSTOP_BIT(Z, TERN(USES_Z_MIN_PROBE_PIN, MIN_PROBE, MIN)); + UPDATE_LIVE_STATE(Z, TERN(USE_Z_MIN_PROBE, MIN_PROBE, MIN)); #endif - #if HAS_Z_MAX && !Z_SPI_SENSORLESS + #if USE_Z_MAX && !Z_SPI_SENSORLESS // Check both Z dual endstops #if ENABLED(Z_MULTI_ENDSTOPS) - UPDATE_ENDSTOP_BIT(Z, MAX); - #if HAS_Z2_MAX - UPDATE_ENDSTOP_BIT(Z2, MAX); + UPDATE_LIVE_STATE(Z, MAX); + #if USE_Z2_MAX + UPDATE_LIVE_STATE(Z2, MAX); #else COPY_LIVE_STATE(Z_MAX, Z2_MAX); #endif #if NUM_Z_STEPPERS >= 3 - #if HAS_Z3_MAX - UPDATE_ENDSTOP_BIT(Z3, MAX); + #if USE_Z3_MAX + UPDATE_LIVE_STATE(Z3, MAX); #else COPY_LIVE_STATE(Z_MAX, Z3_MAX); #endif #endif #if NUM_Z_STEPPERS >= 4 - #if HAS_Z4_MAX - UPDATE_ENDSTOP_BIT(Z4, MAX); + #if USE_Z4_MAX + UPDATE_LIVE_STATE(Z4, MAX); #else COPY_LIVE_STATE(Z_MAX, Z4_MAX); #endif #endif - #elif TERN1(USES_Z_MIN_PROBE_PIN, Z_MAX_PIN != Z_MIN_PROBE_PIN) + #elif TERN1(USE_Z_MIN_PROBE, Z_MAX_PIN != Z_MIN_PROBE_PIN) // If this pin isn't the bed probe it's the Z endstop - UPDATE_ENDSTOP_BIT(Z, MAX); + UPDATE_LIVE_STATE(Z, MAX); #endif #endif - #if HAS_I_MIN && !I_SPI_SENSORLESS + #if USE_I_MIN && !I_SPI_SENSORLESS #if ENABLED(I_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(I, MIN); - #if HAS_I2_MIN - UPDATE_ENDSTOP_BIT(I2, MAX); - #else - COPY_LIVE_STATE(I_MIN, I2_MIN); - #endif + UPDATE_LIVE_STATE(I, MIN); #else - UPDATE_ENDSTOP_BIT(I, MIN); + UPDATE_LIVE_STATE(I, MIN); #endif #endif - #if HAS_I_MAX && !I_SPI_SENSORLESS + #if USE_I_MAX && !I_SPI_SENSORLESS #if ENABLED(I_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(I, MAX); - #if HAS_I2_MAX - UPDATE_ENDSTOP_BIT(I2, MAX); - #else - COPY_LIVE_STATE(I_MAX, I2_MAX); - #endif + UPDATE_LIVE_STATE(I, MAX); #else - UPDATE_ENDSTOP_BIT(I, MAX); + UPDATE_LIVE_STATE(I, MAX); #endif #endif - #if HAS_J_MIN && !J_SPI_SENSORLESS + #if USE_J_MIN && !J_SPI_SENSORLESS #if ENABLED(J_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(J, MIN); - #if HAS_J2_MIN - UPDATE_ENDSTOP_BIT(J2, MIN); - #else - COPY_LIVE_STATE(J_MIN, J2_MIN); - #endif + UPDATE_LIVE_STATE(J, MIN); #else - UPDATE_ENDSTOP_BIT(J, MIN); + UPDATE_LIVE_STATE(J, MIN); #endif #endif - #if HAS_J_MAX && !J_SPI_SENSORLESS + #if USE_J_MAX && !J_SPI_SENSORLESS #if ENABLED(J_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(J, MAX); - #if HAS_J2_MAX - UPDATE_ENDSTOP_BIT(J2, MAX); - #else - COPY_LIVE_STATE(J_MAX, J2_MAX); - #endif + UPDATE_LIVE_STATE(J, MAX); #else - UPDATE_ENDSTOP_BIT(J, MAX); + UPDATE_LIVE_STATE(J, MAX); #endif #endif - #if HAS_K_MIN && !K_SPI_SENSORLESS + #if USE_K_MIN && !K_SPI_SENSORLESS #if ENABLED(K_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(K, MIN); - #if HAS_K2_MIN - UPDATE_ENDSTOP_BIT(K2, MIN); - #else - COPY_LIVE_STATE(K_MIN, K2_MIN); - #endif + UPDATE_LIVE_STATE(K, MIN); #else - UPDATE_ENDSTOP_BIT(K, MIN); + UPDATE_LIVE_STATE(K, MIN); #endif #endif - #if HAS_K_MAX && !K_SPI_SENSORLESS + #if USE_K_MAX && !K_SPI_SENSORLESS #if ENABLED(K_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(K, MAX); - #if HAS_K2_MAX - UPDATE_ENDSTOP_BIT(K2, MAX); - #else - COPY_LIVE_STATE(K_MAX, K2_MAX); - #endif + UPDATE_LIVE_STATE(K, MAX); #else - UPDATE_ENDSTOP_BIT(K, MAX); + UPDATE_LIVE_STATE(K, MAX); #endif #endif - #if HAS_U_MIN && !U_SPI_SENSORLESS + #if USE_U_MIN && !U_SPI_SENSORLESS #if ENABLED(U_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(U, MIN); - #if HAS_U2_MIN - UPDATE_ENDSTOP_BIT(U2, MIN); - #else - COPY_LIVE_STATE(U_MIN, U2_MIN); - #endif + UPDATE_LIVE_STATE(U, MIN); #else - UPDATE_ENDSTOP_BIT(U, MIN); + UPDATE_LIVE_STATE(U, MIN); #endif #endif - #if HAS_U_MAX && !U_SPI_SENSORLESS + #if USE_U_MAX && !U_SPI_SENSORLESS #if ENABLED(U_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(U, MAX); - #if HAS_U2_MAX - UPDATE_ENDSTOP_BIT(U2, MAX); - #else - COPY_LIVE_STATE(U_MAX, U2_MAX); - #endif + UPDATE_LIVE_STATE(U, MAX); #else - UPDATE_ENDSTOP_BIT(U, MAX); + UPDATE_LIVE_STATE(U, MAX); #endif #endif - #if HAS_V_MIN && !V_SPI_SENSORLESS + #if USE_V_MIN && !V_SPI_SENSORLESS #if ENABLED(V_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(V, MIN); - #if HAS_V2_MIN - UPDATE_ENDSTOP_BIT(V2, MIN); - #else - COPY_LIVE_STATE(V_MIN, V2_MIN); - #endif + UPDATE_LIVE_STATE(V, MIN); #else - UPDATE_ENDSTOP_BIT(V, MIN); + UPDATE_LIVE_STATE(V, MIN); #endif #endif - #if HAS_V_MAX && !V_SPI_SENSORLESS + #if USE_V_MAX && !V_SPI_SENSORLESS #if ENABLED(O_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(V, MAX); - #if HAS_V2_MAX - UPDATE_ENDSTOP_BIT(V2, MAX); - #else - COPY_LIVE_STATE(V_MAX, V2_MAX); - #endif + UPDATE_LIVE_STATE(V, MAX); #else - UPDATE_ENDSTOP_BIT(V, MAX); + UPDATE_LIVE_STATE(V, MAX); #endif #endif - #if HAS_W_MIN && !W_SPI_SENSORLESS + #if USE_W_MIN && !W_SPI_SENSORLESS #if ENABLED(W_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(W, MIN); - #if HAS_W2_MIN - UPDATE_ENDSTOP_BIT(W2, MIN); - #else - COPY_LIVE_STATE(W_MIN, W2_MIN); - #endif + UPDATE_LIVE_STATE(W, MIN); #else - UPDATE_ENDSTOP_BIT(W, MIN); + UPDATE_LIVE_STATE(W, MIN); #endif #endif - #if HAS_W_MAX && !W_SPI_SENSORLESS + #if USE_W_MAX && !W_SPI_SENSORLESS #if ENABLED(W_DUAL_ENDSTOPS) - UPDATE_ENDSTOP_BIT(W, MAX); - #if HAS_W2_MAX - UPDATE_ENDSTOP_BIT(W2, MAX); - #else - COPY_LIVE_STATE(W_MAX, W2_MAX); - #endif + UPDATE_LIVE_STATE(W, MAX); #else - UPDATE_ENDSTOP_BIT(W, MAX); + UPDATE_LIVE_STATE(W, MAX); #endif #endif @@ -850,7 +799,7 @@ void Endstops::update() { }while(0) // Core Sensorless Homing needs to test an Extra Pin - #define CORE_DIAG(QQ,A,MM) (CORE_IS_##QQ && A##_SENSORLESS && !A##_SPI_SENSORLESS && HAS_##A##_##MM) + #define CORE_DIAG(QQ,A,MM) (CORE_IS_##QQ && A##_SENSORLESS && !A##_SPI_SENSORLESS && USE_##A##_##MM) #define PROCESS_CORE_ENDSTOP(A1,M1,A2,M2) do { \ if (TEST_ENDSTOP(_ENDSTOP(A1,M1))) { \ _ENDSTOP_HIT(A2,M2); \ @@ -924,41 +873,43 @@ void Endstops::update() { // Signal, after validation, if an endstop limit is pressed or not - if (stepper.axis_is_moving(X_AXIS)) { - if (stepper.motor_direction(X_AXIS_HEAD)) { // -direction - #if HAS_X_MIN || (X_SPI_SENSORLESS && X_HOME_TO_MIN) - PROCESS_ENDSTOP_X(MIN); - #if CORE_DIAG(XY, Y, MIN) - PROCESS_CORE_ENDSTOP(Y,MIN,X,MIN); - #elif CORE_DIAG(XY, Y, MAX) - PROCESS_CORE_ENDSTOP(Y,MAX,X,MIN); - #elif CORE_DIAG(XZ, Z, MIN) - PROCESS_CORE_ENDSTOP(Z,MIN,X,MIN); - #elif CORE_DIAG(XZ, Z, MAX) - PROCESS_CORE_ENDSTOP(Z,MAX,X,MIN); + #if HAS_X_AXIS + if (stepper.axis_is_moving(X_AXIS)) { + if (!stepper.motor_direction(X_AXIS_HEAD)) { // -direction + #if USE_X_MIN || (X_SPI_SENSORLESS && X_HOME_TO_MIN) + PROCESS_ENDSTOP_X(MIN); + #if CORE_DIAG(XY, Y, MIN) + PROCESS_CORE_ENDSTOP(Y,MIN,X,MIN); + #elif CORE_DIAG(XY, Y, MAX) + PROCESS_CORE_ENDSTOP(Y,MAX,X,MIN); + #elif CORE_DIAG(XZ, Z, MIN) + PROCESS_CORE_ENDSTOP(Z,MIN,X,MIN); + #elif CORE_DIAG(XZ, Z, MAX) + PROCESS_CORE_ENDSTOP(Z,MAX,X,MIN); + #endif #endif - #endif - } - else { // +direction - #if HAS_X_MAX || (X_SPI_SENSORLESS && X_HOME_TO_MAX) - PROCESS_ENDSTOP_X(MAX); - #if CORE_DIAG(XY, Y, MIN) - PROCESS_CORE_ENDSTOP(Y,MIN,X,MAX); - #elif CORE_DIAG(XY, Y, MAX) - PROCESS_CORE_ENDSTOP(Y,MAX,X,MAX); - #elif CORE_DIAG(XZ, Z, MIN) - PROCESS_CORE_ENDSTOP(Z,MIN,X,MAX); - #elif CORE_DIAG(XZ, Z, MAX) - PROCESS_CORE_ENDSTOP(Z,MAX,X,MAX); + } + else { // +direction + #if USE_X_MAX || (X_SPI_SENSORLESS && X_HOME_TO_MAX) + PROCESS_ENDSTOP_X(MAX); + #if CORE_DIAG(XY, Y, MIN) + PROCESS_CORE_ENDSTOP(Y,MIN,X,MAX); + #elif CORE_DIAG(XY, Y, MAX) + PROCESS_CORE_ENDSTOP(Y,MAX,X,MAX); + #elif CORE_DIAG(XZ, Z, MIN) + PROCESS_CORE_ENDSTOP(Z,MIN,X,MAX); + #elif CORE_DIAG(XZ, Z, MAX) + PROCESS_CORE_ENDSTOP(Z,MAX,X,MAX); + #endif #endif - #endif + } } - } + #endif // HAS_X_AXIS #if HAS_Y_AXIS if (stepper.axis_is_moving(Y_AXIS)) { - if (stepper.motor_direction(Y_AXIS_HEAD)) { // -direction - #if HAS_Y_MIN || (Y_SPI_SENSORLESS && Y_HOME_TO_MIN) + if (!stepper.motor_direction(Y_AXIS_HEAD)) { // -direction + #if USE_Y_MIN || (Y_SPI_SENSORLESS && Y_HOME_TO_MIN) PROCESS_ENDSTOP_Y(MIN); #if CORE_DIAG(XY, X, MIN) PROCESS_CORE_ENDSTOP(X,MIN,Y,MIN); @@ -972,7 +923,7 @@ void Endstops::update() { #endif } else { // +direction - #if HAS_Y_MAX || (Y_SPI_SENSORLESS && Y_HOME_TO_MAX) + #if USE_Y_MAX || (Y_SPI_SENSORLESS && Y_HOME_TO_MAX) PROCESS_ENDSTOP_Y(MAX); #if CORE_DIAG(XY, X, MIN) PROCESS_CORE_ENDSTOP(X,MIN,Y,MAX); @@ -986,15 +937,15 @@ void Endstops::update() { #endif } } - #endif + #endif // HAS_Y_AXIS #if HAS_Z_AXIS if (stepper.axis_is_moving(Z_AXIS)) { - if (stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up. + if (!stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up. - #if HAS_Z_MIN || (Z_SPI_SENSORLESS && Z_HOME_TO_MIN) + #if USE_Z_MIN || (Z_SPI_SENSORLESS && Z_HOME_TO_MIN) if ( TERN1(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, z_probe_enabled) - && TERN1(USES_Z_MIN_PROBE_PIN, !z_probe_enabled) + && TERN1(USE_Z_MIN_PROBE, !z_probe_enabled) ) PROCESS_ENDSTOP_Z(MIN); #if CORE_DIAG(XZ, X, MIN) PROCESS_CORE_ENDSTOP(X,MIN,Z,MIN); @@ -1008,15 +959,15 @@ void Endstops::update() { #endif // When closing the gap check the enabled probe - #if USES_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN_PROBE); #endif } else { // Z +direction. Gantry up, bed down. - #if HAS_Z_MAX || (Z_SPI_SENSORLESS && Z_HOME_TO_MAX) + #if USE_Z_MAX || (Z_SPI_SENSORLESS && Z_HOME_TO_MAX) #if ENABLED(Z_MULTI_ENDSTOPS) PROCESS_ENDSTOP_Z(MAX); - #elif TERN1(USES_Z_MIN_PROBE_PIN, Z_MAX_PIN != Z_MIN_PROBE_PIN) // No probe or probe is Z_MIN || Probe is not Z_MAX + #elif TERN1(USE_Z_MIN_PROBE, Z_MAX_PIN != Z_MIN_PROBE_PIN) // No probe or probe is Z_MIN || Probe is not Z_MAX PROCESS_ENDSTOP(Z, MAX); #endif #if CORE_DIAG(XZ, X, MIN) @@ -1031,97 +982,97 @@ void Endstops::update() { #endif } } - #endif + #endif // HAS_Z_AXIS #if HAS_I_AXIS if (stepper.axis_is_moving(I_AXIS)) { - if (stepper.motor_direction(I_AXIS_HEAD)) { // -direction - #if HAS_I_MIN || (I_SPI_SENSORLESS && I_HOME_TO_MIN) + if (!stepper.motor_direction(I_AXIS_HEAD)) { // -direction + #if USE_I_MIN || (I_SPI_SENSORLESS && I_HOME_TO_MIN) PROCESS_ENDSTOP(I, MIN); #endif } else { // +direction - #if HAS_I_MAX || (I_SPI_SENSORLESS && I_HOME_TO_MAX) + #if USE_I_MAX || (I_SPI_SENSORLESS && I_HOME_TO_MAX) PROCESS_ENDSTOP(I, MAX); #endif } } - #endif + #endif // HAS_I_AXIS #if HAS_J_AXIS if (stepper.axis_is_moving(J_AXIS)) { - if (stepper.motor_direction(J_AXIS_HEAD)) { // -direction - #if HAS_J_MIN || (J_SPI_SENSORLESS && J_HOME_TO_MIN) + if (!stepper.motor_direction(J_AXIS_HEAD)) { // -direction + #if USE_J_MIN || (J_SPI_SENSORLESS && J_HOME_TO_MIN) PROCESS_ENDSTOP(J, MIN); #endif } else { // +direction - #if HAS_J_MAX || (J_SPI_SENSORLESS && J_HOME_TO_MAX) + #if USE_J_MAX || (J_SPI_SENSORLESS && J_HOME_TO_MAX) PROCESS_ENDSTOP(J, MAX); #endif } } - #endif + #endif // HAS_J_AXIS #if HAS_K_AXIS if (stepper.axis_is_moving(K_AXIS)) { - if (stepper.motor_direction(K_AXIS_HEAD)) { // -direction - #if HAS_K_MIN || (K_SPI_SENSORLESS && K_HOME_TO_MIN) + if (!stepper.motor_direction(K_AXIS_HEAD)) { // -direction + #if USE_K_MIN || (K_SPI_SENSORLESS && K_HOME_TO_MIN) PROCESS_ENDSTOP(K, MIN); #endif } else { // +direction - #if HAS_K_MAX || (K_SPI_SENSORLESS && K_HOME_TO_MAX) + #if USE_K_MAX || (K_SPI_SENSORLESS && K_HOME_TO_MAX) PROCESS_ENDSTOP(K, MAX); #endif } } - #endif + #endif // HAS_K_AXIS #if HAS_U_AXIS if (stepper.axis_is_moving(U_AXIS)) { - if (stepper.motor_direction(U_AXIS_HEAD)) { // -direction - #if HAS_U_MIN || (U_SPI_SENSORLESS && U_HOME_TO_MIN) + if (!stepper.motor_direction(U_AXIS_HEAD)) { // -direction + #if USE_U_MIN || (U_SPI_SENSORLESS && U_HOME_TO_MIN) PROCESS_ENDSTOP(U, MIN); #endif } else { // +direction - #if HAS_U_MAX || (U_SPI_SENSORLESS && U_HOME_TO_MAX) + #if USE_U_MAX || (U_SPI_SENSORLESS && U_HOME_TO_MAX) PROCESS_ENDSTOP(U, MAX); #endif } } - #endif + #endif // HAS_U_AXIS #if HAS_V_AXIS if (stepper.axis_is_moving(V_AXIS)) { - if (stepper.motor_direction(V_AXIS_HEAD)) { // -direction - #if HAS_V_MIN || (V_SPI_SENSORLESS && V_HOME_TO_MIN) + if (!stepper.motor_direction(V_AXIS_HEAD)) { // -direction + #if USE_V_MIN || (V_SPI_SENSORLESS && V_HOME_TO_MIN) PROCESS_ENDSTOP(V, MIN); #endif } else { // +direction - #if HAS_V_MAX || (V_SPI_SENSORLESS && V_HOME_TO_MAX) + #if USE_V_MAX || (V_SPI_SENSORLESS && V_HOME_TO_MAX) PROCESS_ENDSTOP(V, MAX); #endif } } - #endif + #endif // HAS_V_AXIS #if HAS_W_AXIS if (stepper.axis_is_moving(W_AXIS)) { - if (stepper.motor_direction(W_AXIS_HEAD)) { // -direction - #if HAS_W_MIN || (W_SPI_SENSORLESS && W_HOME_TO_MIN) + if (!stepper.motor_direction(W_AXIS_HEAD)) { // -direction + #if USE_W_MIN || (W_SPI_SENSORLESS && W_HOME_TO_MIN) PROCESS_ENDSTOP(W, MIN); #endif } else { // +direction - #if HAS_W_MAX || (W_SPI_SENSORLESS && W_HOME_TO_MAX) + #if USE_W_MAX || (W_SPI_SENSORLESS && W_HOME_TO_MAX) PROCESS_ENDSTOP(W, MAX); #endif } } - #endif + #endif // HAS_W_AXIS } // Endstops::update() #if ENABLED(SPI_ENDSTOPS) @@ -1188,11 +1139,11 @@ void Endstops::update() { void Endstops::clear_endstop_state() { TERN_(X_SPI_SENSORLESS, CBI(live_state, X_ENDSTOP)); - #if BOTH(X_SPI_SENSORLESS, X_DUAL_ENDSTOPS) + #if ALL(X_SPI_SENSORLESS, X_DUAL_ENDSTOPS) CBI(live_state, X2_ENDSTOP); #endif TERN_(Y_SPI_SENSORLESS, CBI(live_state, Y_ENDSTOP)); - #if BOTH(Y_SPI_SENSORLESS, Y_DUAL_ENDSTOPS) + #if ALL(Y_SPI_SENSORLESS, Y_DUAL_ENDSTOPS) CBI(live_state, Y2_ENDSTOP); #endif TERN_(Z_SPI_SENSORLESS, CBI(live_state, Z_ENDSTOP)); @@ -1227,91 +1178,91 @@ void Endstops::update() { #define ES_GET_STATE(S) if (READ_ENDSTOP(S##_PIN)) SBI(live_state_local, S) - #if HAS_X_MIN + #if USE_X_MIN ES_GET_STATE(X_MIN); #endif - #if HAS_X_MAX + #if USE_X_MAX ES_GET_STATE(X_MAX); #endif - #if HAS_Y_MIN + #if USE_Y_MIN ES_GET_STATE(Y_MIN); #endif - #if HAS_Y_MAX + #if USE_Y_MAX ES_GET_STATE(Y_MAX); #endif - #if HAS_Z_MIN + #if HAS_Z_MIN_PIN ES_GET_STATE(Z_MIN); #endif - #if HAS_Z_MAX + #if USE_Z_MAX ES_GET_STATE(Z_MAX); #endif - #if HAS_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE ES_GET_STATE(Z_MIN_PROBE); #endif - #if HAS_X2_MIN + #if USE_X2_MIN ES_GET_STATE(X2_MIN); #endif - #if HAS_X2_MAX + #if USE_X2_MAX ES_GET_STATE(X2_MAX); #endif - #if HAS_Y2_MIN + #if USE_Y2_MIN ES_GET_STATE(Y2_MIN); #endif - #if HAS_Y2_MAX + #if USE_Y2_MAX ES_GET_STATE(Y2_MAX); #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN ES_GET_STATE(Z2_MIN); #endif - #if HAS_Z2_MAX + #if USE_Z2_MAX ES_GET_STATE(Z2_MAX); #endif - #if HAS_Z3_MIN + #if USE_Z3_MIN ES_GET_STATE(Z3_MIN); #endif - #if HAS_Z3_MAX + #if USE_Z3_MAX ES_GET_STATE(Z3_MAX); #endif - #if HAS_Z4_MIN + #if USE_Z4_MIN ES_GET_STATE(Z4_MIN); #endif - #if HAS_Z4_MAX + #if USE_Z4_MAX ES_GET_STATE(Z4_MAX); #endif - #if HAS_I_MAX + #if USE_I_MAX ES_GET_STATE(I_MAX); #endif - #if HAS_I_MIN + #if USE_I_MIN ES_GET_STATE(I_MIN); #endif - #if HAS_J_MAX + #if USE_J_MAX ES_GET_STATE(J_MAX); #endif - #if HAS_J_MIN + #if USE_J_MIN ES_GET_STATE(J_MIN); #endif - #if HAS_K_MAX + #if USE_K_MAX ES_GET_STATE(K_MAX); #endif - #if HAS_K_MIN + #if USE_K_MIN ES_GET_STATE(K_MIN); #endif - #if HAS_U_MAX + #if USE_U_MAX ES_GET_STATE(U_MAX); #endif - #if HAS_U_MIN + #if USE_U_MIN ES_GET_STATE(U_MIN); #endif - #if HAS_V_MAX + #if USE_V_MAX ES_GET_STATE(V_MAX); #endif - #if HAS_V_MIN + #if USE_V_MIN ES_GET_STATE(V_MIN); #endif - #if HAS_W_MAX + #if USE_W_MAX ES_GET_STATE(W_MAX); #endif - #if HAS_W_MIN + #if USE_W_MIN ES_GET_STATE(W_MIN); #endif @@ -1319,91 +1270,91 @@ void Endstops::update() { #define ES_REPORT_CHANGE(S) if (TEST(endstop_change, S)) SERIAL_ECHOPGM(" " STRINGIFY(S) ":", TEST(live_state_local, S)) if (endstop_change) { - #if HAS_X_MIN + #if USE_X_MIN ES_REPORT_CHANGE(X_MIN); #endif - #if HAS_X_MAX + #if USE_X_MAX ES_REPORT_CHANGE(X_MAX); #endif - #if HAS_Y_MIN + #if USE_Y_MIN ES_REPORT_CHANGE(Y_MIN); #endif - #if HAS_Y_MAX + #if USE_Y_MAX ES_REPORT_CHANGE(Y_MAX); #endif - #if HAS_Z_MIN + #if USE_Z_MIN ES_REPORT_CHANGE(Z_MIN); #endif - #if HAS_Z_MAX + #if USE_Z_MAX ES_REPORT_CHANGE(Z_MAX); #endif - #if HAS_Z_MIN_PROBE_PIN + #if USE_Z_MIN_PROBE ES_REPORT_CHANGE(Z_MIN_PROBE); #endif - #if HAS_X2_MIN + #if USE_X2_MIN ES_REPORT_CHANGE(X2_MIN); #endif - #if HAS_X2_MAX + #if USE_X2_MAX ES_REPORT_CHANGE(X2_MAX); #endif - #if HAS_Y2_MIN + #if USE_Y2_MIN ES_REPORT_CHANGE(Y2_MIN); #endif - #if HAS_Y2_MAX + #if USE_Y2_MAX ES_REPORT_CHANGE(Y2_MAX); #endif - #if HAS_Z2_MIN + #if USE_Z2_MIN ES_REPORT_CHANGE(Z2_MIN); #endif - #if HAS_Z2_MAX + #if USE_Z2_MAX ES_REPORT_CHANGE(Z2_MAX); #endif - #if HAS_Z3_MIN + #if USE_Z3_MIN ES_REPORT_CHANGE(Z3_MIN); #endif - #if HAS_Z3_MAX + #if USE_Z3_MAX ES_REPORT_CHANGE(Z3_MAX); #endif - #if HAS_Z4_MIN + #if USE_Z4_MIN ES_REPORT_CHANGE(Z4_MIN); #endif - #if HAS_Z4_MAX + #if USE_Z4_MAX ES_REPORT_CHANGE(Z4_MAX); #endif - #if HAS_I_MIN + #if USE_I_MIN ES_REPORT_CHANGE(I_MIN); #endif - #if HAS_I_MAX + #if USE_I_MAX ES_REPORT_CHANGE(I_MAX); #endif - #if HAS_J_MIN + #if USE_J_MIN ES_REPORT_CHANGE(J_MIN); #endif - #if HAS_J_MAX + #if USE_J_MAX ES_REPORT_CHANGE(J_MAX); #endif - #if HAS_K_MIN + #if USE_K_MIN ES_REPORT_CHANGE(K_MIN); #endif - #if HAS_K_MAX + #if USE_K_MAX ES_REPORT_CHANGE(K_MAX); #endif - #if HAS_U_MIN + #if USE_U_MIN ES_REPORT_CHANGE(U_MIN); #endif - #if HAS_U_MAX + #if USE_U_MAX ES_REPORT_CHANGE(U_MAX); #endif - #if HAS_V_MIN + #if USE_V_MIN ES_REPORT_CHANGE(V_MIN); #endif - #if HAS_V_MAX + #if USE_V_MAX ES_REPORT_CHANGE(V_MAX); #endif - #if HAS_W_MIN + #if USE_W_MIN ES_REPORT_CHANGE(W_MIN); #endif - #if HAS_W_MAX + #if USE_W_MAX ES_REPORT_CHANGE(W_MAX); #endif @@ -1475,6 +1426,6 @@ void Endstops::update() { safe_delay(SENSORLESS_STALLGUARD_DELAY); // Short delay needed to settle #endif - #endif // XYZ + #endif } -#endif +#endif // USE_SENSORLESS diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index 9e942dc18e..d348e58ab7 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -28,58 +28,68 @@ #include "../inc/MarlinConfig.h" #include -#define __ES_ITEM(N) N, -#define _ES_ITEM(K,N) TERN_(K,DEFER4(__ES_ITEM)(N)) +#define _ES_ENUM(A,M) A##_##M +#define ES_ENUM(A,M) _ES_ENUM(A,M) + +#define _ES_ITEM(N) N, +#define ES_ITEM(K,N) TERN_(K,DEFER4(_ES_ITEM)(N)) /** * Basic Endstop Flag Bits: - * - Each axis gets one endstop flag bit based on the homing direction (e.g., "EndstopEnum::X_MIN"). + * - Each axis with an endstop gets a flag for its homing direction. * (The use of "MIN" or "MAX" makes it easier to pair with similarly-named endstop pins.) - * - Multi-stepper axes can optionally enable endstops for all axis steppers. - * - The bed probe gets a 'Z_PROBE' flag bit (but DELTA sensorless probing uses 3 endstops). + * - Bed probes with a single pin get a Z_MIN_PROBE flag. This includes Sensorless Z Probe. + * + * Extended Flag Bits: + * - Multi-stepper axes may have multi-endstops such as X2_MIN, Y2_MAX, etc. + * - DELTA gets X_MAX, Y_MAX, and Z_MAX corresponding to its "A", "B", "C" towers. + * - For DUAL_X_CARRIAGE the X axis has both X_MIN and X_MAX flags. + * - The Z axis may have both MIN and MAX when homing to MAX and the probe is Z_MIN. + * - DELTA Sensorless Probe uses X/Y/Z_MAX but sets the Z_MIN flag. * * Endstop Flag Bit Aliases: * - Each *_MIN or *_MAX flag is aliased to *_ENDSTOP. - * - 'Z_ENDSTOP' is aliased to 'Z_PROBE' if homing with the probe. + * - Z_MIN_PROBE is an alias to Z_MIN when the Z_MIN_PIN is being used as the probe pin. + * - When homing with the probe Z_ENDSTOP is a Z_MIN_PROBE alias, otherwise a Z_MIN/MAX alias. */ enum EndstopEnum : char { - // Common XYZ (ABC) endstops. Defined according to USE_[XYZ](MIN|MAX)_PLUG settings. - _ES_ITEM(HAS_X_MIN, X_MIN) _ES_ITEM(HAS_X_MAX, X_MAX) - _ES_ITEM(HAS_Y_MIN, Y_MIN) _ES_ITEM(HAS_Y_MAX, Y_MAX) - _ES_ITEM(HAS_Z_MIN, Z_MIN) _ES_ITEM(HAS_Z_MAX, Z_MAX) - _ES_ITEM(HAS_I_MIN, I_MIN) _ES_ITEM(HAS_I_MAX, I_MAX) - _ES_ITEM(HAS_J_MIN, J_MIN) _ES_ITEM(HAS_J_MAX, J_MAX) - _ES_ITEM(HAS_K_MIN, K_MIN) _ES_ITEM(HAS_K_MAX, K_MAX) - _ES_ITEM(HAS_U_MIN, U_MIN) _ES_ITEM(HAS_U_MAX, U_MAX) - _ES_ITEM(HAS_V_MIN, V_MIN) _ES_ITEM(HAS_V_MAX, V_MAX) - _ES_ITEM(HAS_W_MIN, W_MIN) _ES_ITEM(HAS_W_MAX, W_MAX) + // Common XYZ (ABC) endstops. + ES_ITEM(USE_X_MIN, X_MIN) ES_ITEM(USE_X_MAX, X_MAX) + ES_ITEM(USE_Y_MIN, Y_MIN) ES_ITEM(USE_Y_MAX, Y_MAX) + ES_ITEM(USE_Z_MIN, Z_MIN) ES_ITEM(USE_Z_MAX, Z_MAX) + ES_ITEM(USE_I_MIN, I_MIN) ES_ITEM(USE_I_MAX, I_MAX) + ES_ITEM(USE_J_MIN, J_MIN) ES_ITEM(USE_J_MAX, J_MAX) + ES_ITEM(USE_K_MIN, K_MIN) ES_ITEM(USE_K_MAX, K_MAX) + ES_ITEM(USE_U_MIN, U_MIN) ES_ITEM(USE_U_MAX, U_MAX) + ES_ITEM(USE_V_MIN, V_MIN) ES_ITEM(USE_V_MAX, V_MAX) + ES_ITEM(USE_W_MIN, W_MIN) ES_ITEM(USE_W_MAX, W_MAX) // Extra Endstops for XYZ #if ENABLED(X_DUAL_ENDSTOPS) - _ES_ITEM(HAS_X_MIN, X2_MIN) _ES_ITEM(HAS_X_MAX, X2_MAX) + ES_ITEM(USE_X_MIN, X2_MIN) ES_ITEM(USE_X_MAX, X2_MAX) #endif #if ENABLED(Y_DUAL_ENDSTOPS) - _ES_ITEM(HAS_Y_MIN, Y2_MIN) _ES_ITEM(HAS_Y_MAX, Y2_MAX) + ES_ITEM(USE_Y_MIN, Y2_MIN) ES_ITEM(USE_Y_MAX, Y2_MAX) #endif #if ENABLED(Z_MULTI_ENDSTOPS) - _ES_ITEM(HAS_Z_MIN, Z2_MIN) _ES_ITEM(HAS_Z_MAX, Z2_MAX) + ES_ITEM(USE_Z_MIN, Z2_MIN) ES_ITEM(USE_Z_MAX, Z2_MAX) #if NUM_Z_STEPPERS >= 3 - _ES_ITEM(HAS_Z_MIN, Z3_MIN) _ES_ITEM(HAS_Z_MAX, Z3_MAX) + ES_ITEM(USE_Z_MIN, Z3_MIN) ES_ITEM(USE_Z_MAX, Z3_MAX) #if NUM_Z_STEPPERS >= 4 - _ES_ITEM(HAS_Z_MIN, Z4_MIN) _ES_ITEM(HAS_Z_MAX, Z4_MAX) + ES_ITEM(USE_Z_MIN, Z4_MIN) ES_ITEM(USE_Z_MAX, Z4_MAX) #endif #endif #endif // Bed Probe state is distinct or shared with Z_MIN (i.e., when the probe is the only Z endstop) #if !HAS_DELTA_SENSORLESS_PROBING - _ES_ITEM(HAS_BED_PROBE, Z_MIN_PROBE IF_DISABLED(USES_Z_MIN_PROBE_PIN, = Z_MIN)) + ES_ITEM(HAS_BED_PROBE, Z_MIN_PROBE IF_DISABLED(USE_Z_MIN_PROBE, = Z_MIN)) #endif // The total number of states NUM_ENDSTOP_STATES - // Endstops can be either MIN or MAX but not both + // Endstop aliased to MIN or MAX #if HAS_X_ENDSTOP , X_ENDSTOP = TERN(X_HOME_TO_MAX, X_MAX, X_MIN) #if ENABLED(X_DUAL_ENDSTOPS) @@ -126,8 +136,8 @@ enum EndstopEnum : char { #endif }; -#undef __ES_ITEM #undef _ES_ITEM +#undef ES_ITEM class Endstops { public: diff --git a/Marlin/src/module/ft_motion.cpp b/Marlin/src/module/ft_motion.cpp index dfef961c79..d3c4de8962 100644 --- a/Marlin/src/module/ft_motion.cpp +++ b/Marlin/src/module/ft_motion.cpp @@ -29,32 +29,28 @@ FxdTiCtrl fxdTiCtrl; +#if !HAS_X_AXIS + static_assert(FTM_DEFAULT_MODE == ftMotionMode_ZV, "ftMotionMode_ZV requires at least one linear axis."); + static_assert(FTM_DEFAULT_MODE == ftMotionMode_ZVD, "ftMotionMode_ZVD requires at least one linear axis."); + static_assert(FTM_DEFAULT_MODE == ftMotionMode_EI, "ftMotionMode_EI requires at least one linear axis."); + static_assert(FTM_DEFAULT_MODE == ftMotionMode_2HEI, "ftMotionMode_2HEI requires at least one linear axis."); + static_assert(FTM_DEFAULT_MODE == ftMotionMode_3HEI, "ftMotionMode_3HEI requires at least one linear axis."); + static_assert(FTM_DEFAULT_MODE == ftMotionMode_MZV, "ftMotionMode_MZV requires at least one linear axis."); +#endif +#if !HAS_DYNAMIC_FREQ_MM + static_assert(FTM_DEFAULT_DYNFREQ_MODE != dynFreqMode_Z_BASED, "dynFreqMode_Z_BASED requires a Z axis."); +#endif +#if !HAS_DYNAMIC_FREQ_G + static_assert(FTM_DEFAULT_DYNFREQ_MODE != dynFreqMode_MASS_BASED, "dynFreqMode_MASS_BASED requires an X axis and an extruder."); +#endif + //-----------------------------------------------------------------// // Variables. //-----------------------------------------------------------------// // Public variables. -ftMotionMode_t FxdTiCtrl::cfg_mode = FTM_DEFAULT_MODE; // Mode / active compensation mode configuration. - -#if HAS_EXTRUDERS - bool FxdTiCtrl::cfg_linearAdvEna = FTM_LINEAR_ADV_DEFAULT_ENA; // Linear advance enable configuration. - float FxdTiCtrl::cfg_linearAdvK = FTM_LINEAR_ADV_DEFAULT_K; // Linear advance gain. -#endif - -dynFreqMode_t FxdTiCtrl::cfg_dynFreqMode = FTM_DEFAULT_DYNFREQ_MODE; // Dynamic frequency mode configuration. -#if !HAS_Z_AXIS - static_assert(FTM_DEFAULT_DYNFREQ_MODE != dynFreqMode_Z_BASED, "dynFreqMode_Z_BASED requires a Z axis."); -#endif -#if !(HAS_X_AXIS && HAS_EXTRUDERS) - static_assert(FTM_DEFAULT_DYNFREQ_MODE != dynFreqMode_MASS_BASED, "dynFreqMode_MASS_BASED requires an X axis and an extruder."); -#endif - -#if HAS_X_AXIS - float FxdTiCtrl::cfg_baseFreq[] = { FTM_SHAPING_DEFAULT_X_FREQ // Base frequency. [Hz] - OPTARG(HAS_Y_AXIS, FTM_SHAPING_DEFAULT_Y_FREQ) }; - float FxdTiCtrl::cfg_dynFreqK[] = { 0.0f OPTARG(HAS_Y_AXIS, 0.0f) }; // Scaling / gain for dynamic frequency. [Hz/mm] or [Hz/g] -#endif +ft_config_t FxdTiCtrl::cfg; ft_command_t FxdTiCtrl::stepperCmdBuff[FTM_STEPPERCMD_BUFF_SIZE] = {0U}; // Buffer of stepper commands. hal_timer_t FxdTiCtrl::stepperCmdBuff_StepRelativeTi[FTM_STEPPERCMD_BUFF_SIZE] = {0U}; // Buffer of the stepper command timing. uint8_t FxdTiCtrl::stepperCmdBuff_ApplyDir[FTM_STEPPERCMD_DIR_SIZE] = {0U}; // Buffer of whether DIR needs to be updated. @@ -65,53 +61,25 @@ bool FxdTiCtrl::sts_stepperBusy = false; // The stepper buffer has item // Private variables. // NOTE: These are sized for Ulendo FBS use. -#if HAS_X_AXIS - float FxdTiCtrl::xd[2 * (FTM_BATCH_SIZE)], // = {0.0f} Storage for fixed-time-based trajectory. - FxdTiCtrl::xm[FTM_BATCH_SIZE]; // = {0.0f} Storage for modified fixed-time-based trajectory. -#endif -#if HAS_Y_AXIS - float FxdTiCtrl::yd[2 * (FTM_BATCH_SIZE)], FxdTiCtrl::ym[FTM_BATCH_SIZE]; -#endif -#if HAS_Z_AXIS - float FxdTiCtrl::zd[2 * (FTM_BATCH_SIZE)], FxdTiCtrl::zm[FTM_BATCH_SIZE]; -#endif -#if HAS_EXTRUDERS - float FxdTiCtrl::ed[2 * (FTM_BATCH_SIZE)], FxdTiCtrl::em[FTM_BATCH_SIZE]; -#endif +xyze_trajectory_t FxdTiCtrl::traj; // = {0.0f} Storage for fixed-time-based trajectory. +xyze_trajectoryMod_t FxdTiCtrl::trajMod; // = {0.0f} Storage for modified fixed-time-based trajectory. -block_t* FxdTiCtrl::current_block_cpy = nullptr; // Pointer to current block being processed. -bool FxdTiCtrl::blockProcRdy = false, // Indicates a block is ready to be processed. - FxdTiCtrl::blockProcRdy_z1 = false, // Storage for the previous indicator. - FxdTiCtrl::blockProcDn = false; // Indicates current block is done being processed. -bool FxdTiCtrl::batchRdy = false; // Indicates a batch of the fixed time trajectory - // has been generated, is now available in the upper - - // half of xd, yd, zd, ed vectors, and is ready to be - // post processed, if applicable, then interpolated. -bool FxdTiCtrl::batchRdyForInterp = false; // Indicates the batch is done being post processed, - // if applicable, and is ready to be converted to step commands. -bool FxdTiCtrl::runoutEna = false; // True if runout of the block hasn't been done and is allowed. +block_t* FxdTiCtrl::current_block_cpy = nullptr; // Pointer to current block being processed. +bool FxdTiCtrl::blockProcRdy = false, // Indicates a block is ready to be processed. + FxdTiCtrl::blockProcRdy_z1 = false, // Storage for the previous indicator. + FxdTiCtrl::blockProcDn = false; // Indicates current block is done being processed. +bool FxdTiCtrl::batchRdy = false; // Indicates a batch of the fixed time trajectory + // has been generated, is now available in the upper - + // half of traj.x[], y, z ... e vectors, and is ready to be + // post processed, if applicable, then interpolated. +bool FxdTiCtrl::batchRdyForInterp = false; // Indicates the batch is done being post processed, + // if applicable, and is ready to be converted to step commands. +bool FxdTiCtrl::runoutEna = false; // True if runout of the block hasn't been done and is allowed. // Trapezoid data variables. -#if HAS_X_AXIS - float FxdTiCtrl::x_startPosn, // (mm) Start position of block - FxdTiCtrl::x_endPosn_prevBlock = 0.0f, // (mm) Start position of block - FxdTiCtrl::x_Ratio; // (ratio) Axis move ratio of block -#endif -#if HAS_Y_AXIS - float FxdTiCtrl::y_startPosn, - FxdTiCtrl::y_endPosn_prevBlock = 0.0f, - FxdTiCtrl::y_Ratio; -#endif -#if HAS_Z_AXIS - float FxdTiCtrl::z_startPosn, - FxdTiCtrl::z_endPosn_prevBlock = 0.0f, - FxdTiCtrl::z_Ratio; -#endif -#if HAS_EXTRUDERS - float FxdTiCtrl::e_startPosn, - FxdTiCtrl::e_endPosn_prevBlock = 0.0f, - FxdTiCtrl::e_Ratio; -#endif +xyze_pos_t FxdTiCtrl::startPosn, // (mm) Start position of block + FxdTiCtrl::endPosn_prevBlock = { 0.0f }; // (mm) End position of previous block +xyze_float_t FxdTiCtrl::ratio; // (ratio) Axis move ratio of block float FxdTiCtrl::accel_P, // Acceleration prime of block. [mm/sec/sec] FxdTiCtrl::decel_P, // Deceleration prime of block. [mm/sec/sec] FxdTiCtrl::F_P, // Feedrate prime of block. [mm/sec] @@ -131,22 +99,8 @@ uint32_t FxdTiCtrl::makeVector_idx = 0, // Index of fixed ti FxdTiCtrl::makeVector_batchIdx = FTM_BATCH_SIZE; // Index of fixed time trajectory generation within the batch. // Interpolation variables. -#if HAS_X_AXIS - int32_t FxdTiCtrl::x_steps = 0; // Step count accumulator. - stepDirState_t FxdTiCtrl::x_dirState = stepDirState_NOT_SET; // Memory of the currently set step direction of the axis. -#endif -#if HAS_Y_AXIS - int32_t FxdTiCtrl::y_steps = 0; - stepDirState_t FxdTiCtrl::y_dirState = stepDirState_NOT_SET; -#endif -#if HAS_Z_AXIS - int32_t FxdTiCtrl::z_steps = 0; - stepDirState_t FxdTiCtrl::z_dirState = stepDirState_NOT_SET; -#endif -#if HAS_EXTRUDERS - int32_t FxdTiCtrl::e_steps = 0; - stepDirState_t FxdTiCtrl::e_dirState = stepDirState_NOT_SET; -#endif +xyze_long_t FxdTiCtrl::steps = { 0 }; // Step count accumulator. +xyze_stepDir_t FxdTiCtrl::dirState = LOGICAL_AXIS_ARRAY_1(stepDirState_NOT_SET); // Memory of the currently set step direction of the axis. uint32_t FxdTiCtrl::interpIdx = 0, // Index of current data point being interpolated. FxdTiCtrl::interpIdx_z1 = 0; // Storage for the previously calculated index above. @@ -154,16 +108,13 @@ hal_timer_t FxdTiCtrl::nextStepTicks = FTM_MIN_TICKS; // Accumulator for the nex // Shaping variables. #if HAS_X_AXIS - uint32_t FxdTiCtrl::xy_zi_idx = 0, // Index of storage in the data point delay vectors. - FxdTiCtrl::xy_max_i = 0; // Vector length for the selected shaper. - float FxdTiCtrl::xd_zi[FTM_ZMAX] = { 0.0f }; // Data point delay vector. - float FxdTiCtrl::x_Ai[5]; // Shaping gain vector. - uint32_t FxdTiCtrl::x_Ni[5]; // Shaping time index vector. -#endif -#if HAS_Y_AXIS - float FxdTiCtrl::yd_zi[FTM_ZMAX] = { 0.0f }; - float FxdTiCtrl::y_Ai[5]; - uint32_t FxdTiCtrl::y_Ni[5]; + FxdTiCtrl::shaping_t FxdTiCtrl::shaping = { + 0, 0, + x:{ { 0.0f }, { 0.0f }, { 0 } }, // d_zi, Ai, Ni + #if HAS_Y_AXIS + y:{ { 0.0f }, { 0.0f }, { 0 } } // d_zi, Ai, Ni + #endif + }; #endif #if HAS_EXTRUDERS @@ -192,14 +143,22 @@ void FxdTiCtrl::runoutBlock() { if (runoutEna && !batchRdy) { // If the window is full already (block intervals was a multiple of // the batch size), or runout is not enabled, no runout is needed. // Fill out the trajectory window with the last position calculated. - if (makeVector_batchIdx > FTM_BATCH_SIZE) { + if (makeVector_batchIdx > FTM_BATCH_SIZE) for (uint32_t i = makeVector_batchIdx; i < 2 * (FTM_BATCH_SIZE); i++) { - xd[i] = xd[makeVector_batchIdx - 1]; - TERN_(HAS_Y_AXIS, yd[i] = yd[makeVector_batchIdx - 1]); - TERN_(HAS_Y_AXIS, zd[i] = zd[makeVector_batchIdx - 1]); - TERN_(HAS_EXTRUDERS, ed[i] = ed[makeVector_batchIdx - 1]); + LOGICAL_AXIS_CODE( + traj.e[i] = traj.e[makeVector_batchIdx - 1], + traj.x[i] = traj.x[makeVector_batchIdx - 1], + traj.y[i] = traj.y[makeVector_batchIdx - 1], + traj.z[i] = traj.z[makeVector_batchIdx - 1], + traj.i[i] = traj.i[makeVector_batchIdx - 1], + traj.j[i] = traj.j[makeVector_batchIdx - 1], + traj.k[i] = traj.k[makeVector_batchIdx - 1], + traj.u[i] = traj.u[makeVector_batchIdx - 1], + traj.v[i] = traj.v[makeVector_batchIdx - 1], + traj.w[i] = traj.w[makeVector_batchIdx - 1] + ); } - } + makeVector_batchIdx = FTM_BATCH_SIZE; batchRdy = true; } @@ -209,10 +168,7 @@ void FxdTiCtrl::runoutBlock() { // Controller main, to be invoked from non-isr task. void FxdTiCtrl::loop() { - if (!cfg_mode) return; - - static bool initd = false; - if (!initd) { init(); initd = true; } + if (!cfg.mode) return; // Handle block abort with the following sequence: // 1. Zero out commands in stepper ISR. @@ -241,23 +197,28 @@ void FxdTiCtrl::loop() { // Call Ulendo FBS here. - memcpy(xm, &xd[FTM_BATCH_SIZE], sizeof(xm)); - TERN_(HAS_Y_AXIS, memcpy(ym, &yd[FTM_BATCH_SIZE], sizeof(ym))); + // Copy the uncompensated vectors. (XY done, other axes uncompensated) + LOGICAL_AXIS_CODE( + memcpy(trajMod.e, &traj.e[FTM_BATCH_SIZE], sizeof(trajMod.e)), + memcpy(trajMod.x, &traj.x[FTM_BATCH_SIZE], sizeof(trajMod.x)), + memcpy(trajMod.y, &traj.y[FTM_BATCH_SIZE], sizeof(trajMod.y)), + memcpy(trajMod.z, &traj.z[FTM_BATCH_SIZE], sizeof(trajMod.z)), + memcpy(trajMod.i, &traj.i[FTM_BATCH_SIZE], sizeof(trajMod.i)), + memcpy(trajMod.j, &traj.j[FTM_BATCH_SIZE], sizeof(trajMod.j)), + memcpy(trajMod.k, &traj.k[FTM_BATCH_SIZE], sizeof(trajMod.k)), + memcpy(trajMod.u, &traj.u[FTM_BATCH_SIZE], sizeof(trajMod.u)), + memcpy(trajMod.v, &traj.v[FTM_BATCH_SIZE], sizeof(trajMod.v)), + memcpy(trajMod.w, &traj.w[FTM_BATCH_SIZE], sizeof(trajMod.w)) + ); - // Done compensating ... + // Shift the time series back in the window for (shaped) X and Y + TERN_(HAS_X_AXIS, memcpy(traj.x, &traj.x[FTM_BATCH_SIZE], sizeof(traj.x) / 2)); + TERN_(HAS_Y_AXIS, memcpy(traj.y, &traj.y[FTM_BATCH_SIZE], sizeof(traj.y) / 2)); - // Copy the uncompensated vectors. - TERN_(HAS_Z_AXIS, memcpy(zm, &zd[FTM_BATCH_SIZE], sizeof(zm))); - TERN_(HAS_EXTRUDERS, memcpy(em, &ed[FTM_BATCH_SIZE], sizeof(em))); + // Z...W and E Disabled! Uncompensated so the lower half is not used. + //TERN_(HAS_Z_AXIS, memcpy(&traj.z[0], &traj.z[FTM_BATCH_SIZE], sizeof(traj.z) / 2)); - // Shift the time series back in the window. - memcpy(xd, &xd[FTM_BATCH_SIZE], sizeof(xd) / 2); - TERN_(HAS_Y_AXIS, memcpy(yd, &yd[FTM_BATCH_SIZE], sizeof(yd) / 2)); - // Disabled by comment as these are uncompensated, the lower half is not used. - //TERN_(HAS_Z_AXIS, memcpy(zd, &zd[FTM_BATCH_SIZE], (sizeof(zd) / 2))); - //TERN_(HAS_EXTRUDERS, memcpy(ed, &ed[FTM_BATCH_SIZE], (sizeof(ed) / 2))); - - // ... data is ready in xm, ym, zm, em. + // ... data is ready in trajMod. batchRdyForInterp = true; batchRdy = false; // Clear so that makeVector() may resume generating points. @@ -289,134 +250,119 @@ void FxdTiCtrl::loop() { // Refresh the gains used by shaping functions. // To be called on init or mode or zeta change. - void FxdTiCtrl::updateShapingA(const_float_t zeta/*=FTM_SHAPING_ZETA*/, const_float_t vtol/*=FTM_SHAPING_V_TOL*/) { - const float K = exp( -zeta * PI / sqrt(1.0f - sq(zeta)) ), + void FxdTiCtrl::Shaping::updateShapingA(const_float_t zeta/*=FTM_SHAPING_ZETA*/, const_float_t vtol/*=FTM_SHAPING_V_TOL*/) { + + const float K = exp(-zeta * M_PI / sqrt(1.0f - sq(zeta))), K2 = sq(K); - switch (cfg_mode) { + switch (cfg.mode) { case ftMotionMode_ZV: - xy_max_i = 1U; - x_Ai[0] = 1.0f / (1.0f + K); - x_Ai[1] = x_Ai[0] * K; + max_i = 1U; + x.Ai[0] = 1.0f / (1.0f + K); + x.Ai[1] = x.Ai[0] * K; break; case ftMotionMode_ZVD: - xy_max_i = 2U; - x_Ai[0] = 1.0f / ( 1.0f + 2.0f * K + K2 ); - x_Ai[1] = x_Ai[0] * 2.0f * K; - x_Ai[2] = x_Ai[0] * K2; + max_i = 2U; + x.Ai[0] = 1.0f / ( 1.0f + 2.0f * K + K2 ); + x.Ai[1] = x.Ai[0] * 2.0f * K; + x.Ai[2] = x.Ai[0] * K2; break; case ftMotionMode_EI: { - xy_max_i = 2U; - x_Ai[0] = 0.25f * (1.0f + vtol); - x_Ai[1] = 0.50f * (1.0f - vtol) * K; - x_Ai[2] = x_Ai[0] * K2; - const float A_adj = 1.0f / (x_Ai[0] + x_Ai[1] + x_Ai[2]); - for (uint32_t i = 0U; i < 3U; i++) { x_Ai[i] *= A_adj; } + max_i = 2U; + x.Ai[0] = 0.25f * (1.0f + vtol); + x.Ai[1] = 0.50f * (1.0f - vtol) * K; + x.Ai[2] = x.Ai[0] * K2; + const float A_adj = 1.0f / (x.Ai[0] + x.Ai[1] + x.Ai[2]); + for (uint32_t i = 0U; i < 3U; i++) { x.Ai[i] *= A_adj; } } break; case ftMotionMode_2HEI: { - xy_max_i = 3U; + max_i = 3U; const float vtol2 = sq(vtol); const float X = pow(vtol2 * (sqrt(1.0f - vtol2) + 1.0f), 1.0f / 3.0f); - x_Ai[0] = ( 3.0f * sq(X) + 2.0f * X + 3.0f * vtol2 ) / (16.0f * X); - x_Ai[1] = ( 0.5f - x_Ai[0] ) * K; - x_Ai[2] = x_Ai[1] * K; - x_Ai[3] = x_Ai[0] * cu(K); - const float A_adj = 1.0f / (x_Ai[0] + x_Ai[1] + x_Ai[2] + x_Ai[3]); - for (uint32_t i = 0U; i < 4U; i++) { x_Ai[i] *= A_adj; } + x.Ai[0] = ( 3.0f * sq(X) + 2.0f * X + 3.0f * vtol2 ) / (16.0f * X); + x.Ai[1] = ( 0.5f - x.Ai[0] ) * K; + x.Ai[2] = x.Ai[1] * K; + x.Ai[3] = x.Ai[0] * cu(K); + const float A_adj = 1.0f / (x.Ai[0] + x.Ai[1] + x.Ai[2] + x.Ai[3]); + for (uint32_t i = 0U; i < 4U; i++) { x.Ai[i] *= A_adj; } } break; case ftMotionMode_3HEI: { - xy_max_i = 4U; - x_Ai[0] = 0.0625f * ( 1.0f + 3.0f * vtol + 2.0f * sqrt( 2.0f * ( vtol + 1.0f ) * vtol ) ); - x_Ai[1] = 0.25f * ( 1.0f - vtol ) * K; - x_Ai[2] = ( 0.5f * ( 1.0f + vtol ) - 2.0f * x_Ai[0] ) * K2; - x_Ai[3] = x_Ai[1] * K2; - x_Ai[4] = x_Ai[0] * sq(K2); - const float A_adj = 1.0f / (x_Ai[0] + x_Ai[1] + x_Ai[2] + x_Ai[3] + x_Ai[4]); - for (uint32_t i = 0U; i < 5U; i++) { x_Ai[i] *= A_adj; } + max_i = 4U; + x.Ai[0] = 0.0625f * ( 1.0f + 3.0f * vtol + 2.0f * sqrt( 2.0f * ( vtol + 1.0f ) * vtol ) ); + x.Ai[1] = 0.25f * ( 1.0f - vtol ) * K; + x.Ai[2] = ( 0.5f * ( 1.0f + vtol ) - 2.0f * x.Ai[0] ) * K2; + x.Ai[3] = x.Ai[1] * K2; + x.Ai[4] = x.Ai[0] * sq(K2); + const float A_adj = 1.0f / (x.Ai[0] + x.Ai[1] + x.Ai[2] + x.Ai[3] + x.Ai[4]); + for (uint32_t i = 0U; i < 5U; i++) { x.Ai[i] *= A_adj; } } break; case ftMotionMode_MZV: { - xy_max_i = 2U; + max_i = 2U; const float B = 1.4142135623730950488016887242097f * K; - x_Ai[0] = 1.0f / (1.0f + B + K2); - x_Ai[1] = x_Ai[0] * B; - x_Ai[2] = x_Ai[0] * K2; + x.Ai[0] = 1.0f / (1.0f + B + K2); + x.Ai[1] = x.Ai[0] * B; + x.Ai[2] = x.Ai[0] * K2; } break; default: - for (uint32_t i = 0U; i < 5U; i++) x_Ai[i] = 0.0f; - xy_max_i = 0; + for (uint32_t i = 0U; i < 5U; i++) x.Ai[i] = 0.0f; + max_i = 0; } #if HAS_Y_AXIS - memcpy(y_Ai, x_Ai, sizeof(x_Ai)); // For now, zeta and vtol are shared across x and y. + memcpy(y.Ai, x.Ai, sizeof(x.Ai)); // For now, zeta and vtol are shared across x and y. #endif } + void FxdTiCtrl::updateShapingA(const_float_t zeta/*=FTM_SHAPING_ZETA*/, const_float_t vtol/*=FTM_SHAPING_V_TOL*/) { + shaping.updateShapingA(zeta, vtol); + } + // Refresh the indices used by shaping functions. // To be called when frequencies change. - void FxdTiCtrl::updateShapingN(const_float_t xf OPTARG(HAS_Y_AXIS, const_float_t yf), const_float_t zeta/*=FTM_SHAPING_ZETA*/) { + void FxdTiCtrl::AxisShaping::updateShapingN(const_float_t f, const_float_t df) { // Protections omitted for DBZ and for index exceeding array length. - - const float df = sqrt(1.0f - sq(zeta)); - - switch (cfg_mode) { + switch (cfg.mode) { case ftMotionMode_ZV: - x_Ni[1] = round((0.5f / xf / df) * (FTM_FS)); - #if HAS_Y_AXIS - y_Ni[1] = round((0.5f / yf / df) * (FTM_FS)); - #endif + Ni[1] = round((0.5f / f / df) * (FTM_FS)); break; case ftMotionMode_ZVD: case ftMotionMode_EI: - x_Ni[1] = round((0.5f / xf / df) * (FTM_FS)); - x_Ni[2] = 2 * x_Ni[1]; - #if HAS_Y_AXIS - y_Ni[1] = round((0.5f / yf / df) * (FTM_FS)); - y_Ni[2] = 2 * y_Ni[1]; - #endif + Ni[1] = round((0.5f / f / df) * (FTM_FS)); + Ni[2] = Ni[1] + Ni[1]; break; case ftMotionMode_2HEI: - x_Ni[1] = round((0.5f / xf / df) * (FTM_FS)); - x_Ni[2] = 2 * x_Ni[1]; - x_Ni[3] = 3 * x_Ni[1]; - #if HAS_Y_AXIS - y_Ni[1] = round((0.5f / yf / df) * (FTM_FS)); - y_Ni[2] = 2 * y_Ni[1]; - y_Ni[3] = 3 * y_Ni[1]; - #endif + Ni[1] = round((0.5f / f / df) * (FTM_FS)); + Ni[2] = Ni[1] + Ni[1]; + Ni[3] = Ni[2] + Ni[1]; break; case ftMotionMode_3HEI: - x_Ni[1] = round((0.5f / xf / df) * (FTM_FS)); - x_Ni[2] = 2 * x_Ni[1]; - x_Ni[3] = 3 * x_Ni[1]; - x_Ni[4] = 4 * x_Ni[1]; - #if HAS_Y_AXIS - y_Ni[1] = round((0.5f / yf / df) * (FTM_FS)); - y_Ni[2] = 2 * y_Ni[1]; - y_Ni[3] = 3 * y_Ni[1]; - y_Ni[4] = 4 * y_Ni[1]; - #endif + Ni[1] = round((0.5f / f / df) * (FTM_FS)); + Ni[2] = Ni[1] + Ni[1]; + Ni[3] = Ni[2] + Ni[1]; + Ni[4] = Ni[3] + Ni[1]; break; case ftMotionMode_MZV: - x_Ni[1] = round((0.375f / xf / df) * (FTM_FS)); - x_Ni[2] = 2 * x_Ni[1]; - #if HAS_Y_AXIS - y_Ni[1] = round((0.375f / yf / df) * (FTM_FS)); - y_Ni[2] = 2 * y_Ni[1]; - #endif + Ni[1] = round((0.375f / f / df) * (FTM_FS)); + Ni[2] = Ni[1] + Ni[1]; break; - default: - for (uint32_t i = 0U; i < 5U; i++) { x_Ni[i] = 0; TERN_(HAS_Y_AXIS, y_Ni[i] = 0); } + default: ZERO(Ni); } } + void FxdTiCtrl::updateShapingN(const_float_t xf OPTARG(HAS_Y_AXIS, const_float_t yf), const_float_t zeta/*=FTM_SHAPING_ZETA*/) { + const float df = sqrt(1.0f - sq(zeta)); + shaping.x.updateShapingN(xf, df); + TERN_(HAS_Y_AXIS, shaping.y.updateShapingN(yf, df)); + } + #endif // HAS_X_AXIS // Reset all trajectory processing variables. @@ -424,39 +370,26 @@ void FxdTiCtrl::reset() { stepperCmdBuff_produceIdx = stepperCmdBuff_consumeIdx = 0; - for (uint32_t i = 0U; i < (FTM_BATCH_SIZE); i++) { // Reset trajectory history - TERN_(HAS_X_AXIS, xd[i] = 0.0f); - TERN_(HAS_Y_AXIS, yd[i] = 0.0f); - TERN_(HAS_Z_AXIS, zd[i] = 0.0f); - TERN_(HAS_EXTRUDERS, ed[i] = 0.0f); - } + traj.reset(); // Reset trajectory history blockProcRdy = blockProcRdy_z1 = blockProcDn = false; batchRdy = batchRdyForInterp = false; runoutEna = false; - TERN_(HAS_X_AXIS, x_endPosn_prevBlock = 0.0f); - TERN_(HAS_Y_AXIS, y_endPosn_prevBlock = 0.0f); - TERN_(HAS_Z_AXIS, z_endPosn_prevBlock = 0.0f); - TERN_(HAS_EXTRUDERS, e_endPosn_prevBlock = 0.0f); + endPosn_prevBlock.reset(); makeVector_idx = makeVector_idx_z1 = 0; makeVector_batchIdx = FTM_BATCH_SIZE; - TERN_(HAS_X_AXIS, x_steps = 0); - TERN_(HAS_Y_AXIS, y_steps = 0); - TERN_(HAS_Z_AXIS, z_steps = 0); - TERN_(HAS_EXTRUDERS, e_steps = 0); + steps.reset(); interpIdx = interpIdx_z1 = 0; - TERN_(HAS_X_AXIS, x_dirState = stepDirState_NOT_SET); - TERN_(HAS_Y_AXIS, y_dirState = stepDirState_NOT_SET); - TERN_(HAS_Z_AXIS, z_dirState = stepDirState_NOT_SET); - TERN_(HAS_EXTRUDERS, e_dirState = stepDirState_NOT_SET); + dirState = LOGICAL_AXIS_ARRAY_1(stepDirState_NOT_SET); nextStepTicks = FTM_MIN_TICKS; #if HAS_X_AXIS - for (uint32_t i = 0U; i < (FTM_ZMAX); i++) { xd_zi[i] = 0.0f; TERN_(HAS_Y_AXIS, yd_zi[i] = 0.0f); } - xy_zi_idx = 0; + for (uint32_t i = 0U; i < (FTM_ZMAX); i++) + shaping.x.d_zi[i] = TERN_(HAS_Y_AXIS, shaping.y.d_zi[i] =) 0.0f; + shaping.zi_idx = 0; #endif TERN_(HAS_EXTRUDERS, e_raw_z1 = e_advanced_z1 = 0.0f); @@ -472,8 +405,8 @@ uint32_t FxdTiCtrl::stepperCmdBuffItems() { // Initializes storage variables before startup. void FxdTiCtrl::init() { #if HAS_X_AXIS - updateShapingN(cfg_baseFreq[0] OPTARG(HAS_Y_AXIS, cfg_baseFreq[1])); - updateShapingA(FTM_SHAPING_ZETA, FTM_SHAPING_V_TOL); + refreshShapingN(); + updateShapingA(); #endif reset(); // Precautionary. } @@ -484,35 +417,36 @@ void FxdTiCtrl::loadBlockData(block_t * const current_block) { const float totalLength = current_block->millimeters, oneOverLength = 1.0f / totalLength; - const axis_bits_t direction = current_block->direction_bits; + const AxisBits direction = current_block->direction_bits; - #if HAS_X_AXIS - x_startPosn = x_endPosn_prevBlock; - float x_moveDist = current_block->steps.a / planner.settings.axis_steps_per_mm[X_AXIS]; - if (TEST(direction, X_AXIS)) x_moveDist *= -1.0f; - x_Ratio = x_moveDist * oneOverLength; - #endif + startPosn = endPosn_prevBlock; + xyze_pos_t moveDist = LOGICAL_AXIS_ARRAY( + current_block->steps.e / planner.settings.axis_steps_per_mm[E_AXIS_N(current_block->extruder)], + current_block->steps.x / planner.settings.axis_steps_per_mm[X_AXIS], + current_block->steps.y / planner.settings.axis_steps_per_mm[Y_AXIS], + current_block->steps.z / planner.settings.axis_steps_per_mm[Z_AXIS], + current_block->steps.i / planner.settings.axis_steps_per_mm[I_AXIS], + current_block->steps.j / planner.settings.axis_steps_per_mm[J_AXIS], + current_block->steps.k / planner.settings.axis_steps_per_mm[K_AXIS], + current_block->steps.u / planner.settings.axis_steps_per_mm[U_AXIS], + current_block->steps.v / planner.settings.axis_steps_per_mm[V_AXIS], + current_block->steps.w / planner.settings.axis_steps_per_mm[W_AXIS] + ); - #if HAS_Y_AXIS - y_startPosn = y_endPosn_prevBlock; - float y_moveDist = current_block->steps.b / planner.settings.axis_steps_per_mm[Y_AXIS]; - if (TEST(direction, Y_AXIS)) y_moveDist *= -1.0f; - y_Ratio = y_moveDist * oneOverLength; - #endif + LOGICAL_AXIS_CODE( + if (!direction.e) moveDist.e *= -1.0f, + if (!direction.x) moveDist.x *= -1.0f, + if (!direction.y) moveDist.y *= -1.0f, + if (!direction.z) moveDist.z *= -1.0f, + if (!direction.i) moveDist.i *= -1.0f, + if (!direction.j) moveDist.j *= -1.0f, + if (!direction.k) moveDist.k *= -1.0f, + if (!direction.u) moveDist.u *= -1.0f, + if (!direction.v) moveDist.v *= -1.0f, + if (!direction.w) moveDist.w *= -1.0f + ); - #if HAS_Z_AXIS - z_startPosn = z_endPosn_prevBlock; - float z_moveDist = current_block->steps.c / planner.settings.axis_steps_per_mm[Z_AXIS]; - if (TEST(direction, Z_AXIS)) z_moveDist *= -1.0f; - z_Ratio = z_moveDist * oneOverLength; - #endif - - #if HAS_EXTRUDERS - e_startPosn = e_endPosn_prevBlock; - float extrusion = current_block->steps.e / planner.settings.axis_steps_per_mm[E_AXIS_N(current_block->extruder)]; - if (TEST(direction, E_AXIS_N(current_block->extruder))) extrusion *= -1.0f; - e_Ratio = extrusion * oneOverLength; - #endif + ratio = moveDist * oneOverLength; const float spm = totalLength / current_block->step_event_count; // (steps/mm) Distance for each step f_s = spm * current_block->initial_rate; // (steps/s) Start feedrate @@ -529,7 +463,7 @@ void FxdTiCtrl::loadBlockData(block_t * const current_block) { odiff = oneby2a - oneby2d, // (i.e., oneby2a * 2) (mm/s) Change in speed for one second of acceleration ldiff = totalLength - fdiff; // (mm) Distance to travel if nominal speed is reached float T2 = (1.0f / F_n) * (ldiff - odiff * sq(F_n)); // (s) Coasting duration after nominal speed reached - if (T2 < 0.0f) { + if (T2 < 0.0f) { T2 = 0.0f; F_n = SQRT(ldiff / odiff); // Clip by intersection if nominal speed can't be reached. } @@ -571,79 +505,84 @@ void FxdTiCtrl::loadBlockData(block_t * const current_block) { // One less than (Accel + Coasting + Decel) datapoints max_intervals = N1 + N2 + N3 - 1U; - TERN_(HAS_X_AXIS, x_endPosn_prevBlock += x_moveDist); - TERN_(HAS_Y_AXIS, y_endPosn_prevBlock += y_moveDist); - TERN_(HAS_Z_AXIS, z_endPosn_prevBlock += z_moveDist); - TERN_(HAS_EXTRUDERS, e_endPosn_prevBlock += extrusion); + endPosn_prevBlock += moveDist; } // Generate data points of the trajectory. void FxdTiCtrl::makeVector() { - float accel_k = 0.0f; // (mm/s^2) Acceleration K factor - float tau = (makeVector_idx + 1) * (FTM_TS); // (s) Time since start of block - float dist = 0.0f; // (mm) Distance traveled + float accel_k = 0.0f; // (mm/s^2) Acceleration K factor + float tau = (makeVector_idx + 1) * (FTM_TS); // (s) Time since start of block + float dist = 0.0f; // (mm) Distance traveled if (makeVector_idx < N1) { // Acceleration phase - dist = (f_s * tau) + (0.5f * accel_P * sq(tau)); // (mm) Distance traveled for acceleration phase - accel_k = accel_P; // (mm/s^2) Acceleration K factor from Accel phase + dist = (f_s * tau) + (0.5f * accel_P * sq(tau)); // (mm) Distance traveled for acceleration phase + accel_k = accel_P; // (mm/s^2) Acceleration K factor from Accel phase } else if (makeVector_idx >= N1 && makeVector_idx < (N1 + N2)) { // Coasting phase - dist = s_1e + F_P * (tau - N1 * (FTM_TS)); // (mm) Distance traveled for coasting phase + dist = s_1e + F_P * (tau - N1 * (FTM_TS)); // (mm) Distance traveled for coasting phase //accel_k = 0.0f; } else { // Deceleration phase - const float tau_ = tau - (N1 + N2) * (FTM_TS); // (s) Time since start of decel phase + const float tau_ = tau - (N1 + N2) * (FTM_TS); // (s) Time since start of decel phase dist = s_2e + F_P * tau_ + 0.5f * decel_P * sq(tau_); // (mm) Distance traveled for deceleration phase accel_k = decel_P; // (mm/s^2) Acceleration K factor from Decel phase } - TERN_(HAS_X_AXIS, xd[makeVector_batchIdx] = x_startPosn + x_Ratio * dist); // (mm) X position for this datapoint - TERN_(HAS_Y_AXIS, yd[makeVector_batchIdx] = y_startPosn + y_Ratio * dist); // (mm) Y - TERN_(HAS_Z_AXIS, zd[makeVector_batchIdx] = z_startPosn + z_Ratio * dist); // (mm) Z + NUM_AXIS_CODE( + traj.x[makeVector_batchIdx] = startPosn.x + ratio.x * dist, + traj.y[makeVector_batchIdx] = startPosn.y + ratio.y * dist, + traj.z[makeVector_batchIdx] = startPosn.z + ratio.z * dist, + traj.i[makeVector_batchIdx] = startPosn.i + ratio.i * dist, + traj.j[makeVector_batchIdx] = startPosn.j + ratio.j * dist, + traj.k[makeVector_batchIdx] = startPosn.k + ratio.k * dist, + traj.u[makeVector_batchIdx] = startPosn.u + ratio.u * dist, + traj.v[makeVector_batchIdx] = startPosn.v + ratio.v * dist, + traj.w[makeVector_batchIdx] = startPosn.w + ratio.w * dist + ); #if HAS_EXTRUDERS - const float new_raw_z1 = e_startPosn + e_Ratio * dist; - if (cfg_linearAdvEna) { + const float new_raw_z1 = startPosn.e + ratio.e * dist; + if (cfg.linearAdvEna) { float dedt_adj = (new_raw_z1 - e_raw_z1) * (FTM_FS); - if (e_Ratio > 0.0f) dedt_adj += accel_k * cfg_linearAdvK; + if (ratio.e > 0.0f) dedt_adj += accel_k * cfg.linearAdvK; e_advanced_z1 += dedt_adj * (FTM_TS); - ed[makeVector_batchIdx] = e_advanced_z1; + traj.e[makeVector_batchIdx] = e_advanced_z1; e_raw_z1 = new_raw_z1; } else { - ed[makeVector_batchIdx] = new_raw_z1; - // Alternatively: coordArray_e[makeVector_batchIdx] = e_startDist + extrusion / (N1 + N2 + N3); + traj.e[makeVector_batchIdx] = new_raw_z1; + // Alternatively: ed[makeVector_batchIdx] = startPosn.e + (ratio.e * dist) / (N1 + N2 + N3); } #endif // Update shaping parameters if needed. - #if HAS_Z_AXIS + #if HAS_DYNAMIC_FREQ_MM static float zd_z1 = 0.0f; #endif - switch (cfg_dynFreqMode) { + switch (cfg.dynFreqMode) { - #if HAS_Z_AXIS + #if HAS_DYNAMIC_FREQ_MM case dynFreqMode_Z_BASED: - if (zd[makeVector_batchIdx] != zd_z1) { // Only update if Z changed. - const float xf = cfg_baseFreq[0] + cfg_dynFreqK[0] * zd[makeVector_batchIdx], - yf = cfg_baseFreq[1] + cfg_dynFreqK[1] * zd[makeVector_batchIdx]; + if (traj.z[makeVector_batchIdx] != zd_z1) { // Only update if Z changed. + const float xf = cfg.baseFreq[X_AXIS] + cfg.dynFreqK[X_AXIS] * traj.z[makeVector_batchIdx], + yf = cfg.baseFreq[Y_AXIS] + cfg.dynFreqK[Y_AXIS] * traj.z[makeVector_batchIdx]; updateShapingN(_MAX(xf, FTM_MIN_SHAPE_FREQ), _MAX(yf, FTM_MIN_SHAPE_FREQ)); - zd_z1 = zd[makeVector_batchIdx]; + zd_z1 = traj.z[makeVector_batchIdx]; } break; #endif - #if HAS_X_AXIS && HAS_EXTRUDERS + #if HAS_DYNAMIC_FREQ_G case dynFreqMode_MASS_BASED: // Update constantly. The optimization done for Z value makes // less sense for E, as E is expected to constantly change. - updateShapingN( cfg_baseFreq[0] + cfg_dynFreqK[0] * ed[makeVector_batchIdx] - OPTARG(HAS_Y_AXIS, cfg_baseFreq[1] + cfg_dynFreqK[1] * ed[makeVector_batchIdx]) ); + updateShapingN( cfg.baseFreq[X_AXIS] + cfg.dynFreqK[X_AXIS] * traj.e[makeVector_batchIdx] + OPTARG(HAS_Y_AXIS, cfg.baseFreq[Y_AXIS] + cfg.dynFreqK[Y_AXIS] * traj.e[makeVector_batchIdx]) ); break; #endif @@ -652,22 +591,22 @@ void FxdTiCtrl::makeVector() { // Apply shaping if in mode. #if HAS_X_AXIS - if (WITHIN(cfg_mode, 10U, 19U)) { - xd_zi[xy_zi_idx] = xd[makeVector_batchIdx]; - xd[makeVector_batchIdx] *= x_Ai[0]; + if (cfg.modeHasShaper()) { + shaping.x.d_zi[shaping.zi_idx] = traj.x[makeVector_batchIdx]; + traj.x[makeVector_batchIdx] *= shaping.x.Ai[0]; #if HAS_Y_AXIS - yd_zi[xy_zi_idx] = yd[makeVector_batchIdx]; - yd[makeVector_batchIdx] *= y_Ai[0]; + shaping.y.d_zi[shaping.zi_idx] = traj.y[makeVector_batchIdx]; + traj.y[makeVector_batchIdx] *= shaping.y.Ai[0]; #endif - for (uint32_t i = 1U; i <= xy_max_i; i++) { - const uint32_t udiffx = xy_zi_idx - x_Ni[i]; - xd[makeVector_batchIdx] += x_Ai[i] * xd_zi[x_Ni[i] > xy_zi_idx ? (FTM_ZMAX) + udiffx : udiffx]; + for (uint32_t i = 1U; i <= shaping.max_i; i++) { + const uint32_t udiffx = shaping.zi_idx - shaping.x.Ni[i]; + traj.x[makeVector_batchIdx] += shaping.x.Ai[i] * shaping.x.d_zi[shaping.x.Ni[i] > shaping.zi_idx ? (FTM_ZMAX) + udiffx : udiffx]; #if HAS_Y_AXIS - const uint32_t udiffy = xy_zi_idx - y_Ni[i]; - yd[makeVector_batchIdx] += y_Ai[i] * yd_zi[y_Ni[i] > xy_zi_idx ? (FTM_ZMAX) + udiffy : udiffy]; + const uint32_t udiffy = shaping.zi_idx - shaping.y.Ni[i]; + traj.y[makeVector_batchIdx] += shaping.y.Ai[i] * shaping.y.d_zi[shaping.y.Ni[i] > shaping.zi_idx ? (FTM_ZMAX) + udiffy : udiffy]; #endif } - if (++xy_zi_idx == (FTM_ZMAX)) xy_zi_idx = 0; + if (++shaping.zi_idx == (FTM_ZMAX)) shaping.zi_idx = 0; } #endif @@ -688,57 +627,63 @@ void FxdTiCtrl::makeVector() { // Interpolates single data point to stepper commands. void FxdTiCtrl::convertToSteps(const uint32_t idx) { - #if HAS_X_AXIS - int32_t x_err_P = 0; - #endif - #if HAS_Y_AXIS - int32_t y_err_P = 0; - #endif - #if HAS_Z_AXIS - int32_t z_err_P = 0; - #endif - #if HAS_EXTRUDERS - int32_t e_err_P = 0; - #endif + xyze_long_t err_P = { 0 }; //#define STEPS_ROUNDING #if ENABLED(STEPS_ROUNDING) - #if HAS_X_AXIS - const float x_steps_tar = xm[idx] * planner.settings.axis_steps_per_mm[X_AXIS] + (xm[idx] < 0.0f ? -0.5f : 0.5f); // May be eliminated if guaranteed positive. - const int32_t x_delta = int32_t(x_steps_tar) - x_steps; - #endif - #if HAS_Y_AXIS - const float y_steps_tar = ym[idx] * planner.settings.axis_steps_per_mm[Y_AXIS] + (ym[idx] < 0.0f ? -0.5f : 0.5f); - const int32_t y_delta = int32_t(y_steps_tar) - y_steps; - #endif - #if HAS_Z_AXIS - const float z_steps_tar = zm[idx] * planner.settings.axis_steps_per_mm[Z_AXIS] + (zm[idx] < 0.0f ? -0.5f : 0.5f); - const int32_t z_delta = int32_t(z_steps_tar) - z_steps; - #endif - #if HAS_EXTRUDERS - const float e_steps_tar = em[idx] * planner.settings.axis_steps_per_mm[E_AXIS] + (em[idx] < 0.0f ? -0.5f : 0.5f); - const int32_t e_delta = int32_t(e_steps_tar) - e_steps; - #endif + const xyze_float_t steps_tar = LOGICAL_AXIS_ARRAY( + trajMod.e[idx] * planner.settings.axis_steps_per_mm[E_AXIS_N(current_block->extruder)] + (trajMod.e[idx] < 0.0f ? -0.5f : 0.5f), // May be eliminated if guaranteed positive. + trajMod.x[idx] * planner.settings.axis_steps_per_mm[X_AXIS] + (trajMod.x[idx] < 0.0f ? -0.5f : 0.5f), + trajMod.y[idx] * planner.settings.axis_steps_per_mm[Y_AXIS] + (trajMod.y[idx] < 0.0f ? -0.5f : 0.5f), + trajMod.z[idx] * planner.settings.axis_steps_per_mm[Z_AXIS] + (trajMod.z[idx] < 0.0f ? -0.5f : 0.5f), + trajMod.i[idx] * planner.settings.axis_steps_per_mm[I_AXIS] + (trajMod.i[idx] < 0.0f ? -0.5f : 0.5f), + trajMod.j[idx] * planner.settings.axis_steps_per_mm[J_AXIS] + (trajMod.j[idx] < 0.0f ? -0.5f : 0.5f), + trajMod.k[idx] * planner.settings.axis_steps_per_mm[K_AXIS] + (trajMod.k[idx] < 0.0f ? -0.5f : 0.5f), + trajMod.u[idx] * planner.settings.axis_steps_per_mm[U_AXIS] + (trajMod.u[idx] < 0.0f ? -0.5f : 0.5f), + trajMod.v[idx] * planner.settings.axis_steps_per_mm[V_AXIS] + (trajMod.v[idx] < 0.0f ? -0.5f : 0.5f), + trajMod.w[idx] * planner.settings.axis_steps_per_mm[W_AXIS] + (trajMod.w[idx] < 0.0f ? -0.5f : 0.5f), + ); + xyze_long_t delta = xyze_long_t(steps_tar) - steps; + //const xyze_long_t delta = LOGICAL_AXIS_ARRAY( + // int32_t(steps_tar.e) - steps.e, + // int32_t(steps_tar.x) - steps.x, + // int32_t(steps_tar.y) - steps.y, + // int32_t(steps_tar.z) - steps.z, + // int32_t(steps_tar.i) - steps.i, + // int32_t(steps_tar.j) - steps.j, + // int32_t(steps_tar.k) - steps.k, + // int32_t(steps_tar.u) - steps.u, + // int32_t(steps_tar.v) - steps.v, + // int32_t(steps_tar.w) - steps.w + //); #else - #if HAS_X_AXIS - const int32_t x_delta = int32_t(xm[idx] * planner.settings.axis_steps_per_mm[X_AXIS]) - x_steps; - #endif - #if HAS_Y_AXIS - const int32_t y_delta = int32_t(ym[idx] * planner.settings.axis_steps_per_mm[Y_AXIS]) - y_steps; - #endif - #if HAS_Z_AXIS - const int32_t z_delta = int32_t(zm[idx] * planner.settings.axis_steps_per_mm[Z_AXIS]) - z_steps; - #endif - #if HAS_EXTRUDERS - const int32_t e_delta = int32_t(em[idx] * planner.settings.axis_steps_per_mm[E_AXIS]) - e_steps; - #endif + xyze_long_t delta = LOGICAL_AXIS_ARRAY( + int32_t(trajMod.e[idx] * planner.settings.axis_steps_per_mm[E_AXIS_N(current_block->extruder)]) - steps.e, + int32_t(trajMod.x[idx] * planner.settings.axis_steps_per_mm[X_AXIS]) - steps.x, + int32_t(trajMod.y[idx] * planner.settings.axis_steps_per_mm[Y_AXIS]) - steps.y, + int32_t(trajMod.z[idx] * planner.settings.axis_steps_per_mm[Z_AXIS]) - steps.z, + int32_t(trajMod.i[idx] * planner.settings.axis_steps_per_mm[I_AXIS]) - steps.i, + int32_t(trajMod.j[idx] * planner.settings.axis_steps_per_mm[J_AXIS]) - steps.j, + int32_t(trajMod.k[idx] * planner.settings.axis_steps_per_mm[K_AXIS]) - steps.k, + int32_t(trajMod.u[idx] * planner.settings.axis_steps_per_mm[U_AXIS]) - steps.u, + int32_t(trajMod.v[idx] * planner.settings.axis_steps_per_mm[V_AXIS]) - steps.v, + int32_t(trajMod.w[idx] * planner.settings.axis_steps_per_mm[W_AXIS]) - steps.w + ); #endif bool any_dirChange = (false - || TERN0(HAS_X_AXIS, (x_delta > 0 && x_dirState != stepDirState_POS) || (x_delta < 0 && x_dirState != stepDirState_NEG)) - || TERN0(HAS_Y_AXIS, (y_delta > 0 && y_dirState != stepDirState_POS) || (y_delta < 0 && y_dirState != stepDirState_NEG)) - || TERN0(HAS_Z_AXIS, (z_delta > 0 && z_dirState != stepDirState_POS) || (z_delta < 0 && z_dirState != stepDirState_NEG)) - || TERN0(HAS_EXTRUDERS, (e_delta > 0 && e_dirState != stepDirState_POS) || (e_delta < 0 && e_dirState != stepDirState_NEG)) + LOGICAL_AXIS_GANG( + || (delta.e > 0 && dirState.e != stepDirState_POS) || (delta.e < 0 && dirState.e != stepDirState_NEG), + || (delta.x > 0 && dirState.x != stepDirState_POS) || (delta.x < 0 && dirState.x != stepDirState_NEG), + || (delta.y > 0 && dirState.y != stepDirState_POS) || (delta.y < 0 && dirState.y != stepDirState_NEG), + || (delta.z > 0 && dirState.z != stepDirState_POS) || (delta.z < 0 && dirState.z != stepDirState_NEG), + || (delta.i > 0 && dirState.i != stepDirState_POS) || (delta.i < 0 && dirState.i != stepDirState_NEG), + || (delta.j > 0 && dirState.j != stepDirState_POS) || (delta.j < 0 && dirState.j != stepDirState_NEG), + || (delta.k > 0 && dirState.k != stepDirState_POS) || (delta.k < 0 && dirState.k != stepDirState_NEG), + || (delta.u > 0 && dirState.u != stepDirState_POS) || (delta.u < 0 && dirState.u != stepDirState_NEG), + || (delta.v > 0 && dirState.v != stepDirState_POS) || (delta.v < 0 && dirState.v != stepDirState_NEG), + || (delta.w > 0 && dirState.w != stepDirState_POS) || (delta.w < 0 && dirState.w != stepDirState_NEG) + ) ); for (uint32_t i = 0U; i < (FTM_STEPS_PER_UNIT_TIME); i++) { @@ -749,109 +694,48 @@ void FxdTiCtrl::convertToSteps(const uint32_t idx) { bool anyStep = false; + // Commands are written in a bitmask with step and dir as single bits + auto COMMAND_SET = [&](auto &d, auto &e, auto &s, auto &b, auto bd, auto bs) { + if (d >= 0) { + if (e + d < (FTM_CTS_COMPARE_VAL)) { + e += d; + } + else { + s++; + b |= bd | bs; + e += d - (FTM_STEPS_PER_UNIT_TIME); + anyStep = true; + } + } + else { + if ((e + d) > -(FTM_CTS_COMPARE_VAL)) { + e += d; + } + else { + s--; + b |= bs; + e += d + (FTM_STEPS_PER_UNIT_TIME); + anyStep = true; + } + } + }; + + // Init all step/dir bits to 0 (defaulting to reverse/negative motion) stepperCmdBuff[stepperCmdBuff_produceIdx] = 0; - // Commands are written in the format: - // |X_step|X_direction|Y_step|Y_direction|Z_step|Z_direction|E_step|E_direction| - #if HAS_X_AXIS - if (x_delta >= 0) { - if ((x_err_P + x_delta) < (FTM_CTS_COMPARE_VAL)) { - x_err_P += x_delta; - } - else { - x_steps++; - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_X) | _BV(FT_BIT_STEP_X); - x_err_P += x_delta - (FTM_STEPS_PER_UNIT_TIME); - anyStep = true; - } - } - else { - if ((x_err_P + x_delta) > -(FTM_CTS_COMPARE_VAL)) { - x_err_P += x_delta; - } - else { - x_steps--; - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_STEP_X); - x_err_P += x_delta + (FTM_STEPS_PER_UNIT_TIME); - anyStep = true; - } - } - #endif // HAS_X_AXIS - - #if HAS_Y_AXIS - if (y_delta >= 0) { - if ((y_err_P + y_delta) < (FTM_CTS_COMPARE_VAL)) { - y_err_P += y_delta; - } - else { - y_steps++; - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_Y) | _BV(FT_BIT_STEP_Y); - y_err_P += y_delta - (FTM_STEPS_PER_UNIT_TIME); - anyStep = true; - } - } - else { - if ((y_err_P + y_delta) > -(FTM_CTS_COMPARE_VAL)) { - y_err_P += y_delta; - } - else { - y_steps--; - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_STEP_Y); - y_err_P += y_delta + (FTM_STEPS_PER_UNIT_TIME); - anyStep = true; - } - } - #endif // HAS_Y_AXIS - - #if HAS_Z_AXIS - if (z_delta >= 0) { - if ((z_err_P + z_delta) < (FTM_CTS_COMPARE_VAL)) { - z_err_P += z_delta; - } - else { - z_steps++; - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_Z) | _BV(FT_BIT_STEP_Z); - z_err_P += z_delta - (FTM_STEPS_PER_UNIT_TIME); - anyStep = true; - } - } - else { - if ((z_err_P + z_delta) > -(FTM_CTS_COMPARE_VAL)) { - z_err_P += z_delta; - } - else { - z_steps--; - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_STEP_Z); - z_err_P += z_delta + (FTM_STEPS_PER_UNIT_TIME); - anyStep = true; - } - } - #endif // HAS_Z_AXIS - - #if HAS_EXTRUDERS - if (e_delta >= 0) { - if ((e_err_P + e_delta) < (FTM_CTS_COMPARE_VAL)) { - e_err_P += e_delta; - } - else { - e_steps++; - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_E) | _BV(FT_BIT_STEP_E); - e_err_P += e_delta - (FTM_STEPS_PER_UNIT_TIME); - anyStep = true; - } - } - else { - if ((e_err_P + e_delta) > -(FTM_CTS_COMPARE_VAL)) { - e_err_P += e_delta; - } - else { - e_steps--; - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_STEP_E); - e_err_P += e_delta + (FTM_STEPS_PER_UNIT_TIME); - anyStep = true; - } - } - #endif // HAS_EXTRUDERS + // Set up step/dir bits for all axes + LOGICAL_AXIS_CODE( + COMMAND_SET(delta.e, err_P.e, steps.e, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_E), _BV(FT_BIT_STEP_E)), + COMMAND_SET(delta.x, err_P.x, steps.x, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_X), _BV(FT_BIT_STEP_X)), + COMMAND_SET(delta.y, err_P.y, steps.y, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_Y), _BV(FT_BIT_STEP_Y)), + COMMAND_SET(delta.z, err_P.z, steps.z, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_Z), _BV(FT_BIT_STEP_Z)), + COMMAND_SET(delta.i, err_P.i, steps.i, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_I), _BV(FT_BIT_STEP_I)), + COMMAND_SET(delta.j, err_P.j, steps.j, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_J), _BV(FT_BIT_STEP_J)), + COMMAND_SET(delta.k, err_P.k, steps.k, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_K), _BV(FT_BIT_STEP_K)), + COMMAND_SET(delta.u, err_P.u, steps.u, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_U), _BV(FT_BIT_STEP_U)), + COMMAND_SET(delta.v, err_P.v, steps.v, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_V), _BV(FT_BIT_STEP_V)), + COMMAND_SET(delta.w, err_P.w, steps.w, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_W), _BV(FT_BIT_STEP_W)), + ); if (!anyStep) { nextStepTicks += (FTM_MIN_TICKS); @@ -862,46 +746,25 @@ void FxdTiCtrl::convertToSteps(const uint32_t idx) { const uint8_t dir_index = stepperCmdBuff_produceIdx >> 3, dir_bit = stepperCmdBuff_produceIdx & 0x7; if (any_dirChange) { + SBI(stepperCmdBuff_ApplyDir[dir_index], dir_bit); - #if HAS_X_AXIS - if (x_delta > 0) { - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_X); - x_dirState = stepDirState_POS; - } - else { - x_dirState = stepDirState_NEG; - } - #endif - #if HAS_Y_AXIS - if (y_delta > 0) { - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_Y); - y_dirState = stepDirState_POS; - } - else { - y_dirState = stepDirState_NEG; - } - #endif + auto DIR_SET = [&](auto &d, auto &c, auto &b, auto bd) { + if (d > 0) { b |= bd; c = stepDirState_POS; } else { c = stepDirState_NEG; } + }; - #if HAS_Z_AXIS - if (z_delta > 0) { - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_Z); - z_dirState = stepDirState_POS; - } - else { - z_dirState = stepDirState_NEG; - } - #endif - - #if HAS_EXTRUDERS - if (e_delta > 0) { - stepperCmdBuff[stepperCmdBuff_produceIdx] |= _BV(FT_BIT_DIR_E); - e_dirState = stepDirState_POS; - } - else { - e_dirState = stepDirState_NEG; - } - #endif + LOGICAL_AXIS_CODE( + DIR_SET(delta.e, dirState.e, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_E)), + DIR_SET(delta.x, dirState.x, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_X)), + DIR_SET(delta.y, dirState.y, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_Y)), + DIR_SET(delta.z, dirState.z, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_Z)), + DIR_SET(delta.i, dirState.i, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_I)), + DIR_SET(delta.j, dirState.j, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_J)), + DIR_SET(delta.k, dirState.k, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_K)), + DIR_SET(delta.u, dirState.u, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_U)), + DIR_SET(delta.v, dirState.v, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_V)), + DIR_SET(delta.w, dirState.w, stepperCmdBuff[stepperCmdBuff_produceIdx], _BV(FT_BIT_DIR_W)), + ); any_dirChange = false; } @@ -909,12 +772,10 @@ void FxdTiCtrl::convertToSteps(const uint32_t idx) { CBI(stepperCmdBuff_ApplyDir[dir_index], dir_bit); } - if (stepperCmdBuff_produceIdx == (FTM_STEPPERCMD_BUFF_SIZE) - 1) { + if (stepperCmdBuff_produceIdx == (FTM_STEPPERCMD_BUFF_SIZE) - 1) stepperCmdBuff_produceIdx = 0; - } - else { + else stepperCmdBuff_produceIdx++; - } nextStepTicks = FTM_MIN_TICKS; } diff --git a/Marlin/src/module/ft_motion.h b/Marlin/src/module/ft_motion.h index 6c5b6bf03b..f4be977786 100644 --- a/Marlin/src/module/ft_motion.h +++ b/Marlin/src/module/ft_motion.h @@ -28,20 +28,69 @@ #define FTM_STEPPERCMD_DIR_SIZE ((FTM_STEPPERCMD_BUFF_SIZE + 7) / 8) +#if HAS_X_AXIS && (HAS_Z_AXIS || HAS_EXTRUDERS) + #define HAS_DYNAMIC_FREQ 1 + #if HAS_Z_AXIS + #define HAS_DYNAMIC_FREQ_MM 1 + #endif + #if HAS_EXTRUDERS + #define HAS_DYNAMIC_FREQ_G 1 + #endif +#endif + +typedef struct FTConfig { + ftMotionMode_t mode = FTM_DEFAULT_MODE; // Mode / active compensation mode configuration. + + bool modeHasShaper() { return WITHIN(mode, 10U, 19U); } + + #if HAS_X_AXIS + float baseFreq[1 + ENABLED(HAS_Y_AXIS)] = // Base frequency. [Hz] + { FTM_SHAPING_DEFAULT_X_FREQ OPTARG(HAS_Y_AXIS, FTM_SHAPING_DEFAULT_Y_FREQ) }; + #endif + + #if HAS_DYNAMIC_FREQ + dynFreqMode_t dynFreqMode = FTM_DEFAULT_DYNFREQ_MODE; // Dynamic frequency mode configuration. + float dynFreqK[1 + ENABLED(HAS_Y_AXIS)] = { 0.0f }; // Scaling / gain for dynamic frequency. [Hz/mm] or [Hz/g] + #else + static constexpr dynFreqMode_t dynFreqMode = dynFreqMode_DISABLED; + #endif + + #if HAS_EXTRUDERS + bool linearAdvEna = FTM_LINEAR_ADV_DEFAULT_ENA; // Linear advance enable configuration. + float linearAdvK = FTM_LINEAR_ADV_DEFAULT_K; // Linear advance gain. + #endif +} ft_config_t; + class FxdTiCtrl { public: // Public variables - static ftMotionMode_t cfg_mode; // Mode / active compensation mode configuration. - static bool cfg_linearAdvEna; // Linear advance enable configuration. - static float cfg_linearAdvK; // Linear advance gain. - static dynFreqMode_t cfg_dynFreqMode; // Dynamic frequency mode configuration. + static ft_config_t cfg; - #if HAS_X_AXIS - static float cfg_baseFreq[1 + ENABLED(HAS_Y_AXIS)]; // Base frequency. [Hz] - static float cfg_dynFreqK[1 + ENABLED(HAS_Y_AXIS)]; // Scaling / gain for dynamic frequency. [Hz/mm] or [Hz/g] - #endif + static void set_defaults() { + cfg.mode = FTM_DEFAULT_MODE; + + TERN_(HAS_X_AXIS, cfg.baseFreq[X_AXIS] = FTM_SHAPING_DEFAULT_X_FREQ); + TERN_(HAS_Y_AXIS, cfg.baseFreq[Y_AXIS] = FTM_SHAPING_DEFAULT_Y_FREQ); + + #if HAS_DYNAMIC_FREQ + cfg.dynFreqMode = FTM_DEFAULT_DYNFREQ_MODE; + cfg.dynFreqK[X_AXIS] = TERN_(HAS_Y_AXIS, cfg.dynFreqK[Y_AXIS]) = 0.0f; + #endif + + #if HAS_EXTRUDERS + cfg.linearAdvEna = FTM_LINEAR_ADV_DEFAULT_ENA; + cfg.linearAdvK = FTM_LINEAR_ADV_DEFAULT_K; + #endif + + #if HAS_X_AXIS + refreshShapingN(); + updateShapingA(); + #endif + + reset(); + } static ft_command_t stepperCmdBuff[FTM_STEPPERCMD_BUFF_SIZE]; // Buffer of stepper commands. static hal_timer_t stepperCmdBuff_StepRelativeTi[FTM_STEPPERCMD_BUFF_SIZE]; // Buffer of the stepper command timing. @@ -53,6 +102,7 @@ class FxdTiCtrl { // Public methods + static void init(); static void startBlockProc(block_t * const current_block); // Set controller states to begin processing a block. static bool getBlockProcDn() { return blockProcDn; } // Return true if the controller no longer needs the current block. static void runoutBlock(); // Move any free data points to the stepper buffer even if a full batch isn't ready. @@ -67,24 +117,17 @@ class FxdTiCtrl { // Refresh the indices used by shaping functions. // To be called when frequencies change. static void updateShapingN(const_float_t xf OPTARG(HAS_Y_AXIS, const_float_t yf), const_float_t zeta=FTM_SHAPING_ZETA); + + static void refreshShapingN() { updateShapingN(cfg.baseFreq[X_AXIS] OPTARG(HAS_Y_AXIS, cfg.baseFreq[Y_AXIS])); } + #endif static void reset(); // Resets all states of the fixed time conversion to defaults. private: - #if HAS_X_AXIS - static float xd[2 * (FTM_BATCH_SIZE)], xm[FTM_BATCH_SIZE]; - #endif - #if HAS_Y_AXIS - static float yd[2 * (FTM_BATCH_SIZE)], ym[FTM_BATCH_SIZE]; - #endif - #if HAS_Z_AXIS - static float zd[2 * (FTM_BATCH_SIZE)], zm[FTM_BATCH_SIZE]; - #endif - #if HAS_EXTRUDERS - static float ed[2 * (FTM_BATCH_SIZE)], em[FTM_BATCH_SIZE]; - #endif + static xyze_trajectory_t traj; + static xyze_trajectoryMod_t trajMod; static block_t *current_block_cpy; static bool blockProcRdy, blockProcRdy_z1, blockProcDn; @@ -92,18 +135,9 @@ class FxdTiCtrl { static bool runoutEna; // Trapezoid data variables. - #if HAS_X_AXIS - static float x_startPosn, x_endPosn_prevBlock, x_Ratio; - #endif - #if HAS_Y_AXIS - static float y_startPosn, y_endPosn_prevBlock, y_Ratio; - #endif - #if HAS_Z_AXIS - static float z_startPosn, z_endPosn_prevBlock, z_Ratio; - #endif - #if HAS_EXTRUDERS - static float e_startPosn, e_endPosn_prevBlock, e_Ratio; - #endif + static xyze_pos_t startPosn, // (mm) Start position of block + endPosn_prevBlock; // (mm) End position of previous block + static xyze_float_t ratio; // (ratio) Axis move ratio of block static float accel_P, decel_P, F_P, f_s, @@ -121,37 +155,38 @@ class FxdTiCtrl { // Interpolation variables. static uint32_t interpIdx, interpIdx_z1; - #if HAS_X_AXIS - static int32_t x_steps; - static stepDirState_t x_dirState; - #endif - #if HAS_Y_AXIS - static int32_t y_steps; - static stepDirState_t y_dirState; - #endif - #if HAS_Z_AXIS - static int32_t z_steps; - static stepDirState_t z_dirState; - #endif - #if HAS_EXTRUDERS - static int32_t e_steps; - static stepDirState_t e_dirState; - #endif + + static xyze_long_t steps; + static xyze_stepDir_t dirState; static hal_timer_t nextStepTicks; - // Shaping variables. #if HAS_X_AXIS - static uint32_t xy_zi_idx, xy_max_i; - static float xd_zi[FTM_ZMAX]; - static float x_Ai[5]; - static uint32_t x_Ni[5]; - #endif - #if HAS_Y_AXIS - static float yd_zi[FTM_ZMAX]; - static float y_Ai[5]; - static uint32_t y_Ni[5]; - #endif + + typedef struct AxisShaping { + float d_zi[FTM_ZMAX] = { 0.0f }; // Data point delay vector. + float Ai[5]; // Shaping gain vector. + uint32_t Ni[5]; // Shaping time index vector. + + void updateShapingN(const_float_t f, const_float_t df); + + } axis_shaping_t; + + typedef struct Shaping { + uint32_t zi_idx, // Index of storage in the data point delay vectors. + max_i; // Vector length for the selected shaper. + axis_shaping_t x; + #if HAS_Y_AXIS + axis_shaping_t y; + #endif + + void updateShapingA(const_float_t zeta=FTM_SHAPING_ZETA, const_float_t vtol=FTM_SHAPING_V_TOL); + + } shaping_t; + + static shaping_t shaping; // Shaping data + + #endif // HAS_X_AXIS // Linear advance variables. #if HAS_EXTRUDERS @@ -160,7 +195,6 @@ class FxdTiCtrl { // Private methods static uint32_t stepperCmdBuffItems(); - static void init(); static void loadBlockData(block_t * const current_block); static void makeVector(); static void convertToSteps(const uint32_t idx); diff --git a/Marlin/src/module/ft_types.h b/Marlin/src/module/ft_types.h index 613e177a39..c4465bd37b 100644 --- a/Marlin/src/module/ft_types.h +++ b/Marlin/src/module/ft_types.h @@ -26,14 +26,14 @@ typedef enum FXDTICtrlMode : uint8_t { ftMotionMode_DISABLED = 0U, ftMotionMode_ENABLED = 1U, - ftMotionMode_ULENDO_FBS = 2U, + //ftMotionMode_ULENDO_FBS = 2U, ftMotionMode_ZV = 10U, ftMotionMode_ZVD = 11U, ftMotionMode_EI = 12U, ftMotionMode_2HEI = 13U, ftMotionMode_3HEI = 14U, ftMotionMode_MZV = 15U, - ftMotionMode_DISCTF = 20U + //ftMotionMode_DISCTF = 20U } ftMotionMode_t; enum dynFreqMode_t : uint8_t { @@ -42,17 +42,30 @@ enum dynFreqMode_t : uint8_t { dynFreqMode_MASS_BASED = 2U }; -enum stepDirState_t { +enum stepDirState_t : uint8_t { stepDirState_NOT_SET = 0U, stepDirState_POS = 1U, stepDirState_NEG = 2U }; +typedef struct XYZEarray xyze_trajectory_t; +typedef struct XYZEarray xyze_trajectoryMod_t; + +typedef struct XYZEval xyze_stepDir_t; + enum { - FT_BIT_DIR_E, FT_BIT_STEP_E, - FT_BIT_DIR_Z, FT_BIT_STEP_Z, - FT_BIT_DIR_Y, FT_BIT_STEP_Y, - FT_BIT_DIR_X, FT_BIT_STEP_X, + LIST_N(DOUBLE(LOGICAL_AXES), + FT_BIT_DIR_E, FT_BIT_STEP_E, + FT_BIT_DIR_X, FT_BIT_STEP_X, + FT_BIT_DIR_Y, FT_BIT_STEP_Y, + FT_BIT_DIR_Z, FT_BIT_STEP_Z, + FT_BIT_DIR_I, FT_BIT_STEP_I, + FT_BIT_DIR_J, FT_BIT_STEP_J, + FT_BIT_DIR_K, FT_BIT_STEP_K, + FT_BIT_DIR_U, FT_BIT_STEP_U, + FT_BIT_DIR_V, FT_BIT_STEP_V, + FT_BIT_DIR_W, FT_BIT_STEP_W + ), FT_BIT_COUNT }; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index f7671e3135..d11842e758 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -33,15 +33,15 @@ #include "../lcd/marlinui.h" #include "../inc/MarlinConfig.h" +#if ENABLED(FT_MOTION) + #include "ft_motion.h" +#endif + #if IS_SCARA #include "../libs/buzzer.h" #include "../lcd/marlinui.h" #endif -#if ALL(DWIN_LCD_PROUI, INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) - #include "../lcd/e3v2/proui/dwin.h" -#endif - #if ENABLED(POLAR) #include "polar.h" #endif @@ -77,6 +77,11 @@ #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" + +#if ENABLED(BD_SENSOR) + #include "../feature/bedlevel/bdl/bdl.h" +#endif + // Relative Mode. Enable with G91, disable with G90. bool relative_mode; // = false; @@ -136,7 +141,10 @@ xyze_pos_t destination; // {0} // no other feedrate is specified. Overridden for special moves. // Set by the last G0 through G5 command's "F" parameter. // Functions that override this for custom moves *must always* restore it! -feedRate_t feedrate_mm_s = MMM_TO_MMS(1500); +#ifndef DEFAULT_FEEDRATE_MM_M + #define DEFAULT_FEEDRATE_MM_M 4000 +#endif +feedRate_t feedrate_mm_s = MMM_TO_MMS(DEFAULT_FEEDRATE_MM_M); int16_t feedrate_percentage = 100; // Cartesian conversion result goes here: @@ -200,22 +208,24 @@ inline void report_more_positions() { // Report the logical position for a given machine position inline void report_logical_position(const xyze_pos_t &rpos) { const xyze_pos_t lpos = rpos.asLogical(); - SERIAL_ECHOPGM_P( - LIST_N(DOUBLE(NUM_AXES), - X_LBL, lpos.x, - SP_Y_LBL, lpos.y, - SP_Z_LBL, lpos.z, - SP_I_LBL, lpos.i, - SP_J_LBL, lpos.j, - SP_K_LBL, lpos.k, - SP_U_LBL, lpos.u, - SP_V_LBL, lpos.v, - SP_W_LBL, lpos.w - ) - #if HAS_EXTRUDERS - , SP_E_LBL, lpos.e - #endif - ); + #if NUM_AXES + SERIAL_ECHOPGM_P( + LIST_N(DOUBLE(NUM_AXES), + X_LBL, lpos.x, + SP_Y_LBL, lpos.y, + SP_Z_LBL, lpos.z, + SP_I_LBL, lpos.i, + SP_J_LBL, lpos.j, + SP_K_LBL, lpos.k, + SP_U_LBL, lpos.u, + SP_V_LBL, lpos.v, + SP_W_LBL, lpos.w + ) + ); + #endif + #if HAS_EXTRUDERS + SERIAL_ECHOPGM_P(SP_E_LBL, lpos.e); + #endif } // Report the real current position according to the steppers. @@ -256,7 +266,7 @@ void report_current_position_projected() { AutoReporter position_auto_reporter; #endif -#if EITHER(FULL_REPORT_TO_HOST_FEATURE, REALTIME_REPORTING_COMMANDS) +#if ANY(FULL_REPORT_TO_HOST_FEATURE, REALTIME_REPORTING_COMMANDS) M_StateEnum M_State_grbl = M_INIT; @@ -364,7 +374,7 @@ void report_current_position_projected() { #else // CARTESIAN // Return true if the given position is within the machine bounds. - bool position_is_reachable(const_float_t rx, const_float_t ry) { + bool position_is_reachable(TERN_(HAS_X_AXIS, const_float_t rx) OPTARG(HAS_Y_AXIS, const_float_t ry)) { if (TERN0(HAS_Y_AXIS, !COORDINATE_OKAY(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop))) return false; #if ENABLED(DUAL_X_CARRIAGE) if (active_extruder) @@ -372,7 +382,8 @@ void report_current_position_projected() { else return COORDINATE_OKAY(rx, X1_MIN_POS - fslop, X1_MAX_POS + fslop); #else - return COORDINATE_OKAY(rx, X_MIN_POS - fslop, X_MAX_POS + fslop); + if (TERN0(HAS_X_AXIS, !COORDINATE_OKAY(rx, X_MIN_POS - fslop, X_MAX_POS + fslop))) return false; + return true; #endif } @@ -540,6 +551,21 @@ void _internal_move_to_destination(const_feedRate_t fr_mm_s/*=0.0f*/ prepare_line_to_destination(); } +#if SECONDARY_AXES + + void secondary_axis_moves(SECONDARY_AXIS_ARGS(const_float_t), const_feedRate_t fr_mm_s) { + auto move_one = [&](const AxisEnum a, const_float_t p) { + const feedRate_t fr = fr_mm_s ?: homing_feedrate(a); + current_position[a] = p; line_to_current_position(fr); + }; + SECONDARY_AXIS_CODE( + move_one(I_AXIS, i), move_one(J_AXIS, j), move_one(K_AXIS, k), + move_one(U_AXIS, u), move_one(V_AXIS, v), move_one(W_AXIS, w) + ); + } + +#endif + /** * Plan a move to (X, Y, Z, [I, [J, [K...]]]) and set the current_position * Plan a move to (X, Y, Z, [I, [J, [K...]]]) with separation of Z from other components. @@ -549,7 +575,7 @@ void _internal_move_to_destination(const_feedRate_t fr_mm_s/*=0.0f*/ * - Delta may lower Z first to get into the free motion zone. * - Before returning, wait for the planner buffer to empty. */ -void do_blocking_move_to(NUM_AXIS_ARGS(const_float_t), const_feedRate_t fr_mm_s/*=0.0f*/) { +void do_blocking_move_to(NUM_AXIS_ARGS_(const_float_t) const_feedRate_t fr_mm_s/*=0.0f*/) { DEBUG_SECTION(log_move, "do_blocking_move_to", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) DEBUG_XYZ("> ", NUM_AXIS_ARGS()); @@ -558,14 +584,6 @@ void do_blocking_move_to(NUM_AXIS_ARGS(const_float_t), const_feedRate_t fr_mm_s/ #if HAS_Z_AXIS const feedRate_t z_feedrate = fr_mm_s ?: homing_feedrate(Z_AXIS); #endif - SECONDARY_AXIS_CODE( - const feedRate_t i_feedrate = fr_mm_s ?: homing_feedrate(I_AXIS), - const feedRate_t j_feedrate = fr_mm_s ?: homing_feedrate(J_AXIS), - const feedRate_t k_feedrate = fr_mm_s ?: homing_feedrate(K_AXIS), - const feedRate_t u_feedrate = fr_mm_s ?: homing_feedrate(U_AXIS), - const feedRate_t v_feedrate = fr_mm_s ?: homing_feedrate(V_AXIS), - const feedRate_t w_feedrate = fr_mm_s ?: homing_feedrate(W_AXIS) - ); #if IS_KINEMATIC && DISABLED(POLARGRAPH) // kinematic machines are expected to home to a point 1.5x their range? never reachable. @@ -608,6 +626,10 @@ void do_blocking_move_to(NUM_AXIS_ARGS(const_float_t), const_feedRate_t fr_mm_s/ if (DEBUGGING(LEVELING)) DEBUG_POS("z lower move", current_position); } + #if SECONDARY_AXES + secondary_axis_moves(SECONDARY_AXIS_LIST(i, j, k, u, v, w), fr_mm_s); + #endif + #elif IS_SCARA // If Z needs to raise, do it before moving XY @@ -615,6 +637,10 @@ void do_blocking_move_to(NUM_AXIS_ARGS(const_float_t), const_feedRate_t fr_mm_s/ destination.set(x, y); prepare_internal_fast_move_to_destination(xy_feedrate); + #if SECONDARY_AXES + secondary_axis_moves(SECONDARY_AXIS_LIST(i, j, k, u, v, w), fr_mm_s); + #endif + // If Z needs to lower, do it after moving XY if (destination.z > z) { destination.z = z; prepare_internal_fast_move_to_destination(z_feedrate); } @@ -624,25 +650,10 @@ void do_blocking_move_to(NUM_AXIS_ARGS(const_float_t), const_feedRate_t fr_mm_s/ if (current_position.z < z) { current_position.z = z; line_to_current_position(z_feedrate); } #endif - current_position.set(x OPTARG(HAS_Y_AXIS, y)); line_to_current_position(xy_feedrate); + current_position.set(TERN_(HAS_X_AXIS, x) OPTARG(HAS_Y_AXIS, y)); line_to_current_position(xy_feedrate); - #if HAS_I_AXIS - current_position.i = i; line_to_current_position(i_feedrate); - #endif - #if HAS_J_AXIS - current_position.j = j; line_to_current_position(j_feedrate); - #endif - #if HAS_K_AXIS - current_position.k = k; line_to_current_position(k_feedrate); - #endif - #if HAS_U_AXIS - current_position.u = u; line_to_current_position(u_feedrate); - #endif - #if HAS_V_AXIS - current_position.v = v; line_to_current_position(v_feedrate); - #endif - #if HAS_W_AXIS - current_position.w = w; line_to_current_position(w_feedrate); + #if SECONDARY_AXES + secondary_axis_moves(SECONDARY_AXIS_LIST(i, j, k, u, v, w), fr_mm_s); #endif #if HAS_Z_AXIS @@ -656,30 +667,33 @@ void do_blocking_move_to(NUM_AXIS_ARGS(const_float_t), const_feedRate_t fr_mm_s/ } void do_blocking_move_to(const xy_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { - do_blocking_move_to(NUM_AXIS_LIST(raw.x, raw.y, current_position.z, current_position.i, current_position.j, current_position.k, - current_position.u, current_position.v, current_position.w), fr_mm_s); + do_blocking_move_to(NUM_AXIS_LIST_(raw.x, raw.y, current_position.z, current_position.i, current_position.j, current_position.k, + current_position.u, current_position.v, current_position.w) fr_mm_s); } void do_blocking_move_to(const xyz_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { - do_blocking_move_to(NUM_AXIS_ELEM(raw), fr_mm_s); + do_blocking_move_to(NUM_AXIS_ELEM_(raw) fr_mm_s); } void do_blocking_move_to(const xyze_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { - do_blocking_move_to(NUM_AXIS_ELEM(raw), fr_mm_s); -} -void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_blocking_move_to_x(", rx, ", ", fr_mm_s, ")"); - do_blocking_move_to( - NUM_AXIS_LIST(rx, current_position.y, current_position.z, current_position.i, current_position.j, current_position.k, - current_position.u, current_position.v, current_position.w), - fr_mm_s - ); + do_blocking_move_to(NUM_AXIS_ELEM_(raw) fr_mm_s); } +#if HAS_X_AXIS + void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_blocking_move_to_x(", rx, ", ", fr_mm_s, ")"); + do_blocking_move_to( + NUM_AXIS_LIST_(rx, current_position.y, current_position.z, current_position.i, current_position.j, current_position.k, + current_position.u, current_position.v, current_position.w) + fr_mm_s + ); + } +#endif + #if HAS_Y_AXIS void do_blocking_move_to_y(const_float_t ry, const_feedRate_t fr_mm_s/*=0.0*/) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_blocking_move_to_y(", ry, ", ", fr_mm_s, ")"); do_blocking_move_to( - NUM_AXIS_LIST(current_position.x, ry, current_position.z, current_position.i, current_position.j, current_position.k, - current_position.u, current_position.v, current_position.w), + NUM_AXIS_LIST_(current_position.x, ry, current_position.z, current_position.i, current_position.j, current_position.k, + current_position.u, current_position.v, current_position.w) fr_mm_s ); } @@ -698,7 +712,7 @@ void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { } void do_blocking_move_to_xyz_i(const xyze_pos_t &raw, const_float_t i, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( - NUM_AXIS_LIST(raw.x, raw.y, raw.z, i, raw.j, raw.k, raw.u, raw.v, raw.w), + NUM_AXIS_LIST_(raw.x, raw.y, raw.z, i, raw.j, raw.k, raw.u, raw.v, raw.w) fr_mm_s ); } @@ -710,7 +724,7 @@ void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { } void do_blocking_move_to_xyzi_j(const xyze_pos_t &raw, const_float_t j, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( - NUM_AXIS_LIST(raw.x, raw.y, raw.z, raw.i, j, raw.k, raw.u, raw.v, raw.w), + NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, j, raw.k, raw.u, raw.v, raw.w) fr_mm_s ); } @@ -722,7 +736,7 @@ void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { } void do_blocking_move_to_xyzij_k(const xyze_pos_t &raw, const_float_t k, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( - NUM_AXIS_LIST(raw.x, raw.y, raw.z, raw.i, raw.j, k, raw.u, raw.v, raw.w), + NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, raw.j, k, raw.u, raw.v, raw.w) fr_mm_s ); } @@ -734,7 +748,7 @@ void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { } void do_blocking_move_to_xyzijk_u(const xyze_pos_t &raw, const_float_t u, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( - NUM_AXIS_LIST(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, u, raw.v, raw.w), + NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, u, raw.v, raw.w) fr_mm_s ); } @@ -746,7 +760,7 @@ void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { } void do_blocking_move_to_xyzijku_v(const xyze_pos_t &raw, const_float_t v, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( - NUM_AXIS_LIST(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, raw.u, v, raw.w), + NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, raw.u, v, raw.w) fr_mm_s ); } @@ -758,7 +772,7 @@ void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { } void do_blocking_move_to_xyzijkuv_w(const xyze_pos_t &raw, const_float_t w, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to( - NUM_AXIS_LIST(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, raw.u, raw.v, w), + NUM_AXIS_LIST_(raw.x, raw.y, raw.z, raw.i, raw.j, raw.k, raw.u, raw.v, w) fr_mm_s ); } @@ -768,8 +782,8 @@ void do_blocking_move_to_x(const_float_t rx, 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*/) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("do_blocking_move_to_xy(", rx, ", ", ry, ", ", fr_mm_s, ")"); do_blocking_move_to( - NUM_AXIS_LIST(rx, ry, current_position.z, current_position.i, current_position.j, current_position.k, - current_position.u, current_position.v, current_position.w), + NUM_AXIS_LIST_(rx, ry, current_position.z, current_position.i, current_position.j, current_position.k, + current_position.u, current_position.v, current_position.w) fr_mm_s ); } @@ -781,8 +795,8 @@ void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { #if HAS_Z_AXIS 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( - NUM_AXIS_LIST(raw.x, raw.y, z, current_position.i, current_position.j, current_position.k, - current_position.u, current_position.v, current_position.w), + NUM_AXIS_LIST_(raw.x, raw.y, z, current_position.i, current_position.j, current_position.k, + current_position.u, current_position.v, current_position.w) fr_mm_s ); } @@ -936,7 +950,7 @@ void restore_feedrate_and_scaling() { if (TERN0(DELTA, !all_axes_homed())) return; - #if BOTH(HAS_HOTEND_OFFSET, DELTA) + #if ALL(HAS_HOTEND_OFFSET, DELTA) // The effector center position will be the target minus the hotend offset. const xy_pos_t offs = hotend_offset[active_extruder]; #elif ENABLED(POLARGRAPH) @@ -963,14 +977,16 @@ void restore_feedrate_and_scaling() { #else - if (axis_was_homed(X_AXIS)) { - #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X) - NOLESS(target.x, soft_endstop.min.x); - #endif - #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X) - NOMORE(target.x, soft_endstop.max.x); - #endif - } + #if HAS_X_AXIS + if (axis_was_homed(X_AXIS)) { + #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MIN_SOFTWARE_ENDSTOP_X) + NOLESS(target.x, soft_endstop.min.x); + #endif + #if !HAS_SOFTWARE_ENDSTOPS || ENABLED(MAX_SOFTWARE_ENDSTOP_X) + NOMORE(target.x, soft_endstop.max.x); + #endif + } + #endif #if HAS_Y_AXIS if (axis_was_homed(Y_AXIS)) { @@ -1076,82 +1092,90 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { * Get distance from displacements along axes and, if required, update move type. */ float get_move_distance(const xyze_pos_t &diff OPTARG(HAS_ROTATIONAL_AXES, bool &is_cartesian_move)) { - if (!(NUM_AXIS_GANG(diff.x, || diff.y, /* skip z */, || diff.i, || diff.j, || diff.k, || diff.u, || diff.v, || diff.w))) - return TERN0(HAS_Z_AXIS, ABS(diff.z)); + #if NUM_AXES - #if ENABLED(ARTICULATED_ROBOT_ARM) + if (!(NUM_AXIS_GANG(diff.x, || diff.y, /* skip z */, || diff.i, || diff.j, || diff.k, || diff.u, || diff.v, || diff.w))) + return TERN0(HAS_Z_AXIS, ABS(diff.z)); - // For articulated robots, interpreting feedrate like LinuxCNC would require inverse kinematics. As a workaround, pretend that motors sit on n mutually orthogonal - // axes and assume that we could think of distance as magnitude of an n-vector in an n-dimensional Euclidian space. - const float distance_sqr = NUM_AXIS_GANG( - sq(diff.x), + sq(diff.y), + sq(diff.z), - + sq(diff.i), + sq(diff.j), + sq(diff.k), - + sq(diff.u), + sq(diff.v), + sq(diff.w) - ); + #if ENABLED(ARTICULATED_ROBOT_ARM) - #elif ENABLED(FOAMCUTTER_XYUV) + // For articulated robots, interpreting feedrate like LinuxCNC would require inverse kinematics. As a workaround, pretend that motors sit on n mutually orthogonal + // axes and assume that we could think of distance as magnitude of an n-vector in an n-dimensional Euclidian space. + const float distance_sqr = NUM_AXIS_GANG( + sq(diff.x), + sq(diff.y), + sq(diff.z), + + sq(diff.i), + sq(diff.j), + sq(diff.k), + + sq(diff.u), + sq(diff.v), + sq(diff.w) + ); - const float distance_sqr = ( - #if HAS_J_AXIS - _MAX(sq(diff.x) + sq(diff.y), sq(diff.i) + sq(diff.j)) // Special 5 axis kinematics. Return the larger of plane X/Y or I/J - #else - sq(diff.x) + sq(diff.y) // Foamcutter with only two axes (XY) + #elif ENABLED(FOAMCUTTER_XYUV) + + const float distance_sqr = ( + #if HAS_J_AXIS + _MAX(sq(diff.x) + sq(diff.y), sq(diff.i) + sq(diff.j)) // Special 5 axis kinematics. Return the larger of plane X/Y or I/J + #else + sq(diff.x) + sq(diff.y) // Foamcutter with only two axes (XY) + #endif + ); + + #else + + /** + * Calculate distance for feedrate interpretation in accordance with NIST RS274NGC interpreter - version 3) and its default CANON_XYZ feed reference mode. + * Assume: + * - X, Y, Z are the primary linear axes; + * - U, V, W are secondary linear axes; + * - A, B, C are rotational axes. + * + * Then: + * - dX, dY, dZ are the displacements of the primary linear axes; + * - dU, dV, dW are the displacements of linear axes; + * - dA, dB, dC are the displacements of rotational axes. + * + * The time it takes to execute a move command with feedrate F is t = D/F, + * plus any time for acceleration and deceleration. + * Here, D is the total distance, calculated as follows: + * + * D^2 = dX^2 + dY^2 + dZ^2 + * if D^2 == 0 (none of XYZ move but any secondary linear axes move, whether other axes are moved or not): + * D^2 = dU^2 + dV^2 + dW^2 + * if D^2 == 0 (only rotational axes are moved): + * D^2 = dA^2 + dB^2 + dC^2 + */ + float distance_sqr = XYZ_GANG(sq(diff.x), + sq(diff.y), + sq(diff.z)); + + #if SECONDARY_LINEAR_AXES + if (UNEAR_ZERO(distance_sqr)) { + // Move does not involve any primary linear axes (xyz) but might involve secondary linear axes + distance_sqr = ( + SECONDARY_AXIS_GANG( + IF_DISABLED(AXIS4_ROTATES, + sq(diff.i)), + IF_DISABLED(AXIS5_ROTATES, + sq(diff.j)), + IF_DISABLED(AXIS6_ROTATES, + sq(diff.k)), + IF_DISABLED(AXIS7_ROTATES, + sq(diff.u)), + IF_DISABLED(AXIS8_ROTATES, + sq(diff.v)), + IF_DISABLED(AXIS9_ROTATES, + sq(diff.w)) + ) + ); + } #endif - ); + + #if HAS_ROTATIONAL_AXES + if (UNEAR_ZERO(distance_sqr)) { + // Move involves only rotational axes. Calculate angular distance in accordance with LinuxCNC + is_cartesian_move = false; + distance_sqr = ROTATIONAL_AXIS_GANG(sq(diff.i), + sq(diff.j), + sq(diff.k), + sq(diff.u), + sq(diff.v), + sq(diff.w)); + } + #endif + + #endif + + return SQRT(distance_sqr); #else - /** - * Calculate distance for feedrate interpretation in accordance with NIST RS274NGC interpreter - version 3) and its default CANON_XYZ feed reference mode. - * Assume: - * - X, Y, Z are the primary linear axes; - * - U, V, W are secondary linear axes; - * - A, B, C are rotational axes. - * - * Then: - * - dX, dY, dZ are the displacements of the primary linear axes; - * - dU, dV, dW are the displacements of linear axes; - * - dA, dB, dC are the displacements of rotational axes. - * - * The time it takes to execute a move command with feedrate F is t = D/F, - * plus any time for acceleration and deceleration. - * Here, D is the total distance, calculated as follows: - * - * D^2 = dX^2 + dY^2 + dZ^2 - * if D^2 == 0 (none of XYZ move but any secondary linear axes move, whether other axes are moved or not): - * D^2 = dU^2 + dV^2 + dW^2 - * if D^2 == 0 (only rotational axes are moved): - * D^2 = dA^2 + dB^2 + dC^2 - */ - float distance_sqr = XYZ_GANG(sq(diff.x), + sq(diff.y), + sq(diff.z)); - - #if SECONDARY_LINEAR_AXES - if (UNEAR_ZERO(distance_sqr)) { - // Move does not involve any primary linear axes (xyz) but might involve secondary linear axes - distance_sqr = ( - SECONDARY_AXIS_GANG( - IF_DISABLED(AXIS4_ROTATES, + sq(diff.i)), - IF_DISABLED(AXIS5_ROTATES, + sq(diff.j)), - IF_DISABLED(AXIS6_ROTATES, + sq(diff.k)), - IF_DISABLED(AXIS7_ROTATES, + sq(diff.u)), - IF_DISABLED(AXIS8_ROTATES, + sq(diff.v)), - IF_DISABLED(AXIS9_ROTATES, + sq(diff.w)) - ) - ); - } - #endif - - #if HAS_ROTATIONAL_AXES - if (UNEAR_ZERO(distance_sqr)) { - // Move involves only rotational axes. Calculate angular distance in accordance with LinuxCNC - is_cartesian_move = false; - distance_sqr = ROTATIONAL_AXIS_GANG(sq(diff.i), + sq(diff.j), + sq(diff.k), + sq(diff.u), + sq(diff.v), + sq(diff.w)); - } - #endif + return 0; #endif - - return SQRT(distance_sqr); } #if IS_KINEMATIC @@ -1217,7 +1241,7 @@ float get_move_distance(const xyze_pos_t &diff OPTARG(HAS_ROTATIONAL_AXES, bool // Minimum number of seconds to move the given distance const float seconds = cartesian_mm / ( - #if BOTH(HAS_ROTATIONAL_AXES, INCH_MODE_SUPPORT) + #if ALL(HAS_ROTATIONAL_AXES, INCH_MODE_SUPPORT) cartes_move ? scaled_fr_mm_s : LINEAR_UNIT(scaled_fr_mm_s) #else scaled_fr_mm_s @@ -1527,7 +1551,7 @@ float get_move_distance(const xyze_pos_t &diff OPTARG(HAS_ROTATIONAL_AXES, bool void prepare_line_to_destination() { apply_motion_limits(destination); - #if EITHER(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) + #if ANY(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) if (!DEBUGGING(DRYRUN) && destination.e != current_position.e) { bool ignore_e = thermalManager.tooColdToExtrude(active_extruder); @@ -1699,7 +1723,9 @@ void prepare_line_to_destination() { #if ENABLED(SPI_ENDSTOPS) switch (axis) { - case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; + #if HAS_X_AXIS + case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; + #endif #if HAS_Y_AXIS case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = true; break; #endif @@ -1793,7 +1819,9 @@ void prepare_line_to_destination() { #if ENABLED(SPI_ENDSTOPS) switch (axis) { - case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; + #if HAS_X_AXIS + case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; + #endif #if HAS_Y_AXIS case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = false; break; #endif @@ -1854,12 +1882,12 @@ void prepare_line_to_destination() { if (is_home_dir) { if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) { - #if BOTH(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) + #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 - #if BOTH(HAS_HOTEND, WAIT_FOR_HOTEND) + #if ALL(HAS_HOTEND, WAIT_FOR_HOTEND) // Wait for the hotend to heat back up between probing points thermalManager.wait_for_hotend_heating(active_extruder); #endif @@ -1876,7 +1904,7 @@ void prepare_line_to_destination() { #endif } - #if EITHER(MORGAN_SCARA, MP_SCARA) + #if ANY(MORGAN_SCARA, MP_SCARA) // Tell the planner the axis is at 0 current_position[axis] = 0; sync_plan_position(); @@ -2074,16 +2102,26 @@ void prepare_line_to_destination() { void homeaxis(const AxisEnum axis) { - #if EITHER(MORGAN_SCARA, MP_SCARA) + #if ENABLED(FT_MOTION) + // Disable ft-motion for homing + struct OnExit { + ftMotionMode_t oldmm; + OnExit() { + oldmm = fxdTiCtrl.cfg.mode; + fxdTiCtrl.cfg.mode = ftMotionMode_DISABLED; + } + ~OnExit() { + fxdTiCtrl.cfg.mode = oldmm; + fxdTiCtrl.init(); + } + } on_exit; + #endif + + #if ANY(MORGAN_SCARA, MP_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) \ - || TERN0(HAS_Z_AXIS, TERN0(HOMING_Z_WITH_PROBE, _AXIS(A) == Z_AXIS)) \ - || TERN0(A##_HOME_TO_MIN, A##_MIN_PIN > -1) \ - || TERN0(A##_HOME_TO_MAX, A##_MAX_PIN > -1) \ - )) + #define _CAN_HOME(A) (axis == _AXIS(A) && (ANY(A##_SPI_SENSORLESS, HAS_##A##_ENDSTOP) || TERN0(HOMING_Z_WITH_PROBE, _AXIS(A) == Z_AXIS))) #define _ANDCANT(N) && !_CAN_HOME(N) if (true MAIN_AXIS_MAP(_ANDCANT)) return; #endif @@ -2117,6 +2155,7 @@ void prepare_line_to_destination() { 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; + TERN_(BD_SENSOR, bdl.config_state = BDS_HOMING_Z); } #endif @@ -2159,7 +2198,7 @@ void prepare_line_to_destination() { // If a second homing move is configured... if (bump) { - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) + #if ALL(HOMING_Z_WITH_PROBE, BLTOUCH) if (axis == Z_AXIS && !bltouch.high_speed_mode) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) #endif @@ -2181,7 +2220,7 @@ void prepare_line_to_destination() { } #endif - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) + #if ALL(HOMING_Z_WITH_PROBE, BLTOUCH) if (axis == Z_AXIS && !bltouch.high_speed_mode && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) #endif @@ -2192,7 +2231,7 @@ void prepare_line_to_destination() { do_homing_move(axis, rebump, get_homing_bump_feedrate(axis), true); } - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) + #if ALL(HOMING_Z_WITH_PROBE, BLTOUCH) if (axis == Z_AXIS) bltouch.stow(); // The final STOW #endif @@ -2367,6 +2406,10 @@ void prepare_line_to_destination() { #endif + #if ALL(BD_SENSOR, HOMING_Z_WITH_PROBE) + if (axis == Z_AXIS) bdl.config_state = BDS_IDLE; + #endif + // Put away the Z probe if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && probe.stow())) return; @@ -2429,7 +2472,7 @@ void set_axis_is_at_home(const AxisEnum axis) { } #endif - #if EITHER(MORGAN_SCARA, AXEL_TPARA) + #if ANY(MORGAN_SCARA, AXEL_TPARA) scara_set_axis_is_at_home(axis); #elif ENABLED(DELTA) current_position[axis] = (axis == Z_AXIS) ? DIFF_TERN(HAS_BED_PROBE, delta_height, probe.offset.z) : base_home_pos(axis); @@ -2444,9 +2487,9 @@ void set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) { #if HOMING_Z_WITH_PROBE current_position.z -= probe.offset.z; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("*** Z HOMED WITH PROBE (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) ***\n> probe.offset.z = ", probe.offset.z); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("*** Z homed with PROBE" TERN_(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, " (Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)") " ***\n> (M851 Z", probe.offset.z, ")"); #else - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("*** Z HOMED TO ENDSTOP ***"); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("*** Z homed to ENDSTOP ***"); #endif } #endif diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 4cd4641e3d..1e6d02d2a7 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -30,6 +30,10 @@ #include "../inc/MarlinConfig.h" +#if ALL(DWIN_LCD_PROUI, INDIVIDUAL_AXIS_HOMING_SUBMENU, MESH_BED_LEVELING) + #include "../lcd/e3v2/proui/dwin.h" +#endif + #if IS_SCARA #include "scara.h" #elif ENABLED(POLAR) @@ -153,9 +157,9 @@ inline float home_bump_mm(const AxisEnum axis) { extern xyz_pos_t hotend_offset[HOTENDS]; void reset_hotend_offsets(); #elif HOTENDS - constexpr xyz_pos_t hotend_offset[HOTENDS] = { { 0 } }; + constexpr xyz_pos_t hotend_offset[HOTENDS] = { { TERN_(HAS_X_AXIS, 0) } }; #else - constexpr xyz_pos_t hotend_offset[1] = { { 0 } }; + constexpr xyz_pos_t hotend_offset[1] = { { TERN_(HAS_X_AXIS, 0) } }; #endif #if HAS_SOFTWARE_ENDSTOPS @@ -169,10 +173,12 @@ inline float home_bump_mm(const AxisEnum axis) { amin = -100000; amax = 100000; // "No limits" #if HAS_SOFTWARE_ENDSTOPS if (enabled()) switch (axis) { - case X_AXIS: - TERN_(MIN_SOFTWARE_ENDSTOP_X, amin = min.x); - TERN_(MAX_SOFTWARE_ENDSTOP_X, amax = max.x); - break; + #if HAS_X_AXIS + case X_AXIS: + TERN_(MIN_SOFTWARE_ENDSTOP_X, amin = min.x); + TERN_(MAX_SOFTWARE_ENDSTOP_X, amax = max.x); + break; + #endif #if HAS_Y_AXIS case Y_AXIS: TERN_(MIN_SOFTWARE_ENDSTOP_Y, amin = min.y); @@ -259,11 +265,13 @@ void report_current_position_projected(); #if ENABLED(AUTO_REPORT_POSITION) #include "../libs/autoreport.h" - struct PositionReport { static void report() { report_current_position_projected(); } }; + struct PositionReport { static void report() { + TERN(AUTO_REPORT_REAL_POSITION, report_real_position(), report_current_position_projected()); + } }; extern AutoReporter position_auto_reporter; #endif -#if EITHER(FULL_REPORT_TO_HOST_FEATURE, REALTIME_REPORTING_COMMANDS) +#if ANY(FULL_REPORT_TO_HOST_FEATURE, REALTIME_REPORTING_COMMANDS) #define HAS_GRBL_STATE 1 /** * Machine states for GRBL or TinyG @@ -348,12 +356,14 @@ 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(NUM_AXIS_ARGS(const_float_t), const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to(NUM_AXIS_ARGS_(const_float_t) 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_t rx, const_feedRate_t fr_mm_s=0.0f); +#if HAS_X_AXIS + void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s=0.0f); +#endif #if HAS_Y_AXIS void do_blocking_move_to_y(const_float_t ry, const_feedRate_t fr_mm_s=0.0f); #endif @@ -424,9 +434,6 @@ void restore_feedrate_and_scaling(); typedef bits_t(NUM_AXES) main_axes_bits_t; constexpr main_axes_bits_t main_axes_mask = _BV(NUM_AXES) - 1; -typedef bits_t(NUM_AXES + EXTRUDERS) e_axis_bits_t; -constexpr e_axis_bits_t e_axis_mask = (_BV(EXTRUDERS) - 1) << NUM_AXES; - void set_axis_is_at_home(const AxisEnum axis); #if HAS_ENDSTOPS @@ -513,8 +520,10 @@ void home_if_needed(const bool keeplev=false); FORCE_INLINE void toNative(xyz_pos_t&) {} FORCE_INLINE void toNative(xyze_pos_t&) {} #endif -#define LOGICAL_X_POSITION(POS) NATIVE_TO_LOGICAL(POS, X_AXIS) -#define RAW_X_POSITION(POS) LOGICAL_TO_NATIVE(POS, X_AXIS) +#if HAS_X_AXIS + #define LOGICAL_X_POSITION(POS) NATIVE_TO_LOGICAL(POS, X_AXIS) + #define RAW_X_POSITION(POS) LOGICAL_TO_NATIVE(POS, X_AXIS) +#endif #if HAS_Y_AXIS #define LOGICAL_Y_POSITION(POS) NATIVE_TO_LOGICAL(POS, Y_AXIS) #define RAW_Y_POSITION(POS) LOGICAL_TO_NATIVE(POS, Y_AXIS) @@ -567,9 +576,9 @@ void home_if_needed(const bool keeplev=false); #else // Return true if the given position is within the machine bounds. - bool position_is_reachable(const_float_t rx, const_float_t ry); + bool position_is_reachable(TERN_(HAS_X_AXIS, const_float_t rx) OPTARG(HAS_Y_AXIS, const_float_t ry)); inline bool position_is_reachable(const xy_pos_t &pos) { - return position_is_reachable(pos.x, pos.y); + return position_is_reachable(TERN_(HAS_X_AXIS, pos.x) OPTARG(HAS_Y_AXIS, pos.y)); } #endif @@ -606,7 +615,7 @@ void home_if_needed(const bool keeplev=false); float x_home_pos(const uint8_t extruder); - #define TOOL_X_HOME_DIR(T) ((T) ? X2_HOME_DIR : X_HOME_DIR) + #define TOOL_X_HOME_DIR(T) ((T) ? 1 : -1) void set_duplication_enabled(const bool dupe, const int8_t tool_index=-1); void idex_set_mirrored_mode(const bool mirr); diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index ccf27a502a..6b645fa133 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -169,7 +169,7 @@ float Planner::mm_per_step[DISTINCT_AXES]; // (mm) Millimeters per step #if ENABLED(DIRECT_STEPPING) uint32_t Planner::last_page_step_rate = 0; - xyze_bool_t Planner::last_page_dir{0}; + AxisBits Planner::last_page_dir; // = 0 #endif #if HAS_EXTRUDERS @@ -795,7 +795,7 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t NOLESS(initial_rate, uint32_t(MINIMAL_STEP_RATE)); NOLESS(final_rate, uint32_t(MINIMAL_STEP_RATE)); - #if EITHER(S_CURVE_ACCELERATION, LIN_ADVANCE) + #if ANY(S_CURVE_ACCELERATION, LIN_ADVANCE) // If we have some plateau time, the cruise rate will be the nominal rate uint32_t cruise_rate = block->nominal_rate; #endif @@ -829,7 +829,7 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t accelerate_steps = _MIN(uint32_t(_MAX(accelerate_steps_float, 0)), block->step_event_count); decelerate_steps = block->step_event_count - accelerate_steps; - #if EITHER(S_CURVE_ACCELERATION, LIN_ADVANCE) + #if ANY(S_CURVE_ACCELERATION, LIN_ADVANCE) // We won't reach the cruising rate. Let's calculate the speed we will reach cruise_rate = final_speed(initial_rate, accel, accelerate_steps); #endif @@ -1349,7 +1349,7 @@ void Planner::check_axes_activity() { if (has_blocks_queued()) { - #if EITHER(HAS_TAIL_FAN_SPEED, BARICUDA) + #if ANY(HAS_TAIL_FAN_SPEED, BARICUDA) block_t *block = &block_buffer[block_buffer_tail]; #endif @@ -1520,7 +1520,7 @@ void Planner::check_axes_activity() { * The multiplier converts a given E value into a length. */ void Planner::calculate_volumetric_multipliers() { - LOOP_L_N(i, COUNT(filament_size)) { + for (uint8_t i = 0; i < COUNT(filament_size); ++i) { volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]); refresh_e_factor(i); } @@ -1692,7 +1692,7 @@ void Planner::quick_stop() { // Restart the block delay for the first movement - As the queue was // forced to empty, there's no risk the ISR will touch this. - delay_before_delivering = TERN_(FT_MOTION, fxdTiCtrl.cfg_mode ? BLOCK_DELAY_NONE :) BLOCK_DELAY_FOR_1ST_MOVE; + delay_before_delivering = TERN_(FT_MOTION, fxdTiCtrl.cfg.mode ? BLOCK_DELAY_NONE :) BLOCK_DELAY_FOR_1ST_MOVE; TERN_(HAS_WIRED_LCD, clear_block_buffer_runtime()); // Clear the accumulated runtime @@ -1773,7 +1773,7 @@ float Planner::get_axis_position_mm(const AxisEnum axis) { else axis_steps = DIFF_TERN(BACKLASH_COMPENSATION, stepper.position(axis), backlash.get_applied_steps(axis)); - #elif EITHER(MARKFORGED_XY, MARKFORGED_YX) + #elif ANY(MARKFORGED_XY, MARKFORGED_YX) // Requesting one of the joined axes? if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) { @@ -1851,7 +1851,7 @@ bool Planner::_buffer_steps(const xyze_long_t &target // As there are no queued movements, the Stepper ISR will not touch this // variable, so there is no risk setting this here (but it MUST be done // before the following line!!) - delay_before_delivering = TERN_(FT_MOTION, fxdTiCtrl.cfg_mode ? BLOCK_DELAY_NONE :) BLOCK_DELAY_FOR_1ST_MOVE; + delay_before_delivering = TERN_(FT_MOTION, fxdTiCtrl.cfg.mode ? BLOCK_DELAY_NONE :) BLOCK_DELAY_FOR_1ST_MOVE; } // Move buffer head @@ -1887,64 +1887,56 @@ bool Planner::_populate_block( OPTARG(HAS_DIST_MM_ARG, const xyze_float_t &cart_dist_mm) , feedRate_t fr_mm_s, const uint8_t extruder, const PlannerHints &hints ) { - int32_t LOGICAL_AXIS_LIST( - de = target.e - position.e, - da = target.a - position.a, - db = target.b - position.b, - dc = target.c - position.c, - di = target.i - position.i, - dj = target.j - position.j, - dk = target.k - position.k, - du = target.u - position.u, - dv = target.v - position.v, - dw = target.w - position.w - ); + xyze_long_t dist = target - position; /* <-- add a slash to enable SERIAL_ECHOLNPGM( " _populate_block FR:", fr_mm_s, - " A:", target.a, " (", da, " steps)" + #if HAS_X_AXIS + " A:", target.a, " (", dist.a, " steps)" + #endif #if HAS_Y_AXIS - " B:", target.b, " (", db, " steps)" + " B:", target.b, " (", dist.b, " steps)" #endif #if HAS_Z_AXIS - " C:", target.c, " (", dc, " steps)" + " C:", target.c, " (", dist.c, " steps)" #endif #if HAS_I_AXIS - " " STR_I ":", target.i, " (", di, " steps)" + " " STR_I ":", target.i, " (", dist.i, " steps)" #endif #if HAS_J_AXIS - " " STR_J ":", target.j, " (", dj, " steps)" + " " STR_J ":", target.j, " (", dist.j, " steps)" #endif #if HAS_K_AXIS - " " STR_K ":", target.k, " (", dk, " steps)" + " " STR_K ":", target.k, " (", dist.k, " steps)" #endif #if HAS_U_AXIS - " " STR_U ":", target.u, " (", du, " steps)" + " " STR_U ":", target.u, " (", dist.u, " steps)" #endif #if HAS_V_AXIS - " " STR_V ":", target.v, " (", dv, " steps)" + " " STR_V ":", target.v, " (", dist.v, " steps)" #endif #if HAS_W_AXIS - " " STR_W ":", target.w, " (", dw, " steps)" + " " STR_W ":", target.w, " (", dist.w, " steps)" + #endif #if HAS_EXTRUDERS - " E:", target.e, " (", de, " steps)" + " E:", target.e, " (", dist.e, " steps)" #endif ); //*/ - #if EITHER(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) - if (de) { + #if ANY(PREVENT_COLD_EXTRUSION, PREVENT_LENGTHY_EXTRUDE) + if (dist.e) { #if ENABLED(PREVENT_COLD_EXTRUSION) if (thermalManager.tooColdToExtrude(extruder)) { position.e = target.e; // Behave as if the move really took place, but ignore E part TERN_(HAS_POSITION_FLOAT, position_float.e = target_float.e); - de = 0; // no difference + dist.e = 0; // no difference SERIAL_ECHO_MSG(STR_ERR_COLD_EXTRUDE_STOP); } #endif // PREVENT_COLD_EXTRUSION #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - const float e_steps = ABS(de * e_factor[extruder]); + const float e_steps = ABS(dist.e * e_factor[extruder]); const float max_e_steps = settings.axis_steps_per_mm[E_AXIS_N(extruder)] * (EXTRUDE_MAXLENGTH); if (e_steps > max_e_steps) { #if ENABLED(MIXING_EXTRUDER) @@ -1959,7 +1951,7 @@ bool Planner::_populate_block( if (ignore_e) { position.e = target.e; // Behave as if the move really took place, but ignore E part TERN_(HAS_POSITION_FLOAT, position_float.e = target_float.e); - de = 0; // no difference + dist.e = 0; // no difference SERIAL_ECHO_MSG(STR_ERR_LONG_EXTRUDE_STOP); } } @@ -1968,55 +1960,51 @@ bool Planner::_populate_block( #endif // PREVENT_COLD_EXTRUSION || PREVENT_LENGTHY_EXTRUDE // Compute direction bit-mask for this block - axis_bits_t dm = 0; + AxisBits dm; #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) - if (da < 0) SBI(dm, X_HEAD); // Save the toolhead's true direction in X - if (db < 0) SBI(dm, Y_HEAD); // ...and Y - TERN_(HAS_Z_AXIS, if (dc < 0) SBI(dm, Z_AXIS)); + dm.hx = (dist.a > 0); // Save the toolhead's true direction in X + dm.hy = (dist.b > 0); // ...and Y + TERN_(HAS_Z_AXIS, dm.z = (dist.c > 0)); #endif #if IS_CORE #if CORE_IS_XY - if (da + db < 0) SBI(dm, A_AXIS); // Motor A direction - if (CORESIGN(da - db) < 0) SBI(dm, B_AXIS); // Motor B direction + dm.a = (dist.a + dist.b > 0); // Motor A direction + dm.b = (CORESIGN(dist.a - dist.b) > 0); // Motor B direction #elif CORE_IS_XZ - if (da < 0) SBI(dm, X_HEAD); // Save the toolhead's true direction in X - if (db < 0) SBI(dm, Y_AXIS); - if (dc < 0) SBI(dm, Z_HEAD); // ...and Z - if (da + dc < 0) SBI(dm, A_AXIS); // Motor A direction - if (CORESIGN(da - dc) < 0) SBI(dm, C_AXIS); // Motor C direction + dm.hx = (dist.a > 0); // Save the toolhead's true direction in X + dm.y = (dist.b > 0); + dm.hz = (dist.c > 0); // ...and Z + dm.a = (dist.a + dist.c > 0); // Motor A direction + dm.c = (CORESIGN(dist.a - dist.c) > 0); // Motor C direction #elif CORE_IS_YZ - if (da < 0) SBI(dm, X_AXIS); - if (db < 0) SBI(dm, Y_HEAD); // Save the toolhead's true direction in Y - if (dc < 0) SBI(dm, Z_HEAD); // ...and Z - if (db + dc < 0) SBI(dm, B_AXIS); // Motor B direction - if (CORESIGN(db - dc) < 0) SBI(dm, C_AXIS); // Motor C direction + dm.x = (dist.a > 0); + dm.hy = (dist.b > 0); // Save the toolhead's true direction in Y + dm.hz = (dist.c > 0); // ...and Z + dm.b = (dist.b + dist.c > 0); // Motor B direction + dm.c = (CORESIGN(dist.b - dist.c) > 0); // Motor C direction #endif #elif ENABLED(MARKFORGED_XY) - if (da + db < 0) SBI(dm, A_AXIS); // Motor A direction - if (db < 0) SBI(dm, B_AXIS); // Motor B direction + dm.a = (dist.a + dist.b > 0); // Motor A direction + dm.b = (dist.b > 0); // Motor B direction #elif ENABLED(MARKFORGED_YX) - if (da < 0) SBI(dm, A_AXIS); // Motor A direction - if (db + da < 0) SBI(dm, B_AXIS); // Motor B direction + dm.a = (dist.a > 0); // Motor A direction + dm.b = (dist.b + dist.a > 0); // Motor B direction #else XYZ_CODE( - if (da < 0) SBI(dm, X_AXIS), - if (db < 0) SBI(dm, Y_AXIS), - if (dc < 0) SBI(dm, Z_AXIS) + dm.x = (dist.a > 0), + dm.y = (dist.b > 0), + dm.z = (dist.c > 0) ); #endif SECONDARY_AXIS_CODE( - if (di < 0) SBI(dm, I_AXIS), - if (dj < 0) SBI(dm, J_AXIS), - if (dk < 0) SBI(dm, K_AXIS), - if (du < 0) SBI(dm, U_AXIS), - if (dv < 0) SBI(dm, V_AXIS), - if (dw < 0) SBI(dm, W_AXIS) + dm.i = (dist.i > 0), dm.j = (dist.j > 0), dm.k = (dist.k > 0), + dm.u = (dist.u > 0), dm.v = (dist.v > 0), dm.w = (dist.w > 0) ); #if HAS_EXTRUDERS - if (de < 0) SBI(dm, E_AXIS); - const float esteps_float = de * e_factor[extruder]; + dm.e = (dist.e > 0); + const float esteps_float = dist.e * e_factor[extruder]; const uint32_t esteps = ABS(esteps_float) + 0.5f; #else constexpr uint32_t esteps = 0; @@ -2062,21 +2050,21 @@ bool Planner::_populate_block( // See https://www.corexy.com/theory.html block->steps.set(NUM_AXIS_LIST( #if CORE_IS_XY - ABS(da + db), ABS(da - db), ABS(dc) + ABS(dist.a + dist.b), ABS(dist.a - dist.b), ABS(dist.c) #elif CORE_IS_XZ - ABS(da + dc), ABS(db), ABS(da - dc) + ABS(dist.a + dist.c), ABS(dist.b), ABS(dist.a - dist.c) #elif CORE_IS_YZ - ABS(da), ABS(db + dc), ABS(db - dc) + ABS(dist.a), ABS(dist.b + dist.c), ABS(dist.b - dist.c) #elif ENABLED(MARKFORGED_XY) - ABS(da + db), ABS(db), ABS(dc) + ABS(dist.a + dist.b), ABS(dist.b), ABS(dist.c) #elif ENABLED(MARKFORGED_YX) - ABS(da), ABS(db + da), ABS(dc) + ABS(dist.a), ABS(dist.b + dist.a), ABS(dist.c) #elif IS_SCARA - ABS(da), ABS(db), ABS(dc) + ABS(dist.a), ABS(dist.b), ABS(dist.c) #else // default non-h-bot planning - ABS(da), ABS(db), ABS(dc) + ABS(dist.a), ABS(dist.b), ABS(dist.c) #endif - , ABS(di), ABS(dj), ABS(dk), ABS(du), ABS(dv), ABS(dw) + , ABS(dist.i), ABS(dist.j), ABS(dist.k), ABS(dist.u), ABS(dist.v), ABS(dist.w) )); /** @@ -2091,104 +2079,82 @@ bool Planner::_populate_block( #if ANY(IS_CORE, MARKFORGED_XY, MARKFORGED_YX) struct { float x, y, z; } head; #endif - } steps_dist_mm; + } dist_mm; #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) - steps_dist_mm.head.x = da * mm_per_step[A_AXIS]; - steps_dist_mm.head.y = db * mm_per_step[B_AXIS]; - TERN_(HAS_Z_AXIS, steps_dist_mm.z = dc * mm_per_step[Z_AXIS]); + dist_mm.head.x = dist.a * mm_per_step[A_AXIS]; + dist_mm.head.y = dist.b * mm_per_step[B_AXIS]; + TERN_(HAS_Z_AXIS, dist_mm.z = dist.c * mm_per_step[Z_AXIS]); #endif #if IS_CORE #if CORE_IS_XY - steps_dist_mm.a = (da + db) * mm_per_step[A_AXIS]; - steps_dist_mm.b = CORESIGN(da - db) * mm_per_step[B_AXIS]; + dist_mm.a = (dist.a + dist.b) * mm_per_step[A_AXIS]; + dist_mm.b = CORESIGN(dist.a - dist.b) * mm_per_step[B_AXIS]; #elif CORE_IS_XZ - steps_dist_mm.head.x = da * mm_per_step[A_AXIS]; - steps_dist_mm.y = db * mm_per_step[Y_AXIS]; - steps_dist_mm.head.z = dc * mm_per_step[C_AXIS]; - steps_dist_mm.a = (da + dc) * mm_per_step[A_AXIS]; - steps_dist_mm.c = CORESIGN(da - dc) * mm_per_step[C_AXIS]; + dist_mm.head.x = dist.a * mm_per_step[A_AXIS]; + dist_mm.y = dist.b * mm_per_step[Y_AXIS]; + dist_mm.head.z = dist.c * mm_per_step[C_AXIS]; + dist_mm.a = (dist.a + dist.c) * mm_per_step[A_AXIS]; + dist_mm.c = CORESIGN(dist.a - dist.c) * mm_per_step[C_AXIS]; #elif CORE_IS_YZ - steps_dist_mm.x = da * mm_per_step[X_AXIS]; - steps_dist_mm.head.y = db * mm_per_step[B_AXIS]; - steps_dist_mm.head.z = dc * mm_per_step[C_AXIS]; - steps_dist_mm.b = (db + dc) * mm_per_step[B_AXIS]; - steps_dist_mm.c = CORESIGN(db - dc) * mm_per_step[C_AXIS]; + dist_mm.x = dist.a * mm_per_step[X_AXIS]; + dist_mm.head.y = dist.b * mm_per_step[B_AXIS]; + dist_mm.head.z = dist.c * mm_per_step[C_AXIS]; + dist_mm.b = (dist.b + dist.c) * mm_per_step[B_AXIS]; + dist_mm.c = CORESIGN(dist.b - dist.c) * mm_per_step[C_AXIS]; #endif #elif ENABLED(MARKFORGED_XY) - steps_dist_mm.a = (da - db) * mm_per_step[A_AXIS]; - steps_dist_mm.b = db * mm_per_step[B_AXIS]; + dist_mm.a = (dist.a - dist.b) * mm_per_step[A_AXIS]; + dist_mm.b = dist.b * mm_per_step[B_AXIS]; #elif ENABLED(MARKFORGED_YX) - steps_dist_mm.a = da * mm_per_step[A_AXIS]; - steps_dist_mm.b = (db - da) * mm_per_step[B_AXIS]; + dist_mm.a = dist.a * mm_per_step[A_AXIS]; + dist_mm.b = (dist.b - dist.a) * mm_per_step[B_AXIS]; #else XYZ_CODE( - steps_dist_mm.a = da * mm_per_step[A_AXIS], - steps_dist_mm.b = db * mm_per_step[B_AXIS], - steps_dist_mm.c = dc * mm_per_step[C_AXIS] + dist_mm.a = dist.a * mm_per_step[A_AXIS], + dist_mm.b = dist.b * mm_per_step[B_AXIS], + dist_mm.c = dist.c * mm_per_step[C_AXIS] ); #endif SECONDARY_AXIS_CODE( - steps_dist_mm.i = di * mm_per_step[I_AXIS], - steps_dist_mm.j = dj * mm_per_step[J_AXIS], - steps_dist_mm.k = dk * mm_per_step[K_AXIS], - steps_dist_mm.u = du * mm_per_step[U_AXIS], - steps_dist_mm.v = dv * mm_per_step[V_AXIS], - steps_dist_mm.w = dw * mm_per_step[W_AXIS] + dist_mm.i = dist.i * mm_per_step[I_AXIS], dist_mm.j = dist.j * mm_per_step[J_AXIS], dist_mm.k = dist.k * mm_per_step[K_AXIS], + dist_mm.u = dist.u * mm_per_step[U_AXIS], dist_mm.v = dist.v * mm_per_step[V_AXIS], dist_mm.w = dist.w * mm_per_step[W_AXIS] ); - TERN_(HAS_EXTRUDERS, steps_dist_mm.e = esteps_float * mm_per_step[E_AXIS_N(extruder)]); + TERN_(HAS_EXTRUDERS, dist_mm.e = esteps_float * mm_per_step[E_AXIS_N(extruder)]); - TERN_(LCD_SHOW_E_TOTAL, e_move_accumulator += steps_dist_mm.e); + TERN_(LCD_SHOW_E_TOTAL, e_move_accumulator += dist_mm.e); #if HAS_ROTATIONAL_AXES bool cartesian_move = hints.cartesian_move; #endif if (true NUM_AXIS_GANG( - && block->steps.a < MIN_STEPS_PER_SEGMENT, - && block->steps.b < MIN_STEPS_PER_SEGMENT, - && block->steps.c < MIN_STEPS_PER_SEGMENT, - && block->steps.i < MIN_STEPS_PER_SEGMENT, - && block->steps.j < MIN_STEPS_PER_SEGMENT, - && block->steps.k < MIN_STEPS_PER_SEGMENT, - && block->steps.u < MIN_STEPS_PER_SEGMENT, - && block->steps.v < MIN_STEPS_PER_SEGMENT, - && block->steps.w < MIN_STEPS_PER_SEGMENT + && block->steps.a < MIN_STEPS_PER_SEGMENT, && block->steps.b < MIN_STEPS_PER_SEGMENT, && block->steps.c < MIN_STEPS_PER_SEGMENT, + && block->steps.i < MIN_STEPS_PER_SEGMENT, && block->steps.j < MIN_STEPS_PER_SEGMENT, && block->steps.k < MIN_STEPS_PER_SEGMENT, + && block->steps.u < MIN_STEPS_PER_SEGMENT, && block->steps.v < MIN_STEPS_PER_SEGMENT, && block->steps.w < MIN_STEPS_PER_SEGMENT ) ) { - block->millimeters = TERN0(HAS_EXTRUDERS, ABS(steps_dist_mm.e)); + block->millimeters = TERN0(HAS_EXTRUDERS, ABS(dist_mm.e)); } else { if (hints.millimeters) block->millimeters = hints.millimeters; else { const xyze_pos_t displacement = LOGICAL_AXIS_ARRAY( - steps_dist_mm.e, + dist_mm.e, #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) - steps_dist_mm.head.x, - steps_dist_mm.head.y, - steps_dist_mm.z, + dist_mm.head.x, dist_mm.head.y, dist_mm.z, #elif CORE_IS_XZ - steps_dist_mm.head.x, - steps_dist_mm.y, - steps_dist_mm.head.z, + dist_mm.head.x, dist_mm.y, dist_mm.head.z, #elif CORE_IS_YZ - steps_dist_mm.x, - steps_dist_mm.head.y, - steps_dist_mm.head.z, + dist_mm.x, dist_mm.head.y, dist_mm.head.z, #else - steps_dist_mm.x, - steps_dist_mm.y, - steps_dist_mm.z, + dist_mm.x, dist_mm.y, dist_mm.z, #endif - steps_dist_mm.i, - steps_dist_mm.j, - steps_dist_mm.k, - steps_dist_mm.u, - steps_dist_mm.v, - steps_dist_mm.w + dist_mm.i, dist_mm.j, dist_mm.k, + dist_mm.u, dist_mm.v, dist_mm.w ); block->millimeters = get_move_distance(displacement OPTARG(HAS_ROTATIONAL_AXES, cartesian_move)); @@ -2203,16 +2169,22 @@ bool Planner::_populate_block( * A correction function is permitted to add steps to an axis, it * should *never* remove steps! */ - TERN_(BACKLASH_COMPENSATION, backlash.add_correction_steps(da, db, dc, dm, block)); + TERN_(BACKLASH_COMPENSATION, backlash.add_correction_steps(dist.a, dist.b, dist.c, dm, block)); } TERN_(HAS_EXTRUDERS, block->steps.e = esteps); - block->step_event_count = _MAX(LOGICAL_AXIS_LIST(esteps, - block->steps.a, block->steps.b, block->steps.c, - block->steps.i, block->steps.j, block->steps.k, - block->steps.u, block->steps.v, block->steps.w - )); + block->step_event_count = ( + #if NUM_AXES + _MAX(LOGICAL_AXIS_LIST(esteps, + block->steps.a, block->steps.b, block->steps.c, + block->steps.i, block->steps.j, block->steps.k, + block->steps.u, block->steps.v, block->steps.w + )) + #elif HAS_EXTRUDERS + esteps + #endif + ); // Bail if this is a zero-length block if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return false; @@ -2274,12 +2246,9 @@ bool Planner::_populate_block( #endif #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) SECONDARY_AXIS_CODE( - if (block->steps.i) stepper.enable_axis(I_AXIS), - if (block->steps.j) stepper.enable_axis(J_AXIS), - if (block->steps.k) stepper.enable_axis(K_AXIS), - if (block->steps.u) stepper.enable_axis(U_AXIS), - if (block->steps.v) stepper.enable_axis(V_AXIS), - if (block->steps.w) stepper.enable_axis(W_AXIS) + if (block->steps.i) stepper.enable_axis(I_AXIS), if (block->steps.j) stepper.enable_axis(J_AXIS), + if (block->steps.k) stepper.enable_axis(K_AXIS), if (block->steps.u) stepper.enable_axis(U_AXIS), + if (block->steps.v) stepper.enable_axis(V_AXIS), if (block->steps.w) stepper.enable_axis(W_AXIS) ); #endif @@ -2291,7 +2260,7 @@ bool Planner::_populate_block( #if ENABLED(DISABLE_OTHER_EXTRUDERS) // Enable only the selected extruder // Count down all steppers that were recently moved - LOOP_L_N(i, E_STEPPERS) + for (uint8_t i = 0; i < E_STEPPERS; ++i) if (extruder_last_move[i]) extruder_last_move[i]--; // Switching Extruder uses one E stepper motor per two nozzles @@ -2330,7 +2299,7 @@ bool Planner::_populate_block( // Example: At 120mm/s a 60mm move involving XYZ axes takes 0.5s. So this will give 2.0. // Example 2: At 120°/s a 60° move involving only rotational axes takes 0.5s. So this will give 2.0. float inverse_secs = inverse_millimeters * ( - #if BOTH(HAS_ROTATIONAL_AXES, INCH_MODE_SUPPORT) + #if ALL(HAS_ROTATIONAL_AXES, INCH_MODE_SUPPORT) cartesian_move ? fr_mm_s : LINEAR_UNIT(fr_mm_s) #else fr_mm_s @@ -2341,7 +2310,7 @@ bool Planner::_populate_block( const uint8_t moves_queued = nonbusy_movesplanned(); // Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill - #if EITHER(SLOWDOWN, HAS_WIRED_LCD) || defined(XY_FREQUENCY_LIMIT) + #if ANY(SLOWDOWN, HAS_WIRED_LCD) || defined(XY_FREQUENCY_LIMIT) // Segment time in microseconds int32_t segment_time_us = LROUND(1000000.0f / inverse_secs); #endif @@ -2378,7 +2347,7 @@ bool Planner::_populate_block( #if ENABLED(FILAMENT_WIDTH_SENSOR) if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM) // Only for extruder with filament sensor - filwidth.advance_e(steps_dist_mm.e); + filwidth.advance_e(dist_mm.e); #endif // Calculate and limit speed in mm/sec (linear) or degrees/sec (rotational) @@ -2388,7 +2357,7 @@ bool Planner::_populate_block( // Linear axes first with less logic LOOP_NUM_AXES(i) { - current_speed[i] = steps_dist_mm[i] * inverse_secs; + current_speed[i] = dist_mm[i] * inverse_secs; const feedRate_t cs = ABS(current_speed[i]), max_fr = settings.max_feedrate_mm_s[i]; if (cs > max_fr) NOMORE(speed_factor, max_fr / cs); @@ -2397,7 +2366,7 @@ bool Planner::_populate_block( // Limit speed on extruders, if any #if HAS_EXTRUDERS { - current_speed.e = steps_dist_mm.e * inverse_secs; + current_speed.e = dist_mm.e * inverse_secs; #if HAS_MIXER_SYNC_CHANNEL // Move all mixing extruders at the specified rate if (mixer.get_current_vtool() == MIXER_AUTORETRACT_TOOL) @@ -2435,11 +2404,11 @@ bool Planner::_populate_block( #ifdef XY_FREQUENCY_LIMIT - static axis_bits_t old_direction_bits; // = 0 + static AxisBits old_direction_bits; // = 0 if (xy_freq_limit_hz) { // Check and limit the xy direction change frequency - const axis_bits_t direction_change = block->direction_bits ^ old_direction_bits; + const AxisBits direction_change = block->direction_bits ^ old_direction_bits; old_direction_bits = block->direction_bits; segment_time_us = LROUND(float(segment_time_us) / speed_factor); @@ -2450,8 +2419,8 @@ bool Planner::_populate_block( xs2 = xs1; xs1 = xs0; ys2 = ys1; ys1 = ys0; } - xs0 = TEST(direction_change, X_AXIS) ? segment_time_us : xy_freq_min_interval_us; - ys0 = TEST(direction_change, Y_AXIS) ? segment_time_us : xy_freq_min_interval_us; + xs0 = direction_change.x ? segment_time_us : xy_freq_min_interval_us; + ys0 = direction_change.y ? segment_time_us : xy_freq_min_interval_us; if (segment_time_us < xy_freq_min_interval_us) { const int32_t least_xy_segment_time = _MIN(_MAX(xs0, xs1, xs2), _MAX(ys0, ys1, ys2)); @@ -2478,8 +2447,8 @@ bool Planner::_populate_block( #if ENABLED(LIN_ADVANCE) bool use_advance_lead = false; #endif - if (NUM_AXIS_GANG( - !block->steps.a, && !block->steps.b, && !block->steps.c, + if (true NUM_AXIS_GANG( + && !block->steps.a, && !block->steps.b, && !block->steps.c, && !block->steps.i, && !block->steps.j, && !block->steps.k, && !block->steps.u, && !block->steps.v, && !block->steps.w) ) { // Is this a retract / recover move? @@ -2514,9 +2483,9 @@ bool Planner::_populate_block( * * extruder_advance_K[extruder] : There is an advance factor set for this extruder. * - * de > 0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves) + * dist.e > 0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves) */ - use_advance_lead = esteps && extruder_advance_K[E_INDEX_N(extruder)] && de > 0; + use_advance_lead = esteps && extruder_advance_K[E_INDEX_N(extruder)] && dist.e > 0; if (use_advance_lead) { float e_D_ratio = (target_float.e - position_float.e) / @@ -2627,10 +2596,10 @@ bool Planner::_populate_block( #if HAS_DIST_MM_ARG cart_dist_mm #else - LOGICAL_AXIS_ARRAY(steps_dist_mm.e, - steps_dist_mm.x, steps_dist_mm.y, steps_dist_mm.z, - steps_dist_mm.i, steps_dist_mm.j, steps_dist_mm.k, - steps_dist_mm.u, steps_dist_mm.v, steps_dist_mm.w) + LOGICAL_AXIS_ARRAY(dist_mm.e, + dist_mm.x, dist_mm.y, dist_mm.z, + dist_mm.i, dist_mm.j, dist_mm.k, + dist_mm.u, dist_mm.v, dist_mm.w) #endif ; @@ -2799,7 +2768,7 @@ bool Planner::_populate_block( #ifndef TRAVEL_EXTRA_XYJERK #define TRAVEL_EXTRA_XYJERK 0 #endif - const float extra_xyjerk = TERN0(HAS_EXTRUDERS, de <= 0) ? TRAVEL_EXTRA_XYJERK : 0; + const float extra_xyjerk = TERN0(HAS_EXTRUDERS, dist.e <= 0) ? TRAVEL_EXTRA_XYJERK : 0; uint8_t limited = 0; TERN(HAS_LINEAR_E_JERK, LOOP_NUM_AXES, LOOP_LOGICAL_AXES)(i) { @@ -2938,7 +2907,7 @@ void Planner::buffer_sync_block(const BlockFlagBit sync_flag/*=BLOCK_BIT_SYNC_PO #if ENABLED(BACKLASH_COMPENSATION) LOOP_NUM_AXES(axis) block->position[axis] += backlash.get_applied_steps((AxisEnum)axis); #endif - #if BOTH(HAS_FAN, LASER_SYNCHRONOUS_M106_M107) + #if ALL(HAS_FAN, LASER_SYNCHRONOUS_M106_M107) FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; #endif @@ -2955,7 +2924,7 @@ void Planner::buffer_sync_block(const BlockFlagBit sync_flag/*=BLOCK_BIT_SYNC_PO // As there are no queued movements, the Stepper ISR will not touch this // variable, so there is no risk setting this here (but it MUST be done // before the following line!!) - delay_before_delivering = TERN_(FT_MOTION, fxdTiCtrl.cfg_mode ? BLOCK_DELAY_NONE :) BLOCK_DELAY_FOR_1ST_MOVE; + delay_before_delivering = TERN_(FT_MOTION, fxdTiCtrl.cfg.mode ? BLOCK_DELAY_NONE :) BLOCK_DELAY_FOR_1ST_MOVE; } block_buffer_head = next_buffer_head; @@ -3177,14 +3146,14 @@ bool Planner::buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s if (delta.a <= POLAR_FAST_RADIUS ) calculated_feedrate = settings.max_feedrate_mm_s[Y_AXIS]; else { - // Normalized vector of movement - const float diffBLength = ABS((2.0f * PI * diff.a) * (diff.b / 360.0f)), - diffTheta = DEGREES(ATAN2(diff.a, diffBLength)), - normalizedTheta = 1.0f - (ABS(diffTheta > 90.0f ? 180.0f - diffTheta : diffTheta) / 90.0f); + // Normalized vector of movement + const float diffBLength = ABS((2.0f * M_PI * diff.a) * (diff.b / 360.0f)), + diffTheta = DEGREES(ATAN2(diff.a, diffBLength)), + normalizedTheta = 1.0f - (ABS(diffTheta > 90.0f ? 180.0f - diffTheta : diffTheta) / 90.0f); - // Normalized position along the radius - const float radiusRatio = PRINTABLE_RADIUS/delta.a; - calculated_feedrate += (fr_mm_s * radiusRatio * normalizedTheta); + // Normalized position along the radius + const float radiusRatio = (PRINTABLE_RADIUS) / delta.a; + calculated_feedrate += (fr_mm_s * radiusRatio * normalizedTheta); } } const feedRate_t feedrate = calculated_feedrate; @@ -3234,16 +3203,11 @@ bool Planner::buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s block->decelerate_after = block->step_event_count; // Will be set to last direction later if directional format. - block->direction_bits = 0; - - #define PAGE_UPDATE_DIR(AXIS) \ - if (!last_page_dir[_AXIS(AXIS)]) SBI(block->direction_bits, _AXIS(AXIS)); + block->direction_bits.reset(); if (!DirectStepping::Config::DIRECTIONAL) { - PAGE_UPDATE_DIR(X); - PAGE_UPDATE_DIR(Y); - PAGE_UPDATE_DIR(Z); - PAGE_UPDATE_DIR(E); + #define PAGE_UPDATE_DIR(AXIS) do{ if (last_page_dir.AXIS) block->direction_bits.AXIS = true; }while(0); + LOGICAL_AXIS_MAP(PAGE_UPDATE_DIR); } // If this is the first added movement, reload the delay, otherwise, cancel it. @@ -3253,7 +3217,7 @@ bool Planner::buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s // As there are no queued movements, the Stepper ISR will not touch this // variable, so there is no risk setting this here (but it MUST be done // before the following line!!) - delay_before_delivering = TERN_(FT_MOTION, fxdTiCtrl.cfg_mode ? BLOCK_DELAY_NONE :) BLOCK_DELAY_FOR_1ST_MOVE; + delay_before_delivering = TERN_(FT_MOTION, fxdTiCtrl.cfg.mode ? BLOCK_DELAY_NONE :) BLOCK_DELAY_FOR_1ST_MOVE; } // Move buffer head diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 030c1b31db..c45ff6ad1d 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -88,6 +88,18 @@ MMM_TO_MMS(manual_feedrate_mm_m.u), MMM_TO_MMS(manual_feedrate_mm_m.v), MMM_TO_MMS(manual_feedrate_mm_m.w)); #endif +#if ENABLED(BABYSTEPPING) + #if ENABLED(BABYSTEP_MILLIMETER_UNITS) + #define BABYSTEP_SIZE_X int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[X_AXIS]) + #define BABYSTEP_SIZE_Y int32_t((BABYSTEP_MULTIPLICATOR_XY) * planner.settings.axis_steps_per_mm[Y_AXIS]) + #define BABYSTEP_SIZE_Z int32_t((BABYSTEP_MULTIPLICATOR_Z) * planner.settings.axis_steps_per_mm[Z_AXIS]) + #else + #define BABYSTEP_SIZE_X BABYSTEP_MULTIPLICATOR_XY + #define BABYSTEP_SIZE_Y BABYSTEP_MULTIPLICATOR_XY + #define BABYSTEP_SIZE_Z BABYSTEP_MULTIPLICATOR_Z + #endif +#endif + #if IS_KINEMATIC && HAS_JUNCTION_DEVIATION #define HAS_DIST_MM_ARG 1 #endif @@ -246,7 +258,7 @@ typedef struct PlannerBlock { uint32_t acceleration_rate; // The acceleration rate used for acceleration calculation #endif - axis_bits_t direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h) + AxisBits direction_bits; // Direction bits set for this block, where 1 is negative motion // Advance extrusion #if ENABLED(LIN_ADVANCE) @@ -417,7 +429,7 @@ class Planner { #if ENABLED(DIRECT_STEPPING) static uint32_t last_page_step_rate; // Last page step rate given - static xyze_bool_t last_page_dir; // Last page direction given + static AxisBits last_page_dir; // Last page direction given, where 1 represents forward or positive motion #endif #if HAS_EXTRUDERS @@ -638,7 +650,7 @@ class Planner { 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 - LOOP_L_N(i, COUNT(filament_size)) + for (uint8_t i = 0; i < COUNT(filament_size); ++i) if (!filament_size[i]) filament_size[i] = DEFAULT_NOMINAL_FILAMENT_DIA; } @@ -926,7 +938,7 @@ class Planner { } // SCARA AB and Polar YB axes are in degrees, not mm - #if EITHER(IS_SCARA, POLAR) + #if ANY(IS_SCARA, POLAR) FORCE_INLINE static float get_axis_position_degrees(const AxisEnum axis) { return get_axis_position_mm(axis); } #endif @@ -1029,7 +1041,7 @@ class Planner { return target_velocity_sqr - 2 * accel * distance; } - #if EITHER(S_CURVE_ACCELERATION, LIN_ADVANCE) + #if ANY(S_CURVE_ACCELERATION, LIN_ADVANCE) /** * Calculate the speed reached given initial speed, acceleration and distance */ diff --git a/Marlin/src/module/printcounter.h b/Marlin/src/module/printcounter.h index 63cc1da158..ebf61a3a1c 100644 --- a/Marlin/src/module/printcounter.h +++ b/Marlin/src/module/printcounter.h @@ -54,7 +54,7 @@ struct printStatistics { // 16 bytes class PrintCounter: public Stopwatch { private: typedef Stopwatch super; - typedef IF::type eeprom_address_t; + typedef IF::type eeprom_address_t; static printStatistics data; diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index a03125a73a..204617ba83 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -57,9 +57,9 @@ float largest_sensorless_adj = 0; #endif -#if EITHER(HAS_QUIET_PROBING, USE_SENSORLESS) +#if ANY(HAS_QUIET_PROBING, USE_SENSORLESS) #include "stepper/indirection.h" - #if BOTH(HAS_QUIET_PROBING, PROBING_ESTEPPERS_OFF) + #if ALL(HAS_QUIET_PROBING, PROBING_ESTEPPERS_OFF) #include "stepper.h" #endif #if USE_SENSORLESS @@ -359,7 +359,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { FSTR_P const ds_str = deploy ? GET_TEXT_F(MSG_MANUAL_DEPLOY) : GET_TEXT_F(MSG_MANUAL_STOW); ui.return_to_status(); // To display the new status message ui.set_status(ds_str, 99); - SERIAL_ECHOLNF(deploy ? GET_EN_TEXT_F(MSG_MANUAL_DEPLOY) : GET_EN_TEXT_F(MSG_MANUAL_STOW)); + SERIAL_ECHOLN(deploy ? GET_EN_TEXT_F(MSG_MANUAL_DEPLOY) : GET_EN_TEXT_F(MSG_MANUAL_STOW)); OKAY_BUZZ(); @@ -429,7 +429,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #endif } -#if EITHER(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) +#if ANY(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) #if ENABLED(PREHEAT_BEFORE_PROBING) #ifndef PROBING_NOZZLE_TEMP @@ -490,7 +490,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { void Probe::probe_error_stop() { SERIAL_ERROR_START(); SERIAL_ECHOPGM(STR_STOP_PRE); - #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) + #if ANY(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) SERIAL_ECHOPGM(STR_STOP_UNHOMED); #elif ENABLED(BLTOUCH) SERIAL_ECHOPGM(STR_STOP_BLTOUCH); @@ -515,19 +515,19 @@ bool Probe::set_deployed(const bool deploy, const bool no_return/*=false*/) { // Make room for probe to deploy (or stow) // Fix-mounted probe should only raise for deploy // unless PAUSE_BEFORE_DEPLOY_STOW is enabled - #if EITHER(FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE) && DISABLED(PAUSE_BEFORE_DEPLOY_STOW) + #if ANY(FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE) && DISABLED(PAUSE_BEFORE_DEPLOY_STOW) const bool z_raise_wanted = deploy; #else constexpr bool z_raise_wanted = true; #endif if (z_raise_wanted) { - const float zdest = DIFF_TERN(HAS_HOTEND_OFFSET, _MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE), hotend_offset[active_extruder].z); + const float zdest = DIFF_TERN(HAS_HOTEND_OFFSET, Z_CLEARANCE_DEPLOY_PROBE, hotend_offset[active_extruder].z); if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Raise Z to ", zdest); do_z_clearance(zdest); } - #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) + #if ANY(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) if (homing_needed_error(TERN_(Z_PROBE_SLED, _BV(X_AXIS)))) { probe_error_stop(); return true; @@ -588,11 +588,11 @@ bool Probe::set_deployed(const bool deploy, const bool no_return/*=false*/) { 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) + #if ALL(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) thermalManager.wait_for_bed_heating(); #endif - #if BOTH(HAS_TEMP_HOTEND, WAIT_FOR_HOTEND) + #if ALL(HAS_TEMP_HOTEND, WAIT_FOR_HOTEND) thermalManager.wait_for_hotend_heating(active_extruder); #endif @@ -615,7 +615,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { if (test_sensitivity.z) stealth_states.z = tmc_enable_stallguard(stepperZ); // All machines will check Z-DIAG for stall endstops.set_homing_current(true); // The "homing" current also applies to probing endstops.enable(true); - #endif + #endif // SENSORLESS_PROBING TERN_(HAS_QUIET_PROBING, set_probing_paused(true)); @@ -623,13 +623,13 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { do_blocking_move_to_z(z, fr_mm_s); // Check to see if the probe was triggered - const bool probe_triggered = + const bool probe_triggered = ( #if HAS_DELTA_SENSORLESS_PROBING endstops.trigger_state() & (_BV(X_MAX) | _BV(Y_MAX) | _BV(Z_MAX)) #else TEST(endstops.trigger_state(), Z_MIN_PROBE) #endif - ; + ); // Offset sensorless probing #if HAS_DELTA_SENSORLESS_PROBING @@ -654,7 +654,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { return true; // Stow in LOW SPEED MODE on every trigger #endif - #if BOTH(HAS_Z_SERVO_PROBE, Z_SERVO_INTERMEDIATE_STOW) + #if ALL(HAS_Z_SERVO_PROBE, Z_SERVO_INTERMEDIATE_STOW) probe_specific_action(false); // Always stow #endif @@ -689,7 +689,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { * @return TRUE if the tare cold not be completed */ bool Probe::tare() { - #if BOTH(PROBE_ACTIVATION_SWITCH, PROBE_TARE_ONLY_WHILE_INACTIVE) + #if ALL(PROBE_ACTIVATION_SWITCH, PROBE_TARE_ONLY_WHILE_INACTIVE) if (endstops.probe_switch_activated()) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Cannot tare an active probe"); return true; @@ -716,10 +716,12 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { * @param sanity_check Flag to compare the probe result with the expected result * based on the probe Z offset. If the result is too far away * (more than 2mm too early) then consider it an error. + * @param z_min_point Override the minimum probing height (-2mm), to allow deeper probing. + * @param z_clearance Z clearance to apply on probe failure. * * @return The Z position of the bed at the current XY or NAN on error. */ -float Probe::run_z_probe(const bool sanity_check/*=true*/) { +float Probe::run_z_probe(const bool sanity_check/*=true*/, const_float_t z_min_point/*=Z_PROBE_LOW_POINT*/, const_float_t z_clearance/*=Z_TWEEN_SAFE_CLEARANCE*/) { DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); const float zoffs = SUM_TERN(HAS_HOTEND_OFFSET, -offset.z, hotend_offset[active_extruder].z); @@ -750,9 +752,8 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { }; // Stop the probe before it goes too low to prevent damage. - // For known Z probe below the expected trigger point, otherwise -10mm. - const float z_probe_low_point = axis_is_trusted(Z_AXIS) ? zoffs + Z_PROBE_LOW_POINT : -10.0f; - + // For known Z probe below the expected trigger point, otherwise -10mm lower. + const float z_probe_low_point = zoffs + z_min_point -float((!axis_is_trusted(Z_AXIS)) * 10); if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Probe Low Point: ", z_probe_low_point); // Double-probing does a fast probe followed by a slow probe @@ -768,7 +769,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("1st Probe Z:", z1); // Raise to give the probe clearance - do_z_clearance(Z_CLEARANCE_MULTI_PROBE); + do_z_clearance(z1 + (Z_CLEARANCE_MULTI_PROBE), false); #elif Z_PROBE_FEEDRATE_FAST != Z_PROBE_FEEDRATE_SLOW @@ -778,7 +779,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { if (current_position.z > z) { // Probe down fast. If the probe never triggered, raise for probe clearance if (!probe_down_to_z(z, z_probe_fast_mm_s)) - do_z_clearance(Z_PROBE_SAFE_CLEARANCE); + do_z_clearance(z_clearance); } #endif @@ -810,7 +811,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { #if EXTRA_PROBING > 0 // Insert Z measurement into probes[]. Keep it sorted ascending. - LOOP_LE_N(i, p) { // Iterate the saved Zs to insert the new Z + for (uint8_t i = 0; i <= p; ++i) { // Iterate the saved Zs to insert the new Z if (i == p || probes[i] > z) { // Last index or new Z is smaller than this Z for (int8_t m = p; --m >= i;) probes[m + 1] = probes[m]; // Shift items down after the insertion point probes[i] = z; // Insert the new Z measurement @@ -848,7 +849,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { max_avg_idx--; else min_avg_idx++; // Return the average value of all remaining probes. - LOOP_S_LE_N(i, min_avg_idx, max_avg_idx) + for (uint8_t i = min_avg_idx; i <= max_avg_idx; ++i) probes_z_sum += probes[i]; #endif @@ -911,7 +912,11 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { * with the previously active tool. * */ -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*/) { +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*/, + const_float_t z_min_point/*=Z_PROBE_LOW_POINT*/, const_float_t z_clearance/*=Z_TWEEN_SAFE_CLEARANCE*/, + const bool raise_after_is_relative/*=false*/ +) { DEBUG_SECTION(log_probe, "Probe::probe_at_point", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) { @@ -930,7 +935,7 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai #endif // Use a safe Z height for the XY move - const float safe_z = _MAX(current_position.z, Z_PROBE_SAFE_CLEARANCE); + const float safe_z = _MAX(current_position.z, z_clearance); // On delta keep Z below clip height or do_blocking_move_to will abort xyz_pos_t npos = NUM_AXIS_ARRAY( @@ -959,7 +964,7 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai #else // !BD_SENSOR - float measured_z = deploy() ? NAN : run_z_probe(sanity_check) + offset.z; + float measured_z = deploy() ? NAN : run_z_probe(sanity_check, z_min_point, z_clearance) + offset.z; // Deploy succeeded and a successful measurement was done. // Raise and/or stow the probe depending on 'raise_after' and settings. @@ -967,7 +972,10 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai switch (raise_after) { default: break; case PROBE_PT_RAISE: - do_z_clearance(Z_PROBE_SAFE_CLEARANCE); + if (raise_after_is_relative) + do_z_clearance(current_position.z + z_clearance, false); + else + do_z_clearance(z_clearance); break; case PROBE_PT_STOW: case PROBE_PT_LAST_STOW: if (stow()) measured_z = NAN; // Error on stow? diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index fd0302c665..028a7589cc 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -29,6 +29,10 @@ #include "motion.h" +#if ENABLED(BLTOUCH) + #include "../feature/bltouch.h" +#endif + #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" @@ -41,14 +45,22 @@ }; #endif -#if USES_Z_MIN_PROBE_PIN - #define PROBE_TRIGGERED() (READ(Z_MIN_PROBE_PIN) == Z_MIN_PROBE_ENDSTOP_HIT_STATE) +#if ENABLED(BD_SENSOR) + #define PROBE_READ() bdp_state +#elif USE_Z_MIN_PROBE + #define PROBE_READ() READ(Z_MIN_PROBE_PIN) #else - #define PROBE_TRIGGERED() (READ(Z_MIN_PIN) == Z_MIN_ENDSTOP_HIT_STATE) + #define PROBE_READ() READ(Z_MIN_PIN) #endif +#if USE_Z_MIN_PROBE + #define PROBE_HIT_STATE Z_MIN_PROBE_ENDSTOP_HIT_STATE +#else + #define PROBE_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE +#endif +#define PROBE_TRIGGERED() (PROBE_READ() == PROBE_HIT_STATE) // In BLTOUCH HS mode, the probe travels in a deployed state. -#define Z_PROBE_SAFE_CLEARANCE SUM_TERN(BLTOUCH, Z_CLEARANCE_BETWEEN_PROBES, bltouch.z_extra_clearance()) +#define Z_TWEEN_SAFE_CLEARANCE SUM_TERN(BLTOUCH, Z_CLEARANCE_BETWEEN_PROBES, bltouch.z_extra_clearance()) #if ENABLED(PREHEAT_BEFORE_LEVELING) #ifndef LEVELING_NOZZLE_TEMP @@ -75,7 +87,7 @@ public: static xyz_pos_t offset; - #if EITHER(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) + #if ANY(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) static void preheat_for_probing(const celsius_t hotend_temp, const celsius_t bed_temp, const bool early=false); #endif @@ -159,9 +171,17 @@ public: #endif // !IS_KINEMATIC - 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); + 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, + const_float_t z_min_point=Z_PROBE_LOW_POINT, const_float_t z_clearance=Z_TWEEN_SAFE_CLEARANCE, + const bool raise_after_is_relative=false); + + 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, + const_float_t z_min_point=Z_PROBE_LOW_POINT, float z_clearance=Z_TWEEN_SAFE_CLEARANCE, + const bool raise_after_is_relative=false + ) { + return probe_at_point(pos.x, pos.y, raise_after, verbose_level, probe_relative, sanity_check, z_min_point, z_clearance, raise_after_is_relative); } #else // !HAS_BED_PROBE @@ -170,7 +190,7 @@ public: static bool set_deployed(const bool, const bool=false) { return false; } - static bool can_reach(const_float_t rx, const_float_t ry, const bool=true) { return position_is_reachable(rx, ry); } + static bool can_reach(const_float_t rx, const_float_t ry, const bool=true) { return position_is_reachable(TERN_(HAS_X_AXIS, rx) OPTARG(HAS_Y_AXIS, ry)); } #endif // !HAS_BED_PROBE @@ -330,7 +350,7 @@ public: private: static bool probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s); - static float run_z_probe(const bool sanity_check=true); + static float run_z_probe(const bool sanity_check=true, const_float_t z_min_point=Z_PROBE_LOW_POINT, const_float_t z_clearance=Z_TWEEN_SAFE_CLEARANCE); }; extern Probe probe; diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 4c42ace884..9c149670e9 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -39,7 +39,7 @@ float segments_per_second = DEFAULT_SEGMENTS_PER_SECOND; -#if EITHER(MORGAN_SCARA, MP_SCARA) +#if ANY(MORGAN_SCARA, MP_SCARA) static constexpr xy_pos_t scara_offset = { SCARA_OFFSET_X, SCARA_OFFSET_Y }; diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 8ebc8c61f5..16e0d10a09 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -36,12 +36,13 @@ */ // Change EEPROM version if the structure changes -#define EEPROM_VERSION "V87" +#define EEPROM_VERSION "V88" #define EEPROM_OFFSET 100 // Check the integrity of data offsets. // Can be disabled for production build. //#define DEBUG_EEPROM_READWRITE +//#define DEBUG_EEPROM_OBSERVE #include "settings.h" @@ -55,11 +56,13 @@ #include "../gcode/gcode.h" #include "../MarlinCore.h" -#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) +#if ANY(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) #include "../HAL/shared/eeprom_api.h" #endif -#include "probe.h" +#if HAS_BED_PROBE + #include "probe.h" +#endif #if HAS_LEVELING #include "../feature/bedlevel/bedlevel.h" @@ -111,6 +114,10 @@ #include "../feature/backlash.h" #endif +#if ENABLED(FT_MOTION) + #include "../module/ft_motion.h" +#endif + #if HAS_FILAMENT_SENSOR #include "../feature/runout.h" #ifndef FIL_RUNOUT_ENABLED_DEFAULT @@ -181,10 +188,10 @@ #define _EN_ITEM(N) , E##N #define _EN1_ITEM(N) , E##N:1 -typedef struct { uint16_t MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM); } per_stepper_uint16_t; -typedef struct { uint32_t MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM); } per_stepper_uint32_t; -typedef struct { int16_t MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4; } mot_stepper_int16_t; -typedef struct { bool NUM_AXIS_LIST(X:1, Y:1, Z:1, I:1, J:1, K:1, U:1, V:1, W:1), X2:1, Y2:1, Z2:1, Z3:1, Z4:1 REPEAT(E_STEPPERS, _EN1_ITEM); } per_stepper_bool_t; +typedef struct { uint16_t MAIN_AXIS_NAMES_ X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM); } per_stepper_uint16_t; +typedef struct { uint32_t MAIN_AXIS_NAMES_ X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM); } per_stepper_uint32_t; +typedef struct { int16_t MAIN_AXIS_NAMES_ X2, Y2, Z2, Z3, Z4; } mot_stepper_int16_t; +typedef struct { bool NUM_AXIS_LIST_(X:1, Y:1, Z:1, I:1, J:1, K:1, U:1, V:1, W:1) X2:1, Y2:1, Z2:1, Z3:1, Z4:1 REPEAT(E_STEPPERS, _EN1_ITEM); } per_stepper_bool_t; #undef _EN_ITEM @@ -207,7 +214,8 @@ typedef struct SettingsDataStruct { #if ENABLED(EEPROM_INIT_NOW) uint32_t build_hash; // Unique build hash #endif - uint16_t crc; // Data Checksum + uint16_t crc; // Data Checksum for validation + uint16_t data_size; // Data Size for validation // // DISTINCT_E_FACTORS @@ -225,7 +233,9 @@ typedef struct SettingsDataStruct { // // Home Offset // - xyz_pos_t home_offset; // M206 XYZ / M665 TPZ + #if NUM_AXES + xyz_pos_t home_offset; // M206 XYZ / M665 TPZ + #endif // // Hotend Offset @@ -258,14 +268,16 @@ typedef struct SettingsDataStruct { // float mbl_z_offset; // bedlevel.z_offset uint8_t mesh_num_x, mesh_num_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y + uint16_t mesh_check; // Hash to check against X/Y float mbl_z_values[TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_X, 3)] // bedlevel.z_values [TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_Y, 3)]; // // HAS_BED_PROBE // - - xyz_pos_t probe_offset; // M851 X Y Z + #if NUM_AXES + xyz_pos_t probe_offset; // M851 X Y Z + #endif // // ABL_PLANAR @@ -276,6 +288,7 @@ typedef struct SettingsDataStruct { // AUTO_BED_LEVELING_BILINEAR // uint8_t grid_max_x, grid_max_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y + uint16_t grid_check; // Hash to check against X/Y xy_pos_t bilinear_grid_spacing, bilinear_start; // G29 L F #if ENABLED(AUTO_BED_LEVELING_BILINEAR) bed_mesh_t z_values; // G29 @@ -475,7 +488,9 @@ typedef struct SettingsDataStruct { // // CNC_COORDINATE_SYSTEMS // - xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; // G54-G59.3 + #if NUM_AXES + xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS]; // G54-G59.3 + #endif // // SKEW_CORRECTION @@ -501,9 +516,11 @@ typedef struct SettingsDataStruct { // // BACKLASH_COMPENSATION // - xyz_float_t backlash_distance_mm; // M425 X Y Z - uint8_t backlash_correction; // M425 F - float backlash_smoothing_mm; // M425 S + #if NUM_AXES + xyz_float_t backlash_distance_mm; // M425 X Y Z + uint8_t backlash_correction; // M425 F + float backlash_smoothing_mm; // M425 S + #endif // // EXTENSIBLE_UI @@ -518,7 +535,7 @@ typedef struct SettingsDataStruct { #if ENABLED(DWIN_LCD_PROUI) uint8_t dwin_data[eeprom_data_size]; #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) - uint8_t dwin_settings[CrealityDWIN.eeprom_data_size]; + uint8_t dwin_settings[crealityDWIN.eeprom_data_size]; #endif // @@ -587,16 +604,23 @@ typedef struct SettingsDataStruct { MPC_t mpc_constants[HOTENDS]; // M306 #endif + // + // Fixed-Time Motion + // + #if ENABLED(FT_MOTION) + ft_config_t fxdTiCtrl_cfg; // M493 + #endif + // // Input Shaping // #if ENABLED(INPUT_SHAPING_X) - float shaping_x_frequency, // M593 X F - shaping_x_zeta; // M593 X D + float shaping_x_frequency, // M593 X F + shaping_x_zeta; // M593 X D #endif #if ENABLED(INPUT_SHAPING_Y) - float shaping_y_frequency, // M593 Y F - shaping_y_zeta; // M593 Y D + float shaping_y_frequency, // M593 Y F + shaping_y_zeta; // M593 Y D #endif } SettingsData; @@ -673,7 +697,7 @@ void MarlinSettings::postprocess() { #endif } -#if BOTH(PRINTCOUNTER, EEPROM_SETTINGS) +#if ALL(PRINTCOUNTER, EEPROM_SETTINGS) #include "printcounter.h" static_assert( !WITHIN(STATS_EEPROM_ADDRESS, EEPROM_OFFSET, EEPROM_OFFSET + sizeof(SettingsData)) && @@ -717,19 +741,22 @@ void MarlinSettings::postprocess() { // This file simply uses the DEBUG_ECHO macros to implement EEPROM_CHITCHAT. // For deeper debugging of EEPROM issues enable DEBUG_EEPROM_READWRITE. // -#define DEBUG_OUT EITHER(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) +#define DEBUG_OUT ANY(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" -#if BOTH(EEPROM_CHITCHAT, HOST_PROMPT_SUPPORT) +#if ALL(EEPROM_CHITCHAT, HOST_PROMPT_SUPPORT) #define HOST_EEPROM_CHITCHAT 1 #endif #if ENABLED(EEPROM_SETTINGS) - #define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_MSG(ERR); eeprom_error = true; } }while(0) + #define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_MSG(ERR); eeprom_error = ERR_EEPROM_SIZE; } }while(0) + + #define TWO_BYTE_HASH(A,B) uint16_t((uint16_t(A ^ 0xC3) << 4) ^ (uint16_t(B ^ 0xC3) << 12)) #if ENABLED(DEBUG_EEPROM_READWRITE) #define _FIELD_TEST(FIELD) \ + SERIAL_ECHOLNPGM("Field: " STRINGIFY(FIELD)); \ EEPROM_ASSERT( \ eeprom_error || eeprom_index == offsetof(SettingsData, FIELD) + EEPROM_OFFSET, \ "Field " STRINGIFY(FIELD) " mismatch." \ @@ -738,6 +765,14 @@ void MarlinSettings::postprocess() { #define _FIELD_TEST(FIELD) NOOP #endif + #if ENABLED(DEBUG_EEPROM_OBSERVE) + #define EEPROM_READ(V...) do{ SERIAL_ECHOLNPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_(V); }while(0) + #define EEPROM_READ_ALWAYS(V...) do{ SERIAL_ECHOLNPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_ALWAYS_(V); }while(0) + #else + #define EEPROM_READ(V...) EEPROM_READ_(V) + #define EEPROM_READ_ALWAYS(V...) EEPROM_READ_ALWAYS_(V) + #endif + const char version[4] = EEPROM_VERSION; #if ENABLED(EEPROM_INIT_NOW) @@ -747,20 +782,20 @@ void MarlinSettings::postprocess() { constexpr uint32_t build_hash = strhash32(__DATE__ __TIME__); #endif - bool MarlinSettings::eeprom_error, MarlinSettings::validating; + bool MarlinSettings::validating; int MarlinSettings::eeprom_index; uint16_t MarlinSettings::working_crc; - bool MarlinSettings::size_error(const uint16_t size) { + EEPROM_Error MarlinSettings::size_error(const uint16_t size) { if (size != datasize()) { DEBUG_ERROR_MSG("EEPROM datasize error." #if ENABLED(MARLIN_DEV_MODE) " (Actual:", size, " Expected:", datasize(), ")" #endif ); - return true; + return ERR_EEPROM_SIZE; } - return false; + return ERR_EEPROM_NOERR; } /** @@ -772,18 +807,25 @@ void MarlinSettings::postprocess() { if (!EEPROM_START(EEPROM_OFFSET)) return false; - eeprom_error = false; + EEPROM_Error eeprom_error = ERR_EEPROM_NOERR; // Write or Skip version. (Flash doesn't allow rewrite without erase.) TERN(FLASH_EEPROM_EMULATION, EEPROM_SKIP, EEPROM_WRITE)(ver); #if ENABLED(EEPROM_INIT_NOW) - EEPROM_SKIP(build_hash); // Skip the hash slot + EEPROM_SKIP(build_hash); // Skip the hash slot which will be written later #endif EEPROM_SKIP(working_crc); // Skip the checksum slot - working_crc = 0; // clear before first "real data" + // + // Clear after skipping CRC and before writing the CRC'ed data + // + working_crc = 0; + + // Write the size of the data structure for use in validation + const uint16_t data_size = datasize(); + EEPROM_WRITE(data_size); const uint8_t e_factors = DISTINCT_AXES - (NUM_AXES); _FIELD_TEST(e_factors); @@ -813,6 +855,7 @@ void MarlinSettings::postprocess() { // // Home Offset // + #if NUM_AXES { _FIELD_TEST(home_offset); @@ -825,6 +868,7 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(home_offset); #endif } + #endif // NUM_AXES // // Hotend Offsets, if any @@ -832,7 +876,7 @@ void MarlinSettings::postprocess() { { #if HAS_HOTEND_OFFSET // Skip hotend 0 which must be 0 - LOOP_S_L_N(e, 1, HOTENDS) + for (uint8_t e = 1; e < HOTENDS; ++e) EEPROM_WRITE(hotend_offset[e]); #endif } @@ -881,7 +925,7 @@ void MarlinSettings::postprocess() { { #if ENABLED(MESH_BED_LEVELING) static_assert( - sizeof(bedlevel.z_values) == (GRID_MAX_POINTS) * sizeof(bedlevel.z_values[0][0]), + sizeof(bedlevel.z_values) == GRID_MAX_POINTS * sizeof(bedlevel.z_values[0][0]), "MBL Z array is the wrong size." ); #else @@ -895,6 +939,10 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(mesh_num_x); EEPROM_WRITE(mesh_num_y); + // Check value for the X/Y values + const uint16_t mesh_check = TWO_BYTE_HASH(mesh_num_x, mesh_num_y); + EEPROM_WRITE(mesh_check); + #if ENABLED(MESH_BED_LEVELING) EEPROM_WRITE(bedlevel.z_values); #else @@ -905,6 +953,7 @@ void MarlinSettings::postprocess() { // // Probe XYZ Offsets // + #if NUM_AXES { _FIELD_TEST(probe_offset); #if HAS_BED_PROBE @@ -914,6 +963,7 @@ void MarlinSettings::postprocess() { #endif EEPROM_WRITE(zpo); } + #endif // // Planar Bed Leveling matrix @@ -933,7 +983,7 @@ void MarlinSettings::postprocess() { { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) static_assert( - sizeof(bedlevel.z_values) == (GRID_MAX_POINTS) * sizeof(bedlevel.z_values[0][0]), + sizeof(bedlevel.z_values) == GRID_MAX_POINTS * sizeof(bedlevel.z_values[0][0]), "Bilinear Z array is the wrong size." ); #endif @@ -942,6 +992,11 @@ void MarlinSettings::postprocess() { grid_max_y = TERN(AUTO_BED_LEVELING_BILINEAR, GRID_MAX_POINTS_Y, 3); EEPROM_WRITE(grid_max_x); EEPROM_WRITE(grid_max_y); + + // Check value for the X/Y values + const uint16_t grid_check = TWO_BYTE_HASH(grid_max_x, grid_max_y); + EEPROM_WRITE(grid_check); + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) EEPROM_WRITE(bedlevel.grid_spacing); EEPROM_WRITE(bedlevel.grid_start); @@ -1364,7 +1419,7 @@ void MarlinSettings::postprocess() { #else #define _EN_ITEM(N) , .E##N = 30 const per_stepper_uint32_t tmc_hybrid_threshold = { - NUM_AXIS_LIST(.X = 100, .Y = 100, .Z = 3, .I = 3, .J = 3, .K = 3, .U = 3, .V = 3, .W = 3), + NUM_AXIS_LIST_(.X = 100, .Y = 100, .Z = 3, .I = 3, .J = 3, .K = 3, .U = 3, .V = 3, .W = 3) .X2 = 100, .Y2 = 100, .Z2 = 3, .Z3 = 3, .Z4 = 3 REPEAT(E_STEPPERS, _EN_ITEM) }; @@ -1462,13 +1517,13 @@ void MarlinSettings::postprocess() { // // CNC Coordinate Systems // - - _FIELD_TEST(coordinate_system); - - #if DISABLED(CNC_COORDINATE_SYSTEMS) - const xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS] = { { 0 } }; + #if NUM_AXES + _FIELD_TEST(coordinate_system); + #if DISABLED(CNC_COORDINATE_SYSTEMS) + const xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS] = { { 0 } }; + #endif + EEPROM_WRITE(TERN(CNC_COORDINATE_SYSTEMS, gcode.coordinate_system, coordinate_system)); #endif - EEPROM_WRITE(TERN(CNC_COORDINATE_SYSTEMS, gcode.coordinate_system, coordinate_system)); // // Skew correction factors @@ -1503,6 +1558,7 @@ void MarlinSettings::postprocess() { // // Backlash Compensation // + #if NUM_AXES { #if ENABLED(BACKLASH_GCODE) xyz_float_t backlash_distance_mm; @@ -1522,6 +1578,7 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(backlash_correction); EEPROM_WRITE(backlash_smoothing_mm); } + #endif // NUM_AXES // // Extensible UI User Data @@ -1550,8 +1607,8 @@ void MarlinSettings::postprocess() { #if ENABLED(DWIN_CREALITY_LCD_JYERSUI) { _FIELD_TEST(dwin_settings); - char dwin_settings[CrealityDWIN.eeprom_data_size] = { 0 }; - CrealityDWIN.Save_Settings(dwin_settings); + char dwin_settings[crealityDWIN.eeprom_data_size] = { 0 }; + crealityDWIN.saveSettings(dwin_settings); EEPROM_WRITE(dwin_settings); } #endif @@ -1635,6 +1692,14 @@ void MarlinSettings::postprocess() { HOTEND_LOOP() EEPROM_WRITE(thermalManager.temp_hotend[e].mpc); #endif + // + // Fixed-Time Motion + // + #if ENABLED(FT_MOTION) + _FIELD_TEST(fxdTiCtrl_cfg); + EEPROM_WRITE(fxdTiCtrl.cfg); + #endif + // // Input Shaping /// @@ -1652,7 +1717,7 @@ void MarlinSettings::postprocess() { // // Report final CRC and Data Size // - if (!eeprom_error) { + if (eeprom_error == ERR_EEPROM_NOERR) { const uint16_t eeprom_size = eeprom_index - (EEPROM_OFFSET), final_crc = working_crc; @@ -1668,7 +1733,7 @@ void MarlinSettings::postprocess() { // Report storage size DEBUG_ECHO_MSG("Settings Stored (", eeprom_size, " bytes; crc ", (uint32_t)final_crc, ")"); - eeprom_error |= size_error(eeprom_size); + eeprom_error = size_error(eeprom_size); } EEPROM_FINISH(); @@ -1680,56 +1745,82 @@ void MarlinSettings::postprocess() { store_mesh(bedlevel.storage_slot); #endif - if (!eeprom_error) { + const bool success = (eeprom_error == ERR_EEPROM_NOERR); + if (success) { LCD_MESSAGE(MSG_SETTINGS_STORED); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_SETTINGS_STORED))); } - TERN_(EXTENSIBLE_UI, ExtUI::onSettingsStored(!eeprom_error)); + TERN_(EXTENSIBLE_UI, ExtUI::onSettingsStored(success)); - return !eeprom_error; + return success; } /** * M501 - Retrieve Configuration */ - bool MarlinSettings::_load() { - if (!EEPROM_START(EEPROM_OFFSET)) return false; + EEPROM_Error MarlinSettings::_load() { + EEPROM_Error eeprom_error = ERR_EEPROM_NOERR; + + if (!EEPROM_START(EEPROM_OFFSET)) return eeprom_error; char stored_ver[4]; EEPROM_READ_ALWAYS(stored_ver); - // Version has to match or defaults are used - if (strncmp(version, stored_ver, 3) != 0) { - if (stored_ver[3] != '\0') { - stored_ver[0] = '?'; - stored_ver[1] = '\0'; + uint16_t stored_crc; + + do { // A block to break out of on error + + // Version has to match or defaults are used + if (strncmp(version, stored_ver, 3) != 0) { + if (stored_ver[3] != '\0') { + stored_ver[0] = '?'; + stored_ver[1] = '\0'; + } + DEBUG_ECHO_MSG("EEPROM version mismatch (EEPROM=", stored_ver, " Marlin=" EEPROM_VERSION ")"); + eeprom_error = ERR_EEPROM_VERSION; + break; } - DEBUG_ECHO_MSG("EEPROM version mismatch (EEPROM=", stored_ver, " Marlin=" EEPROM_VERSION ")"); - LCD_MESSAGE(MSG_ERR_EEPROM_VERSION); - TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_ERR_EEPROM_VERSION))); - IF_DISABLED(EEPROM_AUTO_INIT, ui.eeprom_alert_version()); - eeprom_error = true; - } - else { - - // Optionally reset on the first boot after flashing + // + // Optionally reset on first boot after flashing + // #if ENABLED(EEPROM_INIT_NOW) uint32_t stored_hash; EEPROM_READ_ALWAYS(stored_hash); - if (stored_hash != build_hash) { EEPROM_FINISH(); return false; } + if (stored_hash != build_hash) { + eeprom_error = ERR_EEPROM_CORRUPT; + break; + } #endif - uint16_t stored_crc; + // + // Get the stored CRC to compare at the end + // EEPROM_READ_ALWAYS(stored_crc); + // + // A temporary float for safe storage + // float dummyf = 0; - working_crc = 0; // Init to 0. Accumulated by EEPROM_READ - _FIELD_TEST(e_factors); + // + // Init to 0. Accumulated by EEPROM_READ + // + working_crc = 0; + // + // Validate the stored size against the current data structure size + // + uint16_t stored_size; + EEPROM_READ_ALWAYS(stored_size); + if ((eeprom_error = size_error(stored_size))) break; + + // + // Extruder Parameter Count // Number of e_factors may change + // + _FIELD_TEST(e_factors); uint8_t e_factors; EEPROM_READ_ALWAYS(e_factors); @@ -1775,6 +1866,7 @@ void MarlinSettings::postprocess() { // // Home Offset (M206 / M665) // + #if NUM_AXES { _FIELD_TEST(home_offset); @@ -1787,6 +1879,7 @@ void MarlinSettings::postprocess() { EEPROM_READ(home_offset); #endif } + #endif // NUM_AXES // // Hotend Offsets, if any @@ -1794,7 +1887,7 @@ void MarlinSettings::postprocess() { { #if HAS_HOTEND_OFFSET // Skip hotend 0 which must be 0 - LOOP_S_L_N(e, 1, HOTENDS) + for (uint8_t e = 1; e < HOTENDS; ++e) EEPROM_READ(hotend_offset[e]); #endif } @@ -1838,16 +1931,28 @@ void MarlinSettings::postprocess() { // { uint8_t mesh_num_x, mesh_num_y; + uint16_t mesh_check; EEPROM_READ(dummyf); EEPROM_READ_ALWAYS(mesh_num_x); EEPROM_READ_ALWAYS(mesh_num_y); + // Check value must correspond to the X/Y values + EEPROM_READ_ALWAYS(mesh_check); + if (mesh_check != TWO_BYTE_HASH(mesh_num_x, mesh_num_y)) { + eeprom_error = ERR_EEPROM_CORRUPT; + break; + } + #if ENABLED(MESH_BED_LEVELING) if (!validating) bedlevel.z_offset = dummyf; if (mesh_num_x == (GRID_MAX_POINTS_X) && mesh_num_y == (GRID_MAX_POINTS_Y)) { // EEPROM data fits the current mesh EEPROM_READ(bedlevel.z_values); } + else if (mesh_num_x > (GRID_MAX_POINTS_X) || mesh_num_y > (GRID_MAX_POINTS_Y)) { + eeprom_error = ERR_EEPROM_CORRUPT; + break; + } else { // EEPROM data is stale if (!validating) bedlevel.reset(); @@ -1862,6 +1967,7 @@ void MarlinSettings::postprocess() { // // Probe Z Offset // + #if NUM_AXES { _FIELD_TEST(probe_offset); #if HAS_BED_PROBE @@ -1871,6 +1977,7 @@ void MarlinSettings::postprocess() { #endif EEPROM_READ(zpo); } + #endif // // Planar Bed Leveling matrix @@ -1890,6 +1997,15 @@ void MarlinSettings::postprocess() { uint8_t grid_max_x, grid_max_y; EEPROM_READ_ALWAYS(grid_max_x); // 1 byte EEPROM_READ_ALWAYS(grid_max_y); // 1 byte + + // Check value must correspond to the X/Y values + uint16_t grid_check; + EEPROM_READ_ALWAYS(grid_check); + if (grid_check != TWO_BYTE_HASH(grid_max_x, grid_max_y)) { + eeprom_error = ERR_EEPROM_CORRUPT; + break; + } + xy_pos_t spacing, start; EEPROM_READ(spacing); // 2 ints EEPROM_READ(start); // 2 ints @@ -1899,6 +2015,10 @@ void MarlinSettings::postprocess() { bedlevel.set_grid(spacing, start); EEPROM_READ(bedlevel.z_values); // 9 to 256 floats } + else if (grid_max_x > (GRID_MAX_POINTS_X) || grid_max_y > (GRID_MAX_POINTS_Y)) { + eeprom_error = ERR_EEPROM_CORRUPT; + break; + } else // EEPROM data is stale #endif // AUTO_BED_LEVELING_BILINEAR { @@ -2439,6 +2559,7 @@ void MarlinSettings::postprocess() { // // CNC Coordinate System // + #if NUM_AXES { _FIELD_TEST(coordinate_system); #if ENABLED(CNC_COORDINATE_SYSTEMS) @@ -2449,6 +2570,7 @@ void MarlinSettings::postprocess() { EEPROM_READ(coordinate_system); #endif } + #endif // // Skew correction factors @@ -2494,6 +2616,7 @@ void MarlinSettings::postprocess() { // // Backlash Compensation // + #if NUM_AXES { xyz_float_t backlash_distance_mm; uint8_t backlash_correction; @@ -2512,6 +2635,7 @@ void MarlinSettings::postprocess() { #endif #endif } + #endif // NUM_AXES // // Extensible UI User Data @@ -2537,10 +2661,10 @@ void MarlinSettings::postprocess() { } #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) { - const char dwin_settings[CrealityDWIN.eeprom_data_size] = { 0 }; + const char dwin_settings[crealityDWIN.eeprom_data_size] = { 0 }; _FIELD_TEST(dwin_settings); EEPROM_READ(dwin_settings); - if (!validating) CrealityDWIN.Load_Settings(dwin_settings); + if (!validating) crealityDWIN.loadSettings(dwin_settings); } #endif @@ -2625,9 +2749,15 @@ void MarlinSettings::postprocess() { // Model predictive control // #if ENABLED(MPCTEMP) - { HOTEND_LOOP() EEPROM_READ(thermalManager.temp_hotend[e].mpc); - } + #endif + + // + // Fixed-Time Motion + // + #if ENABLED(FT_MOTION) + _FIELD_TEST(fxdTiCtrl_cfg); + EEPROM_READ(fxdTiCtrl.cfg); #endif // @@ -2654,40 +2784,35 @@ void MarlinSettings::postprocess() { // // Validate Final Size and CRC // - eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET)); - if (eeprom_error) { - DEBUG_ECHO_MSG("Index: ", eeprom_index - (EEPROM_OFFSET), " Size: ", datasize()); - IF_DISABLED(EEPROM_AUTO_INIT, ui.eeprom_alert_index()); + const uint16_t eeprom_total = eeprom_index - (EEPROM_OFFSET); + if ((eeprom_error = size_error(eeprom_total))) { + // Handle below and on return + break; } else if (working_crc != stored_crc) { - eeprom_error = true; - DEBUG_ERROR_MSG("EEPROM CRC mismatch - (stored) ", stored_crc, " != ", working_crc, " (calculated)!"); - LCD_MESSAGE(MSG_ERR_EEPROM_CRC); - TERN_(HOST_EEPROM_CHITCHAT, hostui.notify(GET_TEXT_F(MSG_ERR_EEPROM_CRC))); - IF_DISABLED(EEPROM_AUTO_INIT, ui.eeprom_alert_crc()); + eeprom_error = ERR_EEPROM_CRC; + break; } else if (!validating) { DEBUG_ECHO_START(); DEBUG_ECHO(version); - DEBUG_ECHOLNPGM(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET), " bytes; crc ", (uint32_t)working_crc, ")"); + DEBUG_ECHOLNPGM(" stored settings retrieved (", eeprom_total, " bytes; crc ", working_crc, ")"); TERN_(HOST_EEPROM_CHITCHAT, hostui.notify(F("Stored settings retrieved"))); } - if (!validating && !eeprom_error) postprocess(); - #if ENABLED(AUTO_BED_LEVELING_UBL) if (!validating) { bedlevel.report_state(); if (!bedlevel.sanity_check()) { - #if BOTH(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) + #if ALL(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) bedlevel.echo_name(); DEBUG_ECHOLNPGM(" initialized.\n"); #endif } else { - eeprom_error = true; - #if BOTH(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) + eeprom_error = ERR_EEPROM_CORRUPT; + #if ALL(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) DEBUG_ECHOPGM("?Can't enable "); bedlevel.echo_name(); DEBUG_ECHOLNPGM("."); @@ -2705,6 +2830,26 @@ void MarlinSettings::postprocess() { } } #endif + + } while(0); + + EEPROM_FINISH(); + + switch (eeprom_error) { + case ERR_EEPROM_NOERR: + if (!validating) postprocess(); + break; + case ERR_EEPROM_SIZE: + DEBUG_ECHO_MSG("Index: ", eeprom_index - (EEPROM_OFFSET), " Size: ", datasize()); + break; + case ERR_EEPROM_CORRUPT: + DEBUG_ERROR_MSG(STR_ERR_EEPROM_CORRUPT); + break; + case ERR_EEPROM_CRC: + DEBUG_ERROR_MSG("EEPROM CRC mismatch - (stored) ", stored_crc, " != ", working_crc, " (calculated)!"); + TERN_(HOST_EEPROM_CHITCHAT, hostui.notify(GET_TEXT_F(MSG_ERR_EEPROM_CRC))); + break; + default: break; } #if ENABLED(EEPROM_CHITCHAT) && DISABLED(DISABLE_M503) @@ -2712,9 +2857,7 @@ void MarlinSettings::postprocess() { if (!validating && TERN1(EEPROM_BOOT_SILENT, IsRunning())) report(); #endif - EEPROM_FINISH(); - - return !eeprom_error; + return eeprom_error; } #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE @@ -2724,26 +2867,30 @@ void MarlinSettings::postprocess() { bool MarlinSettings::validate() { validating = true; #ifdef ARCHIM2_SPI_FLASH_EEPROM_BACKUP_SIZE - bool success = _load(); - if (!success && restoreEEPROM()) { + EEPROM_Error err = _load(); + if (err != ERR_EEPROM_NOERR && restoreEEPROM()) { SERIAL_ECHOLNPGM("Recovered backup EEPROM settings from SPI Flash"); - success = _load(); + err = _load(); } #else - const bool success = _load(); + const EEPROM_Error err = _load(); #endif validating = false; - return success; + + if (err) ui.eeprom_alert(err); + + return (err == ERR_EEPROM_NOERR); } bool MarlinSettings::load() { if (validate()) { - const bool success = _load(); + const EEPROM_Error err = _load(); + const bool success = (err == ERR_EEPROM_NOERR); TERN_(EXTENSIBLE_UI, ExtUI::onSettingsLoaded(success)); return success; } reset(); - #if EITHER(EEPROM_AUTO_INIT, EEPROM_INIT_NOW) + #if ANY(EEPROM_AUTO_INIT, EEPROM_INIT_NOW) (void)save(); SERIAL_ECHO_MSG("EEPROM Initialized"); #endif @@ -2903,7 +3050,7 @@ void MarlinSettings::reset() { planner.settings.min_travel_feedrate_mm_s = feedRate_t(DEFAULT_MINTRAVELFEEDRATE); #if HAS_CLASSIC_JERK - #ifndef DEFAULT_XJERK + #if HAS_X_AXIS && !defined(DEFAULT_XJERK) #define DEFAULT_XJERK 0 #endif #if HAS_Y_AXIS && !defined(DEFAULT_YJERK) @@ -3000,7 +3147,7 @@ void MarlinSettings::reset() { #endif #endif - TERN_(DWIN_CREALITY_LCD_JYERSUI, CrealityDWIN.Reset_Settings()); + TERN_(DWIN_CREALITY_LCD_JYERSUI, crealityDWIN.resetSettings()); // // Case Light Brightness @@ -3149,7 +3296,7 @@ void MarlinSettings::reset() { #if HAS_FAN constexpr uint8_t fpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, FAN_SPEED) }; #endif - LOOP_L_N(i, PREHEAT_COUNT) { + for (uint8_t i = 0; i < PREHEAT_COUNT; ++i) { TERN_(HAS_HOTEND, ui.material_preset[i].hotend_temp = hpre[i]); TERN_(HAS_HEATED_BED, ui.material_preset[i].bed_temp = bpre[i]); TERN_(HAS_FAN, ui.material_preset[i].fan_speed = fpre[i]); @@ -3290,10 +3437,10 @@ void MarlinSettings::reset() { #if DISABLED(NO_VOLUMETRICS) parser.volumetric_enabled = ENABLED(VOLUMETRIC_DEFAULT_ON); - LOOP_L_N(q, COUNT(planner.filament_size)) + for (uint8_t q = 0; q < COUNT(planner.filament_size); ++q) planner.filament_size[q] = DEFAULT_NOMINAL_FILAMENT_DIA; #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - LOOP_L_N(q, COUNT(planner.volumetric_extruder_limit)) + for (uint8_t q = 0; q < COUNT(planner.volumetric_extruder_limit); ++q) planner.volumetric_extruder_limit[q] = DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT; #endif #endif @@ -3324,7 +3471,7 @@ void MarlinSettings::reset() { #if HAS_MOTOR_CURRENT_PWM constexpr uint32_t tmp_motor_current_setting[MOTOR_CURRENT_COUNT] = PWM_MOTOR_CURRENT; - LOOP_L_N(q, MOTOR_CURRENT_COUNT) + for (uint8_t q = 0; q < MOTOR_CURRENT_COUNT; ++q) stepper.set_digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); #endif @@ -3334,7 +3481,7 @@ void MarlinSettings::reset() { #if HAS_MOTOR_CURRENT_SPI static constexpr uint32_t tmp_motor_current_setting[] = DIGIPOT_MOTOR_CURRENT; DEBUG_ECHOLNPGM("Writing Digipot"); - LOOP_L_N(q, COUNT(tmp_motor_current_setting)) + for (uint8_t q = 0; q < COUNT(tmp_motor_current_setting); ++q) stepper.set_digipot_current(q, tmp_motor_current_setting[q]); DEBUG_ECHOLNPGM("Digipot Written"); #endif @@ -3424,6 +3571,11 @@ void MarlinSettings::reset() { } #endif + // + // Fixed-Time Motion + // + TERN_(FT_MOTION, fxdTiCtrl.set_defaults()); + // // Input Shaping // @@ -3440,10 +3592,10 @@ void MarlinSettings::reset() { postprocess(); - #if EITHER(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) + #if ANY(EEPROM_CHITCHAT, DEBUG_LEVELING_FEATURE) FSTR_P const hdsl = F("Hardcoded Default Settings Loaded"); TERN_(HOST_EEPROM_CHITCHAT, hostui.notify(hdsl)); - DEBUG_ECHO_START(); DEBUG_ECHOLNF(hdsl); + DEBUG_ECHO_START(); DEBUG_ECHOLN(hdsl); #endif TERN_(EXTENSIBLE_UI, ExtUI::onFactoryReset()); @@ -3536,15 +3688,14 @@ void MarlinSettings::reset() { #if ENABLED(MESH_BED_LEVELING) if (leveling_is_valid()) { - LOOP_L_N(py, GRID_MAX_POINTS_Y) { - LOOP_L_N(px, GRID_MAX_POINTS_X) { + for (uint8_t py = 0; py < GRID_MAX_POINTS_Y; ++py) { + for (uint8_t px = 0; px < GRID_MAX_POINTS_X; ++px) { CONFIG_ECHO_START(); - SERIAL_ECHOPGM(" G29 S3 I", px, " J", py); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(bedlevel.z_values[px][py]), 5); + SERIAL_ECHOLN(F(" G29 S3 I"), px, F(" J"), py, FPSTR(SP_Z_STR), p_float_t(LINEAR_UNIT(bedlevel.z_values[px][py]), 5)); } } CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_F(" G29 S4 Z", LINEAR_UNIT(bedlevel.z_offset), 5); + SERIAL_ECHOLNPGM(" G29 S4 Z", p_float_t(LINEAR_UNIT(bedlevel.z_offset), 5)); } #elif ENABLED(AUTO_BED_LEVELING_UBL) @@ -3562,11 +3713,10 @@ void MarlinSettings::reset() { #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) if (leveling_is_valid()) { - LOOP_L_N(py, GRID_MAX_POINTS_Y) { - LOOP_L_N(px, GRID_MAX_POINTS_X) { + for (uint8_t py = 0; py < GRID_MAX_POINTS_Y; ++py) { + for (uint8_t px = 0; px < GRID_MAX_POINTS_X; ++px) { CONFIG_ECHO_START(); - SERIAL_ECHOPGM(" G29 W I", px, " J", py); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(bedlevel.z_values[px][py]), 5); + SERIAL_ECHOLN(F(" G29 W I"), px, F(" J"), py, FPSTR(SP_Z_STR), p_float_t(LINEAR_UNIT(bedlevel.z_values[px][py]), 5)); } } } @@ -3593,7 +3743,7 @@ void MarlinSettings::reset() { // // M666 Endstops Adjustment // - #if EITHER(DELTA, HAS_EXTRA_ENDSTOPS) + #if ANY(DELTA, HAS_EXTRA_ENDSTOPS) gcode.M666_report(forReplay); #endif @@ -3615,7 +3765,7 @@ void MarlinSettings::reset() { TERN_(PIDTEMPCHAMBER, gcode.M309_report(forReplay)); #if HAS_USER_THERMISTORS - LOOP_L_N(i, USER_THERMISTORS) + for (uint8_t i = 0; i < USER_THERMISTORS; ++i) thermalManager.M305_report(i, forReplay); #endif @@ -3685,6 +3835,11 @@ void MarlinSettings::reset() { // TERN_(HAS_STEALTHCHOP, gcode.M569_report(forReplay)); + // + // Fixed-Time Motion + // + TERN_(FT_MOTION, gcode.M493_report(forReplay)); + // // Input Shaping // diff --git a/Marlin/src/module/settings.h b/Marlin/src/module/settings.h index a8fca60baa..b7c5210db5 100644 --- a/Marlin/src/module/settings.h +++ b/Marlin/src/module/settings.h @@ -29,6 +29,13 @@ #if ENABLED(EEPROM_SETTINGS) #include "../HAL/shared/eeprom_api.h" + enum EEPROM_Error : uint8_t { + ERR_EEPROM_NOERR, + ERR_EEPROM_VERSION, + ERR_EEPROM_SIZE, + ERR_EEPROM_CRC, + ERR_EEPROM_CORRUPT + }; #endif class MarlinSettings { @@ -98,7 +105,7 @@ class MarlinSettings { #if ENABLED(EEPROM_SETTINGS) - static bool eeprom_error, validating; + static bool validating; #if ENABLED(AUTO_BED_LEVELING_UBL) // Eventually make these available if any leveling system // That can store is enabled @@ -106,8 +113,8 @@ class MarlinSettings { // live at the very end of the eeprom #endif - static bool _load(); - static bool size_error(const uint16_t size); + static EEPROM_Error _load(); + static EEPROM_Error size_error(const uint16_t size); static int eeprom_index; static uint16_t working_crc; @@ -130,16 +137,16 @@ class MarlinSettings { } template - static void EEPROM_READ(T &VAR) { + 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) { + 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) { + static void EEPROM_READ_ALWAYS_(T &VAR) { persistentStore.read_data(eeprom_index, (uint8_t *) &VAR, sizeof(VAR), &working_crc); } diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index f26e10a4bd..50b8323838 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -83,6 +83,7 @@ Stepper stepper; // Singleton #define BABYSTEPPING_EXTRA_DIR_WAIT +#include "stepper/cycles.h" #ifdef __AVR__ #include "stepper/speed_lookuptable.h" #endif @@ -147,7 +148,7 @@ Stepper stepper; // Singleton // public: -#if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) +#if ANY(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) bool Stepper::separate_multi_axis = false; #endif @@ -165,8 +166,8 @@ stepper_flags_t Stepper::axis_enabled; // {0} block_t* Stepper::current_block; // (= nullptr) A pointer to the block currently being traced -axis_bits_t Stepper::last_direction_bits, // = 0 - Stepper::axis_did_move; // = 0 +AxisBits Stepper::last_direction_bits, // = 0 + Stepper::axis_did_move; // = 0 bool Stepper::abort_current_block; @@ -181,7 +182,7 @@ bool Stepper::abort_current_block; bool Stepper::locked_Y_motor = false, Stepper::locked_Y2_motor = false; #endif -#if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) +#if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) bool Stepper::locked_Z_motor = false, Stepper::locked_Z2_motor = false #if NUM_Z_STEPPERS >= 3 , Stepper::locked_Z3_motor = false @@ -217,7 +218,7 @@ uint32_t Stepper::advance_divisor = 0, Stepper::decelerate_after, // The count at which to start decelerating Stepper::step_event_count; // The total event count for the current block -#if EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) +#if ANY(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) uint8_t Stepper::stepper_extruder; #else constexpr uint8_t Stepper::stepper_extruder; @@ -286,7 +287,7 @@ xyze_int8_t Stepper::count_direction{0}; #define MINDIR(A) (count_direction[_AXIS(A)] < 0) #define MAXDIR(A) (count_direction[_AXIS(A)] > 0) -#define STEPTEST(A,M,I) TERN0(HAS_ ##A## ##I## _ ##M, !(TEST(endstops.state(), A## ##I## _ ##M) && M## DIR(A)) && !locked_ ##A## ##I## _motor) +#define STEPTEST(A,M,I) TERN0(USE_##A##I##_##M, !(TEST(endstops.state(), A##I##_##M) && M## DIR(A)) && !locked_ ##A##I##_motor) #define DUAL_ENDSTOP_APPLY_STEP(A,V) \ if (separate_multi_axis) { \ @@ -381,103 +382,115 @@ xyze_int8_t Stepper::count_direction{0}; A##4_STEP_WRITE(V); \ } -#if HAS_DUAL_X_STEPPERS - #define X_APPLY_DIR(v,Q) do{ X_DIR_WRITE(v); X2_DIR_WRITE(INVERT_DIR(X2_VS_X, v)); }while(0) +#if HAS_SYNCED_X_STEPPERS + #define X_APPLY_DIR(FWD,Q) do{ X_DIR_WRITE(FWD); X2_DIR_WRITE(INVERT_DIR(X2_VS_X, FWD)); }while(0) #if ENABLED(X_DUAL_ENDSTOPS) - #define X_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(X,v) + #define X_APPLY_STEP(FWD,Q) DUAL_ENDSTOP_APPLY_STEP(X,FWD) #else - #define X_APPLY_STEP(v,Q) do{ X_STEP_WRITE(v); X2_STEP_WRITE(v); }while(0) + #define X_APPLY_STEP(FWD,Q) do{ X_STEP_WRITE(FWD); X2_STEP_WRITE(FWD); }while(0) #endif #elif ENABLED(DUAL_X_CARRIAGE) - #define X_APPLY_DIR(v,ALWAYS) do{ \ - if (extruder_duplication_enabled || ALWAYS) { X_DIR_WRITE(v); X2_DIR_WRITE((v) ^ idex_mirrored_mode); } \ - else if (last_moved_extruder) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ + #define X_APPLY_DIR(FWD,ALWAYS) do{ \ + if (extruder_duplication_enabled || ALWAYS) { X_DIR_WRITE(FWD); X2_DIR_WRITE((FWD) ^ idex_mirrored_mode); } \ + else if (last_moved_extruder) X2_DIR_WRITE(FWD); else X_DIR_WRITE(FWD); \ }while(0) - #define X_APPLY_STEP(v,ALWAYS) do{ \ - if (extruder_duplication_enabled || ALWAYS) { X_STEP_WRITE(v); X2_STEP_WRITE(v); } \ - else if (last_moved_extruder) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ + #define X_APPLY_STEP(FWD,ALWAYS) do{ \ + if (extruder_duplication_enabled || ALWAYS) { X_STEP_WRITE(FWD); X2_STEP_WRITE(FWD); } \ + else if (last_moved_extruder) X2_STEP_WRITE(FWD); else X_STEP_WRITE(FWD); \ }while(0) -#else - #define X_APPLY_DIR(v,Q) X_DIR_WRITE(v) - #define X_APPLY_STEP(v,Q) X_STEP_WRITE(v) +#elif HAS_X_AXIS + #define X_APPLY_DIR(FWD,Q) X_DIR_WRITE(FWD) + #define X_APPLY_STEP(FWD,Q) X_STEP_WRITE(FWD) #endif -#if HAS_DUAL_Y_STEPPERS - #define Y_APPLY_DIR(v,Q) do{ Y_DIR_WRITE(v); Y2_DIR_WRITE(INVERT_DIR(Y2_VS_Y, v)); }while(0) +#if HAS_SYNCED_Y_STEPPERS + #define Y_APPLY_DIR(FWD,Q) do{ Y_DIR_WRITE(FWD); Y2_DIR_WRITE(INVERT_DIR(Y2_VS_Y, FWD)); }while(0) #if ENABLED(Y_DUAL_ENDSTOPS) - #define Y_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Y,v) + #define Y_APPLY_STEP(FWD,Q) DUAL_ENDSTOP_APPLY_STEP(Y,FWD) #else - #define Y_APPLY_STEP(v,Q) do{ Y_STEP_WRITE(v); Y2_STEP_WRITE(v); }while(0) + #define Y_APPLY_STEP(FWD,Q) do{ Y_STEP_WRITE(FWD); Y2_STEP_WRITE(FWD); }while(0) #endif #elif HAS_Y_AXIS - #define Y_APPLY_DIR(v,Q) Y_DIR_WRITE(v) - #define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v) + #define Y_APPLY_DIR(FWD,Q) Y_DIR_WRITE(FWD) + #define Y_APPLY_STEP(FWD,Q) Y_STEP_WRITE(FWD) #endif #if NUM_Z_STEPPERS == 4 - #define Z_APPLY_DIR(v,Q) do{ \ - Z_DIR_WRITE(v); Z2_DIR_WRITE(INVERT_DIR(Z2_VS_Z, v)); \ - Z3_DIR_WRITE(INVERT_DIR(Z3_VS_Z, v)); Z4_DIR_WRITE(INVERT_DIR(Z4_VS_Z, v)); \ + #define Z_APPLY_DIR(FWD,Q) do{ \ + Z_DIR_WRITE(FWD); Z2_DIR_WRITE(INVERT_DIR(Z2_VS_Z, FWD)); \ + Z3_DIR_WRITE(INVERT_DIR(Z3_VS_Z, FWD)); Z4_DIR_WRITE(INVERT_DIR(Z4_VS_Z, FWD)); \ }while(0) #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z_APPLY_STEP(v,Q) QUAD_ENDSTOP_APPLY_STEP(Z,v) + #define Z_APPLY_STEP(FWD,Q) QUAD_ENDSTOP_APPLY_STEP(Z,FWD) #elif ENABLED(Z_STEPPER_AUTO_ALIGN) - #define Z_APPLY_STEP(v,Q) QUAD_SEPARATE_APPLY_STEP(Z,v) + #define Z_APPLY_STEP(FWD,Q) QUAD_SEPARATE_APPLY_STEP(Z,FWD) #else - #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); Z4_STEP_WRITE(v); }while(0) + #define Z_APPLY_STEP(FWD,Q) do{ Z_STEP_WRITE(FWD); Z2_STEP_WRITE(FWD); Z3_STEP_WRITE(FWD); Z4_STEP_WRITE(FWD); }while(0) #endif #elif NUM_Z_STEPPERS == 3 - #define Z_APPLY_DIR(v,Q) do{ \ - Z_DIR_WRITE(v); Z2_DIR_WRITE(INVERT_DIR(Z2_VS_Z, v)); Z3_DIR_WRITE(INVERT_DIR(Z3_VS_Z, v)); \ + #define Z_APPLY_DIR(FWD,Q) do{ \ + Z_DIR_WRITE(FWD); Z2_DIR_WRITE(INVERT_DIR(Z2_VS_Z, FWD)); Z3_DIR_WRITE(INVERT_DIR(Z3_VS_Z, FWD)); \ }while(0) #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z_APPLY_STEP(v,Q) TRIPLE_ENDSTOP_APPLY_STEP(Z,v) + #define Z_APPLY_STEP(FWD,Q) TRIPLE_ENDSTOP_APPLY_STEP(Z,FWD) #elif ENABLED(Z_STEPPER_AUTO_ALIGN) - #define Z_APPLY_STEP(v,Q) TRIPLE_SEPARATE_APPLY_STEP(Z,v) + #define Z_APPLY_STEP(FWD,Q) TRIPLE_SEPARATE_APPLY_STEP(Z,FWD) #else - #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); }while(0) + #define Z_APPLY_STEP(FWD,Q) do{ Z_STEP_WRITE(FWD); Z2_STEP_WRITE(FWD); Z3_STEP_WRITE(FWD); }while(0) #endif #elif NUM_Z_STEPPERS == 2 - #define Z_APPLY_DIR(v,Q) do{ Z_DIR_WRITE(v); Z2_DIR_WRITE(INVERT_DIR(Z2_VS_Z, v)); }while(0) + #define Z_APPLY_DIR(FWD,Q) do{ Z_DIR_WRITE(FWD); Z2_DIR_WRITE(INVERT_DIR(Z2_VS_Z, FWD)); }while(0) #if ENABLED(Z_MULTI_ENDSTOPS) - #define Z_APPLY_STEP(v,Q) DUAL_ENDSTOP_APPLY_STEP(Z,v) + #define Z_APPLY_STEP(FWD,Q) DUAL_ENDSTOP_APPLY_STEP(Z,FWD) #elif ENABLED(Z_STEPPER_AUTO_ALIGN) - #define Z_APPLY_STEP(v,Q) DUAL_SEPARATE_APPLY_STEP(Z,v) + #define Z_APPLY_STEP(FWD,Q) DUAL_SEPARATE_APPLY_STEP(Z,FWD) #else - #define Z_APPLY_STEP(v,Q) do{ Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }while(0) + #define Z_APPLY_STEP(FWD,Q) do{ Z_STEP_WRITE(FWD); Z2_STEP_WRITE(FWD); }while(0) #endif #elif HAS_Z_AXIS - #define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v) - #define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v) + #define Z_APPLY_DIR(FWD,Q) Z_DIR_WRITE(FWD) + #define Z_APPLY_STEP(FWD,Q) Z_STEP_WRITE(FWD) #endif #if HAS_I_AXIS - #define I_APPLY_DIR(v,Q) I_DIR_WRITE(v) - #define I_APPLY_STEP(v,Q) I_STEP_WRITE(v) + #define I_APPLY_DIR(FWD,Q) I_DIR_WRITE(FWD) + #define I_APPLY_STEP(FWD,Q) I_STEP_WRITE(FWD) #endif #if HAS_J_AXIS - #define J_APPLY_DIR(v,Q) J_DIR_WRITE(v) - #define J_APPLY_STEP(v,Q) J_STEP_WRITE(v) + #define J_APPLY_DIR(FWD,Q) J_DIR_WRITE(FWD) + #define J_APPLY_STEP(FWD,Q) J_STEP_WRITE(FWD) #endif #if HAS_K_AXIS - #define K_APPLY_DIR(v,Q) K_DIR_WRITE(v) - #define K_APPLY_STEP(v,Q) K_STEP_WRITE(v) + #define K_APPLY_DIR(FWD,Q) K_DIR_WRITE(FWD) + #define K_APPLY_STEP(FWD,Q) K_STEP_WRITE(FWD) #endif #if HAS_U_AXIS - #define U_APPLY_DIR(v,Q) U_DIR_WRITE(v) - #define U_APPLY_STEP(v,Q) U_STEP_WRITE(v) + #define U_APPLY_DIR(FWD,Q) U_DIR_WRITE(FWD) + #define U_APPLY_STEP(FWD,Q) U_STEP_WRITE(FWD) #endif #if HAS_V_AXIS - #define V_APPLY_DIR(v,Q) V_DIR_WRITE(v) - #define V_APPLY_STEP(v,Q) V_STEP_WRITE(v) + #define V_APPLY_DIR(FWD,Q) V_DIR_WRITE(FWD) + #define V_APPLY_STEP(FWD,Q) V_STEP_WRITE(FWD) #endif #if HAS_W_AXIS - #define W_APPLY_DIR(v,Q) W_DIR_WRITE(v) - #define W_APPLY_STEP(v,Q) W_STEP_WRITE(v) + #define W_APPLY_DIR(FWD,Q) W_DIR_WRITE(FWD) + #define W_APPLY_STEP(FWD,Q) W_STEP_WRITE(FWD) #endif -#if DISABLED(MIXING_EXTRUDER) - #define E_APPLY_STEP(v,Q) E_STEP_WRITE(stepper_extruder, v) +//#define E0_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(0) : REV_E_DIR(0); }while(0) +//#define E1_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(1) : REV_E_DIR(1); }while(0) +//#define E2_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(2) : REV_E_DIR(2); }while(0) +//#define E3_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(3) : REV_E_DIR(3); }while(0) +//#define E4_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(4) : REV_E_DIR(4); }while(0) +//#define E5_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(5) : REV_E_DIR(5); }while(0) +//#define E6_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(6) : REV_E_DIR(6); }while(0) +//#define E7_APPLY_DIR(FWD) do{ (FWD) ? FWD_E_DIR(7) : REV_E_DIR(7); }while(0) + +#if ENABLED(MIXING_EXTRUDER) + #define E_APPLY_DIR(FWD,Q) do{ if (FWD) { MIXER_STEPPER_LOOP(j) FWD_E_DIR(j); } else { MIXER_STEPPER_LOOP(j) REV_E_DIR(j); } }while(0) +#else + #define E_APPLY_STEP(FWD,Q) E_STEP_WRITE(stepper_extruder, FWD) + #define E_APPLY_DIR(FWD,Q) do{ if (FWD) { FWD_E_DIR(stepper_extruder); } else { REV_E_DIR(stepper_extruder); } }while(0) #endif #define CYCLES_TO_NS(CYC) (1000UL * (CYC) / ((F_CPU) / 1000000)) @@ -591,15 +604,13 @@ void Stepper::disable_all_steppers() { TERN_(EXTENSIBLE_UI, ExtUI::onSteppersDisabled()); } -#define SET_STEP_DIR(A) \ - if (motor_direction(_AXIS(A))) { \ - A##_APPLY_DIR(INVERT_DIR(A, LOW), false); \ - count_direction[_AXIS(A)] = -1; \ - } \ - else { \ - A##_APPLY_DIR(INVERT_DIR(A, HIGH), false); \ - count_direction[_AXIS(A)] = 1; \ - } +// Set a single axis direction based on the last set flags. +// A direction bit of "1" indicates forward or positive motion. +#define SET_STEP_DIR(A) do{ \ + const bool fwd = motor_direction(_AXIS(A)); \ + A##_APPLY_DIR(fwd, false); \ + count_direction[_AXIS(A)] = fwd ? 1 : -1; \ + }while(0) /** * Set the stepper direction of each axis @@ -609,39 +620,14 @@ void Stepper::disable_all_steppers() { * COREYZ: Y_AXIS=B_AXIS and Z_AXIS=C_AXIS */ void Stepper::apply_directions() { - DIR_WAIT_BEFORE(); - TERN_(HAS_X_DIR, SET_STEP_DIR(X)); // A - TERN_(HAS_Y_DIR, SET_STEP_DIR(Y)); // B - TERN_(HAS_Z_DIR, SET_STEP_DIR(Z)); // C - TERN_(HAS_I_DIR, SET_STEP_DIR(I)); - TERN_(HAS_J_DIR, SET_STEP_DIR(J)); - TERN_(HAS_K_DIR, SET_STEP_DIR(K)); - TERN_(HAS_U_DIR, SET_STEP_DIR(U)); - TERN_(HAS_V_DIR, SET_STEP_DIR(V)); - TERN_(HAS_W_DIR, SET_STEP_DIR(W)); - - #if HAS_EXTRUDERS - // Because this is valid for the whole block we don't know - // what E steppers will step. Likely all. Set all. - if (motor_direction(E_AXIS)) { - #if ENABLED(MIXING_EXTRUDER) - MIXER_STEPPER_LOOP(j) REV_E_DIR(j); - #else - REV_E_DIR(stepper_extruder); - #endif - count_direction.e = -1; - } - else { - #if ENABLED(MIXING_EXTRUDER) - MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); - #else - NORM_E_DIR(stepper_extruder); - #endif - count_direction.e = 1; - } - #endif // HAS_EXTRUDERS + LOGICAL_AXIS_CODE( + SET_STEP_DIR(E), + SET_STEP_DIR(X), SET_STEP_DIR(Y), SET_STEP_DIR(Z), // ABC + SET_STEP_DIR(I), SET_STEP_DIR(J), SET_STEP_DIR(K), + SET_STEP_DIR(U), SET_STEP_DIR(V), SET_STEP_DIR(W) + ); DIR_WAIT_AFTER(); } @@ -1511,7 +1497,7 @@ void Stepper::isr() { #if ENABLED(FT_MOTION) // NOTE STEPPER_TIMER_RATE is equal to 2000000, not what VSCode shows - const bool using_fxtictrl = fxdTiCtrl.cfg_mode; + const bool using_fxtictrl = fxdTiCtrl.cfg.mode; if (using_fxtictrl) { if (!nextMainISR) { if (abort_current_block) { @@ -1817,7 +1803,7 @@ void Stepper::pulse_phase_isr() { de += step_fwd ? -128 : 128; \ if ((MAXDIR(AXIS) && step_bak) || (MINDIR(AXIS) && step_fwd)) { \ { USING_TIMED_PULSE(); START_TIMED_PULSE(); AWAIT_LOW_PULSE(); } \ - TBI(last_direction_bits, _AXIS(AXIS)); \ + last_direction_bits.toggle(_AXIS(AXIS)); \ DIR_WAIT_BEFORE(); \ SET_STEP_DIR(AXIS); \ DIR_WAIT_AFTER(); \ @@ -1849,11 +1835,11 @@ void Stepper::pulse_phase_isr() { #if STEPPER_PAGE_FORMAT == SP_4x4D_128 - #define PAGE_SEGMENT_UPDATE(AXIS, VALUE) do{ \ - if ((VALUE) < 7) SBI(dm, _AXIS(AXIS)); \ - else if ((VALUE) > 7) CBI(dm, _AXIS(AXIS)); \ - page_step_state.sd[_AXIS(AXIS)] = VALUE; \ - page_step_state.bd[_AXIS(AXIS)] += VALUE; \ + #define PAGE_SEGMENT_UPDATE(AXIS, VALUE) do{ \ + if ((VALUE) < 7) dm[_AXIS(AXIS)] = false; \ + else if ((VALUE) > 7) dm[_AXIS(AXIS)] = true; \ + page_step_state.sd[_AXIS(AXIS)] = VALUE; \ + page_step_state.bd[_AXIS(AXIS)] += VALUE; \ }while(0) #define PAGE_PULSE_PREP(AXIS) do{ \ @@ -1869,15 +1855,14 @@ void Stepper::pulse_phase_isr() { case 0: { const uint8_t low = page_step_state.page[page_step_state.segment_idx], high = page_step_state.page[page_step_state.segment_idx + 1]; - axis_bits_t dm = last_direction_bits; + const AxisBits dm = last_direction_bits; PAGE_SEGMENT_UPDATE(X, low >> 4); PAGE_SEGMENT_UPDATE(Y, low & 0xF); PAGE_SEGMENT_UPDATE(Z, high >> 4); PAGE_SEGMENT_UPDATE(E, high & 0xF); - if (dm != last_direction_bits) - set_directions(dm); + if (dm != last_direction_bits) set_directions(dm); } break; @@ -1982,7 +1967,7 @@ void Stepper::pulse_phase_isr() { PULSE_PREP(W); #endif - #if EITHER(HAS_E0_STEP, MIXING_EXTRUDER) + #if ANY(HAS_E0_STEP, MIXING_EXTRUDER) PULSE_PREP(E); #if ENABLED(LIN_ADVANCE) @@ -2401,29 +2386,16 @@ hal_timer_t Stepper::block_phase_isr() { if (la_active) { const uint32_t la_step_rate = la_advance_steps > current_block->final_adv_steps ? current_block->la_advance_rate : 0; if (la_step_rate != step_rate) { - bool reverse_e = la_step_rate > step_rate; - la_interval = calc_timer_interval((reverse_e ? la_step_rate - step_rate : step_rate - la_step_rate) >> current_block->la_scaling); + const bool forward_e = la_step_rate < step_rate; + la_interval = calc_timer_interval((forward_e ? step_rate - la_step_rate : la_step_rate - step_rate) >> current_block->la_scaling); - if (reverse_e != motor_direction(E_AXIS)) { - TBI(last_direction_bits, E_AXIS); + if (forward_e != motor_direction(E_AXIS)) { + last_direction_bits.toggle(E_AXIS); count_direction.e = -count_direction.e; DIR_WAIT_BEFORE(); - if (reverse_e) { - #if ENABLED(MIXING_EXTRUDER) - MIXER_STEPPER_LOOP(j) REV_E_DIR(j); - #else - REV_E_DIR(stepper_extruder); - #endif - } - else { - #if ENABLED(MIXING_EXTRUDER) - MIXER_STEPPER_LOOP(j) NORM_E_DIR(j); - #else - NORM_E_DIR(stepper_extruder); - #endif - } + E_APPLY_DIR(forward_e, false); DIR_WAIT_AFTER(); } @@ -2575,7 +2547,7 @@ hal_timer_t Stepper::block_phase_isr() { #if IS_CORE // Define conditions for checking endstops #define S_(N) current_block->steps[CORE_AXIS_##N] - #define D_(N) TEST(current_block->direction_bits, CORE_AXIS_##N) + #define D_(N) current_block->direction_bits[CORE_AXIS_##N] #endif #if CORE_IS_XY || CORE_IS_XZ @@ -2586,7 +2558,7 @@ hal_timer_t Stepper::block_phase_isr() { * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z, handled below) * If DeltaA == DeltaB, the movement is only in the 1st axis (X) */ - #if EITHER(COREXY, COREXZ) + #if ANY(COREXY, COREXZ) #define X_CMP(A,B) ((A)==(B)) #else #define X_CMP(A,B) ((A)!=(B)) @@ -2606,7 +2578,7 @@ hal_timer_t Stepper::block_phase_isr() { * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y) * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Y or Z) */ - #if EITHER(COREYX, COREYZ) + #if ANY(COREYX, COREYZ) #define Y_CMP(A,B) ((A)==(B)) #else #define Y_CMP(A,B) ((A)!=(B)) @@ -2626,7 +2598,7 @@ hal_timer_t Stepper::block_phase_isr() { * If DeltaA == DeltaB, the movement is only in the 1st axis (X or Y, already handled above) * If DeltaA == -DeltaB, the movement is only in the 2nd axis (Z) */ - #if EITHER(COREZX, COREZY) + #if ANY(COREZX, COREZY) #define Z_CMP(A,B) ((A)==(B)) #else #define Z_CMP(A,B) ((A)!=(B)) @@ -2636,23 +2608,23 @@ hal_timer_t Stepper::block_phase_isr() { #define Z_MOVE_TEST !!current_block->steps.c #endif - axis_bits_t axis_bits = 0; + AxisBits didmove; NUM_AXIS_CODE( - if (X_MOVE_TEST) SBI(axis_bits, A_AXIS), - if (Y_MOVE_TEST) SBI(axis_bits, B_AXIS), - if (Z_MOVE_TEST) SBI(axis_bits, C_AXIS), - if (current_block->steps.i) SBI(axis_bits, I_AXIS), - if (current_block->steps.j) SBI(axis_bits, J_AXIS), - if (current_block->steps.k) SBI(axis_bits, K_AXIS), - if (current_block->steps.u) SBI(axis_bits, U_AXIS), - if (current_block->steps.v) SBI(axis_bits, V_AXIS), - if (current_block->steps.w) SBI(axis_bits, W_AXIS) + if (X_MOVE_TEST) didmove.a = true, + if (Y_MOVE_TEST) didmove.b = true, + if (Z_MOVE_TEST) didmove.c = true, + if (current_block->steps.i) didmove.i = true, + if (current_block->steps.j) didmove.j = true, + if (current_block->steps.k) didmove.k = true, + if (current_block->steps.u) didmove.u = true, + if (current_block->steps.v) didmove.v = true, + if (current_block->steps.w) didmove.w = true ); - //if (current_block->steps.e) SBI(axis_bits, E_AXIS); - //if (current_block->steps.a) SBI(axis_bits, X_HEAD); - //if (current_block->steps.b) SBI(axis_bits, Y_HEAD); - //if (current_block->steps.c) SBI(axis_bits, Z_HEAD); - axis_did_move = axis_bits; + //if (current_block->steps.e) didmove.e = true; + //if (current_block->steps.a) didmove.x = true; + //if (current_block->steps.b) didmove.y = true; + //if (current_block->steps.c) didmove.z = true; + axis_did_move = didmove; // No acceleration / deceleration time elapsed so far acceleration_time = deceleration_time = 0; @@ -2661,10 +2633,12 @@ hal_timer_t Stepper::block_phase_isr() { oversampling_factor = 0; // Assume no axis smoothing (via oversampling) // Decide if axis smoothing is possible uint32_t max_rate = current_block->nominal_rate; // Get the step event rate - while (max_rate < MIN_STEP_ISR_FREQUENCY) { // As long as more ISRs are possible... - max_rate <<= 1; // Try to double the rate - if (max_rate < MIN_STEP_ISR_FREQUENCY) // Don't exceed the estimated ISR limit - ++oversampling_factor; // Increase the oversampling (used for left-shift) + if (TERN1(DWIN_LCD_PROUI, HMI_data.AdaptiveStepSmoothing)) { + while (max_rate < MIN_STEP_ISR_FREQUENCY) { // As long as more ISRs are possible... + max_rate <<= 1; // Try to double the rate + if (max_rate < MIN_STEP_ISR_FREQUENCY) // Don't exceed the estimated ISR limit + ++oversampling_factor; // Increase the oversampling (used for left-shift) + } } #endif @@ -2680,24 +2654,24 @@ hal_timer_t Stepper::block_phase_isr() { #if ENABLED(INPUT_SHAPING_X) if (shaping_x.enabled) { - const int64_t steps = TEST(current_block->direction_bits, X_AXIS) ? -int64_t(current_block->steps.x) : int64_t(current_block->steps.x); + const int64_t steps = current_block->direction_bits.x ? int64_t(current_block->steps.x) : -int64_t(current_block->steps.x); shaping_x.last_block_end_pos += steps; // If there are any remaining echos unprocessed, then direction change must // be delayed and processed in PULSE_PREP_SHAPING. This will cause half a step // to be missed, which will need recovering and this can be done through shaping_x.remainder. - shaping_x.forward = !TEST(current_block->direction_bits, X_AXIS); - if (!ShapingQueue::empty_x()) SET_BIT_TO(current_block->direction_bits, X_AXIS, TEST(last_direction_bits, X_AXIS)); + shaping_x.forward = current_block->direction_bits.x; + if (!ShapingQueue::empty_x()) current_block->direction_bits.x = last_direction_bits.x; } #endif // Y follows the same logic as X (but the comments aren't repeated) #if ENABLED(INPUT_SHAPING_Y) if (shaping_y.enabled) { - const int64_t steps = TEST(current_block->direction_bits, Y_AXIS) ? -int64_t(current_block->steps.y) : int64_t(current_block->steps.y); + const int64_t steps = current_block->direction_bits.y ? int64_t(current_block->steps.y) : -int64_t(current_block->steps.y); shaping_y.last_block_end_pos += steps; - shaping_y.forward = !TEST(current_block->direction_bits, Y_AXIS); - if (!ShapingQueue::empty_y()) SET_BIT_TO(current_block->direction_bits, Y_AXIS, TEST(last_direction_bits, Y_AXIS)); + shaping_y.forward = current_block->direction_bits.y; + if (!ShapingQueue::empty_y()) current_block->direction_bits.y = last_direction_bits.y; } #endif @@ -2786,7 +2760,7 @@ hal_timer_t Stepper::block_phase_isr() { } #endif } - } + } // !current_block // Return the interval to wait return interval; @@ -2870,7 +2844,7 @@ void Stepper::init() { #if MB(ALLIGATOR) const float motor_current[] = MOTOR_CURRENT; unsigned int digipot_motor = 0; - LOOP_L_N(i, 3 + EXTRUDERS) { + for (uint8_t i = 0; i < 3 + EXTRUDERS; ++i) { digipot_motor = 255 * (motor_current[i] / 2.5); dac084s085::setValue(i, digipot_motor); } @@ -2884,7 +2858,7 @@ void Stepper::init() { TERN_(HAS_X2_DIR, X2_DIR_INIT()); #if HAS_Y_DIR Y_DIR_INIT(); - #if BOTH(HAS_DUAL_Y_STEPPERS, HAS_Y2_DIR) + #if ALL(HAS_Y2_STEPPER, HAS_Y2_DIR) Y2_DIR_INIT(); #endif #endif @@ -2900,24 +2874,10 @@ void Stepper::init() { Z4_DIR_INIT(); #endif #endif - #if HAS_I_DIR - I_DIR_INIT(); - #endif - #if HAS_J_DIR - J_DIR_INIT(); - #endif - #if HAS_K_DIR - K_DIR_INIT(); - #endif - #if HAS_U_DIR - U_DIR_INIT(); - #endif - #if HAS_V_DIR - V_DIR_INIT(); - #endif - #if HAS_W_DIR - W_DIR_INIT(); - #endif + SECONDARY_AXIS_CODE( + I_DIR_INIT(), J_DIR_INIT(), K_DIR_INIT(), + U_DIR_INIT(), V_DIR_INIT(), W_DIR_INIT() + ); #if HAS_E0_DIR E0_DIR_INIT(); #endif @@ -2950,7 +2910,7 @@ void Stepper::init() { #endif X_ENABLE_INIT(); if (X_ENABLE_INIT_STATE) X_ENABLE_WRITE(X_ENABLE_INIT_STATE); - #if BOTH(HAS_X2_STEPPER, HAS_X2_ENABLE) + #if ALL(HAS_X2_STEPPER, HAS_X2_ENABLE) X2_ENABLE_INIT(); if (X_ENABLE_INIT_STATE) X2_ENABLE_WRITE(X_ENABLE_INIT_STATE); #endif @@ -2961,7 +2921,7 @@ void Stepper::init() { #endif Y_ENABLE_INIT(); if (Y_ENABLE_INIT_STATE) Y_ENABLE_WRITE(Y_ENABLE_INIT_STATE); - #if BOTH(HAS_DUAL_Y_STEPPERS, HAS_Y2_ENABLE) + #if ALL(HAS_Y2_STEPPER, HAS_Y2_ENABLE) Y2_ENABLE_INIT(); if (Y_ENABLE_INIT_STATE) Y2_ENABLE_WRITE(Y_ENABLE_INIT_STATE); #endif @@ -3090,7 +3050,7 @@ void Stepper::init() { #endif #if HAS_Y_STEP - #if HAS_DUAL_Y_STEPPERS + #if HAS_Y2_STEPPER Y2_STEP_INIT(); Y2_STEP_WRITE(!STEP_STATE_Y); #endif @@ -3162,20 +3122,8 @@ void Stepper::init() { sei(); #endif - // Init direction bits for first moves - set_directions(0 - NUM_AXIS_GANG( - | TERN0(INVERT_X_DIR, _BV(X_AXIS)), - | TERN0(INVERT_Y_DIR, _BV(Y_AXIS)), - | TERN0(INVERT_Z_DIR, _BV(Z_AXIS)), - | TERN0(INVERT_I_DIR, _BV(I_AXIS)), - | TERN0(INVERT_J_DIR, _BV(J_AXIS)), - | TERN0(INVERT_K_DIR, _BV(K_AXIS)), - | TERN0(INVERT_U_DIR, _BV(U_AXIS)), - | TERN0(INVERT_V_DIR, _BV(V_AXIS)), - | TERN0(INVERT_W_DIR, _BV(W_AXIS)) - ) - ); + // Init direction states + apply_directions(); #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM initialized = true; @@ -3190,9 +3138,9 @@ void Stepper::init() { * when shaping an axis. */ void Stepper::set_shaping_damping_ratio(const AxisEnum axis, const_float_t zeta) { - // from the damping ratio, get a factor that can be applied to advance_dividend for fixed point maths - // for ZV, we use amplitudes 1/(1+K) and K/(1+K) where K = exp(-zeta * M_PI / sqrt(1.0f - zeta * zeta)) - // which can be converted to 1:7 fixed point with an excellent fit with a 3rd order polynomial + // From the damping ratio, get a factor that can be applied to advance_dividend for fixed-point maths. + // For ZV, we use amplitudes 1/(1+K) and K/(1+K) where K = exp(-zeta * π / sqrt(1.0f - zeta * zeta)) + // which can be converted to 1:7 fixed point with an excellent fit with a 3rd-order polynomial. float factor2; if (zeta <= 0.0f) factor2 = 64.0f; else if (zeta >= 1.0f) factor2 = 0.0f; @@ -3425,19 +3373,21 @@ int32_t Stepper::triggered_position(const AxisEnum axis) { #endif void Stepper::report_a_position(const xyz_long_t &pos) { - SERIAL_ECHOLNPGM_P( - LIST_N(DOUBLE(NUM_AXES), - TERN(SAYS_A, PSTR(STR_COUNT_A), PSTR(STR_COUNT_X)), pos.x, - TERN(SAYS_B, PSTR("B:"), SP_Y_LBL), pos.y, - TERN(SAYS_C, PSTR("C:"), SP_Z_LBL), pos.z, - SP_I_LBL, pos.i, - SP_J_LBL, pos.j, - SP_K_LBL, pos.k, - SP_U_LBL, pos.u, - SP_V_LBL, pos.v, - SP_W_LBL, pos.w - ) - ); + #if NUM_AXES + SERIAL_ECHOLNPGM_P( + LIST_N(DOUBLE(NUM_AXES), + TERN(SAYS_A, PSTR(STR_COUNT_A), PSTR(STR_COUNT_X)), pos.x, + TERN(SAYS_B, PSTR("B:"), SP_Y_LBL), pos.y, + TERN(SAYS_C, PSTR("C:"), SP_Z_LBL), pos.z, + SP_I_LBL, pos.i, + SP_J_LBL, pos.j, + SP_K_LBL, pos.k, + SP_U_LBL, pos.u, + SP_V_LBL, pos.v, + SP_W_LBL, pos.w + ) + ); + #endif } void Stepper::report_positions() { @@ -3463,39 +3413,93 @@ void Stepper::report_positions() { USING_TIMED_PULSE(); - #if HAS_Z_AXIS - // Z is handled differently to update the stepper - // counts (needed by Marlin for bed level probing). - const bool z_dir = !TEST(command, FT_BIT_DIR_Z), - z_step = TEST(command, FT_BIT_STEP_Z); - #endif + const xyze_bool_t axis_step = LOGICAL_AXIS_ARRAY( + TEST(command, FT_BIT_STEP_E), + TEST(command, FT_BIT_STEP_X), TEST(command, FT_BIT_STEP_Y), TEST(command, FT_BIT_STEP_Z), + TEST(command, FT_BIT_STEP_I), TEST(command, FT_BIT_STEP_J), TEST(command, FT_BIT_STEP_K), + TEST(command, FT_BIT_STEP_U), TEST(command, FT_BIT_STEP_V), TEST(command, FT_BIT_STEP_W) + ); + // Apply directions (which will apply to the entire linear move) + AxisBits axis_dir = last_direction_bits; if (applyDir) { - TERN_(HAS_X_AXIS, X_DIR_WRITE(INVERT_DIR(X, TEST(command, FT_BIT_DIR_X)))); - TERN_(HAS_Y_AXIS, Y_DIR_WRITE(INVERT_DIR(Y, TEST(command, FT_BIT_DIR_Y)))); - TERN_(HAS_Z_AXIS, Z_DIR_WRITE(INVERT_DIR(Z, z_dir))); - TERN_(HAS_EXTRUDERS, E0_DIR_WRITE(INVERT_DIR(E0, TEST(command, FT_BIT_DIR_E)))); + axis_dir = LOGICAL_AXIS_ARRAY( + TEST(command, FT_BIT_DIR_E), + TEST(command, FT_BIT_DIR_X), TEST(command, FT_BIT_DIR_Y), TEST(command, FT_BIT_DIR_Z), + TEST(command, FT_BIT_DIR_I), TEST(command, FT_BIT_DIR_J), TEST(command, FT_BIT_DIR_K), + TEST(command, FT_BIT_DIR_U), TEST(command, FT_BIT_DIR_V), TEST(command, FT_BIT_DIR_W) + ); + LOGICAL_AXIS_CODE( + E_APPLY_DIR(axis_dir.e, false), + X_APPLY_DIR(axis_dir.x, false), Y_APPLY_DIR(axis_dir.y, false), Z_APPLY_DIR(axis_dir.z, false), + I_APPLY_DIR(axis_dir.i, false), J_APPLY_DIR(axis_dir.j, false), K_APPLY_DIR(axis_dir.k, false), + U_APPLY_DIR(axis_dir.u, false), V_APPLY_DIR(axis_dir.v, false), W_APPLY_DIR(axis_dir.w, false) + ); + last_direction_bits = axis_dir; DIR_WAIT_AFTER(); } - TERN_(HAS_X_AXIS, X_STEP_WRITE(TEST(command, FT_BIT_STEP_X))); - TERN_(HAS_Y_AXIS, Y_STEP_WRITE(TEST(command, FT_BIT_STEP_Y))); - TERN_(HAS_Z_AXIS, Z_STEP_WRITE(z_step)); - TERN_(HAS_EXTRUDERS, E0_STEP_WRITE(TEST(command, FT_BIT_STEP_E))); + // Start a step pulse + LOGICAL_AXIS_CODE( + if (axis_step.e) E_APPLY_STEP(STEP_STATE_E, false), + if (axis_step.x) X_APPLY_STEP(STEP_STATE_X, false), if (axis_step.y) Y_APPLY_STEP(STEP_STATE_Y, false), + if (axis_step.z) Z_APPLY_STEP(STEP_STATE_Z, false), if (axis_step.i) I_APPLY_STEP(STEP_STATE_I, false), + if (axis_step.j) J_APPLY_STEP(STEP_STATE_J, false), if (axis_step.k) K_APPLY_STEP(STEP_STATE_K, false), + if (axis_step.u) U_APPLY_STEP(STEP_STATE_U, false), if (axis_step.v) V_APPLY_STEP(STEP_STATE_V, false), + if (axis_step.w) W_APPLY_STEP(STEP_STATE_W, false) + ); + // Begin waiting for the minimum pulse duration START_TIMED_PULSE(); - #if HAS_Z_AXIS - // Update step counts - if (z_step) count_position.z += z_dir ? -1 : 1; + // Update axis direction adders + count_direction = LOGICAL_AXIS_ARRAY( + int8_t(axis_dir.e ? 1 : -1), + int8_t(axis_dir.x ? 1 : -1), int8_t(axis_dir.y ? 1 : -1), int8_t(axis_dir.z ? 1 : -1), + int8_t(axis_dir.i ? 1 : -1), int8_t(axis_dir.j ? 1 : -1), int8_t(axis_dir.k ? 1 : -1), + int8_t(axis_dir.u ? 1 : -1), int8_t(axis_dir.v ? 1 : -1), int8_t(axis_dir.w ? 1 : -1) + ); + + // Update stepper counts - required for various operations + LOGICAL_AXIS_CODE( + if (axis_step.e) count_position.e += count_direction.e, + if (axis_step.x) count_position.x += count_direction.x, if (axis_step.y) count_position.y += count_direction.y, + if (axis_step.z) count_position.z += count_direction.z, if (axis_step.i) count_position.i += count_direction.i, + if (axis_step.j) count_position.j += count_direction.j, if (axis_step.k) count_position.k += count_direction.k, + if (axis_step.u) count_position.u += count_direction.u, if (axis_step.v) count_position.v += count_direction.v, + if (axis_step.w) count_position.w += count_direction.w + ); + + #if HAS_EXTRUDERS + #if ENABLED(E_DUAL_STEPPER_DRIVERS) + constexpr bool e_axis_has_dedge = AXIS_HAS_DEDGE(E0) && AXIS_HAS_DEDGE(E1); + #else + #define _EDGE_BIT(N) | (AXIS_HAS_DEDGE(E##N) << TOOL_ESTEPPER(N)) + constexpr Flags e_stepper_dedge { 0 REPEAT(EXTRUDERS, _EDGE_BIT) }; + const bool e_axis_has_dedge = e_stepper_dedge[stepper_extruder]; + #endif #endif - AWAIT_HIGH_PULSE(); + // Only wait for axes without edge stepping + const bool any_wait = false LOGICAL_AXIS_GANG( + || (!e_axis_has_dedge && axis_step.e), + || (!AXIS_HAS_DEDGE(X) && axis_step.x), || (!AXIS_HAS_DEDGE(Y) && axis_step.y), || (!AXIS_HAS_DEDGE(Z) && axis_step.z), + || (!AXIS_HAS_DEDGE(I) && axis_step.i), || (!AXIS_HAS_DEDGE(J) && axis_step.j), || (!AXIS_HAS_DEDGE(K) && axis_step.k), + || (!AXIS_HAS_DEDGE(U) && axis_step.u), || (!AXIS_HAS_DEDGE(V) && axis_step.v), || (!AXIS_HAS_DEDGE(W) && axis_step.w) + ); - X_STEP_WRITE(0); - TERN_(HAS_Y_AXIS, Y_STEP_WRITE(0)); - TERN_(HAS_Z_AXIS, Z_STEP_WRITE(0)); - TERN_(HAS_EXTRUDERS, E0_STEP_WRITE(0)); + // Allow pulses to be registered by stepper drivers + if (any_wait) AWAIT_HIGH_PULSE(); + + // Stop pulses. Axes with DEDGE will do nothing, assuming STEP_STATE_* is HIGH + LOGICAL_AXIS_CODE( + if (axis_step.e) E_APPLY_STEP(!STEP_STATE_E, false), + if (axis_step.x) X_APPLY_STEP(!STEP_STATE_X, false), if (axis_step.y) Y_APPLY_STEP(!STEP_STATE_Y, false), + if (axis_step.z) Z_APPLY_STEP(!STEP_STATE_Z, false), if (axis_step.i) I_APPLY_STEP(!STEP_STATE_I, false), + if (axis_step.j) J_APPLY_STEP(!STEP_STATE_J, false), if (axis_step.k) K_APPLY_STEP(!STEP_STATE_K, false), + if (axis_step.u) U_APPLY_STEP(!STEP_STATE_U, false), if (axis_step.v) V_APPLY_STEP(!STEP_STATE_V, false), + if (axis_step.w) W_APPLY_STEP(!STEP_STATE_W, false) + ); } // Stepper::fxdTiCtrl_stepper @@ -3505,7 +3509,7 @@ void Stepper::report_positions() { // If the current block is not done processing, return right away if (!fxdTiCtrl.getBlockProcDn()) return; - axis_did_move = 0; + axis_did_move.reset(); current_block = nullptr; discard_current_block(); } @@ -3551,28 +3555,17 @@ void Stepper::report_positions() { // or the set conditions should be changed from the block to // the motion trajectory or motor commands. - uint8_t axis_bits = 0U; + AxisBits didmove; + static abce_ulong_t debounce{0}; + auto debounce_axis = [&](const AxisEnum axis) { + if (current_block->steps[axis]) debounce[axis] = (AXIS_DID_MOVE_DEB) * 400; // divide by 0.0025f */ + if (debounce[axis]) { didmove.bset(axis); debounce[axis]--; } + }; + #define _DEBOUNCE(N) debounce_axis(AxisEnum(N)); - static uint32_t a_debounce = 0U; - if (!!current_block->steps.a) a_debounce = (AXIS_DID_MOVE_DEB) * 400; // divide by 0.0025f - if (a_debounce) { SBI(axis_bits, A_AXIS); a_debounce--; } - #if HAS_Y_AXIS - static uint32_t b_debounce = 0U; - if (!!current_block->steps.b) b_debounce = (AXIS_DID_MOVE_DEB) * 400; - if (b_debounce) { SBI(axis_bits, B_AXIS); b_debounce--; } - #endif - #if HAS_Z_AXIS - static uint32_t c_debounce = 0U; - if (!!current_block->steps.c) c_debounce = (AXIS_DID_MOVE_DEB) * 400; - if (c_debounce) { SBI(axis_bits, C_AXIS); c_debounce--; } - #endif - #if HAS_EXTRUDERS - static uint32_t e_debounce = 0U; - if (!!current_block->steps.e) e_debounce = (AXIS_DID_MOVE_DEB) * 400; - if (e_debounce) { SBI(axis_bits, E_AXIS); e_debounce--; } - #endif + if (current_block) { REPEAT(LOGICAL_AXES, _DEBOUNCE); } - axis_did_move = axis_bits; + axis_did_move = didmove; } #endif // FT_MOTION @@ -3581,7 +3574,7 @@ void Stepper::report_positions() { #define _ENABLE_AXIS(A) enable_axis(_AXIS(A)) #define _READ_DIR(AXIS) AXIS ##_DIR_READ() - #define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true) + #define _APPLY_DIR(AXIS, FWD) AXIS ##_APPLY_DIR(FWD, true) #if MINIMUM_STEPPER_PULSE #define STEP_PULSE_CYCLES ((MINIMUM_STEPPER_PULSE) * CYCLES_PER_MICROSECOND) @@ -3627,31 +3620,31 @@ void Stepper::report_positions() { #if DISABLED(DELTA) - #define BABYSTEP_AXIS(AXIS, DIR, INV) do{ \ - const uint8_t old_dir = _READ_DIR(AXIS); \ - _ENABLE_AXIS(AXIS); \ - DIR_WAIT_BEFORE(); \ - _APPLY_DIR(AXIS, INVERT_DIR(AXIS, (DIR)^(INV))); \ - DIR_WAIT_AFTER(); \ - _SAVE_START(); \ - _APPLY_STEP(AXIS, _STEP_STATE(AXIS), true); \ - _PULSE_WAIT(); \ - _APPLY_STEP(AXIS, !_STEP_STATE(AXIS), true); \ - EXTRA_DIR_WAIT_BEFORE(); \ - _APPLY_DIR(AXIS, old_dir); \ - EXTRA_DIR_WAIT_AFTER(); \ + #define BABYSTEP_AXIS(AXIS, FWD, INV) do{ \ + const bool old_fwd = _READ_DIR(AXIS); \ + _ENABLE_AXIS(AXIS); \ + DIR_WAIT_BEFORE(); \ + _APPLY_DIR(AXIS, (FWD)^(INV)); \ + DIR_WAIT_AFTER(); \ + _SAVE_START(); \ + _APPLY_STEP(AXIS, _STEP_STATE(AXIS), true); \ + _PULSE_WAIT(); \ + _APPLY_STEP(AXIS, !_STEP_STATE(AXIS), true); \ + EXTRA_DIR_WAIT_BEFORE(); \ + _APPLY_DIR(AXIS, old_fwd); \ + EXTRA_DIR_WAIT_AFTER(); \ }while(0) #endif #if IS_CORE - #define BABYSTEP_CORE(A, B, DIR, INV, ALT) do{ \ - const xy_byte_t old_dir = { _READ_DIR(A), _READ_DIR(B) }; \ + #define BABYSTEP_CORE(A, B, FWD, INV, ALT) do{ \ + const xy_byte_t old_fwd = { _READ_DIR(A), _READ_DIR(B) }; \ _ENABLE_AXIS(A); _ENABLE_AXIS(B); \ DIR_WAIT_BEFORE(); \ - _APPLY_DIR(A, INVERT_DIR(A, (DIR)^(INV))); \ - _APPLY_DIR(B, INVERT_DIR(B, (DIR)^(INV)^(ALT))); \ + _APPLY_DIR(A, (FWD)^(INV)); \ + _APPLY_DIR(B, (FWD)^(INV)^(ALT)); \ DIR_WAIT_AFTER(); \ _SAVE_START(); \ _APPLY_STEP(A, _STEP_STATE(A), true); \ @@ -3660,7 +3653,7 @@ void Stepper::report_positions() { _APPLY_STEP(A, !_STEP_STATE(A), true); \ _APPLY_STEP(B, !_STEP_STATE(B), true); \ EXTRA_DIR_WAIT_BEFORE(); \ - _APPLY_DIR(A, old_dir.a); _APPLY_DIR(B, old_dir.b); \ + _APPLY_DIR(A, old_fwd.a); _APPLY_DIR(B, old_fwd.b); \ EXTRA_DIR_WAIT_AFTER(); \ }while(0) @@ -3688,7 +3681,7 @@ void Stepper::report_positions() { case Y_AXIS: #if CORE_IS_XY - BABYSTEP_CORE(X, Y, !direction, 1, (CORESIGN(1)>0)); + BABYSTEP_CORE(X, Y, direction, 0, (CORESIGN(1)>0)); #elif CORE_IS_YZ BABYSTEP_CORE(Y, Z, direction, 0, (CORESIGN(1)<0)); #else @@ -3701,78 +3694,46 @@ void Stepper::report_positions() { case Z_AXIS: { #if CORE_IS_XZ - BABYSTEP_CORE(X, Z, direction, BABYSTEP_INVERT_Z, (CORESIGN(1)<0)); + BABYSTEP_CORE(X, Z, direction, ENABLED(BABYSTEP_INVERT_Z), (CORESIGN(1)>0)); #elif CORE_IS_YZ - BABYSTEP_CORE(Y, Z, direction, BABYSTEP_INVERT_Z, (CORESIGN(1)<0)); + BABYSTEP_CORE(Y, Z, direction, ENABLED(BABYSTEP_INVERT_Z), (CORESIGN(1)<0)); #elif DISABLED(DELTA) - BABYSTEP_AXIS(Z, direction, BABYSTEP_INVERT_Z); + BABYSTEP_AXIS(Z, direction, ENABLED(BABYSTEP_INVERT_Z)); #else // DELTA - const bool z_direction = direction ^ BABYSTEP_INVERT_Z; + const bool z_direction = TERN_(BABYSTEP_INVERT_Z, !) direction; - NUM_AXIS_CODE( - enable_axis(X_AXIS), enable_axis(Y_AXIS), enable_axis(Z_AXIS), - enable_axis(I_AXIS), enable_axis(J_AXIS), enable_axis(K_AXIS), - enable_axis(U_AXIS), enable_axis(V_AXIS), enable_axis(W_AXIS) - ); + enable_axis(A_AXIS); enable_axis(B_AXIS); enable_axis(C_AXIS); DIR_WAIT_BEFORE(); - const xyz_byte_t old_dir = NUM_AXIS_ARRAY( - X_DIR_READ(), Y_DIR_READ(), Z_DIR_READ(), - I_DIR_READ(), J_DIR_READ(), K_DIR_READ(), - U_DIR_READ(), V_DIR_READ(), W_DIR_READ() - ); + const bool old_fwd[3] = { X_DIR_READ(), Y_DIR_READ(), Z_DIR_READ() }; - #ifdef X_DIR_WRITE - X_DIR_WRITE(INVERT_DIR(X, z_direction)); - #endif - #ifdef Y_DIR_WRITE - Y_DIR_WRITE(INVERT_DIR(Y, z_direction)); - #endif - #ifdef Z_DIR_WRITE - Z_DIR_WRITE(INVERT_DIR(Z, z_direction)); - #endif + X_DIR_WRITE(z_direction); + Y_DIR_WRITE(z_direction); + Z_DIR_WRITE(z_direction); DIR_WAIT_AFTER(); _SAVE_START(); - #ifdef X_STEP_WRITE - X_STEP_WRITE(STEP_STATE_X); - #endif - #ifdef Y_STEP_WRITE - Y_STEP_WRITE(STEP_STATE_Y); - #endif - #ifdef Z_STEP_WRITE - Z_STEP_WRITE(STEP_STATE_Z); - #endif + X_STEP_WRITE(STEP_STATE_X); + Y_STEP_WRITE(STEP_STATE_Y); + Z_STEP_WRITE(STEP_STATE_Z); _PULSE_WAIT(); - #ifdef X_STEP_WRITE - X_STEP_WRITE(!STEP_STATE_X); - #endif - #ifdef Y_STEP_WRITE - Y_STEP_WRITE(!STEP_STATE_Y); - #endif - #ifdef Z_STEP_WRITE - Z_STEP_WRITE(!STEP_STATE_Z); - #endif + X_STEP_WRITE(!STEP_STATE_X); + Y_STEP_WRITE(!STEP_STATE_Y); + Z_STEP_WRITE(!STEP_STATE_Z); // Restore direction bits EXTRA_DIR_WAIT_BEFORE(); - #ifdef X_DIR_WRITE - X_DIR_WRITE(old_dir.x); - #endif - #ifdef Y_DIR_WRITE - Y_DIR_WRITE(old_dir.y); - #endif - #ifdef Z_DIR_WRITE - Z_DIR_WRITE(old_dir.z); - #endif + X_DIR_WRITE(old_fwd[A_AXIS]); + Y_DIR_WRITE(old_fwd[B_AXIS]); + Z_DIR_WRITE(old_fwd[C_AXIS]); EXTRA_DIR_WAIT_AFTER(); @@ -3780,25 +3741,6 @@ void Stepper::report_positions() { } break; - #if HAS_I_AXIS - case I_AXIS: BABYSTEP_AXIS(I, direction, 0); break; - #endif - #if HAS_J_AXIS - case J_AXIS: BABYSTEP_AXIS(J, direction, 0); break; - #endif - #if HAS_K_AXIS - case K_AXIS: BABYSTEP_AXIS(K, direction, 0); break; - #endif - #if HAS_U_AXIS - case U_AXIS: BABYSTEP_AXIS(U, direction, 0); break; - #endif - #if HAS_V_AXIS - case V_AXIS: BABYSTEP_AXIS(V, direction, 0); break; - #endif - #if HAS_W_AXIS - case W_AXIS: BABYSTEP_AXIS(W, direction, 0); break; - #endif - default: break; } @@ -3828,7 +3770,7 @@ void Stepper::report_positions() { void Stepper::refresh_motor_power() { if (!initialized) return; - LOOP_L_N(i, COUNT(motor_current_setting)) { + for (uint8_t i = 0; i < COUNT(motor_current_setting); ++i) { switch (i) { #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) case 0: @@ -3924,7 +3866,7 @@ void Stepper::report_positions() { SPI.begin(); SET_OUTPUT(DIGIPOTSS_PIN); - LOOP_L_N(i, COUNT(motor_current_setting)) + for (uint8_t i = 0; i < COUNT(motor_current_setting); ++i) set_digipot_current(i, motor_current_setting[i]); #elif HAS_MOTOR_CURRENT_PWM @@ -3985,7 +3927,7 @@ void Stepper::report_positions() { #else // PRINTRBOARD_G2 - #include HAL_PATH(../HAL, fastio/G2_PWM.h) + #include HAL_PATH(.., fastio/G2_PWM.h) #endif diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 63285398cd..9f49e353a7 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -53,210 +53,19 @@ #include "ft_types.h" #endif -// -// Estimate the amount of time the Stepper ISR will take to execute -// - -/** - * The method of calculating these cycle-constants is unclear. - * Most of them are no longer used directly for pulse timing, and exist - * only to estimate a maximum step rate based on the user's configuration. - * As 32-bit processors continue to diverge, maintaining cycle counts - * will become increasingly difficult and error-prone. - */ - -#ifdef CPU_32_BIT - /** - * Duration of START_TIMED_PULSE - * - * ...as measured on an LPC1768 with a scope and converted to cycles. - * Not applicable to other 32-bit processors, but as long as others - * take longer, pulses will be longer. For example the SKR Pro - * (stm32f407zgt6) requires ~60 cyles. - */ - #define TIMER_READ_ADD_AND_STORE_CYCLES 34UL - - // The base ISR - #define ISR_BASE_CYCLES 770UL - - // Linear advance base time is 64 cycles - #if ENABLED(LIN_ADVANCE) - #define ISR_LA_BASE_CYCLES 64UL - #else - #define ISR_LA_BASE_CYCLES 0UL - #endif - - // S curve interpolation adds 40 cycles - #if ENABLED(S_CURVE_ACCELERATION) - #ifdef STM32G0B1xx - #define ISR_S_CURVE_CYCLES 500UL - #else - #define ISR_S_CURVE_CYCLES 40UL - #endif - #else - #define ISR_S_CURVE_CYCLES 0UL - #endif - - // Input shaping base time - #if HAS_ZV_SHAPING - #define ISR_SHAPING_BASE_CYCLES 180UL - #else - #define ISR_SHAPING_BASE_CYCLES 0UL - #endif - - // Stepper Loop base cycles - #define ISR_LOOP_BASE_CYCLES 4UL - - // And each stepper (start + stop pulse) takes in worst case - #define ISR_STEPPER_CYCLES 100UL - +// TODO: Review and ensure proper handling for special E axes with commands like M17/M18, stepper timeout, etc. +#if ENABLED(MIXING_EXTRUDER) + #define E_STATES EXTRUDERS // All steppers are set together for each mixer. (Currently limited to 1.) +#elif HAS_SWITCHING_EXTRUDER + #define E_STATES E_STEPPERS // One stepper for every two EXTRUDERS. The last extruder can be non-switching. +#elif HAS_PRUSA_MMU2 + #define E_STATES E_STEPPERS // One E stepper shared with all EXTRUDERS, so setting any only sets one. #else - // Cycles to perform actions in START_TIMED_PULSE - #define TIMER_READ_ADD_AND_STORE_CYCLES 13UL - - // The base ISR - #define ISR_BASE_CYCLES 882UL - - // Linear advance base time is 32 cycles - #if ENABLED(LIN_ADVANCE) - #define ISR_LA_BASE_CYCLES 30UL - #else - #define ISR_LA_BASE_CYCLES 0UL - #endif - - // S curve interpolation adds 160 cycles - #if ENABLED(S_CURVE_ACCELERATION) - #define ISR_S_CURVE_CYCLES 160UL - #else - #define ISR_S_CURVE_CYCLES 0UL - #endif - - // Input shaping base time - #if HAS_ZV_SHAPING - #define ISR_SHAPING_BASE_CYCLES 290UL - #else - #define ISR_SHAPING_BASE_CYCLES 0UL - #endif - - // Stepper Loop base cycles - #define ISR_LOOP_BASE_CYCLES 32UL - - // And each stepper (start + stop pulse) takes in worst case - #define ISR_STEPPER_CYCLES 60UL - + #define E_STATES E_STEPPERS // One stepper for each extruder, so each can be disabled individually. #endif -// If linear advance is disabled, the loop also handles them -#if DISABLED(LIN_ADVANCE) && ENABLED(MIXING_EXTRUDER) - #define ISR_MIXING_STEPPER_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) -#else - #define ISR_MIXING_STEPPER_CYCLES 0UL -#endif - -// Add time for each stepper -#if HAS_X_STEP - #define ISR_X_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_Y_STEP - #define ISR_Y_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_Z_STEP - #define ISR_Z_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_I_STEP - #define ISR_I_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_J_STEP - #define ISR_J_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_K_STEP - #define ISR_K_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_U_STEP - #define ISR_U_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_V_STEP - #define ISR_V_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_W_STEP - #define ISR_W_STEPPER_CYCLES ISR_STEPPER_CYCLES -#endif -#if HAS_EXTRUDERS - #define ISR_E_STEPPER_CYCLES ISR_STEPPER_CYCLES // E is always interpolated, even for mixing extruders -#endif - -// And the total minimum loop time, not including the base -#define _PLUS_AXIS_CYCLES(A) + (ISR_##A##_STEPPER_CYCLES) -#define MIN_ISR_LOOP_CYCLES (ISR_MIXING_STEPPER_CYCLES LOGICAL_AXIS_MAP(_PLUS_AXIS_CYCLES)) - -// Calculate the minimum MPU cycles needed per pulse to enforce, limited to the max stepper rate -#define _MIN_STEPPER_PULSE_CYCLES(N) _MAX(uint32_t((F_CPU) / (MAXIMUM_STEPPER_RATE)), ((F_CPU) / 500000UL) * (N)) -#if MINIMUM_STEPPER_PULSE - #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(uint32_t(MINIMUM_STEPPER_PULSE)) -#elif HAS_DRIVER(LV8729) - #define MIN_STEPPER_PULSE_CYCLES uint32_t((((F_CPU) - 1) / 2000000) + 1) // 0.5µs, aka 500ns -#else - #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(1UL) -#endif - -// Calculate the minimum pulse times (high and low) -#if MINIMUM_STEPPER_PULSE && MAXIMUM_STEPPER_RATE - constexpr uint32_t _MIN_STEP_PERIOD_NS = 1000000000UL / MAXIMUM_STEPPER_RATE; - constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE; - constexpr uint32_t _MIN_PULSE_LOW_NS = _MAX((_MIN_STEP_PERIOD_NS - _MIN(_MIN_STEP_PERIOD_NS, _MIN_PULSE_HIGH_NS)), _MIN_PULSE_HIGH_NS); -#elif MINIMUM_STEPPER_PULSE - // Assume 50% duty cycle - constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE; - constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS; -#elif MAXIMUM_STEPPER_RATE - // Assume 50% duty cycle - constexpr uint32_t _MIN_PULSE_HIGH_NS = 500000000UL / MAXIMUM_STEPPER_RATE; - constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS; -#else - #error "Expected at least one of MINIMUM_STEPPER_PULSE or MAXIMUM_STEPPER_RATE to be defined" -#endif - -// The loop takes the base time plus the time for all the bresenham logic for 1 << R pulses plus the time -// between pulses for ((1 << R) - 1) pulses. But the user could be enforcing a minimum time so the loop time is: -#define ISR_LOOP_CYCLES(R) ((ISR_LOOP_BASE_CYCLES + MIN_ISR_LOOP_CYCLES + MIN_STEPPER_PULSE_CYCLES) * ((1UL << R) - 1) + _MAX(MIN_ISR_LOOP_CYCLES, MIN_STEPPER_PULSE_CYCLES)) - -// Model input shaping as an extra loop call -#define ISR_SHAPING_LOOP_CYCLES(R) (TERN0(HAS_ZV_SHAPING, (ISR_LOOP_BASE_CYCLES + TERN0(INPUT_SHAPING_X, ISR_X_STEPPER_CYCLES) + TERN0(INPUT_SHAPING_Y, ISR_Y_STEPPER_CYCLES)) << R)) - -// If linear advance is enabled, then it is handled separately -#if ENABLED(LIN_ADVANCE) - - // Estimate the minimum LA loop time - #if ENABLED(MIXING_EXTRUDER) // ToDo: ??? - // HELP ME: What is what? - // Directions are set up for MIXING_STEPPERS - like before. - // Finding the right stepper may last up to MIXING_STEPPERS loops in get_next_stepper(). - // These loops are a bit faster than advancing a bresenham counter. - // Always only one E stepper is stepped. - #define MIN_ISR_LA_LOOP_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) - #else - #define MIN_ISR_LA_LOOP_CYCLES ISR_STEPPER_CYCLES - #endif - - // And the real loop time - #define ISR_LA_LOOP_CYCLES _MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LA_LOOP_CYCLES) - -#else - #define ISR_LA_LOOP_CYCLES 0UL -#endif - -// Estimate the total ISR execution time in cycles given a step-per-ISR shift multiplier -#define ISR_EXECUTION_CYCLES(R) ((ISR_BASE_CYCLES + ISR_S_CURVE_CYCLES + ISR_SHAPING_BASE_CYCLES + ISR_LOOP_CYCLES(R) + ISR_SHAPING_LOOP_CYCLES(R) + ISR_LA_BASE_CYCLES + ISR_LA_LOOP_CYCLES) >> R) - -// The maximum allowable stepping frequency when doing 1x stepping (in Hz) -#define MAX_STEP_ISR_FREQUENCY_1X ((F_CPU) / ISR_EXECUTION_CYCLES(0)) - -// The minimum step ISR rate used by ADAPTIVE_STEP_SMOOTHING to target 50% CPU usage -// This does not account for the possibility of multi-stepping. -#define MIN_STEP_ISR_FREQUENCY (MAX_STEP_ISR_FREQUENCY_1X >> 1) - // Number of axes that could be enabled/disabled. Dual/multiple steppers are combined. -#define ENABLE_COUNT (NUM_AXES + E_STEPPERS) +#define ENABLE_COUNT (NUM_AXES + E_STATES) typedef bits_t(ENABLE_COUNT) ena_mask_t; // Axis flags type, for enabled state or other simple state @@ -264,17 +73,22 @@ typedef struct { union { ena_mask_t bits; struct { - bool NUM_AXIS_LIST(X:1, Y:1, Z:1, I:1, J:1, K:1, U:1, V:1, W:1); - #if HAS_EXTRUDERS - bool LIST_N(EXTRUDERS, E0:1, E1:1, E2:1, E3:1, E4:1, E5:1, E6:1, E7:1); + #if NUM_AXES + bool NUM_AXIS_LIST(X:1, Y:1, Z:1, I:1, J:1, K:1, U:1, V:1, W:1); + #endif + #if E_STATES + bool LIST_N(E_STATES, E0:1, E1:1, E2:1, E3:1, E4:1, E5:1, E6:1, E7:1); #endif }; }; } stepper_flags_t; +typedef bits_t(NUM_AXES + E_STATES) e_axis_bits_t; +constexpr e_axis_bits_t e_axis_mask = (_BV(E_STATES) - 1) << NUM_AXES; + // All the stepper enable pins constexpr pin_t ena_pins[] = { - NUM_AXIS_LIST(X_ENABLE_PIN, Y_ENABLE_PIN, Z_ENABLE_PIN, I_ENABLE_PIN, J_ENABLE_PIN, K_ENABLE_PIN, U_ENABLE_PIN, V_ENABLE_PIN, W_ENABLE_PIN), + NUM_AXIS_LIST_(X_ENABLE_PIN, Y_ENABLE_PIN, Z_ENABLE_PIN, I_ENABLE_PIN, J_ENABLE_PIN, K_ENABLE_PIN, U_ENABLE_PIN, V_ENABLE_PIN, W_ENABLE_PIN) LIST_N(E_STEPPERS, E0_ENABLE_PIN, E1_ENABLE_PIN, E2_ENABLE_PIN, E3_ENABLE_PIN, E4_ENABLE_PIN, E5_ENABLE_PIN, E6_ENABLE_PIN, E7_ENABLE_PIN) }; @@ -479,7 +293,7 @@ class Stepper { public: - #if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + #if ANY(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) static bool separate_multi_axis; #endif @@ -508,17 +322,17 @@ class Stepper { #endif #if ENABLED(FREEZE_FEATURE) - static bool frozen; // Set this flag to instantly freeze motion + static bool frozen; // Set this flag to instantly freeze motion #endif private: - static block_t* current_block; // A pointer to the block currently being traced + static block_t* current_block; // A pointer to the block currently being traced - static axis_bits_t last_direction_bits, // The next stepping-bits to be output - axis_did_move; // Last Movement in the given direction is not null, as computed when the last movement was fetched from planner + static AxisBits last_direction_bits, // The next stepping-bits to be output + axis_did_move; // Last Movement in the given direction is not null, as computed when the last movement was fetched from planner - static bool abort_current_block; // Signals to the stepper that current block should be aborted + static bool abort_current_block; // Signals to the stepper that current block should be aborted #if ENABLED(X_DUAL_ENDSTOPS) static bool locked_X_motor, locked_X2_motor; @@ -526,7 +340,7 @@ class Stepper { #if ENABLED(Y_DUAL_ENDSTOPS) static bool locked_Y_motor, locked_Y2_motor; #endif - #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + #if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) static bool locked_Z_motor, locked_Z2_motor #if NUM_Z_STEPPERS >= 3 , locked_Z3_motor @@ -564,7 +378,7 @@ class Stepper { decelerate_after, // The point from where we need to start decelerating step_event_count; // The total event count for the current block - #if EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) + #if ANY(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) static uint8_t stepper_extruder; #else static constexpr uint8_t stepper_extruder = 0; @@ -713,11 +527,11 @@ class Stepper { // Quickly stop all steppers FORCE_INLINE static void quick_stop() { abort_current_block = true; } - // The direction of a single motor - FORCE_INLINE static bool motor_direction(const AxisEnum axis) { return TEST(last_direction_bits, axis); } + // The direction of a single motor. A true result indicates forward or positive motion. + FORCE_INLINE static bool motor_direction(const AxisEnum axis) { return last_direction_bits[axis]; } // The last movement direction was not null on the specified axis. Note that motor direction is not necessarily the same. - FORCE_INLINE static bool axis_is_moving(const AxisEnum axis) { return TEST(axis_did_move, axis); } + FORCE_INLINE static bool axis_is_moving(const AxisEnum axis) { return axis_did_move[axis]; } // Handle a triggered endstop static void endstop_triggered(const AxisEnum axis); @@ -736,7 +550,7 @@ class Stepper { static void microstep_readings(); #endif - #if EITHER(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + #if ANY(HAS_EXTRA_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) FORCE_INLINE static void set_separate_multi_axis(const bool state) { separate_multi_axis = state; } #endif #if ENABLED(X_DUAL_ENDSTOPS) @@ -747,7 +561,7 @@ class Stepper { FORCE_INLINE static void set_y_lock(const bool state) { locked_Y_motor = state; } FORCE_INLINE static void set_y2_lock(const bool state) { locked_Y2_motor = state; } #endif - #if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) + #if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) FORCE_INLINE static void set_z1_lock(const bool state) { locked_Z_motor = state; } FORCE_INLINE static void set_z2_lock(const bool state) { locked_Z2_motor = state; } #if NUM_Z_STEPPERS >= 3 @@ -817,7 +631,7 @@ class Stepper { static void apply_directions(); // Set direction bits and update all stepper DIR states - static void set_directions(const axis_bits_t bits) { + static void set_directions(const AxisBits bits) { last_direction_bits = bits; apply_directions(); } diff --git a/Marlin/src/module/stepper/cycles.h b/Marlin/src/module/stepper/cycles.h new file mode 100644 index 0000000000..dae9e7c62c --- /dev/null +++ b/Marlin/src/module/stepper/cycles.h @@ -0,0 +1,223 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 + +/** + * cycles.h - Cycle counting for the Stepper ISR + * + * Estimate the amount of time the Stepper ISR will take to execute. + * + * These cycle counts are rough estimates used to determine whether the ISR + * has enough time to do all its work before it should yield back to userland. + * These constants may be updated as data is gathered from a variety of MCUs. + */ + +#ifdef CPU_32_BIT + /** + * Duration of START_TIMED_PULSE + * + * ...as measured on an LPC1768 with a scope and converted to cycles. + * Not applicable to other 32-bit processors, but as long as others + * take longer, pulses will be longer. For example the SKR Pro + * (stm32f407zgt6) requires ~60 cyles. + */ + #define TIMER_READ_ADD_AND_STORE_CYCLES 34UL + + // The base ISR + #define ISR_BASE_CYCLES 770UL + + // Linear advance base time is 64 cycles + #if ENABLED(LIN_ADVANCE) + #define ISR_LA_BASE_CYCLES 64UL + #else + #define ISR_LA_BASE_CYCLES 0UL + #endif + + // S curve interpolation adds 40 cycles + #if ENABLED(S_CURVE_ACCELERATION) + #ifdef STM32G0B1xx + #define ISR_S_CURVE_CYCLES 500UL + #else + #define ISR_S_CURVE_CYCLES 40UL + #endif + #else + #define ISR_S_CURVE_CYCLES 0UL + #endif + + // Input shaping base time + #if HAS_ZV_SHAPING + #define ISR_SHAPING_BASE_CYCLES 180UL + #else + #define ISR_SHAPING_BASE_CYCLES 0UL + #endif + + // Stepper Loop base cycles + #define ISR_LOOP_BASE_CYCLES 4UL + + // And each stepper (start + stop pulse) takes in worst case + #define ISR_STEPPER_CYCLES 100UL + +#else + + // Cycles to perform actions in START_TIMED_PULSE + #define TIMER_READ_ADD_AND_STORE_CYCLES 13UL + + // The base ISR + #define ISR_BASE_CYCLES 882UL + + // Linear advance base time is 32 cycles + #if ENABLED(LIN_ADVANCE) + #define ISR_LA_BASE_CYCLES 30UL + #else + #define ISR_LA_BASE_CYCLES 0UL + #endif + + // S curve interpolation adds 160 cycles + #if ENABLED(S_CURVE_ACCELERATION) + #define ISR_S_CURVE_CYCLES 160UL + #else + #define ISR_S_CURVE_CYCLES 0UL + #endif + + // Input shaping base time + #if HAS_ZV_SHAPING + #define ISR_SHAPING_BASE_CYCLES 290UL + #else + #define ISR_SHAPING_BASE_CYCLES 0UL + #endif + + // Stepper Loop base cycles + #define ISR_LOOP_BASE_CYCLES 32UL + + // And each stepper (start + stop pulse) takes in worst case + #define ISR_STEPPER_CYCLES 60UL + +#endif + +// If linear advance is disabled, the loop also handles them +#if DISABLED(LIN_ADVANCE) && ENABLED(MIXING_EXTRUDER) + #define ISR_MIXING_STEPPER_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) +#else + #define ISR_MIXING_STEPPER_CYCLES 0UL +#endif + +// Add time for each stepper +#if HAS_X_STEP + #define ISR_X_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_Y_STEP + #define ISR_Y_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_Z_STEP + #define ISR_Z_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_I_STEP + #define ISR_I_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_J_STEP + #define ISR_J_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_K_STEP + #define ISR_K_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_U_STEP + #define ISR_U_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_V_STEP + #define ISR_V_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_W_STEP + #define ISR_W_STEPPER_CYCLES ISR_STEPPER_CYCLES +#endif +#if HAS_EXTRUDERS + #define ISR_E_STEPPER_CYCLES ISR_STEPPER_CYCLES // E is always interpolated, even for mixing extruders +#endif + +// And the total minimum loop time, not including the base +#define _PLUS_AXIS_CYCLES(A) + (ISR_##A##_STEPPER_CYCLES) +#define MIN_ISR_LOOP_CYCLES (ISR_MIXING_STEPPER_CYCLES LOGICAL_AXIS_MAP(_PLUS_AXIS_CYCLES)) + +// Calculate the minimum MPU cycles needed per pulse to enforce, limited to the max stepper rate +#define _MIN_STEPPER_PULSE_CYCLES(N) _MAX(uint32_t((F_CPU) / (MAXIMUM_STEPPER_RATE)), ((F_CPU) / 500000UL) * (N)) +#if MINIMUM_STEPPER_PULSE + #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(uint32_t(MINIMUM_STEPPER_PULSE)) +#elif HAS_DRIVER(LV8729) + #define MIN_STEPPER_PULSE_CYCLES uint32_t((((F_CPU) - 1) / 2000000) + 1) // 0.5µs, aka 500ns +#else + #define MIN_STEPPER_PULSE_CYCLES _MIN_STEPPER_PULSE_CYCLES(1UL) +#endif + +// Calculate the minimum pulse times (high and low) +#if MINIMUM_STEPPER_PULSE && MAXIMUM_STEPPER_RATE + constexpr uint32_t _MIN_STEP_PERIOD_NS = 1000000000UL / MAXIMUM_STEPPER_RATE; + constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE; + constexpr uint32_t _MIN_PULSE_LOW_NS = _MAX((_MIN_STEP_PERIOD_NS - _MIN(_MIN_STEP_PERIOD_NS, _MIN_PULSE_HIGH_NS)), _MIN_PULSE_HIGH_NS); +#elif MINIMUM_STEPPER_PULSE + // Assume 50% duty cycle + constexpr uint32_t _MIN_PULSE_HIGH_NS = 1000UL * MINIMUM_STEPPER_PULSE; + constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS; +#elif MAXIMUM_STEPPER_RATE + // Assume 50% duty cycle + constexpr uint32_t _MIN_PULSE_HIGH_NS = 500000000UL / MAXIMUM_STEPPER_RATE; + constexpr uint32_t _MIN_PULSE_LOW_NS = _MIN_PULSE_HIGH_NS; +#else + #error "Expected at least one of MINIMUM_STEPPER_PULSE or MAXIMUM_STEPPER_RATE to be defined" +#endif + +// The loop takes the base time plus the time for all the bresenham logic for 1 << R pulses plus the time +// between pulses for ((1 << R) - 1) pulses. But the user could be enforcing a minimum time so the loop time is: +#define ISR_LOOP_CYCLES(R) ((ISR_LOOP_BASE_CYCLES + MIN_ISR_LOOP_CYCLES + MIN_STEPPER_PULSE_CYCLES) * ((1UL << R) - 1) + _MAX(MIN_ISR_LOOP_CYCLES, MIN_STEPPER_PULSE_CYCLES)) + +// Model input shaping as an extra loop call +#define ISR_SHAPING_LOOP_CYCLES(R) (TERN0(HAS_ZV_SHAPING, (ISR_LOOP_BASE_CYCLES + TERN0(INPUT_SHAPING_X, ISR_X_STEPPER_CYCLES) + TERN0(INPUT_SHAPING_Y, ISR_Y_STEPPER_CYCLES)) << R)) + +// If linear advance is enabled, then it is handled separately +#if ENABLED(LIN_ADVANCE) + + // Estimate the minimum LA loop time + #if ENABLED(MIXING_EXTRUDER) // ToDo: ??? + // HELP ME: What is what? + // Directions are set up for MIXING_STEPPERS - like before. + // Finding the right stepper may last up to MIXING_STEPPERS loops in get_next_stepper(). + // These loops are a bit faster than advancing a bresenham counter. + // Always only one E stepper is stepped. + #define MIN_ISR_LA_LOOP_CYCLES ((MIXING_STEPPERS) * (ISR_STEPPER_CYCLES)) + #else + #define MIN_ISR_LA_LOOP_CYCLES ISR_STEPPER_CYCLES + #endif + + // And the real loop time + #define ISR_LA_LOOP_CYCLES _MAX(MIN_STEPPER_PULSE_CYCLES, MIN_ISR_LA_LOOP_CYCLES) + +#else + #define ISR_LA_LOOP_CYCLES 0UL +#endif + +// Estimate the total ISR execution time in cycles given a step-per-ISR shift multiplier +#define ISR_EXECUTION_CYCLES(R) ((ISR_BASE_CYCLES + ISR_S_CURVE_CYCLES + ISR_SHAPING_BASE_CYCLES + ISR_LOOP_CYCLES(R) + ISR_SHAPING_LOOP_CYCLES(R) + ISR_LA_BASE_CYCLES + ISR_LA_LOOP_CYCLES) >> R) + +// The maximum allowable stepping frequency when doing 1x stepping (in Hz) +#define MAX_STEP_ISR_FREQUENCY_1X ((F_CPU) / ISR_EXECUTION_CYCLES(0)) + +// The minimum step ISR rate used by ADAPTIVE_STEP_SMOOTHING to target 50% CPU usage +// This does not account for the possibility of multi-stepping. +#define MIN_STEP_ISR_FREQUENCY (MAX_STEP_ISR_FREQUENCY_1X >> 1) diff --git a/Marlin/src/module/stepper/indirection.cpp b/Marlin/src/module/stepper/indirection.cpp index 427fd71cbe..0290d8135d 100644 --- a/Marlin/src/module/stepper/indirection.cpp +++ b/Marlin/src/module/stepper/indirection.cpp @@ -42,6 +42,6 @@ void reset_stepper_drivers() { } #if ENABLED(SOFTWARE_DRIVER_ENABLE) - // Flags to optimize XYZ Enabled state + // Flags to optimize axis enabled state xyz_bool_t axis_sw_enabled; // = { false, false, false } #endif diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 806826b7fc..e82ab66e00 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -22,14 +22,51 @@ #pragma once /** - * stepper/indirection.h + * stepper/indirection.h - Stepper Indirection Macros * - * Stepper motor driver indirection to allow some stepper functions to - * be done via SPI/I2c instead of direct pin manipulation. + * Each axis in a machine may have between 1 and 4 stepper motors. + * Currently X and Y allow for 1 or 2 steppers. Z can have up to 4. + * Extruders usually have one E stepper per nozzle. + * + * XYZ Special Cases + * - Delta: 3 steppers contribute to X, Y, and Z. + * - SCARA: A and B steppers contribute to X and Y by angular transformation. + * - CoreXY: A and B steppers contribute to X and Y in combination. + * - CoreXZ: A and B steppers contribute to X and Z in combination. + * - CoreYZ: A and B steppers contribute to Y and Z in combination. + * + * E Special Cases + * - SINGLENOZZLE: All Extruders have a single nozzle so there is one heater and no XYZ offset. + * - Switching Extruder: One stepper is used for each pair of nozzles with a switching mechanism. + * - Duplication Mode: Two or more steppers move in sync when `extruder_duplication_enabled` is set. + * With MULTI_NOZZLE_DUPLICATION a `duplication_e_mask` is also used. + * - Průša MMU1: One stepper is used with a switching mechanism. Odd numbered E indexes are reversed. + * - Průša MMU2: One stepper is used with a switching mechanism. + * - E_DUAL_STEPPER_DRIVERS: Two steppers always move in sync, possibly with opposite DIR states. + * + * Direct Stepper Control + * Where "Q" represents X Y Z I J K U V W / X2 Y2 Z2 Z3 Z4 / E0 E1 E2 E3 E4 E5 E6 E7 + * Here each E index corresponds to a single E stepper driver. + * + * Q_ENABLE_INIT() Q_ENABLE_WRITE(S) Q_ENABLE_READ() + * Q_DIR_INIT() Q_DIR_WRITE(S) Q_DIR_READ() + * Q_STEP_INIT() Q_STEP_WRITE(S) Q_STEP_READ() + * + * Steppers may not have an enable state or may be enabled by other methods + * beyond a single pin (SOFTWARE_DRIVER_ENABLE) so these can be overriden: + * ENABLE_STEPPER_Q() DISABLE_STEPPER_Q() + * + * Axis Stepper Control (X Y Z I J K U V W) + * SOFTWARE_DRIVER_ENABLE gives all axes a status flag, so these macros will + * skip sending commands to steppers that are already in the desired state: + * ENABLE_AXIS_Q() DISABLE_AXIS_Q() + * + * E-Axis Stepper Control (0..n) + * For these macros the E index indicates a logical extruder (e.g., active_extruder). + * + * E_STEP_WRITE(E,V) FWD_E_DIR(E) REV_E_DIR(E) * - * Copyright (c) 2015 Dominik Wenger */ - #include "../../inc/MarlinConfig.h" #if HAS_TMC26X @@ -43,22 +80,26 @@ void restore_stepper_drivers(); // Called by powerManager.power_on() void reset_stepper_drivers(); // Called by settings.load / settings.reset +#define INVERT_DIR(AXIS, D) (TERN_(INVERT_## AXIS ##_DIR, !)(D)) + // X Stepper -#ifndef X_ENABLE_INIT - #define X_ENABLE_INIT() SET_OUTPUT(X_ENABLE_PIN) - #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) - #define X_ENABLE_READ() bool(READ(X_ENABLE_PIN)) +#if HAS_X_AXIS + #ifndef X_ENABLE_INIT + #define X_ENABLE_INIT() SET_OUTPUT(X_ENABLE_PIN) + #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) + #define X_ENABLE_READ() bool(READ(X_ENABLE_PIN)) + #endif + #ifndef X_DIR_INIT + #define X_DIR_INIT() SET_OUTPUT(X_DIR_PIN) + #define X_DIR_WRITE(STATE) WRITE(X_DIR_PIN,INVERT_DIR(X, STATE)) + #define X_DIR_READ() INVERT_DIR(X, bool(READ(X_DIR_PIN))) + #endif + #define X_STEP_INIT() SET_OUTPUT(X_STEP_PIN) + #ifndef X_STEP_WRITE + #define X_STEP_WRITE(STATE) WRITE(X_STEP_PIN,STATE) + #endif + #define X_STEP_READ() bool(READ(X_STEP_PIN)) #endif -#ifndef X_DIR_INIT - #define X_DIR_INIT() SET_OUTPUT(X_DIR_PIN) - #define X_DIR_WRITE(STATE) WRITE(X_DIR_PIN,STATE) - #define X_DIR_READ() bool(READ(X_DIR_PIN)) -#endif -#define X_STEP_INIT() SET_OUTPUT(X_STEP_PIN) -#ifndef X_STEP_WRITE - #define X_STEP_WRITE(STATE) WRITE(X_STEP_PIN,STATE) -#endif -#define X_STEP_READ() bool(READ(X_STEP_PIN)) // Y Stepper #if HAS_Y_AXIS @@ -69,8 +110,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef Y_DIR_INIT #define Y_DIR_INIT() SET_OUTPUT(Y_DIR_PIN) - #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,STATE) - #define Y_DIR_READ() bool(READ(Y_DIR_PIN)) + #define Y_DIR_WRITE(STATE) WRITE(Y_DIR_PIN,INVERT_DIR(Y, STATE)) + #define Y_DIR_READ() INVERT_DIR(Y, bool(READ(Y_DIR_PIN))) #endif #define Y_STEP_INIT() SET_OUTPUT(Y_STEP_PIN) #ifndef Y_STEP_WRITE @@ -88,8 +129,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef Z_DIR_INIT #define Z_DIR_INIT() SET_OUTPUT(Z_DIR_PIN) - #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,STATE) - #define Z_DIR_READ() bool(READ(Z_DIR_PIN)) + #define Z_DIR_WRITE(STATE) WRITE(Z_DIR_PIN,INVERT_DIR(Z, STATE)) + #define Z_DIR_READ() INVERT_DIR(Z, bool(READ(Z_DIR_PIN))) #endif #define Z_STEP_INIT() SET_OUTPUT(Z_STEP_PIN) #ifndef Z_STEP_WRITE @@ -107,8 +148,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef X2_DIR_INIT #define X2_DIR_INIT() SET_OUTPUT(X2_DIR_PIN) - #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,STATE) - #define X2_DIR_READ() bool(READ(X2_DIR_PIN)) + #define X2_DIR_WRITE(STATE) WRITE(X2_DIR_PIN,INVERT_DIR(X2, STATE)) + #define X2_DIR_READ() INVERT_DIR(X2, bool(READ(X2_DIR_PIN))) #endif #define X2_STEP_INIT() SET_OUTPUT(X2_STEP_PIN) #ifndef X2_STEP_WRITE @@ -126,8 +167,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef Y2_DIR_INIT #define Y2_DIR_INIT() SET_OUTPUT(Y2_DIR_PIN) - #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,STATE) - #define Y2_DIR_READ() bool(READ(Y2_DIR_PIN)) + #define Y2_DIR_WRITE(STATE) WRITE(Y2_DIR_PIN,INVERT_DIR(Y2, STATE)) + #define Y2_DIR_READ() INVERT_DIR(Y2, bool(READ(Y2_DIR_PIN))) #endif #define Y2_STEP_INIT() SET_OUTPUT(Y2_STEP_PIN) #ifndef Y2_STEP_WRITE @@ -147,8 +188,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef Z2_DIR_INIT #define Z2_DIR_INIT() SET_OUTPUT(Z2_DIR_PIN) - #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,STATE) - #define Z2_DIR_READ() bool(READ(Z2_DIR_PIN)) + #define Z2_DIR_WRITE(STATE) WRITE(Z2_DIR_PIN,INVERT_DIR(Z2, STATE)) + #define Z2_DIR_READ() INVERT_DIR(Z2, bool(READ(Z2_DIR_PIN))) #endif #define Z2_STEP_INIT() SET_OUTPUT(Z2_STEP_PIN) #ifndef Z2_STEP_WRITE @@ -168,8 +209,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef Z3_DIR_INIT #define Z3_DIR_INIT() SET_OUTPUT(Z3_DIR_PIN) - #define Z3_DIR_WRITE(STATE) WRITE(Z3_DIR_PIN,STATE) - #define Z3_DIR_READ() bool(READ(Z3_DIR_PIN)) + #define Z3_DIR_WRITE(STATE) WRITE(Z3_DIR_PIN,INVERT_DIR(Z3, STATE)) + #define Z3_DIR_READ() INVERT_DIR(Z3, bool(READ(Z3_DIR_PIN))) #endif #define Z3_STEP_INIT() SET_OUTPUT(Z3_STEP_PIN) #ifndef Z3_STEP_WRITE @@ -189,8 +230,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef Z4_DIR_INIT #define Z4_DIR_INIT() SET_OUTPUT(Z4_DIR_PIN) - #define Z4_DIR_WRITE(STATE) WRITE(Z4_DIR_PIN,STATE) - #define Z4_DIR_READ() bool(READ(Z4_DIR_PIN)) + #define Z4_DIR_WRITE(STATE) WRITE(Z4_DIR_PIN,INVERT_DIR(Z4, STATE)) + #define Z4_DIR_READ() INVERT_DIR(Z4, bool(READ(Z4_DIR_PIN))) #endif #define Z4_STEP_INIT() SET_OUTPUT(Z4_STEP_PIN) #ifndef Z4_STEP_WRITE @@ -210,8 +251,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef I_DIR_INIT #define I_DIR_INIT() SET_OUTPUT(I_DIR_PIN) - #define I_DIR_WRITE(STATE) WRITE(I_DIR_PIN,STATE) - #define I_DIR_READ() bool(READ(I_DIR_PIN)) + #define I_DIR_WRITE(STATE) WRITE(I_DIR_PIN,INVERT_DIR(I, STATE)) + #define I_DIR_READ() INVERT_DIR(I, bool(READ(I_DIR_PIN))) #endif #define I_STEP_INIT() SET_OUTPUT(I_STEP_PIN) #ifndef I_STEP_WRITE @@ -229,8 +270,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef J_DIR_INIT #define J_DIR_INIT() SET_OUTPUT(J_DIR_PIN) - #define J_DIR_WRITE(STATE) WRITE(J_DIR_PIN,STATE) - #define J_DIR_READ() bool(READ(J_DIR_PIN)) + #define J_DIR_WRITE(STATE) WRITE(J_DIR_PIN,INVERT_DIR(J, STATE)) + #define J_DIR_READ() INVERT_DIR(J, bool(READ(J_DIR_PIN))) #endif #define J_STEP_INIT() SET_OUTPUT(J_STEP_PIN) #ifndef J_STEP_WRITE @@ -248,8 +289,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef K_DIR_INIT #define K_DIR_INIT() SET_OUTPUT(K_DIR_PIN) - #define K_DIR_WRITE(STATE) WRITE(K_DIR_PIN,STATE) - #define K_DIR_READ() bool(READ(K_DIR_PIN)) + #define K_DIR_WRITE(STATE) WRITE(K_DIR_PIN,INVERT_DIR(K, STATE)) + #define K_DIR_READ() INVERT_DIR(K, bool(READ(K_DIR_PIN))) #endif #define K_STEP_INIT() SET_OUTPUT(K_STEP_PIN) #ifndef K_STEP_WRITE @@ -267,8 +308,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef U_DIR_INIT #define U_DIR_INIT() SET_OUTPUT(U_DIR_PIN) - #define U_DIR_WRITE(STATE) WRITE(U_DIR_PIN,STATE) - #define U_DIR_READ() bool(READ(U_DIR_PIN)) + #define U_DIR_WRITE(STATE) WRITE(U_DIR_PIN,INVERT_DIR(U, STATE)) + #define U_DIR_READ() INVERT_DIR(U, bool(READ(U_DIR_PIN))) #endif #define U_STEP_INIT() SET_OUTPUT(U_STEP_PIN) #ifndef U_STEP_WRITE @@ -286,8 +327,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef V_DIR_INIT #define V_DIR_INIT() SET_OUTPUT(V_DIR_PIN) - #define V_DIR_WRITE(STATE) WRITE(V_DIR_PIN,STATE) - #define V_DIR_READ() bool(READ(V_DIR_PIN)) + #define V_DIR_WRITE(STATE) WRITE(V_DIR_PIN,INVERT_DIR(V, STATE)) + #define V_DIR_READ() INVERT_DIR(V, bool(READ(V_DIR_PIN))) #endif #define V_STEP_INIT() SET_OUTPUT(V_STEP_PIN) #ifndef V_STEP_WRITE @@ -305,8 +346,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef W_DIR_INIT #define W_DIR_INIT() SET_OUTPUT(W_DIR_PIN) - #define W_DIR_WRITE(STATE) WRITE(W_DIR_PIN,STATE) - #define W_DIR_READ() bool(READ(W_DIR_PIN)) + #define W_DIR_WRITE(STATE) WRITE(W_DIR_PIN,INVERT_DIR(W, STATE)) + #define W_DIR_READ() INVERT_DIR(W, bool(READ(W_DIR_PIN))) #endif #define W_STEP_INIT() SET_OUTPUT(W_STEP_PIN) #ifndef W_STEP_WRITE @@ -323,8 +364,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef E0_DIR_INIT #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) - #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,STATE) - #define E0_DIR_READ() bool(READ(E0_DIR_PIN)) + #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,INVERT_DIR(E0, STATE)) + #define E0_DIR_READ() INVERT_DIR(E0, bool(READ(E0_DIR_PIN))) #endif #define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) #ifndef E0_STEP_WRITE @@ -340,8 +381,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef E1_DIR_INIT #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) - #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,STATE) - #define E1_DIR_READ() bool(READ(E1_DIR_PIN)) + #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,INVERT_DIR(E1, STATE)) + #define E1_DIR_READ() INVERT_DIR(E1, bool(READ(E1_DIR_PIN))) #endif #define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) #ifndef E1_STEP_WRITE @@ -357,8 +398,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef E2_DIR_INIT #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) - #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,STATE) - #define E2_DIR_READ() bool(READ(E2_DIR_PIN)) + #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,INVERT_DIR(E2, STATE)) + #define E2_DIR_READ() INVERT_DIR(E2, bool(READ(E2_DIR_PIN))) #endif #define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) #ifndef E2_STEP_WRITE @@ -374,8 +415,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef E3_DIR_INIT #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) - #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,STATE) - #define E3_DIR_READ() bool(READ(E3_DIR_PIN)) + #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,INVERT_DIR(E3, STATE)) + #define E3_DIR_READ() INVERT_DIR(E3, bool(READ(E3_DIR_PIN))) #endif #define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) #ifndef E3_STEP_WRITE @@ -391,8 +432,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef E4_DIR_INIT #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) - #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,STATE) - #define E4_DIR_READ() bool(READ(E4_DIR_PIN)) + #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,INVERT_DIR(E4, STATE)) + #define E4_DIR_READ() INVERT_DIR(E4, bool(READ(E4_DIR_PIN))) #endif #define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) #ifndef E4_STEP_WRITE @@ -408,8 +449,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef E5_DIR_INIT #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) - #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE) - #define E5_DIR_READ() bool(READ(E5_DIR_PIN)) + #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,INVERT_DIR(E5, STATE)) + #define E5_DIR_READ() INVERT_DIR(E5, bool(READ(E5_DIR_PIN))) #endif #define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) #ifndef E5_STEP_WRITE @@ -425,8 +466,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef E6_DIR_INIT #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) - #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,STATE) - #define E6_DIR_READ() bool(READ(E6_DIR_PIN)) + #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,INVERT_DIR(E6, STATE)) + #define E6_DIR_READ() INVERT_DIR(E6, bool(READ(E6_DIR_PIN))) #endif #define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) #ifndef E6_STEP_WRITE @@ -442,8 +483,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef E7_DIR_INIT #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) - #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,STATE) - #define E7_DIR_READ() bool(READ(E7_DIR_PIN)) + #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,INVERT_DIR(E7, STATE)) + #define E7_DIR_READ() INVERT_DIR(E7, bool(READ(E7_DIR_PIN))) #endif #define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) #ifndef E7_STEP_WRITE @@ -451,100 +492,100 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #define E7_STEP_READ() bool(READ(E7_STEP_PIN)) -#define INVERT_DIR(AXIS, D) (TERN_(INVERT_## AXIS ##_DIR, !)(D)) - /** * Extruder indirection for the single E axis */ #if HAS_SWITCHING_EXTRUDER // One stepper driver per two extruders, reversed on odd index #if EXTRUDERS > 7 #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else if (E < 6) { E2_STEP_WRITE(V); } else { E3_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 4: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; case 5: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; \ - case 6: E3_DIR_WRITE(INVERT_DIR(E3, HIGH)); break; case 7: E3_DIR_WRITE(INVERT_DIR(E3, LOW )); break; \ + #define FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ + case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ + case 4: E2_DIR_WRITE(HIGH); break; case 5: E2_DIR_WRITE(LOW ); break; \ + case 6: E3_DIR_WRITE(HIGH); break; case 7: E3_DIR_WRITE(LOW ); break; \ } }while(0) #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 4: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; case 5: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; \ - case 6: E3_DIR_WRITE(INVERT_DIR(E3, LOW )); break; case 7: E3_DIR_WRITE(INVERT_DIR(E3, HIGH)); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E0_DIR_WRITE(HIGH); break; \ + case 2: E1_DIR_WRITE(LOW ); break; case 3: E1_DIR_WRITE(HIGH); break; \ + case 4: E2_DIR_WRITE(LOW ); break; case 5: E2_DIR_WRITE(HIGH); break; \ + case 6: E3_DIR_WRITE(LOW ); break; case 7: E3_DIR_WRITE(HIGH); break; \ } }while(0) #elif EXTRUDERS > 6 #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else if (E < 6) { E2_STEP_WRITE(V); } else { E3_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 4: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; case 5: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; \ - case 6: E3_DIR_WRITE(INVERT_DIR(E3, HIGH)); break; \ + #define FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ + case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ + case 4: E2_DIR_WRITE(HIGH); break; case 5: E2_DIR_WRITE(LOW ); break; \ + case 6: E3_DIR_WRITE(HIGH); break; \ } }while(0) #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 4: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; case 5: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; \ - case 6: E3_DIR_WRITE(INVERT_DIR(E3, LOW )); } }while(0) + case 0: E0_DIR_WRITE(LOW ); break; case 1: E0_DIR_WRITE(HIGH); break; \ + case 2: E1_DIR_WRITE(LOW ); break; case 3: E1_DIR_WRITE(HIGH); break; \ + case 4: E2_DIR_WRITE(LOW ); break; case 5: E2_DIR_WRITE(HIGH); break; \ + case 6: E3_DIR_WRITE(LOW ); } }while(0) #elif EXTRUDERS > 5 #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 4: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; case 5: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; \ + #define FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ + case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ + case 4: E2_DIR_WRITE(HIGH); break; case 5: E2_DIR_WRITE(LOW ); break; \ } }while(0) #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 4: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; case 5: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E0_DIR_WRITE(HIGH); break; \ + case 2: E1_DIR_WRITE(LOW ); break; case 3: E1_DIR_WRITE(HIGH); break; \ + case 4: E2_DIR_WRITE(LOW ); break; case 5: E2_DIR_WRITE(HIGH); break; \ } }while(0) #elif EXTRUDERS > 4 #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 4: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; \ + #define FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ + case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ + case 4: E2_DIR_WRITE(HIGH); break; \ } }while(0) #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 4: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E0_DIR_WRITE(HIGH); break; \ + case 2: E1_DIR_WRITE(LOW ); break; case 3: E1_DIR_WRITE(HIGH); break; \ + case 4: E2_DIR_WRITE(LOW ); break; \ } }while(0) #elif EXTRUDERS > 3 #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ + #define FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ + case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ } }while(0) #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; case 3: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E0_DIR_WRITE(HIGH); break; \ + case 2: E1_DIR_WRITE(LOW ); break; case 3: E1_DIR_WRITE(HIGH); break; \ } }while(0) #elif EXTRUDERS > 2 #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) - #define NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ + #define FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ + case 2: E1_DIR_WRITE(HIGH); break; \ } }while(0) #define REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; \ - case 2: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E0_DIR_WRITE(HIGH); break; \ + case 2: E1_DIR_WRITE(LOW ); break; \ } }while(0) #else #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) - #define NORM_E_DIR(E) do{ E0_DIR_WRITE(INVERT_DIR(E0, (E) ? LOW : HIGH)); }while(0) - #define REV_E_DIR(E) do{ E0_DIR_WRITE(INVERT_DIR(E0, (E) ? HIGH : LOW )); }while(0) + #define FWD_E_DIR(E) do{ E0_DIR_WRITE((E) ? LOW : HIGH); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE((E) ? HIGH : LOW ); }while(0) #endif + #define TOOL_ESTEPPER(T) ((T) >> 1) + #elif HAS_PRUSA_MMU2 // One multiplexed stepper driver #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) - #define NORM_E_DIR(E) E0_DIR_WRITE(INVERT_DIR(E0, HIGH)) - #define REV_E_DIR(E) E0_DIR_WRITE(INVERT_DIR(E0, LOW )) + #define FWD_E_DIR(E) E0_DIR_WRITE(HIGH) + #define REV_E_DIR(E) E0_DIR_WRITE(LOW ) #elif HAS_PRUSA_MMU1 // One multiplexed stepper driver, reversed on odd index #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) - #define NORM_E_DIR(E) do{ E0_DIR_WRITE(INVERT_DIR(E0, TEST(E, 0) ? HIGH : LOW )); }while(0) - #define REV_E_DIR(E) do{ E0_DIR_WRITE(INVERT_DIR(E0, TEST(E, 0) ? LOW : HIGH)); }while(0) + #define FWD_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? HIGH : LOW ); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? LOW : HIGH); }while(0) #elif E_STEPPERS > 1 @@ -554,17 +595,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; case 6: E6_STEP_WRITE(V); break; case 7: E7_STEP_WRITE(V); break; \ } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, HIGH)); break; \ - case 4: E4_DIR_WRITE(INVERT_DIR(E4, HIGH)); break; case 5: E5_DIR_WRITE(INVERT_DIR(E5, HIGH)); break; \ - case 6: E6_DIR_WRITE(INVERT_DIR(E6, HIGH)); break; case 7: E7_DIR_WRITE(INVERT_DIR(E7, HIGH)); break; \ + #define _FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ + case 2: E2_DIR_WRITE(HIGH); break; case 3: E3_DIR_WRITE(HIGH); break; \ + case 4: E4_DIR_WRITE(HIGH); break; case 5: E5_DIR_WRITE(HIGH); break; \ + case 6: E6_DIR_WRITE(HIGH); break; case 7: E7_DIR_WRITE(HIGH); break; \ } }while(0) #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, LOW )); break; \ - case 4: E4_DIR_WRITE(INVERT_DIR(E4, LOW )); break; case 5: E5_DIR_WRITE(INVERT_DIR(E5, LOW )); break; \ - case 6: E6_DIR_WRITE(INVERT_DIR(E6, LOW )); break; case 7: E7_DIR_WRITE(INVERT_DIR(E7, LOW )); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E1_DIR_WRITE(LOW ); break; \ + case 2: E2_DIR_WRITE(LOW ); break; case 3: E3_DIR_WRITE(LOW ); break; \ + case 4: E4_DIR_WRITE(LOW ); break; case 5: E5_DIR_WRITE(LOW ); break; \ + case 6: E6_DIR_WRITE(LOW ); break; case 7: E7_DIR_WRITE(LOW ); break; \ } }while(0) #elif E_STEPPERS > 6 @@ -573,17 +614,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; case 6: E6_STEP_WRITE(V); break; \ } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, HIGH)); break; \ - case 4: E4_DIR_WRITE(INVERT_DIR(E4, HIGH)); break; case 5: E5_DIR_WRITE(INVERT_DIR(E5, HIGH)); break; \ - case 6: E6_DIR_WRITE(INVERT_DIR(E6, HIGH)); break; \ + #define _FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ + case 2: E2_DIR_WRITE(HIGH); break; case 3: E3_DIR_WRITE(HIGH); break; \ + case 4: E4_DIR_WRITE(HIGH); break; case 5: E5_DIR_WRITE(HIGH); break; \ + case 6: E6_DIR_WRITE(HIGH); break; \ } }while(0) #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, LOW )); break; \ - case 4: E4_DIR_WRITE(INVERT_DIR(E4, LOW )); break; case 5: E5_DIR_WRITE(INVERT_DIR(E5, LOW )); break; \ - case 6: E6_DIR_WRITE(INVERT_DIR(E6, LOW )); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E1_DIR_WRITE(LOW ); break; \ + case 2: E2_DIR_WRITE(LOW ); break; case 3: E3_DIR_WRITE(LOW ); break; \ + case 4: E4_DIR_WRITE(LOW ); break; case 5: E5_DIR_WRITE(LOW ); break; \ + case 6: E6_DIR_WRITE(LOW ); break; \ } }while(0) #elif E_STEPPERS > 5 @@ -592,15 +633,15 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; \ } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, HIGH)); break; \ - case 4: E4_DIR_WRITE(INVERT_DIR(E4, HIGH)); break; case 5: E5_DIR_WRITE(INVERT_DIR(E5, HIGH)); break; \ + #define _FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ + case 2: E2_DIR_WRITE(HIGH); break; case 3: E3_DIR_WRITE(HIGH); break; \ + case 4: E4_DIR_WRITE(HIGH); break; case 5: E5_DIR_WRITE(HIGH); break; \ } }while(0) #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, LOW )); break; \ - case 4: E4_DIR_WRITE(INVERT_DIR(E4, LOW )); break; case 5: E5_DIR_WRITE(INVERT_DIR(E5, LOW )); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E1_DIR_WRITE(LOW ); break; \ + case 2: E2_DIR_WRITE(LOW ); break; case 3: E3_DIR_WRITE(LOW ); break; \ + case 4: E4_DIR_WRITE(LOW ); break; case 5: E5_DIR_WRITE(LOW ); break; \ } }while(0) #elif E_STEPPERS > 4 @@ -609,15 +650,15 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ case 4: E4_STEP_WRITE(V); break; \ } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, HIGH)); break; \ - case 4: E4_DIR_WRITE(INVERT_DIR(E4, HIGH)); break; \ + #define _FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ + case 2: E2_DIR_WRITE(HIGH); break; case 3: E3_DIR_WRITE(HIGH); break; \ + case 4: E4_DIR_WRITE(HIGH); break; \ } }while(0) #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, LOW )); break; \ - case 4: E4_DIR_WRITE(INVERT_DIR(E4, LOW )); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E1_DIR_WRITE(LOW ); break; \ + case 2: E2_DIR_WRITE(LOW ); break; case 3: E3_DIR_WRITE(LOW ); break; \ + case 4: E4_DIR_WRITE(LOW ); break; \ } }while(0) #elif E_STEPPERS > 3 @@ -625,26 +666,26 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define _E_STEP_WRITE(E,V) do{ switch (E) { \ case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, HIGH)); break; \ + #define _FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ + case 2: E2_DIR_WRITE(HIGH); break; case 3: E3_DIR_WRITE(HIGH); break; \ } }while(0) #define _REV_E_DIR(E) do{ switch (E) { \ - case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; \ - case 2: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); break; case 3: E3_DIR_WRITE(INVERT_DIR(E3, LOW )); break; \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E1_DIR_WRITE(LOW ); break; \ + case 2: E2_DIR_WRITE(LOW ); break; case 3: E3_DIR_WRITE(LOW ); break; \ } }while(0) #elif E_STEPPERS > 2 #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); } }while(0) - #define _NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); break; case 2: E2_DIR_WRITE(INVERT_DIR(E2, HIGH)); } }while(0) - #define _REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(INVERT_DIR(E0, LOW )); break; case 1: E1_DIR_WRITE(INVERT_DIR(E1, LOW )); break; case 2: E2_DIR_WRITE(INVERT_DIR(E2, LOW )); } }while(0) + #define _FWD_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; case 2: E2_DIR_WRITE(HIGH); } }while(0) + #define _REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(LOW ); break; case 1: E1_DIR_WRITE(LOW ); break; case 2: E2_DIR_WRITE(LOW ); } }while(0) #else #define _E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) - #define _NORM_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(INVERT_DIR(E0, HIGH)); } else { E1_DIR_WRITE(INVERT_DIR(E1, HIGH)); } }while(0) - #define _REV_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(INVERT_DIR(E0, LOW )); } else { E1_DIR_WRITE(INVERT_DIR(E1, LOW )); } }while(0) + #define _FWD_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(HIGH); } else { E1_DIR_WRITE(HIGH); } }while(0) + #define _REV_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(LOW ); } else { E1_DIR_WRITE(LOW ); } }while(0) #endif #if HAS_DUPLICATION_MODE @@ -655,38 +696,42 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define DUPE(N,T,V) E##N##_##T##_WRITE(V); #endif - #define NDIR(N) DUPE(N,DIR,INVERT_DIR(E, HIGH)); - #define RDIR(N) DUPE(N,DIR,INVERT_DIR(E, LOW )); + #define NDIR(N) DUPE(N,DIR,HIGH); + #define RDIR(N) DUPE(N,DIR,LOW ); #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { REPEAT2(E_STEPPERS, DUPE, STEP, V); } else _E_STEP_WRITE(E,V); }while(0) - #define NORM_E_DIR(E) do{ if (extruder_duplication_enabled) { REPEAT(E_STEPPERS, NDIR); } else _NORM_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { REPEAT(E_STEPPERS, RDIR); } else _REV_E_DIR(E); }while(0) + #define FWD_E_DIR(E) do{ if (extruder_duplication_enabled) { REPEAT(E_STEPPERS, NDIR); } else _FWD_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { REPEAT(E_STEPPERS, RDIR); } else _REV_E_DIR(E); }while(0) #else #define E_STEP_WRITE(E,V) _E_STEP_WRITE(E,V) - #define NORM_E_DIR(E) _NORM_E_DIR(E) + #define FWD_E_DIR(E) _FWD_E_DIR(E) #define REV_E_DIR(E) _REV_E_DIR(E) #endif #elif ENABLED(E_DUAL_STEPPER_DRIVERS) #define E_STEP_WRITE(E,V) do{ E0_STEP_WRITE(V); E1_STEP_WRITE(V); }while(0) - #define NORM_E_DIR(E) do{ constexpr bool d = INVERT_DIR(E0, HIGH); E0_DIR_WRITE(d); E1_DIR_WRITE(INVERT_DIR(E1_VS_E0, d)); }while(0) - #define REV_E_DIR(E) do{ constexpr bool d = INVERT_DIR(E0, LOW ); E0_DIR_WRITE(d); E1_DIR_WRITE(INVERT_DIR(E1_VS_E0, d)); }while(0) + #define FWD_E_DIR(E) do{ E0_DIR_WRITE(HIGH); E1_DIR_WRITE(INVERT_DIR(E1_VS_E0, HIGH)); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(LOW ); E1_DIR_WRITE(INVERT_DIR(E1_VS_E0, LOW )); }while(0) -#elif E_STEPPERS +#elif E_STEPPERS == 1 #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) - #define NORM_E_DIR(E) E0_DIR_WRITE(INVERT_DIR(E0, HIGH)) - #define REV_E_DIR(E) E0_DIR_WRITE(INVERT_DIR(E0, LOW )) + #define FWD_E_DIR(E) E0_DIR_WRITE(HIGH) + #define REV_E_DIR(E) E0_DIR_WRITE(LOW ) #else #define E_STEP_WRITE(E,V) NOOP - #define NORM_E_DIR(E) NOOP + #define FWD_E_DIR(E) NOOP #define REV_E_DIR(E) NOOP #endif +#ifndef TOOL_ESTEPPER + #define TOOL_ESTEPPER(T) (T) +#endif + // // Individual stepper enable / disable macros // @@ -940,8 +985,13 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define AFTER_CHANGE(N,TF) NOOP #endif -#define ENABLE_AXIS_X() if (SHOULD_ENABLE(x)) { ENABLE_STEPPER_X(); ENABLE_STEPPER_X2(); AFTER_CHANGE(x, true); } -#define DISABLE_AXIS_X() if (SHOULD_DISABLE(x)) { DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); AFTER_CHANGE(x, false); set_axis_untrusted(X_AXIS); } +#if HAS_X_AXIS + #define ENABLE_AXIS_X() if (SHOULD_ENABLE(x)) { ENABLE_STEPPER_X(); ENABLE_STEPPER_X2(); AFTER_CHANGE(x, true); } + #define DISABLE_AXIS_X() if (SHOULD_DISABLE(x)) { DISABLE_STEPPER_X(); DISABLE_STEPPER_X2(); AFTER_CHANGE(x, false); set_axis_untrusted(X_AXIS); } +#else + #define ENABLE_AXIS_X() NOOP + #define DISABLE_AXIS_X() NOOP +#endif #if HAS_Y_AXIS #define ENABLE_AXIS_Y() if (SHOULD_ENABLE(y)) { ENABLE_STEPPER_Y(); ENABLE_STEPPER_Y2(); AFTER_CHANGE(y, true); } @@ -953,7 +1003,7 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #if HAS_Z_AXIS #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(); TERN_(BD_SENSOR, bdl.config_state = 0); } + #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(); TERN_(BD_SENSOR, bdl.config_state = BDS_IDLE); } #else #define ENABLE_AXIS_Z() NOOP #define DISABLE_AXIS_Z() NOOP diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index 893ce3f8db..ce99d87f09 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -493,7 +493,7 @@ enum StealthIndex : uint8_t { #endif #define _EN_ITEM(N) , E##N - enum TMCAxis : uint8_t { MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4 REPEAT(EXTRUDERS, _EN_ITEM), TOTAL }; + enum TMCAxis : uint8_t { MAIN_AXIS_NAMES_ X2, Y2, Z2, Z3, Z4 REPEAT(EXTRUDERS, _EN_ITEM), TOTAL }; #undef _EN_ITEM void tmc_serial_begin() { @@ -501,7 +501,7 @@ enum StealthIndex : uint8_t { struct { const void *ptr[TMCAxis::TOTAL]; bool began(const TMCAxis a, const void * const p) { - LOOP_L_N(i, a) if (p == ptr[i]) return true; + for (uint8_t i = 0; i < a; ++i) if (p == ptr[i]) return true; ptr[a] = p; return false; }; } sp_helper; @@ -514,154 +514,154 @@ enum StealthIndex : uint8_t { #ifdef X_HARDWARE_SERIAL HW_SERIAL_BEGIN(X); #else - stepperX.beginSerial(TMC_BAUD_RATE); + stepperX.beginSerial(TMC_X_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(X2) #ifdef X2_HARDWARE_SERIAL HW_SERIAL_BEGIN(X2); #else - stepperX2.beginSerial(TMC_BAUD_RATE); + stepperX2.beginSerial(TMC_X2_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(Y) #ifdef Y_HARDWARE_SERIAL HW_SERIAL_BEGIN(Y); #else - stepperY.beginSerial(TMC_BAUD_RATE); + stepperY.beginSerial(TMC_Y_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(Y2) #ifdef Y2_HARDWARE_SERIAL HW_SERIAL_BEGIN(Y2); #else - stepperY2.beginSerial(TMC_BAUD_RATE); + stepperY2.beginSerial(TMC_Y2_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(Z) #ifdef Z_HARDWARE_SERIAL HW_SERIAL_BEGIN(Z); #else - stepperZ.beginSerial(TMC_BAUD_RATE); + stepperZ.beginSerial(TMC_Z_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(Z2) #ifdef Z2_HARDWARE_SERIAL HW_SERIAL_BEGIN(Z2); #else - stepperZ2.beginSerial(TMC_BAUD_RATE); + stepperZ2.beginSerial(TMC_Z2_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(Z3) #ifdef Z3_HARDWARE_SERIAL HW_SERIAL_BEGIN(Z3); #else - stepperZ3.beginSerial(TMC_BAUD_RATE); + stepperZ3.beginSerial(TMC_Z3_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(Z4) #ifdef Z4_HARDWARE_SERIAL HW_SERIAL_BEGIN(Z4); #else - stepperZ4.beginSerial(TMC_BAUD_RATE); + stepperZ4.beginSerial(TMC_Z4_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(I) #ifdef I_HARDWARE_SERIAL HW_SERIAL_BEGIN(I); #else - stepperI.beginSerial(TMC_BAUD_RATE); + stepperI.beginSerial(TMC_I_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(J) #ifdef J_HARDWARE_SERIAL HW_SERIAL_BEGIN(J); #else - stepperJ.beginSerial(TMC_BAUD_RATE); + stepperJ.beginSerial(TMC_J_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(K) #ifdef K_HARDWARE_SERIAL HW_SERIAL_BEGIN(K); #else - stepperK.beginSerial(TMC_BAUD_RATE); + stepperK.beginSerial(TMC_K_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(U) #ifdef U_HARDWARE_SERIAL HW_SERIAL_BEGIN(U); #else - stepperU.beginSerial(TMC_BAUD_RATE); + stepperU.beginSerial(TMC_U_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(V) #ifdef V_HARDWARE_SERIAL HW_SERIAL_BEGIN(V); #else - stepperV.beginSerial(TMC_BAUD_RATE); + stepperV.beginSerial(TMC_V_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(W) #ifdef W_HARDWARE_SERIAL HW_SERIAL_BEGIN(W); #else - stepperW.beginSerial(TMC_BAUD_RATE); + stepperW.beginSerial(TMC_W_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(E0) #ifdef E0_HARDWARE_SERIAL HW_SERIAL_BEGIN(E0); #else - stepperE0.beginSerial(TMC_BAUD_RATE); + stepperE0.beginSerial(TMC_E0_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(E1) #ifdef E1_HARDWARE_SERIAL HW_SERIAL_BEGIN(E1); #else - stepperE1.beginSerial(TMC_BAUD_RATE); + stepperE1.beginSerial(TMC_E1_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(E2) #ifdef E2_HARDWARE_SERIAL HW_SERIAL_BEGIN(E2); #else - stepperE2.beginSerial(TMC_BAUD_RATE); + stepperE2.beginSerial(TMC_E2_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(E3) #ifdef E3_HARDWARE_SERIAL HW_SERIAL_BEGIN(E3); #else - stepperE3.beginSerial(TMC_BAUD_RATE); + stepperE3.beginSerial(TMC_E3_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(E4) #ifdef E4_HARDWARE_SERIAL HW_SERIAL_BEGIN(E4); #else - stepperE4.beginSerial(TMC_BAUD_RATE); + stepperE4.beginSerial(TMC_E4_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(E5) #ifdef E5_HARDWARE_SERIAL HW_SERIAL_BEGIN(E5); #else - stepperE5.beginSerial(TMC_BAUD_RATE); + stepperE5.beginSerial(TMC_E5_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(E6) #ifdef E6_HARDWARE_SERIAL HW_SERIAL_BEGIN(E6); #else - stepperE6.beginSerial(TMC_BAUD_RATE); + stepperE6.beginSerial(TMC_E6_BAUD_RATE); #endif #endif #if AXIS_HAS_UART(E7) #ifdef E7_HARDWARE_SERIAL HW_SERIAL_BEGIN(E7); #else - stepperE7.beginSerial(TMC_BAUD_RATE); + stepperE7.beginSerial(TMC_E7_BAUD_RATE); #endif #endif } @@ -991,13 +991,13 @@ void reset_trinamic_drivers() { #if USE_SENSORLESS TERN_(X_SENSORLESS, stepperX.homing_threshold(X_STALL_SENSITIVITY)); - TERN_(X2_SENSORLESS, stepperX2.homing_threshold(CAT(TERN(X2_SENSORLESS, X2, X), _STALL_SENSITIVITY))); + TERN_(X2_SENSORLESS, stepperX2.homing_threshold(X2_STALL_SENSITIVITY)); TERN_(Y_SENSORLESS, stepperY.homing_threshold(Y_STALL_SENSITIVITY)); - TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(CAT(TERN(Y2_SENSORLESS, Y2, Y), _STALL_SENSITIVITY))); + TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(Y2_STALL_SENSITIVITY)); TERN_(Z_SENSORLESS, stepperZ.homing_threshold(Z_STALL_SENSITIVITY)); - TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(CAT(TERN(Z2_SENSORLESS, Z2, Z), _STALL_SENSITIVITY))); - TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(CAT(TERN(Z3_SENSORLESS, Z3, Z), _STALL_SENSITIVITY))); - TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(CAT(TERN(Z4_SENSORLESS, Z4, Z), _STALL_SENSITIVITY))); + TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(Z2_STALL_SENSITIVITY)); + TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(Z3_STALL_SENSITIVITY)); + TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(Z4_STALL_SENSITIVITY)); TERN_(I_SENSORLESS, stepperI.homing_threshold(I_STALL_SENSITIVITY)); TERN_(J_SENSORLESS, stepperJ.homing_threshold(J_STALL_SENSITIVITY)); TERN_(K_SENSORLESS, stepperK.homing_threshold(K_STALL_SENSITIVITY)); diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h index 88c0686fc3..d6de5cd002 100644 --- a/Marlin/src/module/stepper/trinamic.h +++ b/Marlin/src/module/stepper/trinamic.h @@ -77,7 +77,7 @@ #define TMC_CLASS_E(N) TMC_CLASS(E##N, E) #endif -#ifndef CHOPPER_TIMING_X +#if HAS_X_AXIS && !defined(CHOPPER_TIMING_X) #define CHOPPER_TIMING_X CHOPPER_TIMING #endif #if HAS_Y_AXIS && !defined(CHOPPER_TIMING_Y) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 3274136f41..11788c3cb1 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -37,7 +37,7 @@ #include "planner.h" #include "printcounter.h" -#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) +#if ANY(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../feature/cooler.h" #include "../feature/spindle_laser.h" #endif @@ -156,7 +156,7 @@ #include "probe.h" #endif -#if EITHER(MPCTEMP, PID_EXTRUSION_SCALING) +#if ANY(MPCTEMP, PID_EXTRUSION_SCALING) #include "stepper.h" #endif @@ -373,7 +373,7 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); redundant_info_t Temperature::temp_redundant; #endif -#if EITHER(AUTO_POWER_E_FANS, HAS_FANCHECK) +#if ANY(AUTO_POWER_E_FANS, HAS_FANCHECK) uint8_t Temperature::autofan_speed[HOTENDS] = ARRAY_N_1(HOTENDS, FAN_OFF_PWM); #endif @@ -385,7 +385,7 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); uint8_t Temperature::coolerfan_speed = FAN_OFF_PWM; #endif -#if BOTH(FAN_SOFT_PWM, USE_CONTROLLER_FAN) +#if ALL(FAN_SOFT_PWM, USE_CONTROLLER_FAN) uint8_t Temperature::soft_pwm_controller_speed = FAN_OFF_PWM; #endif @@ -439,7 +439,7 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); #endif - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) + #if ANY(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) bool Temperature::fans_paused; // = false; uint8_t Temperature::saved_fan_speed[FAN_COUNT] = ARRAY_N_1(FAN_COUNT, FAN_OFF_PWM); #endif @@ -467,8 +467,12 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); if (fan >= FAN_COUNT) return; fan_speed[fan] = speed; - #if REDUNDANT_PART_COOLING_FAN - if (fan == 0) fan_speed[REDUNDANT_PART_COOLING_FAN] = speed; + + #if NUM_REDUNDANT_FANS + if (fan == 0) { + for (uint8_t f = REDUNDANT_PART_COOLING_FAN; f < REDUNDANT_PART_COOLING_FAN + NUM_REDUNDANT_FANS; ++f) + thermalManager.set_fan_speed(f, speed); + } #endif TERN_(REPORT_FAN_CHANGE, report_fan_speed(fan)); @@ -485,7 +489,7 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); } #endif - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) + #if ANY(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) void Temperature::set_fans_paused(const bool p) { if (p != fans_paused) { @@ -524,7 +528,7 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); #if HAS_TEMP_CHAMBER chamber_info_t Temperature::temp_chamber; // = { 0 } #if HAS_HEATED_CHAMBER - millis_t next_cool_check_ms_2 = 0; + millis_t next_cool_check_ms = 0; celsius_float_t old_temp = 9999; raw_adc_t Temperature::mintemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_LO_TEMP, Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; @@ -546,7 +550,7 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); raw_adc_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}; + cooler_watch_t Temperature::watch_cooler; // = { 0 } #endif millis_t Temperature::next_cooler_check_ms, Temperature::cooler_fan_flush_ms; #endif @@ -564,7 +568,12 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); #endif #endif -#if BOTH(HAS_MARLINUI_MENU, PREVENT_COLD_EXTRUSION) && E_MANUAL > 0 +#if HAS_TEMP_SOC + soc_info_t Temperature::temp_soc; // = { 0 } + raw_adc_t Temperature::maxtemp_raw_SOC = TEMP_SENSOR_SOC_RAW_HI_TEMP; +#endif + +#if ALL(HAS_MARLINUI_MENU, PREVENT_COLD_EXTRUSION) && E_MANUAL > 0 bool Temperature::allow_cold_extrude_override = false; #else constexpr bool Temperature::allow_cold_extrude_override; @@ -612,11 +621,11 @@ volatile bool Temperature::raw_temps_ready = false; #if MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED > 1 #define MULTI_MAX_CONSECUTIVE_LOW_TEMP_ERR 1 - uint8_t Temperature::consecutive_low_temperature_error[HOTENDS] = { 0 }; + uint8_t Temperature::consecutive_low_temperature_error[HOTENDS]; // = { 0 } #endif #if PREHEAT_TIME_HOTEND_MS > 0 - millis_t Temperature::preheat_end_ms_hotend[HOTENDS] { 0 }; + millis_t Temperature::preheat_end_ms_hotend[HOTENDS]; // = { 0 }; #endif #if HAS_HEATED_BED && PREHEAT_TIME_BED_MS > 0 millis_t Temperature::preheat_end_ms_bed = 0; @@ -689,15 +698,15 @@ volatile bool Temperature::raw_temps_ready = false; #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 DISABLED(NO_WATCH_PID_TUNING) && (BOTH(WATCH_CHAMBER, PIDTEMPCHAMBER) || BOTH(WATCH_BED, PIDTEMPBED) || BOTH(WATCH_HOTENDS, PIDTEMP)) + #define WATCH_PID DISABLED(NO_WATCH_PID_TUNING) && (ALL(WATCH_CHAMBER, PIDTEMPCHAMBER) || ALL(WATCH_BED, PIDTEMPBED) || ALL(WATCH_HOTENDS, PIDTEMP)) #if WATCH_PID - #if BOTH(THERMAL_PROTECTION_CHAMBER, PIDTEMPCHAMBER) + #if ALL(THERMAL_PROTECTION_CHAMBER, PIDTEMPCHAMBER) #define C_GTV(T,A,B) ((T) ? (A) : (B)) #else #define C_GTV(T,A,B) (B) #endif - #if BOTH(THERMAL_PROTECTION_BED, PIDTEMPBED) + #if ALL(THERMAL_PROTECTION_BED, PIDTEMPBED) #define B_GTV(T,A,B) ((T) ? (A) : (B)) #else #define B_GTV(T,A,B) (B) @@ -717,16 +726,14 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(DWIN_PID_TUNE, DWIN_PidTuning(isbed ? PIDTEMPBED_START : PIDTEMP_START)); if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, temp_range[heater_id].maxtemp - (HOTEND_OVERSHOOT))) { - SERIAL_ECHOPGM(STR_PID_AUTOTUNE); - SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); TERN_(DWIN_PID_TUNE, DWIN_PidTuning(PID_TEMP_TOO_HIGH)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH))); return; } - SERIAL_ECHOPGM(STR_PID_AUTOTUNE); - SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_START); + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_START); disable_all_heaters(); TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); @@ -811,8 +818,7 @@ volatile bool Temperature::raw_temps_ready = false; #define MAX_OVERSHOOT_PID_AUTOTUNE 30 #endif if (current_temp > target + MAX_OVERSHOOT_PID_AUTOTUNE) { - SERIAL_ECHOPGM(STR_PID_AUTOTUNE); - SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); TERN_(DWIN_PID_TUNE, DWIN_PidTuning(PID_TEMP_TOO_HIGH)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TEMP_TOO_HIGH))); @@ -829,7 +835,7 @@ volatile bool Temperature::raw_temps_ready = false; // Make sure heating is actually working #if WATCH_PID - if (BOTH(WATCH_BED, WATCH_HOTENDS) || isbed == DISABLED(WATCH_HOTENDS) || ischamber == DISABLED(WATCH_HOTENDS)) { + if (ALL(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 @@ -850,25 +856,23 @@ volatile bool Temperature::raw_temps_ready = false; #define MAX_CYCLE_TIME_PID_AUTOTUNE 20L #endif if ((ms - _MIN(t1, t2)) > (MAX_CYCLE_TIME_PID_AUTOTUNE * 60L * 1000L)) { - TERN_(DWIN_CREALITY_LCD, DWIN_Popup_Temperature(0)); + TERN_(DWIN_CREALITY_LCD, dwinPopupTemperature(0)); TERN_(DWIN_PID_TUNE, DWIN_PidTuning(PID_TUNING_TIMEOUT)); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TUNING_TIMEOUT)); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_TIMEOUT))); - SERIAL_ECHOPGM(STR_PID_AUTOTUNE); - SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_TIMEOUT); break; } if (cycles > ncycles && cycles > 2) { - SERIAL_ECHOPGM(STR_PID_AUTOTUNE); - SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_FINISHED); + SERIAL_ECHOPGM(STR_PID_AUTOTUNE); SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_FINISHED); TERN_(HOST_PROMPT_SUPPORT, hostui.notify(GET_TEXT_F(MSG_PID_AUTOTUNE_DONE))); - #if EITHER(PIDTEMPBED, PIDTEMPCHAMBER) + #if ANY(PIDTEMPBED, PIDTEMPCHAMBER) FSTR_P const estring = GHV(F("chamber"), F("bed"), FPSTR(NUL_STR)); - say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Kp ", tune_pid.p); - say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Ki ", tune_pid.i); - say_default_(); SERIAL_ECHOF(estring); SERIAL_ECHOLNPGM("Kd ", tune_pid.d); + say_default_(); SERIAL_ECHO(estring, F("Kp "), tune_pid.p); + say_default_(); SERIAL_ECHO(estring, F("Ki "), tune_pid.i); + say_default_(); SERIAL_ECHO(estring, F("Kd "), tune_pid.d); #else say_default_(); SERIAL_ECHOLNPGM("Kp ", tune_pid.p); say_default_(); SERIAL_ECHOLNPGM("Ki ", tune_pid.i); @@ -906,7 +910,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(color)); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_DONE)); - TERN_(DWIN_PID_TUNE, DWIN_PidTuning(PID_DONE)); + TERN_(DWIN_PID_TUNE, DWIN_PidTuning(AUTOTUNE_DONE)); goto EXIT_M303; } @@ -915,7 +919,7 @@ volatile bool Temperature::raw_temps_ready = false; hal.idletask(); // Run UI update - TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); + TERN(DWIN_CREALITY_LCD, dwinUpdate(), ui.update()); } wait_for_heatup = false; @@ -924,7 +928,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(color)); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_DONE)); - TERN_(DWIN_PID_TUNE, DWIN_PidTuning(PID_DONE)); + TERN_(DWIN_PID_TUNE, DWIN_PidTuning(AUTOTUNE_DONE)); EXIT_M303: TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = true); @@ -935,64 +939,268 @@ volatile bool Temperature::raw_temps_ready = false; #if ENABLED(MPC_AUTOTUNE) - #if EITHER(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) + #if ANY(MPC_FAN_0_ALL_HOTENDS, MPC_FAN_0_ACTIVE_HOTEND) #define SINGLEFAN 1 #endif - void Temperature::MPC_autotune(const uint8_t e) { - auto housekeeping = [] (millis_t &ms, const uint8_t e, celsius_float_t ¤t_temp, millis_t &next_report_ms) { - ms = millis(); + #define DEBUG_MPC_AUTOTUNE 1 - if (updateTemperaturesIfReady()) { // temp sample ready - current_temp = degHotend(e); - TERN_(HAS_FAN_LOGIC, manage_extruder_fans(ms)); + millis_t Temperature::MPC_autotuner::curr_time_ms, Temperature::MPC_autotuner::next_report_ms; + + celsius_float_t Temperature::MPC_autotuner::temp_samples[16]; + uint8_t Temperature::MPC_autotuner::sample_count; + uint16_t Temperature::MPC_autotuner::sample_distance; + + // Parameters from differential analysis + celsius_float_t Temperature::MPC_autotuner::temp_fastest; + + #if HAS_FAN + float Temperature::MPC_autotuner::power_fan255; + #endif + + Temperature::MPC_autotuner::MPC_autotuner(const uint8_t extruderIdx) : e(extruderIdx) { + TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = false); + } + + Temperature::MPC_autotuner::~MPC_autotuner() { + wait_for_heatup = false; + + ui.reset_status(); + + temp_hotend[e].target = 0.0f; + temp_hotend[e].soft_pwm_amount = 0; + #if HAS_FAN + set_fan_speed(TERN(SINGLEFAN, 0, e), 0); + planner.sync_fan_speeds(fan_speed); + #endif + + do_z_clearance(MPC_TUNING_END_Z, false); + + TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = true); + } + + Temperature::MPC_autotuner::MeasurementState Temperature::MPC_autotuner::measure_ambient_temp() { + init_timers(); + const millis_t test_interval_ms = 10000UL; + millis_t next_test_ms = curr_time_ms + test_interval_ms; + ambient_temp = current_temp = degHotend(e); + wait_for_heatup = true; + + for (;;) { // Can be interrupted with M108 + if (housekeeping() == CANCELLED) return CANCELLED; + + if (ELAPSED(curr_time_ms, next_test_ms)) { + if (current_temp >= ambient_temp) { + ambient_temp = (ambient_temp + current_temp) / 2.0f; + break; + } + ambient_temp = current_temp; + next_test_ms += test_interval_ms; } + } + wait_for_heatup = false; - if (ELAPSED(ms, next_report_ms)) { - next_report_ms += 1000UL; + #if ENABLED(DEBUG_MPC_AUTOTUNE) + SERIAL_ECHOLNPGM("MPC_autotuner::measure_ambient_temp() Completed"); + SERIAL_ECHOLNPGM("====="); + SERIAL_ECHOLNPGM("ambient_temp ", get_ambient_temp()); + #endif - print_heater_states(e); - SERIAL_EOL(); + return SUCCESS; + } + + Temperature::MPC_autotuner::MeasurementState Temperature::MPC_autotuner::measure_heatup() { + init_timers(); + constexpr millis_t test_interval_ms = 1000UL; + millis_t next_test_time_ms = curr_time_ms + test_interval_ms; + MPCHeaterInfo &hotend = temp_hotend[e]; + + current_temp = degHotend(e); + millis_t heat_start_time_ms = curr_time_ms; + sample_count = 0; + sample_distance = 1; + t1_time = 0; + + hotend.target = 200.0f; // So M105 looks nice + hotend.soft_pwm_amount = (MPC_MAX) >> 1; + + // Initialise rate of change to to steady state at current time + temp_samples[0] = temp_samples[1] = temp_samples[2] = current_temp; + time_fastest = rate_fastest = 0; + + wait_for_heatup = true; + for (;;) { // Can be interrupted with M108 + if (housekeeping() == CANCELLED) return CANCELLED; + + if (ELAPSED(curr_time_ms, next_test_time_ms)) { + if (current_temp < 100.0f) { + // Initial regime (below 100deg): Measure rate of change of heating for differential tuning + + // Update the buffer of previous readings + temp_samples[0] = temp_samples[1]; + temp_samples[1] = temp_samples[2]; + temp_samples[2] = current_temp; + + // Measure the rate of change of temperature, https://en.wikipedia.org/wiki/Symmetric_derivative + const float h = MS_TO_SEC_PRECISE(test_interval_ms), + curr_rate = (temp_samples[2] - temp_samples[0]) / 2 * h; + if (curr_rate > rate_fastest) { + // Update fastest values + rate_fastest = curr_rate; + temp_fastest = temp_samples[1]; + time_fastest = get_elapsed_heating_time(); + } + + next_test_time_ms += test_interval_ms; + + } + else if (current_temp < 200.0f) { + // Second regime (after 100deg) measure 3 points to determine asymptotic temperature + + // If there are too many samples, space them more widely + if (sample_count == COUNT(temp_samples)) { + for (uint8_t i = 0; i < COUNT(temp_samples) / 2; i++) + temp_samples[i] = temp_samples[i * 2]; + sample_count /= 2; + sample_distance *= 2; + } + + if (sample_count == 0) t1_time = MS_TO_SEC_PRECISE(curr_time_ms - heat_start_time_ms); + temp_samples[sample_count++] = current_temp; + + next_test_time_ms += test_interval_ms * sample_distance; + + } + else { + // Third regime (after 200deg) finished gathering data so finish + break; + } } + } + wait_for_heatup = false; - hal.idletask(); - TERN(DWIN_CREALITY_LCD, DWIN_Update(), ui.update()); + hotend.soft_pwm_amount = 0; - if (!wait_for_heatup) { - SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_INTERRUPTED); - TERN_(DWIN_LCD_PROUI, DWIN_MPCTuning(MPC_INTERRUPTED)); - return true; - } + elapsed_heating_time = MS_TO_SEC_PRECISE(curr_time_ms - heat_start_time_ms); - return false; - }; + // Ensure sample count is odd so that we have 3 equally spaced samples + if (sample_count == 0) return FAILED; + if (sample_count % 2 == 0) sample_count--; - struct OnExit { - uint8_t e; - OnExit(const uint8_t _e) { this->e = _e; } - ~OnExit() { - wait_for_heatup = false; + #if ENABLED(DEBUG_MPC_AUTOTUNE) + SERIAL_ECHOLNPGM("MPC_autotuner::measure_heatup() Completed"); + SERIAL_ECHOLNPGM("====="); + SERIAL_ECHOLNPGM("t1_time ", t1_time); + SERIAL_ECHOLNPGM("sample_count ", sample_count); + SERIAL_ECHOLNPGM("sample_distance ", sample_distance); + for (uint8_t i = 0; i < sample_count; i++) + SERIAL_ECHOLNPGM("sample ", i, " : ", temp_samples[i]); + SERIAL_ECHOLNPGM("t1 ", get_sample_1_temp(), " t2 ", get_sample_2_temp(), " t3 ", get_sample_3_temp()); + #endif - ui.reset_status(); + return SUCCESS; + } - temp_hotend[e].target = 0.0f; - temp_hotend[e].soft_pwm_amount = 0; - #if HAS_FAN - set_fan_speed(TERN(SINGLEFAN, 0, e), 0); - planner.sync_fan_speeds(fan_speed); - #endif - - do_z_clearance(MPC_TUNING_END_Z, false); - - TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = true); - } - } on_exit(e); - - SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_START, e); + Temperature::MPC_autotuner::MeasurementState Temperature::MPC_autotuner::measure_transfer() { + init_timers(); + const millis_t test_interval_ms = SEC_TO_MS(MPC_dT); + millis_t next_test_ms = curr_time_ms + test_interval_ms; MPCHeaterInfo &hotend = temp_hotend[e]; MPC_t &mpc = hotend.mpc; - TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = false); + constexpr millis_t settle_time = 20000UL, test_duration = 20000UL; + millis_t settle_end_ms = curr_time_ms + settle_time, + test_end_ms = settle_end_ms + test_duration; + float total_energy_fan0 = 0.0f; + #if HAS_FAN + bool fan0_done = false; + float total_energy_fan255 = 0.0f; + #endif + float last_temp = current_temp; + + wait_for_heatup = true; + for (;;) { // Can be interrupted with M108 + if (housekeeping() == CANCELLED) return CANCELLED; + + if (ELAPSED(curr_time_ms, next_test_ms)) { + hotend.soft_pwm_amount = (int)get_pid_output_hotend(e) >> 1; + + if (ELAPSED(curr_time_ms, settle_end_ms) && !ELAPSED(curr_time_ms, test_end_ms) && TERN1(HAS_FAN, !fan0_done)) + total_energy_fan0 += mpc.heater_power * hotend.soft_pwm_amount / 127 * MPC_dT + (last_temp - current_temp) * mpc.block_heat_capacity; + #if HAS_FAN + else if (ELAPSED(curr_time_ms, test_end_ms) && !fan0_done) { + set_fan_speed(TERN(SINGLEFAN, 0, e), 255); + planner.sync_fan_speeds(fan_speed); + settle_end_ms = curr_time_ms + settle_time; + test_end_ms = settle_end_ms + test_duration; + fan0_done = true; + } + else if (ELAPSED(curr_time_ms, settle_end_ms) && !ELAPSED(curr_time_ms, test_end_ms)) + total_energy_fan255 += mpc.heater_power * hotend.soft_pwm_amount / 127 * MPC_dT + (last_temp - current_temp) * mpc.block_heat_capacity; + #endif + else if (ELAPSED(curr_time_ms, test_end_ms)) break; + + last_temp = current_temp; + next_test_ms += test_interval_ms; + } + + // Ensure we don't drift too far from the window between the last sampled temp and the target temperature + if (!WITHIN(current_temp, get_sample_3_temp() - 15.0f, hotend.target + 15.0f)) { + SERIAL_ECHOLNPGM(STR_MPC_TEMPERATURE_ERROR); + TERN_(DWIN_LCD_PROUI, DWIN_MPCTuning(MPC_TEMP_ERROR)); + wait_for_heatup = false; + return FAILED; + } + } + wait_for_heatup = false; + + power_fan0 = total_energy_fan0 / MS_TO_SEC_PRECISE(test_duration); + TERN_(HAS_FAN, power_fan255 = (total_energy_fan255 * 1000) / test_duration); + + #if ENABLED(DEBUG_MPC_AUTOTUNE) + SERIAL_ECHOLNPGM("MPC_autotuner::measure_transfer() Completed"); + SERIAL_ECHOLNPGM("====="); + SERIAL_ECHOLNPGM("power_fan0 ", power_fan0); + TERN_(HAS_FAN, SERIAL_ECHOLNPGM("power_fan255 ", power_fan255)); + #endif + + return SUCCESS; + } + + Temperature::MPC_autotuner::MeasurementState Temperature::MPC_autotuner::housekeeping() { + const millis_t report_interval_ms = 1000UL; + curr_time_ms = millis(); + + if (updateTemperaturesIfReady()) { // temp sample ready + current_temp = degHotend(e); + TERN_(HAS_FAN_LOGIC, manage_extruder_fans(curr_time_ms)); + } + + if (ELAPSED(curr_time_ms, next_report_ms)) { + next_report_ms += report_interval_ms; + print_heater_states(e); + SERIAL_EOL(); + } + + hal.idletask(); + TERN(DWIN_CREALITY_LCD, dwinUpdate(), ui.update()); + + if (!wait_for_heatup) { + SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_INTERRUPTED); + TERN_(DWIN_LCD_PROUI, DWIN_MPCTuning(MPC_INTERRUPTED)); + return MeasurementState::CANCELLED; + } + + return MeasurementState::SUCCESS; + } + + void Temperature::MPC_autotune(const uint8_t e, MPCTuningType tuning_type=AUTO) { + SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_START, e); + + MPC_autotuner tuner(e); + + MPCHeaterInfo &hotend = temp_hotend[e]; + MPC_t &mpc = hotend.mpc; // Move to center of bed, just above bed height and cool with max fan gcode.home_all_axes(true); @@ -1004,6 +1212,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif do_blocking_move_to(xyz_pos_t(MPC_TUNING_POS)); + // Determine ambient temperature. SERIAL_ECHOLNPGM(STR_MPC_COOLING_TO_AMBIENT); #if ENABLED(DWIN_LCD_PROUI) DWIN_MPCTuning(MPCTEMP_START); @@ -1012,168 +1221,96 @@ volatile bool Temperature::raw_temps_ready = false; LCD_MESSAGE(MSG_COOLING); #endif - millis_t ms = millis(), next_report_ms = ms, next_test_ms = ms + 10000UL; - celsius_float_t current_temp = degHotend(e), - ambient_temp = current_temp; - - wait_for_heatup = true; - for (;;) { // Can be interrupted with M108 - if (housekeeping(ms, e, current_temp, next_report_ms)) return; - - if (ELAPSED(ms, next_test_ms)) { - if (current_temp >= ambient_temp) { - ambient_temp = (ambient_temp + current_temp) / 2.0f; - break; - } - ambient_temp = current_temp; - next_test_ms += 10000UL; - } - } - wait_for_heatup = false; + if (tuner.measure_ambient_temp() != MPC_autotuner::MeasurementState::SUCCESS) return; + hotend.modeled_ambient_temp = tuner.get_ambient_temp(); #if HAS_FAN set_fan_speed(TERN(SINGLEFAN, 0, e), 0); planner.sync_fan_speeds(fan_speed); #endif - hotend.modeled_ambient_temp = ambient_temp; - + // Heat to 200 degrees SERIAL_ECHOLNPGM(STR_MPC_HEATING_PAST_200); - TERN(DWIN_LCD_PROUI, LCD_ALERTMESSAGE(MSG_MPC_HEATING_PAST_200), LCD_MESSAGE(MSG_HEATING)); - hotend.target = 200.0f; // So M105 looks nice - hotend.soft_pwm_amount = (MPC_MAX) >> 1; - const millis_t heat_start_time = next_test_ms = ms; - celsius_float_t temp_samples[16]; - uint8_t sample_count = 0; - uint16_t sample_distance = 1; - float t1_time = 0; + LCD_ALERTMESSAGE(MSG_MPC_HEATING_PAST_200); - wait_for_heatup = true; - for (;;) { // Can be interrupted with M108 - if (housekeeping(ms, e, current_temp, next_report_ms)) return; - - if (ELAPSED(ms, next_test_ms)) { - // Record samples between 100C and 200C - if (current_temp >= 100.0f) { - // If there are too many samples, space them more widely - if (sample_count == COUNT(temp_samples)) { - for (uint8_t i = 0; i < COUNT(temp_samples) / 2; i++) - temp_samples[i] = temp_samples[i*2]; - sample_count /= 2; - sample_distance *= 2; - } - - if (sample_count == 0) t1_time = float(ms - heat_start_time) / 1000.0f; - temp_samples[sample_count++] = current_temp; - } - - if (current_temp >= 200.0f) break; - - next_test_ms += 1000UL * sample_distance; - } - } - wait_for_heatup = false; - - hotend.soft_pwm_amount = 0; + if (tuner.measure_heatup() != MPC_autotuner::MeasurementState::SUCCESS) return; // Calculate physical constants from three equally-spaced samples - sample_count = (sample_count + 1) / 2 * 2 - 1; - const float t1 = temp_samples[0], - t2 = temp_samples[(sample_count - 1) >> 1], - t3 = temp_samples[sample_count - 1]; + const float t1 = tuner.get_sample_1_temp(), + t2 = tuner.get_sample_2_temp(), + t3 = tuner.get_sample_3_temp(); float asymp_temp = (t2 * t2 - t1 * t3) / (2 * t2 - t1 - t3), - block_responsiveness = -log((t2 - asymp_temp) / (t1 - asymp_temp)) / (sample_distance * (sample_count >> 1)); + block_responsiveness = -log((t2 - asymp_temp) / (t1 - asymp_temp)) / tuner.get_sample_interval(); - mpc.ambient_xfer_coeff_fan0 = mpc.heater_power * (MPC_MAX) / 255 / (asymp_temp - ambient_temp); - mpc.block_heat_capacity = mpc.ambient_xfer_coeff_fan0 / block_responsiveness; - mpc.sensor_responsiveness = block_responsiveness / (1.0f - (ambient_temp - asymp_temp) * exp(-block_responsiveness * t1_time) / (t1 - asymp_temp)); + #if ENABLED(DEBUG_MPC_AUTOTUNE) + SERIAL_ECHOLNPGM("asymp_temp ", asymp_temp); + SERIAL_ECHOLNPGM("block_responsiveness ", p_float_t(block_responsiveness, 4)); + #endif + + // Make initial guess at transfer coefficients + mpc.ambient_xfer_coeff_fan0 = mpc.heater_power * (MPC_MAX) / 255 / (asymp_temp - tuner.get_ambient_temp()); TERN_(MPC_INCLUDE_FAN, mpc.fan255_adjustment = 0.0f); - hotend.modeled_block_temp = asymp_temp + (ambient_temp - asymp_temp) * exp(-block_responsiveness * (ms - heat_start_time) / 1000.0f); - hotend.modeled_sensor_temp = current_temp; + if (tuning_type == AUTO || tuning_type == FORCE_ASYMPTOTIC) { + // Analytic tuning + mpc.block_heat_capacity = mpc.ambient_xfer_coeff_fan0 / block_responsiveness; + mpc.sensor_responsiveness = block_responsiveness / (1.0f - (tuner.get_ambient_temp() - asymp_temp) * exp(-block_responsiveness * tuner.get_sample_1_time()) / (t1 - asymp_temp)); + } + + // If analytic tuning fails, fall back to differential tuning + if (tuning_type == AUTO) { + if (mpc.sensor_responsiveness <= 0 || mpc.block_heat_capacity <= 0) + tuning_type = FORCE_DIFFERENTIAL; + } + + if (tuning_type == FORCE_DIFFERENTIAL) { + // Differential tuning + mpc.block_heat_capacity = mpc.heater_power / tuner.get_rate_fastest(); + mpc.sensor_responsiveness = tuner.get_rate_fastest() / (tuner.get_rate_fastest() * tuner.get_time_fastest() + tuner.get_ambient_temp() - tuner.get_time_fastest()); + } + + hotend.modeled_block_temp = asymp_temp + (tuner.get_ambient_temp() - asymp_temp) * exp(-block_responsiveness * tuner.get_elapsed_heating_time()); + hotend.modeled_sensor_temp = tuner.get_last_measured_temp(); // Allow the system to stabilize under MPC, then get a better measure of ambient loss with and without fan SERIAL_ECHOLNPGM(STR_MPC_MEASURING_AMBIENT, hotend.modeled_block_temp); TERN(DWIN_LCD_PROUI, LCD_ALERTMESSAGE(MSG_MPC_MEASURING_AMBIENT), LCD_MESSAGE(MSG_MPC_MEASURING_AMBIENT)); + + // Use the estimated overshoot of the temperature as the target to achieve. hotend.target = hotend.modeled_block_temp; - next_test_ms = ms + MPC_dT * 1000; - constexpr millis_t settle_time = 20000UL, test_duration = 20000UL; - millis_t settle_end_ms = ms + settle_time, - test_end_ms = settle_end_ms + test_duration; - float total_energy_fan0 = 0.0f; + if (tuner.measure_transfer() != MPC_autotuner::MeasurementState::SUCCESS) return; + + // Update the transfer coefficients + mpc.ambient_xfer_coeff_fan0 = tuner.get_power_fan0() / (hotend.target - tuner.get_ambient_temp()); #if HAS_FAN - bool fan0_done = false; - float total_energy_fan255 = 0.0f; - #endif - float last_temp = current_temp; - - wait_for_heatup = true; - for (;;) { // Can be interrupted with M108 - if (housekeeping(ms, e, current_temp, next_report_ms)) return; - - if (ELAPSED(ms, next_test_ms)) { - hotend.soft_pwm_amount = (int)get_pid_output_hotend(e) >> 1; - - if (ELAPSED(ms, settle_end_ms) && !ELAPSED(ms, test_end_ms) && TERN1(HAS_FAN, !fan0_done)) - total_energy_fan0 += mpc.heater_power * hotend.soft_pwm_amount / 127 * MPC_dT + (last_temp - current_temp) * mpc.block_heat_capacity; - #if HAS_FAN - else if (ELAPSED(ms, test_end_ms) && !fan0_done) { - set_fan_speed(TERN(SINGLEFAN, 0, e), 255); - planner.sync_fan_speeds(fan_speed); - settle_end_ms = ms + settle_time; - test_end_ms = settle_end_ms + test_duration; - fan0_done = true; - } - else if (ELAPSED(ms, settle_end_ms) && !ELAPSED(ms, test_end_ms)) - total_energy_fan255 += mpc.heater_power * hotend.soft_pwm_amount / 127 * MPC_dT + (last_temp - current_temp) * mpc.block_heat_capacity; - #endif - else if (ELAPSED(ms, test_end_ms)) break; - - last_temp = current_temp; - next_test_ms += MPC_dT * 1000; - } - - if (!WITHIN(current_temp, t3 - 15.0f, hotend.target + 15.0f)) { - SERIAL_ECHOLNPGM(STR_MPC_TEMPERATURE_ERROR); - TERN_(DWIN_LCD_PROUI, DWIN_MPCTuning(MPC_TEMP_ERROR)); - break; - } - } - wait_for_heatup = false; - - const float power_fan0 = total_energy_fan0 * 1000 / test_duration; - mpc.ambient_xfer_coeff_fan0 = power_fan0 / (hotend.target - ambient_temp); - - #if HAS_FAN - const float power_fan255 = total_energy_fan255 * 1000 / test_duration, - ambient_xfer_coeff_fan255 = power_fan255 / (hotend.target - ambient_temp); + const float ambient_xfer_coeff_fan255 = tuner.get_power_fan255() / (hotend.target - tuner.get_ambient_temp()); mpc.applyFanAdjustment(ambient_xfer_coeff_fan255); #endif - // Calculate a new and better asymptotic temperature and re-evaluate the other constants - asymp_temp = ambient_temp + mpc.heater_power * (MPC_MAX) / 255 / mpc.ambient_xfer_coeff_fan0; - block_responsiveness = -log((t2 - asymp_temp) / (t1 - asymp_temp)) / (sample_distance * (sample_count >> 1)); - mpc.block_heat_capacity = mpc.ambient_xfer_coeff_fan0 / block_responsiveness; - mpc.sensor_responsiveness = block_responsiveness / (1.0f - (ambient_temp - asymp_temp) * exp(-block_responsiveness * t1_time) / (t1 - asymp_temp)); + if (tuning_type == AUTO || tuning_type == FORCE_ASYMPTOTIC) { + // Calculate a new and better asymptotic temperature and re-evaluate the other constants + asymp_temp = tuner.get_ambient_temp() + mpc.heater_power * (MPC_MAX) / 255 / mpc.ambient_xfer_coeff_fan0; + block_responsiveness = -log((t2 - asymp_temp) / (t1 - asymp_temp)) / tuner.get_sample_interval(); + + #if ENABLED(DEBUG_MPC_AUTOTUNE) + SERIAL_ECHOLNPGM("Refining estimates for:"); + SERIAL_ECHOLNPGM("asymp_temp ", asymp_temp); + SERIAL_ECHOLNPGM("block_responsiveness ", p_float_t(block_responsiveness, 4)); + #endif + + // Update analytic tuning values based on the above + mpc.block_heat_capacity = mpc.ambient_xfer_coeff_fan0 / block_responsiveness; + mpc.sensor_responsiveness = block_responsiveness / (1.0f - (tuner.get_ambient_temp() - asymp_temp) * exp(-block_responsiveness * tuner.get_sample_1_time()) / (t1 - asymp_temp)); + + } SERIAL_ECHOLNPGM(STR_MPC_AUTOTUNE_FINISHED); - TERN_(DWIN_LCD_PROUI, DWIN_MPCTuning(MPC_DONE)); - - #if 0 - SERIAL_ECHOLNPGM("t1_time ", t1_time); - SERIAL_ECHOLNPGM("sample_count ", sample_count); - SERIAL_ECHOLNPGM("sample_distance ", sample_distance); - for (uint8_t i = 0; i < sample_count; i++) - SERIAL_ECHOLNPGM("sample ", i, " : ", temp_samples[i]); - SERIAL_ECHOLNPGM("t1 ", t1, " t2 ", t2, " t3 ", t3); - SERIAL_ECHOLNPGM("asymp_temp ", asymp_temp); - SERIAL_ECHOLNPAIR_F("block_responsiveness ", block_responsiveness, 4); - #endif + TERN_(DWIN_LCD_PROUI, DWIN_MPCTuning(AUTOTUNE_DONE)); SERIAL_ECHOLNPGM("MPC_BLOCK_HEAT_CAPACITY ", mpc.block_heat_capacity); - SERIAL_ECHOLNPAIR_F("MPC_SENSOR_RESPONSIVENESS ", mpc.sensor_responsiveness, 4); - SERIAL_ECHOLNPAIR_F("MPC_AMBIENT_XFER_COEFF ", mpc.ambient_xfer_coeff_fan0, 4); - TERN_(HAS_FAN, SERIAL_ECHOLNPAIR_F("MPC_AMBIENT_XFER_COEFF_FAN255 ", ambient_xfer_coeff_fan255, 4)); + SERIAL_ECHOLNPGM("MPC_SENSOR_RESPONSIVENESS ", p_float_t(mpc.sensor_responsiveness, 4)); + SERIAL_ECHOLNPGM("MPC_AMBIENT_XFER_COEFF ", p_float_t(mpc.ambient_xfer_coeff_fan0, 4)); + TERN_(HAS_FAN, SERIAL_ECHOLNPGM("MPC_AMBIENT_XFER_COEFF_FAN255 ", p_float_t(ambient_xfer_coeff_fan255, 4))); } #endif // MPC_AUTOTUNE @@ -1263,7 +1400,7 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { }while(0) uint8_t fanDone = 0; - LOOP_L_N(f, COUNT(fanBit)) { + for (uint8_t f = 0; f < COUNT(fanBit); ++f) { const uint8_t realFan = pgm_read_byte(&fanBit[f]); if (TEST(fanDone, realFan)) continue; const bool fan_on = TEST(fanState, realFan); @@ -1279,13 +1416,13 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { break; #endif default: - #if EITHER(AUTO_POWER_E_FANS, HAS_FANCHECK) + #if ANY(AUTO_POWER_E_FANS, HAS_FANCHECK) autofan_speed[realFan] = fan_on ? EXTRUDER_AUTO_FAN_SPEED : 0; #endif break; } - #if BOTH(HAS_FANCHECK, HAS_PWMFANCHECK) + #if ALL(HAS_FANCHECK, HAS_PWMFANCHECK) #define _AUTOFAN_SPEED() fan_check.is_measuring() ? 255 : EXTRUDER_AUTO_FAN_SPEED #else #define _AUTOFAN_SPEED() EXTRUDER_AUTO_FAN_SPEED @@ -1295,7 +1432,7 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { #define AUTOFAN_CASE(N) TERN(HAS_AUTO_FAN_##N, _AUTOFAN_CASE, _AUTOFAN_NOT)(N) switch (f) { - REPEAT(8, AUTOFAN_CASE) + REPEAT(HOTENDS, AUTOFAN_CASE) #if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_E case CHAMBER_FAN_INDEX: _UPDATE_AUTO_FAN(CHAMBER, fan_on, CHAMBER_AUTO_FAN_SPEED); break; #endif @@ -1340,7 +1477,7 @@ void Temperature::_temp_error(const heater_id_t heater_id, FSTR_P const serial_m if (IsRunning() && TERN1(BOGUS_TEMPERATURE_GRACE_PERIOD, killed == 2)) { SERIAL_ERROR_START(); - SERIAL_ECHOF(serial_msg); + SERIAL_ECHO(serial_msg); SERIAL_ECHOPGM(STR_STOPPED_HEATER); heater_id_t real_heater_id = heater_id; @@ -1356,6 +1493,7 @@ void Temperature::_temp_error(const heater_id_t heater_id, FSTR_P const serial_m OPTCODE(HAS_TEMP_COOLER, case H_COOLER: SERIAL_ECHOPGM(STR_COOLER); break) OPTCODE(HAS_TEMP_PROBE, case H_PROBE: SERIAL_ECHOPGM(STR_PROBE); break) OPTCODE(HAS_TEMP_BOARD, case H_BOARD: SERIAL_ECHOPGM(STR_MOTHERBOARD); break) + OPTCODE(HAS_TEMP_SOC, case H_SOC: SERIAL_ECHOPGM(STR_SOC); break) OPTCODE(HAS_TEMP_CHAMBER, case H_CHAMBER: SERIAL_ECHOPGM(STR_HEATER_CHAMBER); break) OPTCODE(HAS_TEMP_BED, case H_BED: SERIAL_ECHOPGM(STR_HEATER_BED); break) default: @@ -1393,14 +1531,14 @@ void Temperature::_temp_error(const heater_id_t heater_id, FSTR_P const serial_m void Temperature::maxtemp_error(const heater_id_t heater_id) { #if HAS_DWIN_E3V2_BASIC && (HAS_HOTEND || HAS_HEATED_BED) - DWIN_Popup_Temperature(1); + dwinPopupTemperature(1); #endif _temp_error(heater_id, F(STR_T_MAXTEMP), GET_TEXT_F(MSG_ERR_MAXTEMP)); } void Temperature::mintemp_error(const heater_id_t heater_id) { #if HAS_DWIN_E3V2_BASIC && (HAS_HOTEND || HAS_HEATED_BED) - DWIN_Popup_Temperature(0); + dwinPopupTemperature(0); #endif _temp_error(heater_id, F(STR_T_MINTEMP), GET_TEXT_F(MSG_ERR_MINTEMP)); } @@ -1445,7 +1583,7 @@ void Temperature::mintemp_error(const heater_id_t heater_id) { FORCE_INLINE void debug(const_celsius_float_t c, const_float_t pid_out, FSTR_P const name=nullptr, const int8_t index=-1) { if (TERN0(HAS_PID_DEBUG, thermalManager.pid_debug_flag)) { SERIAL_ECHO_START(); - if (name) SERIAL_ECHOF(name); + if (name) SERIAL_ECHO(name); if (index >= 0) SERIAL_ECHO(index); SERIAL_ECHOLNPGM( STR_PID_DEBUG_INPUT, c, @@ -1620,7 +1758,7 @@ void Temperature::mintemp_error(const heater_id_t heater_id) { if (watch_hotend[e].check(degHotend(e))) // Increased enough? start_watching_hotend(e); // If temp reached, turn off elapsed check else { - TERN_(HAS_DWIN_E3V2_BASIC, DWIN_Popup_Temperature(0)); + TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); _temp_error((heater_id_t)e, FPSTR(str_t_heating_failed), GET_TEXT_F(MSG_HEATING_FAILED_LCD)); } } @@ -1645,13 +1783,13 @@ void Temperature::mintemp_error(const heater_id_t heater_id) { if (watch_bed.check(degBed())) // Increased enough? start_watching_bed(); // If temp reached, turn off elapsed check else { - TERN_(HAS_DWIN_E3V2_BASIC, DWIN_Popup_Temperature(0)); + TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); _temp_error(H_BED, FPSTR(str_t_heating_failed), GET_TEXT_F(MSG_HEATING_FAILED_LCD)); } } #endif // WATCH_BED - #if BOTH(PROBING_HEATERS_OFF, BED_LIMIT_SWITCHING) + #if ALL(PROBING_HEATERS_OFF, BED_LIMIT_SWITCHING) #define PAUSE_CHANGE_REQD 1 #endif @@ -1696,9 +1834,9 @@ void Temperature::mintemp_error(const heater_id_t heater_id) { // Check if temperature is within the correct band if (WITHIN(temp_bed.celsius, BED_MINTEMP, BED_MAXTEMP)) { #if ENABLED(BED_LIMIT_SWITCHING) - if (temp_bed.is_above_target((BED_HYSTERESIS) - 1)) + if (temp_bed.is_above_target(BED_HYSTERESIS)) temp_bed.soft_pwm_amount = 0; - else if (temp_bed.is_below_target((BED_HYSTERESIS) - 1)) + else if (temp_bed.is_below_target(BED_HYSTERESIS)) temp_bed.soft_pwm_amount = MAX_BED_POWER >> 1; #else // !PIDTEMPBED && !BED_LIMIT_SWITCHING temp_bed.soft_pwm_amount = temp_bed.is_below_target() ? MAX_BED_POWER >> 1 : 0; @@ -1739,11 +1877,11 @@ void Temperature::mintemp_error(const heater_id_t heater_id) { } #endif - #if EITHER(CHAMBER_FAN, CHAMBER_VENT) || DISABLED(PIDTEMPCHAMBER) + #if ANY(CHAMBER_FAN, CHAMBER_VENT) || DISABLED(PIDTEMPCHAMBER) static bool flag_chamber_excess_heat; // = false; #endif - #if EITHER(CHAMBER_FAN, CHAMBER_VENT) + #if ANY(CHAMBER_FAN, CHAMBER_VENT) static bool flag_chamber_off; // = false if (temp_chamber.target > CHAMBER_MINTEMP) { @@ -1772,21 +1910,21 @@ void Temperature::mintemp_error(const heater_id_t heater_id) { #ifndef MIN_COOLING_SLOPE_DEG_CHAMBER_VENT #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 #endif - if (!flag_chamber_excess_heat && temp_chamber.is_above_target((HIGH_EXCESS_HEAT_LIMIT) - 1)) { + if (!flag_chamber_excess_heat && temp_chamber.is_above_target(HIGH_EXCESS_HEAT_LIMIT)) { // 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 (next_cool_check_ms == 0 || ELAPSED(ms, next_cool_check_ms)) { 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); + next_cool_check_ms = ms + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_CHAMBER_VENT); old_temp = temp_chamber.celsius; } } else { - next_cool_check_ms_2 = 0; + next_cool_check_ms = 0; old_temp = 9999; } - if (flag_chamber_excess_heat && temp_chamber.is_above_target((LOW_EXCESS_HEAT_LIMIT) - 1)) + if (flag_chamber_excess_heat && temp_chamber.is_above_target(LOW_EXCESS_HEAT_LIMIT)) flag_chamber_excess_heat = false; #endif } @@ -1818,9 +1956,9 @@ void Temperature::mintemp_error(const heater_id_t heater_id) { } else { #if ENABLED(CHAMBER_LIMIT_SWITCHING) - if (temp_chamber.is_above_target((TEMP_CHAMBER_HYSTERESIS) - 1)) + if (temp_chamber.is_above_target(TEMP_CHAMBER_HYSTERESIS)) temp_chamber.soft_pwm_amount = 0; - else if (temp_chamber.is_below_target((TEMP_CHAMBER_HYSTERESIS) - 1)) + else if (temp_chamber.is_below_target(TEMP_CHAMBER_HYSTERESIS)) temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1; #else temp_chamber.soft_pwm_amount = temp_chamber.is_below_target() ? (MAX_CHAMBER_POWER) >> 1 : 0; @@ -2087,12 +2225,12 @@ void Temperature::task() { const user_thermistor_t &t = user_thermistor[t_index]; - SERIAL_ECHOPAIR_F(" R", t.series_res, 1); - SERIAL_ECHOPAIR_F_P(SP_T_STR, t.res_25, 1); - SERIAL_ECHOPAIR_F_P(SP_B_STR, t.beta, 1); - SERIAL_ECHOPAIR_F_P(SP_C_STR, t.sh_c_coeff, 9); - SERIAL_ECHOPGM(" ; "); - SERIAL_ECHOF( + SERIAL_ECHO( + F(" R"), p_float_t(t.series_res, 1), FPSTR(SP_T_STR), p_float_t(t.res_25, 1), + FPSTR(SP_B_STR), p_float_t(t.beta, 1), FPSTR(SP_C_STR), p_float_t(t.sh_c_coeff, 9), + F(" ; ") + ); + SERIAL_ECHOLN( TERN_(TEMP_SENSOR_0_IS_CUSTOM, t_index == CTI_HOTEND_0 ? F("HOTEND 0") :) TERN_(TEMP_SENSOR_1_IS_CUSTOM, t_index == CTI_HOTEND_1 ? F("HOTEND 1") :) TERN_(TEMP_SENSOR_2_IS_CUSTOM, t_index == CTI_HOTEND_2 ? F("HOTEND 2") :) @@ -2107,9 +2245,8 @@ void Temperature::task() { TERN_(TEMP_SENSOR_PROBE_IS_CUSTOM, t_index == CTI_PROBE ? F("PROBE") :) TERN_(TEMP_SENSOR_BOARD_IS_CUSTOM, t_index == CTI_BOARD ? F("BOARD") :) TERN_(TEMP_SENSOR_REDUNDANT_IS_CUSTOM, t_index == CTI_REDUNDANT ? F("REDUNDANT") :) - nullptr + FSTR_P(nullptr) ); - SERIAL_EOL(); } celsius_float_t Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const raw_adc_t raw) { @@ -2368,6 +2505,20 @@ void Temperature::task() { } #endif // HAS_TEMP_BOARD +#if HAS_TEMP_SOC + // For SoC temperature measurement. + celsius_float_t Temperature::analog_to_celsius_soc(const raw_adc_t raw) { + return ( + #ifdef TEMP_SOC_SENSOR + TEMP_SOC_SENSOR(raw) + #else + 0 + #error "TEMP_SENSOR_SOC requires the TEMP_SOC_SENSOR(RAW) macro to be defined for your board." + #endif + ); + } +#endif + #if HAS_TEMP_REDUNDANT // For redundant temperature measurement. celsius_float_t Temperature::analog_to_celsius_redundant(const raw_adc_t raw) { @@ -2430,6 +2581,7 @@ void Temperature::updateTemperaturesFromRawValues() { TERN_(HAS_TEMP_COOLER, temp_cooler.celsius = analog_to_celsius_cooler(temp_cooler.getraw())); TERN_(HAS_TEMP_PROBE, temp_probe.celsius = analog_to_celsius_probe(temp_probe.getraw())); TERN_(HAS_TEMP_BOARD, temp_board.celsius = analog_to_celsius_board(temp_board.getraw())); + TERN_(HAS_TEMP_SOC, temp_soc.celsius = analog_to_celsius_soc(temp_soc.getraw())); TERN_(HAS_TEMP_REDUNDANT, temp_redundant.celsius = analog_to_celsius_redundant(temp_redundant.getraw())); TERN_(FILAMENT_WIDTH_SENSOR, filwidth.update_measured_mm()); @@ -2471,7 +2623,7 @@ void Temperature::updateTemperaturesFromRawValues() { /** // DEBUG PREHEATING TIME SERIAL_ECHOLNPGM("\nExtruder = ", e, " Preheat On/Off = ", is_preheating(e)); - const float test_is_preheating = (preheat_end_time[HOTEND_INDEX] - millis()) * 0.001f; + const float test_is_preheating = (preheat_end_ms_hotend[HOTEND_INDEX] - millis()) * 0.001f; if (test_is_preheating < 31) SERIAL_ECHOLNPGM("Extruder = ", e, " Preheat remaining time = ", test_is_preheating, "s", "\n"); //*/ @@ -2493,20 +2645,24 @@ void Temperature::updateTemperaturesFromRawValues() { if (temp_bed.target > 0 && !is_bed_preheating() && TP_CMP(BED, mintemp_raw_BED, temp_bed.getraw())) mintemp_error(H_BED); #endif - #if BOTH(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER) + #if ALL(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER) if (TP_CMP(CHAMBER, temp_chamber.getraw(), maxtemp_raw_CHAMBER)) maxtemp_error(H_CHAMBER); if (temp_chamber.target > 0 && TP_CMP(CHAMBER, mintemp_raw_CHAMBER, temp_chamber.getraw())) mintemp_error(H_CHAMBER); #endif - #if BOTH(HAS_COOLER, THERMAL_PROTECTION_COOLER) + #if ALL(HAS_COOLER, THERMAL_PROTECTION_COOLER) if (cutter.unitPower > 0 && TP_CMP(COOLER, temp_cooler.getraw(), maxtemp_raw_COOLER)) maxtemp_error(H_COOLER); if (TP_CMP(COOLER, mintemp_raw_COOLER, temp_cooler.getraw())) mintemp_error(H_COOLER); #endif - #if BOTH(HAS_TEMP_BOARD, THERMAL_PROTECTION_BOARD) + #if ALL(HAS_TEMP_BOARD, THERMAL_PROTECTION_BOARD) if (TP_CMP(BOARD, temp_board.getraw(), maxtemp_raw_BOARD)) maxtemp_error(H_BOARD); if (TP_CMP(BOARD, mintemp_raw_BOARD, temp_board.getraw())) mintemp_error(H_BOARD); #endif + + #if ALL(HAS_TEMP_SOC, THERMAL_PROTECTION_SOC) + if (TP_CMP(SOC, temp_soc.getraw(), maxtemp_raw_SOC)) maxtemp_error(H_SOC); + #endif #undef TP_CMP } // Temperature::updateTemperaturesFromRawValues @@ -2722,6 +2878,7 @@ void Temperature::init() { TERN_(HAS_TEMP_ADC_PROBE, hal.adc_enable(TEMP_PROBE_PIN)); TERN_(HAS_TEMP_ADC_COOLER, hal.adc_enable(TEMP_COOLER_PIN)); TERN_(HAS_TEMP_ADC_BOARD, hal.adc_enable(TEMP_BOARD_PIN)); + TERN_(HAS_TEMP_ADC_SOC, hal.adc_enable(TEMP_SOC_PIN)); TERN_(HAS_TEMP_ADC_REDUNDANT, hal.adc_enable(TEMP_REDUNDANT_PIN)); TERN_(FILAMENT_WIDTH_SENSOR, hal.adc_enable(FILWIDTH_PIN)); TERN_(HAS_ADC_BUTTONS, hal.adc_enable(ADC_KEYPAD_PIN)); @@ -2785,7 +2942,7 @@ void Temperature::init() { temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) - #define _MINMAX_TEST(N,M) (HOTENDS > N && TEMP_SENSOR_##NR##_IS_THERMISTOR && defined(HEATER_##N##_##M##TEMP)) + #define _MINMAX_TEST(N,M) (!TEMP_SENSOR_##N##_IS_DUMMY && HOTENDS > N && TEMP_SENSOR_##N##_IS_THERMISTOR && defined(HEATER_##N##_##M##TEMP)) #if _MINMAX_TEST(0, MIN) _TEMP_MIN_E(0); @@ -2853,11 +3010,15 @@ void Temperature::init() { while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR); #endif - #if BOTH(HAS_TEMP_BOARD, THERMAL_PROTECTION_BOARD) + #if ALL(HAS_TEMP_BOARD, THERMAL_PROTECTION_BOARD) while (analog_to_celsius_board(mintemp_raw_BOARD) < BOARD_MINTEMP) mintemp_raw_BOARD += TEMPDIR(BOARD) * (OVERSAMPLENR); while (analog_to_celsius_board(maxtemp_raw_BOARD) > BOARD_MAXTEMP) maxtemp_raw_BOARD -= TEMPDIR(BOARD) * (OVERSAMPLENR); #endif + #if ALL(HAS_TEMP_SOC, THERMAL_PROTECTION_SOC) + while (analog_to_celsius_soc(maxtemp_raw_SOC) > SOC_MAXTEMP) maxtemp_raw_SOC -= OVERSAMPLENR; + #endif + #if HAS_TEMP_REDUNDANT temp_redundant.target = &( #if REDUNDANT_TEMP_MATCH(TARGET, COOLER) && HAS_TEMP_COOLER @@ -2983,7 +3144,7 @@ void Temperature::init() { if (TERN0(REPORT_ADAPTIVE_FAN_SLOWING, DEBUGGING(INFO))) { const uint8_t fss7 = fan_speed_scaler[fan_index] & 0x80; if (fss7 ^ (scale & 0x80)) - serial_ternary(fss7, F("Adaptive Fan Slowing "), nullptr, F("de"), F("activated.\n")); + serial_ternary(F("Adaptive Fan Slowing "), fss7, nullptr, F("de"), F("activated.\n")); } fan_speed_scaler[fan_index] = scale; @@ -3018,12 +3179,12 @@ void Temperature::init() { } // fall through case TRRunaway: - TERN_(HAS_DWIN_E3V2_BASIC, DWIN_Popup_Temperature(0)); + TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); _temp_error(heater_id, FPSTR(str_t_thermal_runaway), GET_TEXT_F(MSG_THERMAL_RUNAWAY)); #if ENABLED(THERMAL_PROTECTION_VARIANCE_MONITOR) case TRMalfunction: - TERN_(HAS_DWIN_E3V2_BASIC, DWIN_Popup_Temperature(0)); + TERN_(HAS_DWIN_E3V2_BASIC, dwinPopupTemperature(0)); _temp_error(heater_id, FPSTR(str_t_temp_malfunction), GET_TEXT_F(MSG_TEMP_MALFUNCTION)); #endif } @@ -3110,7 +3271,7 @@ void Temperature::disable_all_heaters() { #endif // PROBING_HEATERS_OFF -#if EITHER(SINGLENOZZLE_STANDBY_TEMP, SINGLENOZZLE_STANDBY_FAN) +#if ANY(SINGLENOZZLE_STANDBY_TEMP, SINGLENOZZLE_STANDBY_FAN) void Temperature::singlenozzle_change(const uint8_t old_tool, const uint8_t new_tool) { #if ENABLED(SINGLENOZZLE_STANDBY_FAN) @@ -3340,6 +3501,7 @@ void Temperature::update_raw_temperatures() { TERN_(HAS_TEMP_ADC_PROBE, temp_probe.update()); TERN_(HAS_TEMP_ADC_COOLER, temp_cooler.update()); TERN_(HAS_TEMP_ADC_BOARD, temp_board.update()); + TERN_(HAS_TEMP_ADC_SOC, temp_soc.update()); TERN_(HAS_JOY_ADC_X, joystick.x.update()); TERN_(HAS_JOY_ADC_Y, joystick.y.update()); @@ -3370,6 +3532,7 @@ void Temperature::readings_ready() { TERN_(HAS_TEMP_PROBE, temp_probe.reset()); TERN_(HAS_TEMP_COOLER, temp_cooler.reset()); TERN_(HAS_TEMP_BOARD, temp_board.reset()); + TERN_(HAS_TEMP_SOC, temp_soc.reset()); TERN_(HAS_TEMP_REDUNDANT, temp_redundant.reset()); TERN_(HAS_JOY_ADC_X, joystick.x.reset()); @@ -3447,6 +3610,10 @@ void Temperature::isr() { static int8_t temp_count = -1; static ADCSensorState adc_sensor_state = StartupDelay; + + #ifndef SOFT_PWM_SCALE + #define SOFT_PWM_SCALE 0 + #endif static uint8_t pwm_count = _BV(SOFT_PWM_SCALE); // Avoid multiple loads of pwm_count @@ -3473,7 +3640,7 @@ void Temperature::isr() { static SoftPWM soft_pwm_cooler; #endif - #if BOTH(FAN_SOFT_PWM, USE_CONTROLLER_FAN) + #if ALL(FAN_SOFT_PWM, USE_CONTROLLER_FAN) static SoftPWM soft_pwm_controller; #endif @@ -3515,7 +3682,7 @@ void Temperature::isr() { #if ENABLED(FAN_SOFT_PWM) #if ENABLED(USE_CONTROLLER_FAN) - WRITE(CONTROLLER_FAN_PIN, soft_pwm_controller.add(pwm_mask, soft_pwm_controller_speed)); + WRITE(CONTROLLER_FAN_PIN, soft_pwm_controller.add(pwm_mask, controllerFan.soft_pwm_speed)); #endif #define _FAN_PWM(N) do{ \ @@ -3828,6 +3995,11 @@ void Temperature::isr() { case MeasureTemp_BOARD: ACCUMULATE_ADC(temp_board); break; #endif + #if HAS_TEMP_ADC_SOC + case PrepareTemp_SOC: hal.adc_start(TEMP_SOC_PIN); break; + case MeasureTemp_SOC: ACCUMULATE_ADC(temp_soc); break; + #endif + #if HAS_TEMP_ADC_REDUNDANT case PrepareTemp_REDUNDANT: hal.adc_start(TEMP_REDUNDANT_PIN); break; case MeasureTemp_REDUNDANT: ACCUMULATE_ADC(temp_redundant); break; @@ -3967,8 +4139,10 @@ void Temperature::isr() { * Print a single heater state in the form: * Bed: " B:nnn.nn /nnn.nn" * Chamber: " C:nnn.nn /nnn.nn" - * Probe: " P:nnn.nn /nnn.nn" + * Probe: " P:nnn.nn" * Cooler: " L:nnn.nn /nnn.nn" + * Board: " M:nnn.nn" + * SoC: " S:nnn.nn" * Redundant: " R:nnn.nn /nnn.nn" * Extruder: " T0:nnn.nn /nnn.nn" * With ADC: " T0:nnn.nn /nnn.nn (nnn.nn)" @@ -3977,6 +4151,7 @@ void Temperature::isr() { OPTARG(SHOW_TEMP_ADC_VALUES, const float r) ) { char k; + bool show_t = true; switch (e) { default: #if HAS_TEMP_HOTEND @@ -3989,13 +4164,16 @@ void Temperature::isr() { case H_CHAMBER: k = 'C'; break; #endif #if HAS_TEMP_PROBE - case H_PROBE: k = 'P'; break; + case H_PROBE: k = 'P'; show_t = false; break; #endif #if HAS_TEMP_COOLER case H_COOLER: k = 'L'; break; #endif #if HAS_TEMP_BOARD - case H_BOARD: k = 'M'; break; + case H_BOARD: k = 'M'; show_t = false; break; + #endif + #if HAS_TEMP_SOC + case H_SOC: k = 'S'; show_t = false; break; #endif #if HAS_TEMP_REDUNDANT case H_REDUNDANT: k = 'R'; break; @@ -4010,10 +4188,8 @@ void Temperature::isr() { #else #define SFP 2 #endif - SERIAL_CHAR(':'); - SERIAL_PRINT(c, SFP); - SERIAL_ECHOPGM(" /"); - SERIAL_PRINT(t, SFP); + SERIAL_ECHO(AS_CHAR(':'), p_float_t(c, SFP)); + if (show_t) { SERIAL_ECHOPGM(" /", p_float_t(t, SFP)); } #if ENABLED(SHOW_TEMP_ADC_VALUES) // Temperature MAX SPI boards do not have an OVERSAMPLENR defined SERIAL_ECHOPGM(" (", TERN(HAS_MAXTC_LIBRARIES, k == 'T', false) ? r : r * RECIPROCAL(OVERSAMPLENR)); @@ -4043,6 +4219,9 @@ void Temperature::isr() { #if HAS_TEMP_BOARD print_heater_state(H_BOARD, degBoard(), 0 OPTARG(SHOW_TEMP_ADC_VALUES, rawBoardTemp())); #endif + #if HAS_TEMP_SOC + print_heater_state(H_SOC, degSoc(), 0 OPTARG(SHOW_TEMP_ADC_VALUES, rawSocTemp())); + #endif #if HAS_TEMP_REDUNDANT if (include_r) print_heater_state(H_REDUNDANT, degRedundant(), degRedundantTarget() OPTARG(SHOW_TEMP_ADC_VALUES, rawRedundantTemp())); #endif @@ -4135,7 +4314,7 @@ void Temperature::isr() { bool wants_to_cool = false; celsius_float_t target_temp = -1.0, old_temp = 9999.0; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + millis_t now, next_temp_ms = 0, cool_check_ms = 0; wait_for_heatup = true; do { // Target temperature might be changed during the loop @@ -4193,9 +4372,9 @@ void Temperature::isr() { if (wants_to_cool) { // Break after MIN_COOLING_SLOPE_TIME seconds // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG - if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (!cool_check_ms || ELAPSED(now, cool_check_ms)) { if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG)) break; - next_cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME); + cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME); old_temp = temp; } } @@ -4212,8 +4391,8 @@ void Temperature::isr() { // If wait_for_heatup is set, temperature was reached, no cancel if (wait_for_heatup) { wait_for_heatup = false; - #if HAS_DWIN_E3V2_BASIC - HMI_flag.heat_flag = 0; + #if ENABLED(DWIN_CREALITY_LCD) + hmiFlag.heat_flag = 0; duration_t elapsed = print_job_timer.duration(); // Print timer dwin_heat_time = elapsed.value; #else @@ -4272,7 +4451,7 @@ void Temperature::isr() { bool wants_to_cool = false; celsius_float_t target_temp = -1, old_temp = 9999; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + millis_t now, next_temp_ms = 0, cool_check_ms = 0; wait_for_heatup = true; do { // Target temperature might be changed during the loop @@ -4328,9 +4507,9 @@ void Temperature::isr() { if (wants_to_cool) { // Break after MIN_COOLING_SLOPE_TIME_BED seconds // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_BED - if (!next_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (!cool_check_ms || ELAPSED(now, cool_check_ms)) { if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_BED)) break; - next_cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_BED); + cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_BED); old_temp = temp; } } @@ -4467,7 +4646,7 @@ void Temperature::isr() { bool wants_to_cool = false; float target_temp = -1, old_temp = 9999; - millis_t now, next_temp_ms = 0, next_cool_check_ms = 0; + millis_t now, next_temp_ms = 0, cool_check_ms = 0; wait_for_heatup = true; do { // Target temperature might be changed during the loop @@ -4519,9 +4698,9 @@ void Temperature::isr() { 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_cool_check_ms || ELAPSED(now, next_cool_check_ms)) { + if (!cool_check_ms || ELAPSED(now, cool_check_ms)) { if (old_temp - temp < float(MIN_COOLING_SLOPE_DEG_CHAMBER)) break; - next_cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_CHAMBER); + cool_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_CHAMBER); old_temp = temp; } } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 4bf76e5d48..b0cb3d778e 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -41,19 +41,27 @@ #include "../feature/fancheck.h" #endif -#ifndef SOFT_PWM_SCALE - #define SOFT_PWM_SCALE 0 -#endif - #define HOTEND_INDEX TERN(HAS_MULTI_HOTEND, e, 0) #define E_NAME TERN_(HAS_MULTI_HOTEND, e) +#if HAS_FAN + #if NUM_REDUNDANT_FANS + #define FAN_IS_REDUNDANT(Q) WITHIN(Q, REDUNDANT_PART_COOLING_FAN, REDUNDANT_PART_COOLING_FAN + NUM_REDUNDANT_FANS - 1) + #else + #define FAN_IS_REDUNDANT(Q) false + #endif + #define FAN_IS_M106ABLE(Q) (HAS_FAN##Q && !FAN_IS_REDUNDANT(Q)) +#else + #define FAN_IS_M106ABLE(Q) false +#endif + // Element identifiers. Positive values are hotends. Negative values are other heaters or coolers. typedef enum : int_fast8_t { H_REDUNDANT = HID_REDUNDANT, H_COOLER = HID_COOLER, H_PROBE = HID_PROBE, H_BOARD = HID_BOARD, + H_SOC = HID_SOC, H_CHAMBER = HID_CHAMBER, H_BED = HID_BED, H_E0 = HID_E0, H_E1, H_E2, H_E3, H_E4, H_E5, H_E6, H_E7, @@ -83,6 +91,9 @@ enum ADCSensorState : char { #if HAS_TEMP_ADC_BOARD PrepareTemp_BOARD, MeasureTemp_BOARD, #endif + #if HAS_TEMP_ADC_SOC + PrepareTemp_SOC, MeasureTemp_SOC, + #endif #if HAS_TEMP_ADC_REDUNDANT PrepareTemp_REDUNDANT, MeasureTemp_REDUNDANT, #endif @@ -150,7 +161,7 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; #if HAS_PID_HEATING - #define PID_K2 (1-float(PID_K1)) + #define PID_K2 (1.0f - float(PID_K1)) #define PID_dT ((OVERSAMPLENR * float(ACTUAL_ADC_SAMPLES)) / (TEMP_TIMER_FREQUENCY)) // Apply the scale factors to the PID values @@ -231,7 +242,7 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; }; -#endif +#endif // HAS_PID_HEATING #if ENABLED(PIDTEMP) @@ -262,7 +273,7 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; base::reset(); prev_e_pos = 0; lpq_ptr = 0; - LOOP_L_N(i, LPQ_ARR_SZ) lpq[i] = 0; + for (uint8_t i = 0; i < LPQ_ARR_SZ; ++i) lpq[i] = 0; } float get_extrusion_scale_output(const bool is_active, const int32_t e_position, const float e_mm_per_step, const int16_t lpq_len) { @@ -358,7 +369,7 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; }; typedef - #if BOTH(PID_EXTRUSION_SCALING, PID_FAN_SCALING) + #if ALL(PID_EXTRUSION_SCALING, PID_FAN_SCALING) PIDCF_t<0, PID_MAX, LPQ_MAX_LEN, PID_FAN_SCALING_MIN_SPEED, PID_FAN_SCALING_LIN_FACTOR> #elif ENABLED(PID_EXTRUSION_SCALING) PIDC_t<0, PID_MAX, LPQ_MAX_LEN> @@ -398,7 +409,7 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; #endif -#if ENABLED(G26_MESH_VALIDATION) && EITHER(HAS_MARLINUI_MENU, EXTENSIBLE_UI) +#if ENABLED(G26_MESH_VALIDATION) && ANY(HAS_MARLINUI_MENU, EXTENSIBLE_UI) #define G26_CLICK_CAN_CANCEL 1 #endif @@ -474,12 +485,15 @@ struct PIDHeaterInfo : public HeaterInfo { #if HAS_TEMP_PROBE typedef temp_info_t probe_info_t; #endif -#if EITHER(HAS_COOLER, HAS_TEMP_COOLER) +#if ANY(HAS_COOLER, HAS_TEMP_COOLER) typedef heater_info_t cooler_info_t; #endif #if HAS_TEMP_BOARD typedef temp_info_t board_info_t; #endif +#if HAS_TEMP_SOC + typedef temp_info_t soc_info_t; +#endif // Heater watch handling template @@ -607,11 +621,14 @@ class Temperature { #if HAS_TEMP_BOARD static board_info_t temp_board; #endif + #if HAS_TEMP_SOC + static soc_info_t temp_soc; + #endif #if HAS_TEMP_REDUNDANT static redundant_info_t temp_redundant; #endif - #if EITHER(AUTO_POWER_E_FANS, HAS_FANCHECK) + #if ANY(AUTO_POWER_E_FANS, HAS_FANCHECK) static uint8_t autofan_speed[HOTENDS]; #endif #if ENABLED(AUTO_POWER_CHAMBER_FAN) @@ -626,11 +643,11 @@ class Temperature { soft_pwm_count_fan[FAN_COUNT]; #endif - #if BOTH(FAN_SOFT_PWM, USE_CONTROLLER_FAN) + #if ALL(FAN_SOFT_PWM, USE_CONTROLLER_FAN) static uint8_t soft_pwm_controller_speed; #endif - #if BOTH(HAS_MARLINUI_MENU, PREVENT_COLD_EXTRUSION) && E_MANUAL > 0 + #if ALL(HAS_MARLINUI_MENU, PREVENT_COLD_EXTRUSION) && E_MANUAL > 0 static bool allow_cold_extrude_override; static void set_menu_cold_override(const bool allow) { allow_cold_extrude_override = allow; } #else @@ -654,7 +671,7 @@ class Temperature { static bool hotEnoughToExtrude(const uint8_t e) { return !tooColdToExtrude(e); } static bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } - #if EITHER(SINGLENOZZLE_STANDBY_TEMP, SINGLENOZZLE_STANDBY_FAN) + #if ANY(SINGLENOZZLE_STANDBY_TEMP, SINGLENOZZLE_STANDBY_FAN) #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) static celsius_t singlenozzle_temp[EXTRUDERS]; #endif @@ -750,10 +767,14 @@ class Temperature { static raw_adc_t mintemp_raw_COOLER, maxtemp_raw_COOLER; #endif - #if BOTH(HAS_TEMP_BOARD, THERMAL_PROTECTION_BOARD) + #if ALL(HAS_TEMP_BOARD, THERMAL_PROTECTION_BOARD) static raw_adc_t mintemp_raw_BOARD, maxtemp_raw_BOARD; #endif + #if ALL(HAS_TEMP_SOC, THERMAL_PROTECTION_SOC) + static raw_adc_t maxtemp_raw_SOC; + #endif + #if MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED > 1 static uint8_t consecutive_low_temperature_error[HOTENDS]; #endif @@ -846,6 +867,9 @@ class Temperature { #if HAS_TEMP_BOARD static celsius_float_t analog_to_celsius_board(const raw_adc_t raw); #endif + #if HAS_TEMP_SOC + static celsius_float_t analog_to_celsius_soc(const raw_adc_t raw); + #endif #if HAS_TEMP_REDUNDANT static celsius_float_t analog_to_celsius_redundant(const raw_adc_t raw); #endif @@ -853,7 +877,7 @@ class Temperature { #if HAS_FAN static uint8_t fan_speed[FAN_COUNT]; - #define FANS_LOOP(I) LOOP_L_N(I, FAN_COUNT) + #define FANS_LOOP(I) for (uint8_t I = 0; I < FAN_COUNT; ++I) static void set_fan_speed(const uint8_t fan, const uint16_t speed); @@ -861,7 +885,7 @@ class Temperature { static void report_fan_speed(const uint8_t fan); #endif - #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) + #if ANY(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) static bool fans_paused; static uint8_t saved_fan_speed[FAN_COUNT]; #endif @@ -889,7 +913,7 @@ class Temperature { 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) + #if ANY(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) void set_fans_paused(const bool p); #endif @@ -1119,6 +1143,14 @@ class Temperature { static celsius_t wholeDegBoard() { return static_cast(temp_board.celsius + 0.5f); } #endif + #if HAS_TEMP_SOC + #if ENABLED(SHOW_TEMP_ADC_VALUES) + static raw_adc_t rawSocTemp() { return temp_soc.getraw(); } + #endif + static celsius_float_t degSoc() { return temp_soc.celsius; } + static celsius_t wholeDegSoc() { return static_cast(temp_soc.celsius + 0.5f); } + #endif + #if HAS_TEMP_REDUNDANT #if ENABLED(SHOW_TEMP_ADC_VALUES) static raw_adc_t rawRedundantTemp() { return temp_redundant.getraw(); } @@ -1194,11 +1226,68 @@ class Temperature { } #endif - #endif + #endif // HAS_PID_HEATING #if ENABLED(MPC_AUTOTUNE) - void MPC_autotune(const uint8_t e); - #endif + + // Utility class to perform MPCTEMP auto tuning measurements + class MPC_autotuner { + public: + enum MeasurementState { CANCELLED, FAILED, SUCCESS }; + MPC_autotuner(const uint8_t extruderIdx); + ~MPC_autotuner(); + MeasurementState measure_ambient_temp(); + MeasurementState measure_heatup(); + MeasurementState measure_transfer(); + + celsius_float_t get_ambient_temp() { return ambient_temp; } + celsius_float_t get_last_measured_temp() { return current_temp; } + + float get_elapsed_heating_time() { return elapsed_heating_time; } + float get_sample_1_time() { return t1_time; } + static float get_sample_1_temp() { return temp_samples[0]; } + static float get_sample_2_temp() { return temp_samples[(sample_count - 1) >> 1]; } + static float get_sample_3_temp() { return temp_samples[sample_count - 1]; } + static float get_sample_interval() { return sample_distance * (sample_count >> 1); } + + static celsius_float_t get_temp_fastest() { return temp_fastest; } + float get_time_fastest() { return time_fastest; } + float get_rate_fastest() { return rate_fastest; } + + float get_power_fan0() { return power_fan0; } + #if HAS_FAN + static float get_power_fan255() { return power_fan255; } + #endif + + protected: + static void init_timers() { curr_time_ms = next_report_ms = millis(); } + MeasurementState housekeeping(); + + uint8_t e; + + float elapsed_heating_time; + celsius_float_t ambient_temp, current_temp; + float t1_time; + + static millis_t curr_time_ms, next_report_ms; + static celsius_float_t temp_samples[16]; + static uint8_t sample_count; + static uint16_t sample_distance; + + // Parameters from differential analysis + static celsius_float_t temp_fastest; + float time_fastest, rate_fastest; + + float power_fan0; + #if HAS_FAN + static float power_fan255; + #endif + }; + + enum MPCTuningType { AUTO, FORCE_ASYMPTOTIC, FORCE_DIFFERENTIAL }; + static void MPC_autotune(const uint8_t e, MPCTuningType tuning_type); + + #endif // MPC_AUTOTUNE #if ENABLED(PROBING_HEATERS_OFF) static void pause_heaters(const bool p); diff --git a/Marlin/src/module/thermistor/thermistor_1.h b/Marlin/src/module/thermistor/thermistor_1.h index 2ebf8da550..e581f1b5cd 100644 --- a/Marlin/src/module/thermistor/thermistor_1.h +++ b/Marlin/src/module/thermistor/thermistor_1.h @@ -23,6 +23,10 @@ // R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor constexpr temp_entry_t temptable_1[] PROGMEM = { + { OV( 18), 320 }, + { OV( 19), 315 }, + { OV( 20), 310 }, + { OV( 22), 305 }, { OV( 23), 300 }, { OV( 25), 295 }, { OV( 27), 290 }, diff --git a/Marlin/src/module/thermistor/thermistor_14.h b/Marlin/src/module/thermistor/thermistor_14.h new file mode 100644 index 0000000000..f0bc6f606e --- /dev/null +++ b/Marlin/src/module/thermistor/thermistor_14.h @@ -0,0 +1,85 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 + +// R25 = 100 kOhm, beta25 = 4092 K, 4.7 kOhm pull-up, bed thermistor +const temp_entry_t temptable_14[] PROGMEM = { + { OV( 23), 275 }, + { OV( 25), 270 }, + { OV( 27), 265 }, + { OV( 28), 260 }, + { OV( 31), 255 }, + { OV( 33), 250 }, + { OV( 35), 245 }, + { OV( 38), 240 }, + { OV( 41), 235 }, + { OV( 44), 230 }, + { OV( 47), 225 }, + { OV( 52), 220 }, + { OV( 56), 215 }, + { OV( 62), 210 }, + { OV( 68), 205 }, + { OV( 74), 200 }, + { OV( 81), 195 }, + { OV( 90), 190 }, + { OV( 99), 185 }, + { OV( 108), 180 }, + { OV( 121), 175 }, + { OV( 133), 170 }, + { OV( 147), 165 }, + { OV( 162), 160 }, + { OV( 180), 155 }, + { OV( 199), 150 }, + { OV( 219), 145 }, + { OV( 243), 140 }, + { OV( 268), 135 }, + { OV( 296), 130 }, + { OV( 326), 125 }, + { OV( 358), 120 }, + { OV( 398), 115 }, + { OV( 435), 110 }, + { OV( 476), 105 }, + { OV( 519), 100 }, + { OV( 566), 95 }, + { OV( 610), 90 }, + { OV( 658), 85 }, + { OV( 703), 80 }, + { OV( 742), 75 }, + { OV( 773), 70 }, + { OV( 807), 65 }, + { OV( 841), 60 }, + { OV( 871), 55 }, + { OV( 895), 50 }, + { OV( 918), 45 }, + { OV( 937), 40 }, + { OV( 954), 35 }, + { OV( 968), 30 }, + { OV( 978), 25 }, + { OV( 985), 20 }, + { OV( 993), 15 }, + { OV( 999), 10 }, + { OV(1004), 5 }, + { OV(1008), 0 }, + { OV(1012), -5 }, + { OV(1016), -10 }, + { OV(1020), -15 } +}; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index c596d746f7..5d4a8a7c92 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -109,6 +109,9 @@ typedef struct { raw_adc_t value; celsius_t celsius; } temp_entry_t; #if ANY_THERMISTOR_IS(13) // beta25 = 4100 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "Hisens" #include "thermistor_13.h" #endif +#if ANY_THERMISTOR_IS(14) // beta25 = 4092 K, R25 = 100 kOhm, Pull-up = 4.7 kOhm, "EPCOS" for hot bed + #include "thermistor_14.h" +#endif #if ANY_THERMISTOR_IS(15) // JGAurora A5 thermistor calibration #include "thermistor_15.h" #endif @@ -532,6 +535,10 @@ static_assert(255 > TEMPTABLE_0_LEN || 255 > TEMPTABLE_1_LEN || 255 > TEMPTABLE_ #define TEMP_SENSOR_BOARD_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif +#ifndef TEMP_SENSOR_SOC_RAW_HI_TEMP + #define TEMP_SENSOR_SOC_RAW_LO_TEMP 0 + #define TEMP_SENSOR_SOC_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE +#endif #ifndef TEMP_SENSOR_REDUNDANT_RAW_HI_TEMP #if TT_REVRAW(REDUNDANT) #define TEMP_SENSOR_REDUNDANT_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index cce3669355..d65b3fb32a 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -24,7 +24,6 @@ #include "tool_change.h" -#include "probe.h" #include "motion.h" #include "planner.h" #include "temperature.h" @@ -92,6 +91,10 @@ #include "../feature/pause.h" #endif +#if HAS_BED_PROBE + #include "probe.h" +#endif + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) #if TOOLCHANGE_FS_WIPE_RETRACT <= 0 #undef TOOLCHANGE_FS_WIPE_RETRACT @@ -250,7 +253,7 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0. #elif ENABLED(PARKING_EXTRUDER) void pe_solenoid_init() { - LOOP_LE_N(n, 1) pe_solenoid_set_pin_state(n, !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE); + for (uint8_t n = 0; n <= 1; ++n) pe_solenoid_set_pin_state(n, !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE); } void pe_solenoid_set_pin_state(const uint8_t extruder_num, const uint8_t state) { @@ -1165,7 +1168,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { if (new_tool != old_tool || TERN0(PARKING_EXTRUDER, extruder_parked)) { // PARKING_EXTRUDER may need to attach old_tool when homing destination = current_position; - #if BOTH(TOOLCHANGE_FILAMENT_SWAP, HAS_FAN) && TOOLCHANGE_FS_FAN >= 0 + #if ALL(TOOLCHANGE_FILAMENT_SWAP, HAS_FAN) && TOOLCHANGE_FS_FAN >= 0 // Store and stop fan. Restored on any exit. REMEMBER(fan, thermalManager.fan_speed[TOOLCHANGE_FS_FAN], 0); #endif @@ -1277,7 +1280,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { fast_line_to_current(Z_AXIS); } move_nozzle_servo(new_tool); - #elif EITHER(MECHANICAL_SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_NOZZLE) + #elif ANY(MECHANICAL_SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_NOZZLE) if (!no_move) { current_position.z = _MIN(current_position.z + toolchange_settings.z_raise, _MIN(TERN(HAS_SOFTWARE_ENDSTOPS, soft_endstop.max.z, Z_MAX_POS), Z_MAX_POS)); fast_line_to_current(Z_AXIS); @@ -1308,7 +1311,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { const bool should_move = safe_to_move && !no_move && IsRunning(); if (should_move) { - #if EITHER(SINGLENOZZLE_STANDBY_TEMP, SINGLENOZZLE_STANDBY_FAN) + #if ANY(SINGLENOZZLE_STANDBY_TEMP, SINGLENOZZLE_STANDBY_FAN) thermalManager.singlenozzle_change(old_tool, new_tool); #endif @@ -1469,7 +1472,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { // If using MECHANICAL_SWITCHING extruder/nozzle, set HOTEND_OFFSET in Z axis after running EVENT_GCODE_TOOLCHANGE // so that nozzle does not lower below print surface if new hotend Z offset is higher than old hotend Z offset. - #if EITHER(MECHANICAL_SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_NOZZLE) + #if ANY(MECHANICAL_SWITCHING_EXTRUDER, MECHANICAL_SWITCHING_NOZZLE) #if HAS_HOTEND_OFFSET xyz_pos_t diff = hotend_offset[new_tool] - hotend_offset[old_tool]; TERN_(DUAL_X_CARRIAGE, diff.x = 0); diff --git a/Marlin/src/pins/esp32/pins_ENWI_ESPNP.h b/Marlin/src/pins/esp32/pins_ENWI_ESPNP.h index e911900b1d..360501aa08 100644 --- a/Marlin/src/pins/esp32/pins_ENWI_ESPNP.h +++ b/Marlin/src/pins/esp32/pins_ENWI_ESPNP.h @@ -91,7 +91,9 @@ #define K_CS_PIN 159 // Reduce baud rate to improve software serial reliability -#define TMC_BAUD_RATE 19200 +#ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 +#endif // // Temperature Sensors diff --git a/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h b/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h new file mode 100644 index 0000000000..6f8046988e --- /dev/null +++ b/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h @@ -0,0 +1,141 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 + +/** + * Godi Controller 32-Bit V1.0 pin assignments + * + * 3D printer control board based on the ESP32 microcontroller. + * Supports 4 stepper drivers, heated bed, single hotend. + */ + +#include "env_validate.h" + +#if EXTRUDERS > 1 || E_STEPPERS > 1 + #error "Godi Controller only supports 1 E stepper." +#elif HAS_MULTI_HOTEND + #error "Godi Controller only supports 1 hotend." +#endif + +#define BOARD_INFO_NAME "Godi Controller 32-Bit V1.0" + +// +// Disable I2S stepper stream, by default +// +#undef I2S_STEPPER_STREAM +#undef I2S_WS +#undef I2S_BCK +#undef I2S_DATA + +// +// Limit Switches +// +#define X_STOP_PIN 34 +#define Y_STOP_PIN 35 +#define Z_STOP_PIN 15 + +// +// Steppers +// +#define X_STEP_PIN 27 +#define X_DIR_PIN 26 +#define X_ENABLE_PIN 25 + +#define Y_STEP_PIN 33 +#define Y_DIR_PIN 32 +#define Y_ENABLE_PIN X_ENABLE_PIN + +#define Z_STEP_PIN 14 +#define Z_DIR_PIN 12 +#define Z_ENABLE_PIN X_ENABLE_PIN + +#define E0_STEP_PIN 16 +#define E0_DIR_PIN 17 +#define E0_ENABLE_PIN X_ENABLE_PIN + +// +// Temperature Sensors +// +#define TEMP_0_PIN 36 // Analog Input +#define TEMP_BED_PIN 39 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 4 +#define FAN0_PIN 13 +#define HEATER_BED_PIN 2 + +// +// MicroSD card +// +#define SD_MOSI_PIN 23 +#define SD_MISO_PIN 19 +#define SD_SCK_PIN 18 +#define SDSS 5 +#define USES_SHARED_SPI // SPI is shared by SD card with TMC SPI drivers + +#if HAS_TMC_UART + // + // TMC2209 stepper drivers + // + + // + // Hardware serial 1 + // + #define X_HARDWARE_SERIAL Serial1 + #define Y_HARDWARE_SERIAL Serial1 + #define Z_HARDWARE_SERIAL Serial1 + #define E0_HARDWARE_SERIAL Serial1 + + #define TMC_BAUD_RATE 115200 +#endif + +/** + * Hardware serial pins + * + * Override these pins in Configuration.h or Configuration_adv.h if needed. + * + * Note: Serial2 can be defined using HARDWARE_SERIAL2_RX and HARDWARE_SERIAL2_TX + * but Godi Controller 32-Bit does not have enough spare pins for such reassignment. + */ +#ifndef HARDWARE_SERIAL1_RX + #define HARDWARE_SERIAL1_RX 21 +#endif +#ifndef HARDWARE_SERIAL1_TX + #define HARDWARE_SERIAL1_TX 22 +#endif + +// +// Heaters / Fans +// + +#if ANY(EDUTRONICS_12864OLED_SH1106, EDUTRONICS_12864OLED_SSD1306) + #define LCDSCREEN_NAME "EDUTRONICS 12864 OLED" + #define BTN_EN2 1 + #define BTN_EN1 3 + #define BTN_ENC 0 + #define BEEPER_PIN -1 + #define KILL_PIN -1 + #define DOGLCD_SDA 21 // SDA + #define DOGLCD_SCL 22 // SCL +#endif diff --git a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h index cfb682df54..2dea1edacc 100644 --- a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h +++ b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h @@ -22,10 +22,8 @@ #pragma once /** - * MRR ESPE pin assignments - * MRR ESPE is a 3D printer control board based on the ESP32 microcontroller. - * Supports 5 stepper drivers (using I2S stepper stream), heated bed, - * single hotend, and LCD controller. + * MKS TinyBee pin assignments + * https://github.com/makerbase-mks/MKS-TinyBee */ #include "env_validate.h" @@ -179,7 +177,7 @@ #if SD_CONNECTION_IS(ONBOARD) #define FORCE_SOFT_SPI #endif - #if BOTH(MKS_MINI_12864_V3, HAS_MEDIA) + #if ALL(MKS_MINI_12864_V3, HAS_MEDIA) #define PAUSE_LCD_FOR_BUSY_SD #endif #else diff --git a/Marlin/src/pins/gd32f1/pins_SOVOL_V131.h b/Marlin/src/pins/gd32f1/pins_SOVOL_V131.h index 44e5275423..e92c24b86c 100644 --- a/Marlin/src/pins/gd32f1/pins_SOVOL_V131.h +++ b/Marlin/src/pins/gd32f1/pins_SOVOL_V131.h @@ -63,7 +63,9 @@ #define E0_SERIAL_RX_PIN PC14 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif #endif // HAS_TMC_UART diff --git a/Marlin/src/pins/gd32f1/pins_TRIGORILLA_V006.h b/Marlin/src/pins/gd32f1/pins_TRIGORILLA_V006.h index ee4376c50a..abdd35f058 100644 --- a/Marlin/src/pins/gd32f1/pins_TRIGORILLA_V006.h +++ b/Marlin/src/pins/gd32f1/pins_TRIGORILLA_V006.h @@ -122,7 +122,7 @@ // // SPI // - #define SPI_DEVICE -1 + #define SPI_DEVICE -1 // Maple #define SCK_PIN -1 #define MISO_PIN -1 #define MOSI_PIN -1 diff --git a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h index b414c0015f..19ea927531 100644 --- a/Marlin/src/pins/linux/pins_RAMPS_LINUX.h +++ b/Marlin/src/pins/linux/pins_RAMPS_LINUX.h @@ -221,12 +221,12 @@ // #if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) #if !defined(NUM_SERVOS) || NUM_SERVOS == 0 // Prefer the servo connector - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_DIR_PIN 5 #elif HAS_FREE_AUX2_PINS // try to use AUX 2 - #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! #define SPINDLE_DIR_PIN 65 #endif #endif @@ -381,8 +381,8 @@ #define TFT_CS_PIN 49 #define TFT_DC_PIN 43 #define TFT_SCK_PIN SD_SCK_PIN - #define TFT_MOSI_PIN SD_MOSI_PIN #define TFT_MISO_PIN SD_MISO_PIN + #define TFT_MOSI_PIN SD_MOSI_PIN #define LCD_USE_DMA_SPI #define BTN_EN1 40 @@ -396,19 +396,19 @@ #define SPI_FLASH #if ENABLED(SPI_FLASH) - #define SPI_DEVICE 1 + #define SPI_DEVICE 1 // Maple #define SPI_FLASH_SIZE 0x1000000 // 16MB #define SPI_FLASH_CS_PIN 31 - #define SPI_FLASH_MOSI_PIN SD_MOSI_PIN - #define SPI_FLASH_MISO_PIN SD_MISO_PIN #define SPI_FLASH_SCK_PIN SD_SCK_PIN + #define SPI_FLASH_MISO_PIN SD_MISO_PIN + #define SPI_FLASH_MOSI_PIN SD_MOSI_PIN #endif #define TFT_BUFFER_SIZE 0xFFFF #ifndef TFT_DRIVER #define TFT_DRIVER ST7796 #endif - #ifndef TOUCH_SCREEN_CALIBRATION + #if DISABLED(TOUCH_SCREEN_CALIBRATION) #if ENABLED(TFT_RES_320x240) #ifndef TOUCH_CALIBRATION_X #define TOUCH_CALIBRATION_X 20525 @@ -477,7 +477,7 @@ #define LCD_PINS_EN 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) + #elif ALL(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS 40 #define LCD_PINS_EN 42 @@ -509,7 +509,7 @@ #else - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) #define LCD_PINS_DC 25 // Set as output on init #define LCD_PINS_RS 27 // Pull low for 1s to init // DOGM SPI LCD Support @@ -593,7 +593,7 @@ #define LCD_SDSS SDSS #define SD_DETECT_PIN 49 - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) #define DOGLCD_CS 45 #define DOGLCD_A0 44 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 423c89b8c9..c498af3a64 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -130,7 +130,7 @@ #define LCD_PINS_EN P0_18 // (MOSI) EXP1-3 #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 - #if BOTH(HAS_MARLINUI_HD44780, IS_RRD_SC) + #if ALL(HAS_MARLINUI_HD44780, IS_RRD_SC) #error "REPRAP_DISCOUNT_SMART_CONTROLLER displays aren't supported by the BIQU B300 v1.0" #endif diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index 278ba12dd5..3fb29b9092 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -107,7 +107,7 @@ #define LCD_PINS_EN P0_18 // (MOSI) EXP1-3 #define LCD_PINS_D4 P0_15 // (SCK) EXP1-5 - #if BOTH(HAS_MARLINUI_HD44780, IS_RRD_SC) + #if ALL(HAS_MARLINUI_HD44780, IS_RRD_SC) #error "REPRAP_DISCOUNT_SMART_CONTROLLER displays aren't supported by the BIQU BQ111-A4" #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h index 90a2ef8afc..8cca8ec440 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h @@ -186,8 +186,11 @@ #define E1_SERIAL_RX_PIN P1_01 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART /** * ------ ------ @@ -404,7 +407,7 @@ #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif 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 41190e644f..a3fb8f6488 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -243,8 +243,11 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART /** ------ ------ * 1.30 | 1 2 | 0.28 0.17 | 1 2 | 0.15 @@ -447,7 +450,7 @@ #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 2b01b4ce6f..75eea8e0f6 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -27,8 +27,8 @@ // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT //#define BTT_MOTOR_EXPANSION -#if BOTH(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) - #if EITHER(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) +#if ALL(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) + #if ANY(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) #define EXP_MOT_USE_EXP2_ONLY 1 #else #error "You can't use both an LCD and a Motor Expansion Module on EXP1/EXP2 at the same time." diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 92c405b267..a9184073c5 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -106,7 +106,9 @@ #define E2_SERIAL_RX_PIN E2_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif #else #error "TMC2208 UART configuration is required for GMarsh X6." #endif diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index 09a3075301..a4150aa22f 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -240,7 +240,7 @@ #define LCD_SDSS P0_28 // EXP2.4 #define LCD_PINS_EN P0_18 // EXP1.3 #define LCD_PINS_D4 P0_15 // EXP1.5 - #if EITHER(VIKI2, miniVIKI) + #if ANY(VIKI2, miniVIKI) #define DOGLCD_SCK SD_SCK_PIN #define DOGLCD_MOSI SD_MOSI_PIN #endif @@ -265,7 +265,7 @@ //#define FORCE_SOFT_SPI // Use this if default of hardware SPI causes display problems // results in LCD soft SPI mode 3, SD soft SPI mode 0 - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN P2_12 // J8-4 (LCD_D6 on FYSETC schematic) #endif @@ -336,8 +336,11 @@ #define E0_SERIAL_RX_PIN P0_26 // TH4 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // UNUSED //#define PIN_P0_02 P0_02 // AUX1 (Interrupt Capable/ADC/Serial Port 0) diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index 0994b20a0c..42a0155471 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -184,7 +184,10 @@ #define Z2_SERIAL_RX_PIN P1_17 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + #endif // HAS_TMC_UART // @@ -368,7 +371,7 @@ #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 6639053d5e..f3b134cd36 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -151,8 +151,11 @@ #endif // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -204,9 +207,9 @@ #endif #ifndef FAN0_PIN - #if EITHER(FET_ORDER_EFB, FET_ORDER_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #if ANY(FET_ORDER_EFB, FET_ORDER_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan #define FAN0_PIN MOSFET_B_PIN - #elif EITHER(FET_ORDER_EEF, FET_ORDER_SF) // Hotend, Hotend, Fan or Spindle, Fan + #elif ANY(FET_ORDER_EEF, FET_ORDER_SF) // Hotend, Hotend, Fan or Spindle, Fan #define FAN0_PIN MOSFET_C_PIN #elif FET_ORDER_EEB // Hotend, Hotend, Bed #define FAN0_PIN P1_18 // (4) IO pin. Buffer needed @@ -249,8 +252,8 @@ #error "LASER_FEATURE requires 3 free servo pins." #endif #endif - #define SPINDLE_LASER_ENA_PIN SERVO1_PIN // (6) Pin should have a pullup/pulldown! #define SPINDLE_LASER_PWM_PIN SERVO3_PIN // (4) MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENA_PIN SERVO1_PIN // (6) Pin should have a pullup/pulldown! #define SPINDLE_DIR_PIN SERVO2_PIN // (5) #endif @@ -350,7 +353,7 @@ //#define SHIFT_EN_PIN P1_22 // (41) J5-4 & AUX-4 #endif - #if EITHER(VIKI2, miniVIKI) + #if ANY(VIKI2, miniVIKI) #define DOGLCD_CS P0_16 // (16) #define DOGLCD_A0 P2_06 // (59) J3-8 & AUX-2 #define DOGLCD_SCK P0_15 // (52) (SCK) J3-9 & AUX-3 @@ -375,7 +378,7 @@ #define LCD_RESET_PIN P0_16 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN P1_00 #endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h index 5899cb0f50..8412f1c12d 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h @@ -108,7 +108,7 @@ // // Display // -#if EITHER(VIKI2, miniVIKI) +#if ANY(VIKI2, miniVIKI) #define BEEPER_PIN P1_31 #define DOGLCD_A0 P2_06 #define DOGLCD_CS P0_16 diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index 1a8192bafe..92e97ca875 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -158,7 +158,7 @@ //#define SHIFT_EN_PIN P1_22 // (41) J5-4 & AUX-4 #endif - #if EITHER(VIKI2, miniVIKI) + #if ANY(VIKI2, miniVIKI) #define BEEPER_PIN P1_30 // (37) may change if cable changes #define DOGLCD_CS P0_26 // (63) J5-3 & AUX-2 #define DOGLCD_SCK SD_SCK_PIN 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 3793f65bfa..966ff5ef95 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -153,8 +153,11 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // TMC Low Power Standby pins @@ -171,7 +174,10 @@ #define TEMP_0_PIN P0_24 #define TEMP_1_PIN P0_23 #define TEMP_BED_PIN P0_25 -#define TEMP_BOARD_PIN P1_30 // Onboard thermistor, NTC100K + +#ifndef TEMP_BOARD_PIN + #define TEMP_BOARD_PIN P1_30 // Onboard thermistor, NTC100K +#endif // // Heaters / Fans @@ -254,7 +260,7 @@ #define LCD_PINS_D7 EXP1_01_PIN #define ADC_KEYPAD_PIN P1_23 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #elif ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define BTN_EN1 EXP1_03_PIN #define BTN_EN2 EXP1_05_PIN diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h index 4dc275eee7..362aafe12e 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -153,8 +153,8 @@ #undef HEATER_0_PIN #undef HEATER_BED_PIN #undef FAN0_PIN - #define SPINDLE_LASER_ENA_PIN P2_07 // FET 1 #define SPINDLE_LASER_PWM_PIN P2_05 // Bed FET + #define SPINDLE_LASER_ENA_PIN P2_07 // FET 1 #define SPINDLE_DIR_PIN P2_06 // FET 4 #endif @@ -190,7 +190,7 @@ // A custom EXP1 cable is required colored LEDs. Pins 1-5, 9, 10 of the cable go to pins 1-5, 9, 10 // on the board's EXP1 connector. Pins 6, 7, and 8 of the EXP1 cable go to the Ethernet connector. // Rev 1.2 displays do NOT require the RGB LEDs. 2.0 and 2.1 displays do require RGB. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN P1_16 // EXP1-6 => Ethernet pin 6 (top row, 3 from left) #endif diff --git a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h index fb768ed46a..d5a7a38c23 100644 --- a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h +++ b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h @@ -126,8 +126,11 @@ #define E2_SERIAL_RX_PIN E2_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index 1e71fccfe5..5e552353cd 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -56,5 +56,8 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // 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 51a8f601ee..ba78146623 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -195,7 +195,10 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + #endif // HAS_TMC_UART // @@ -386,7 +389,7 @@ #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index 3e7e784b59..3db18e4acf 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -93,7 +93,7 @@ // // LCD / Controller // -#if EITHER(VIKI2, miniVIKI) +#if ANY(VIKI2, miniVIKI) #define BEEPER_PIN P1_31 #define DOGLCD_A0 P2_11 diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index a55b9fb646..634e50c223 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -99,8 +99,11 @@ #define E0_SERIAL_RX_PIN P0_21 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temp Sensors @@ -138,7 +141,7 @@ #define SDCARD_CONNECTION ONBOARD -//#define SD_DETECT_PIN P0_25 // SD_CD +#define SD_DETECT_PIN P0_27 // SD_CD #define SD_SCK_PIN P0_07 #define SD_MISO_PIN P0_08 #define SD_MOSI_PIN P0_09 @@ -214,7 +217,7 @@ #endif -#if EITHER(CR10_STOCKDISPLAY, MKS_MINI_12864) +#if ANY(CR10_STOCKDISPLAY, MKS_MINI_12864) #define BTN_EN1 EXP1_03_PIN #define BTN_EN2 EXP1_05_PIN #define BTN_ENC EXP1_02_PIN diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index 61c61f94ff..783a93a85b 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -47,14 +47,12 @@ #define Y_MAX_PIN 28 #define Z_MIN_PIN 30 -#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 +#if ENABLED(BLTOUCH) && !defined(SERVO0_PIN) + #define SERVO0_PIN 32 +#endif + +#if SERVO0_PIN == 32 + #define Z_MAX_PIN -1 #else #define Z_MAX_PIN 32 #endif @@ -102,64 +100,100 @@ // // Misc. Functions // -#define SDSS 53 + +// Power monitoring pins - set to 0 for main VIN, 1 for dedicated bed supply rail. +// Don't forget to enable POWER_MONITOR_VOLTAGE in Configuration_adv.h +// and set POWER_MONITOR_VOLTS_PER_VOLT to 0.090909. +#define POWER_MONITOR_VOLTAGE_PIN 0 + +/** LCD SDCARD + * ------ ------ + * (TX1) 18 | 1 2 | 19 (RX1) (MISO) 50 | 1 2 | 52 (SCK) + * (RX2) 17 | 3 4 | 20 (SDA) 42 | 3 4 | 53 (SS) + * (TX2) 16 | 5 6 21 (SCL) 40 | 5 6 51 (MOSI) + * 5 | 7 8 | 6 38 | 7 8 | RESET + * GND | 9 10 | 5V GND | 9 10 | 5V/3V3 + * ------ ------ + * SV1 SV3 + * + * GT2560 LCD & SD headers follow typical EXP1 & EXP2 format. + * SD header voltage pin set by link pads beneath the header; R25 for 5V, R44 for 3.3V (default) + * Pins 20 (SDA) and 21 (SCL) have external 10K pull-ups on the board. + */ + +#define EXP1_01_PIN 18 // TX1 / BEEPER +#define EXP1_02_PIN 19 // RX1 / ENC +#define EXP1_03_PIN 17 // RX2 / CS +#define EXP1_04_PIN 20 // SDA / A0 +#define EXP1_05_PIN 16 // TX2 / LCD_RS +#define EXP1_06_PIN 21 // SCL / CS +#define EXP1_07_PIN 5 // D6 / A0 +#define EXP1_08_PIN 6 // D7 / D4 + +#define EXP2_01_PIN 50 // MISO +#define EXP2_02_PIN 52 // SCK +#define EXP2_03_PIN 42 // EN2 +#define EXP2_04_PIN 53 // SDSS +#define EXP2_05_PIN 40 // EN1 +#define EXP2_06_PIN 51 // MOSI +#define EXP2_07_PIN 38 // SD_DET +#define EXP2_08_PIN -1 // RESET + +#define SDSS EXP2_04_PIN #define LED_PIN 13 -#define PS_ON_PIN 12 -#define SUICIDE_PIN 54 // Must be enabled at startup to keep power flowing -#define KILL_PIN -1 #if HAS_WIRED_LCD - #define BEEPER_PIN 18 + #define BEEPER_PIN EXP1_01_PIN #if IS_NEWPANEL #if ENABLED(MKS_MINI_12864) - #define DOGLCD_A0 5 - #define DOGLCD_CS 21 - #define BTN_EN1 40 - #define BTN_EN2 42 + #define DOGLCD_CS EXP1_06_PIN + #define DOGLCD_A0 EXP1_07_PIN + #define BTN_EN1 EXP2_05_PIN + #define BTN_EN2 EXP2_03_PIN #elif ENABLED(FYSETC_MINI_12864) // Disconnect EXP2-1 and EXP2-2, otherwise future firmware upload won't work. - #define DOGLCD_A0 20 - #define DOGLCD_CS 17 + #define DOGLCD_CS EXP1_03_PIN + #define DOGLCD_A0 EXP1_04_PIN - #define NEOPIXEL_PIN 21 - #define BTN_EN1 42 - #define BTN_EN2 40 + #define NEOPIXEL_PIN EXP1_06_PIN + #define BTN_EN1 EXP2_03_PIN + #define BTN_EN2 EXP2_05_PIN - #define LCD_RESET_PIN 16 + #define LCD_RESET_PIN EXP1_05_PIN #define LCD_CONTRAST_INIT 220 #define LCD_BACKLIGHT_PIN -1 #else - #define LCD_PINS_RS 20 - #define LCD_PINS_EN 17 - #define LCD_PINS_D4 16 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 5 - #define LCD_PINS_D7 6 - #define BTN_EN1 42 - #define BTN_EN2 40 + #define LCD_PINS_RS EXP1_04_PIN + #define LCD_PINS_EN EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN + #define LCD_PINS_D5 EXP1_06_PIN + #define LCD_PINS_D6 EXP1_07_PIN + #define LCD_PINS_D7 EXP1_08_PIN + #define BTN_EN1 EXP2_03_PIN + #define BTN_EN2 EXP2_05_PIN #endif - #define BTN_ENC 19 - #define SD_DETECT_PIN 38 + #define BTN_ENC EXP1_02_PIN + #define SD_DETECT_PIN EXP2_07_PIN #else // !IS_NEWPANEL - #define SHIFT_CLK_PIN 38 - #define SHIFT_LD_PIN 42 - #define SHIFT_OUT_PIN 40 - #define SHIFT_EN_PIN 17 + #define SHIFT_CLK_PIN EXP2_07_PIN + #define SHIFT_LD_PIN EXP2_03_PIN + #define SHIFT_OUT_PIN EXP2_05_PIN + #define SHIFT_EN_PIN EXP1_03_PIN - #define LCD_PINS_RS 16 - #define LCD_PINS_EN 5 - #define LCD_PINS_D4 6 - #define LCD_PINS_D5 21 - #define LCD_PINS_D6 20 - #define LCD_PINS_D7 19 + #define LCD_PINS_RS EXP1_05_PIN + #define LCD_PINS_EN EXP1_07_PIN + #define LCD_PINS_D4 EXP1_08_PIN + #define LCD_PINS_D5 EXP1_06_PIN + #define LCD_PINS_D6 EXP1_04_PIN + #define LCD_PINS_D7 EXP1_02_PIN #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h index a982a0e00e..1905f58108 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A_PLUS.h @@ -30,8 +30,6 @@ #define BOARD_INFO_NAME "GT2560 Rev.A+" -#include "pins_GT2560_REV_A.h" +#define SERVO0_PIN 11 -#if DISABLED(BLTOUCH) - #define SERVO0_PIN 32 -#endif +#include "pins_GT2560_REV_A.h" diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 61f30fc7d4..0c588e6516 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -168,18 +168,10 @@ #define BEEPER_PIN 18 #if ENABLED(YHCB2004) - #ifndef YHCB2004_CLK - #define YHCB2004_CLK 5 - #define DIO52 YHCB2004_CLK - #endif - #ifndef YHCB2004_MOSI - #define YHCB2004_MOSI 21 - #define DIO50 YHCB2004_MOSI - #endif - #ifndef YHCB2004_MISO - #define YHCB2004_MISO 36 - #define DIO51 YHCB2004_MISO - #endif + #define YHCB2004_MOSI_PIN 21 + #define YHCB2004_MISO_PIN 36 + #define YHCB2004_SCK_PIN 5 + #define YHCB2004_SS_PIN SS #elif HAS_WIRED_LCD #ifndef LCD_PINS_RS #define LCD_PINS_RS 20 diff --git a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h index 772a45a918..2422dfdd73 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3_A20.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3_A20.h @@ -26,12 +26,16 @@ * ATmega2560 */ -#define LCD_PINS_RS 5 -#define LCD_PINS_EN 36 -#define LCD_PINS_D4 21 -#define LCD_PINS_D7 6 +#if HAS_WIRED_LCD + #define LCD_PINS_RS 5 + #define LCD_PINS_EN 36 + #define LCD_PINS_D4 21 + #define LCD_PINS_D7 6 +#endif -#define SPEAKER // The speaker can produce tones +#ifndef SPEAKER + #define SPEAKER // The speaker can produce tones +#endif #if IS_NEWPANEL #define BTN_EN1 16 diff --git a/Marlin/src/pins/mega/pins_GT2560_V4_A20.h b/Marlin/src/pins/mega/pins_GT2560_V4_A20.h index 3b3a80caa8..405a3aba5b 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V4_A20.h +++ b/Marlin/src/pins/mega/pins_GT2560_V4_A20.h @@ -28,12 +28,16 @@ #define BOARD_INFO_NAME "GT2560 4.x" -#define LCD_PINS_RS 5 -#define LCD_PINS_EN 36 -#define LCD_PINS_D4 21 -#define LCD_PINS_D7 6 +#if HAS_WIRED_LCD + #define LCD_PINS_RS 5 + #define LCD_PINS_EN 36 + #define LCD_PINS_D4 21 + #define LCD_PINS_D7 6 +#endif -#define SPEAKER // The speaker can produce tones +#ifndef SPEAKER + #define SPEAKER // The speaker can produce tones +#endif #if IS_NEWPANEL #define BTN_EN1 16 diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index 79eef14366..512da02834 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -114,9 +114,9 @@ // M3/M4/M5 - Spindle/Laser Control // #if HAS_CUTTER - #define SPINDLE_DIR_PIN 16 - #define SPINDLE_LASER_ENA_PIN 17 // Pin should have a pullup! #define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 17 // Pin should have a pullup! + #define SPINDLE_DIR_PIN 16 #endif // diff --git a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h index 19808817c9..049917b6b6 100644 --- a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h +++ b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h @@ -162,6 +162,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 7 // Pullup! -#define SPINDLE_DIR_PIN 8 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 7 // Pullup! + #define SPINDLE_DIR_PIN 8 +#endif diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index 0e2ac291b2..066b577c62 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -130,6 +130,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_PWM_PIN 3 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 4 // Pullup! -#define SPINDLE_DIR_PIN 11 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 3 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 4 // Pullup! + #define SPINDLE_DIR_PIN 11 +#endif diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index d6840de8d0..ff118e7323 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -122,9 +122,11 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_PWM_PIN 3 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 16 // Pullup! -#define SPINDLE_DIR_PIN 11 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 3 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 16 // Pullup! + #define SPINDLE_DIR_PIN 11 +#endif // // LCD / Controller diff --git a/Marlin/src/pins/mega/pins_MINITRONICS.h b/Marlin/src/pins/mega/pins_MINITRONICS.h index 6d0309c4c1..c8828faea7 100644 --- a/Marlin/src/pins/mega/pins_MINITRONICS.h +++ b/Marlin/src/pins/mega/pins_MINITRONICS.h @@ -141,7 +141,7 @@ #define HEATER_BED_PIN 4 // won't compile #define TEMP_BED_PIN 50 #define TEMP_0_PIN 51 - #define SPINDLE_LASER_ENA_PIN 52 // using A6 because it already has a pullup #define SPINDLE_LASER_PWM_PIN 3 // WARNING - LED & resistor pull up to +12/+24V stepper voltage + #define SPINDLE_LASER_ENA_PIN 52 // using A6 because it already has a pullup #define SPINDLE_DIR_PIN 53 #endif diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 86a36c7580..7e235ca80a 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -38,15 +38,15 @@ #define MAX_E_STEPPERS 8 #if NONE(FET_ORDER_EEF, FET_ORDER_EEB, FET_ORDER_EFF, FET_ORDER_EFB, FET_ORDER_SF) - #if MB(RAMPS_13_EFB, RAMPS_14_EFB, RAMPS_PLUS_EFB, RAMPS_14_RE_ARM_EFB, RAMPS_SMART_EFB, RAMPS_DUO_EFB, RAMPS4DUE_EFB) + #if MB(RAMPS_13_EFB, RAMPS_14_EFB, RAMPS_PLUS_EFB, RAMPS_14_RE_ARM_EFB, RAMPS_SMART_EFB, RAMPS_DUO_EFB, RAMPS4DUE_EFB, RAMPS_BTT_16_PLUS_EFB) #define FET_ORDER_EFB 1 - #elif MB(RAMPS_13_EEB, RAMPS_14_EEB, RAMPS_PLUS_EEB, RAMPS_14_RE_ARM_EEB, RAMPS_SMART_EEB, RAMPS_DUO_EEB, RAMPS4DUE_EEB) + #elif MB(RAMPS_13_EEB, RAMPS_14_EEB, RAMPS_PLUS_EEB, RAMPS_14_RE_ARM_EEB, RAMPS_SMART_EEB, RAMPS_DUO_EEB, RAMPS4DUE_EEB, RAMPS_BTT_16_PLUS_EEB) #define FET_ORDER_EEB 1 - #elif MB(RAMPS_13_EFF, RAMPS_14_EFF, RAMPS_PLUS_EFF, RAMPS_14_RE_ARM_EFF, RAMPS_SMART_EFF, RAMPS_DUO_EFF, RAMPS4DUE_EFF) + #elif MB(RAMPS_13_EFF, RAMPS_14_EFF, RAMPS_PLUS_EFF, RAMPS_14_RE_ARM_EFF, RAMPS_SMART_EFF, RAMPS_DUO_EFF, RAMPS4DUE_EFF, RAMPS_BTT_16_PLUS_EFF) #define FET_ORDER_EFF 1 - #elif MB(RAMPS_13_EEF, RAMPS_14_EEF, RAMPS_PLUS_EEF, RAMPS_14_RE_ARM_EEF, RAMPS_SMART_EEF, RAMPS_DUO_EEF, RAMPS4DUE_EEF) + #elif MB(RAMPS_13_EEF, RAMPS_14_EEF, RAMPS_PLUS_EEF, RAMPS_14_RE_ARM_EEF, RAMPS_SMART_EEF, RAMPS_DUO_EEF, RAMPS4DUE_EEF, RAMPS_BTT_16_PLUS_EEF) #define FET_ORDER_EEF 1 - #elif MB(RAMPS_13_SF, RAMPS_14_SF, RAMPS_PLUS_SF, RAMPS_14_RE_ARM_SF, RAMPS_SMART_SF, RAMPS_DUO_SF, RAMPS4DUE_SF) + #elif MB(RAMPS_13_SF, RAMPS_14_SF, RAMPS_PLUS_SF, RAMPS_14_RE_ARM_SF, RAMPS_SMART_SF, RAMPS_DUO_SF, RAMPS4DUE_SF, RAMPS_BTT_16_PLUS_SF) #define FET_ORDER_SF 1 #elif HAS_MULTI_HOTEND || (HAS_EXTRUDERS && HAS_CUTTER) #if TEMP_SENSOR_BED @@ -61,10 +61,61 @@ #endif #endif -#if !(BOTH(HAS_WIRED_LCD, IS_NEWPANEL) && ANY(PANEL_ONE, VIKI2, miniVIKI, WYH_L12864, MINIPANEL, REPRAPWORLD_KEYPAD)) +#if !(ALL(HAS_WIRED_LCD, IS_NEWPANEL) && ANY(PANEL_ONE, VIKI2, miniVIKI, WYH_L12864, MINIPANEL, REPRAPWORLD_KEYPAD)) #define HAS_FREE_AUX2_PINS 1 #endif +// +// Check for additional used endstop pins +// +#ifndef X_MIN_PIN + #define X_MIN_PIN 1001 +#endif +#ifndef Y_MIN_PIN + #define Y_MIN_PIN 1002 +#endif +#ifndef Z_MIN_PIN + #define Z_MIN_PIN 1003 +#endif +#ifndef X_MAX_PIN + #define X_MAX_PIN 1004 +#endif +#ifndef Y_MAX_PIN + #define Y_MAX_PIN 1005 +#endif +#ifndef Z_MAX_PIN + #define Z_MAX_PIN 1006 +#endif +#define _ENDSTOP_IS_ANY(P) (HAS_EXTRA_ENDSTOPS && (X2_STOP_PIN == P || Y2_STOP_PIN == P || Z2_STOP_PIN == P || Z3_STOP_PIN == P || Z4_STOP_PIN == P)) +#if ENABLED(DUAL_X_CARRIAGE) || _ENDSTOP_IS_ANY(X_MIN_PIN) || _ENDSTOP_IS_ANY(X_MAX_PIN) + #define NEEDS_X_MINMAX 1 +#endif +#if _ENDSTOP_IS_ANY(Y_MIN_PIN) || _ENDSTOP_IS_ANY(Y_MAX_PIN) + #define NEEDS_Y_MINMAX 1 +#endif +#if _ENDSTOP_IS_ANY(Z_MIN_PIN) || _ENDSTOP_IS_ANY(Z_MAX_PIN) || ALL(Z_HOME_TO_MAX, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define NEEDS_Z_MINMAX 1 +#endif +#undef _ENDSTOP_IS_ANY +#if X_MIN_PIN > 1000 + #undef X_MIN_PIN +#endif +#if Y_MIN_PIN > 1000 + #undef Y_MIN_PIN +#endif +#if Z_MIN_PIN > 1000 + #undef Z_MIN_PIN +#endif +#if X_MAX_PIN > 1000 + #undef X_MAX_PIN +#endif +#if Y_MAX_PIN > 1000 + #undef Y_MAX_PIN +#endif +#if Z_MAX_PIN > 1000 + #undef Z_MAX_PIN +#endif + // Test the target within the included pins file #ifdef __MARLIN_DEPS__ #define NOT_TARGET(V...) 0 @@ -73,748 +124,766 @@ #endif // -// RAMPS 1.3 / 1.4 - ATmega1280, ATmega2560 +// RAMPS 1.3 / 1.4 / 1.6+ - ATmega1280, ATmega2560 // #if MB(RAMPS_OLD) - #include "ramps/pins_RAMPS_OLD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_RAMPS_PLUS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 +#elif MB(RAMPS_BTT_16_PLUS_EFB, RAMPS_BTT_16_PLUS_EEB, RAMPS_BTT_16_PLUS_EFF, RAMPS_BTT_16_PLUS_EEF, RAMPS_BTT_16_PLUS_SF) + #include "ramps/pins_RAMPS_BTT_16_PLUS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 // // RAMPS Derivatives - ATmega1280, ATmega2560 // #elif MB(3DRAG) - #include "ramps/pins_3DRAG.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_3DRAG.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8200) - #include "ramps/pins_K8200.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_K8200.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8400) - #include "ramps/pins_K8400.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_K8400.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8600) - #include "ramps/pins_K8600.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_K8600.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8800) - #include "ramps/pins_K8800.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_K8800.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(BAM_DICE) - #include "ramps/pins_RAMPS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_RAMPS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(BAM_DICE_DUE) - #include "ramps/pins_BAM_DICE_DUE.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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 + #include "ramps/pins_MKS_BASE_10.h" // ATmega2560 env:mega2560 #elif MB(MKS_BASE_14) - #include "ramps/pins_MKS_BASE_14.h" // ATmega2560 env:mega2560 + #include "ramps/pins_MKS_BASE_14.h" // ATmega2560 env:mega2560 #elif MB(MKS_BASE_15) - #include "ramps/pins_MKS_BASE_15.h" // ATmega2560 env:mega2560 + #include "ramps/pins_MKS_BASE_15.h" // ATmega2560 env:mega2560 #elif MB(MKS_BASE_16) - #include "ramps/pins_MKS_BASE_16.h" // ATmega2560 env:mega2560 + #include "ramps/pins_MKS_BASE_16.h" // ATmega2560 env:mega2560 #elif MB(MKS_BASE_HEROIC) - #include "ramps/pins_MKS_BASE_HEROIC.h" // ATmega2560 env:mega2560 + #include "ramps/pins_MKS_BASE_HEROIC.h" // ATmega2560 env:mega2560 #elif MB(MKS_GEN_13) - #include "ramps/pins_MKS_GEN_13.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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 + #include "ramps/pins_BIQU_KFB_2.h" // ATmega2560 env:mega2560 #elif MB(ZRIB_V20) - #include "ramps/pins_ZRIB_V20.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_ZRIB_V20.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ZRIB_V52) - #include "ramps/pins_ZRIB_V52.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_ZRIB_V52.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ZRIB_V53) - #include "ramps/pins_ZRIB_V53.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_ZRIB_V53.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(FELIX2) - #include "ramps/pins_FELIX2.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_FELIX2.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RIGIDBOARD) - #include "ramps/pins_RIGIDBOARD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_RIGIDBOARD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RIGIDBOARD_V2) - #include "ramps/pins_RIGIDBOARD_V2.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_RIGIDBOARD_V2.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(SAINSMART_2IN1) - #include "ramps/pins_SAINSMART_2IN1.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_SAINSMART_2IN1.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ULTIMAKER) - #include "ramps/pins_ULTIMAKER.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "ramps/pins_ULTIMAKER.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ULTIMAKER_OLD) - #include "ramps/pins_ULTIMAKER_OLD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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 + #include "ramps/pins_AZTEEG_X3.h" // ATmega2560 env:mega2560 #elif MB(AZTEEG_X3_PRO) - #include "ramps/pins_AZTEEG_X3_PRO.h" // ATmega2560 env:mega2560 + #include "ramps/pins_AZTEEG_X3_PRO.h" // ATmega2560 env:mega2560 #elif MB(ULTIMAIN_2) - #include "ramps/pins_ULTIMAIN_2.h" // ATmega2560 env:mega2560ext + #include "ramps/pins_ULTIMAIN_2.h" // ATmega2560 env:mega2560ext #elif MB(FORMBOT_RAPTOR) - #include "ramps/pins_FORMBOT_RAPTOR.h" // ATmega2560 env:mega2560 + #include "ramps/pins_FORMBOT_RAPTOR.h" // ATmega2560 env:mega2560 #elif MB(FORMBOT_RAPTOR2) - #include "ramps/pins_FORMBOT_RAPTOR2.h" // ATmega2560 env:mega2560 + #include "ramps/pins_FORMBOT_RAPTOR2.h" // ATmega2560 env:mega2560 #elif MB(FORMBOT_TREX2PLUS) - #include "ramps/pins_FORMBOT_TREX2PLUS.h" // ATmega2560 env:mega2560 + #include "ramps/pins_FORMBOT_TREX2PLUS.h" // ATmega2560 env:mega2560 #elif MB(FORMBOT_TREX3) - #include "ramps/pins_FORMBOT_TREX3.h" // ATmega2560 env:mega2560 + #include "ramps/pins_FORMBOT_TREX3.h" // ATmega2560 env:mega2560 #elif MB(RUMBA) - #include "ramps/pins_RUMBA.h" // ATmega2560 env:mega2560 + #include "ramps/pins_RUMBA.h" // ATmega2560 env:mega2560 #elif MB(RUMBA_RAISE3D) - #include "ramps/pins_RUMBA_RAISE3D.h" // ATmega2560 env:mega2560 + #include "ramps/pins_RUMBA_RAISE3D.h" // ATmega2560 env:mega2560 #elif MB(RL200) - #include "ramps/pins_RL200.h" // ATmega2560 env:mega2560 + #include "ramps/pins_RL200.h" // ATmega2560 env:mega2560 #elif MB(BQ_ZUM_MEGA_3D) - #include "ramps/pins_BQ_ZUM_MEGA_3D.h" // ATmega2560 env:mega2560ext + #include "ramps/pins_BQ_ZUM_MEGA_3D.h" // ATmega2560 env:mega2560ext #elif MB(MAKEBOARD_MINI) - #include "ramps/pins_MAKEBOARD_MINI.h" // ATmega2560 env:mega2560 + #include "ramps/pins_MAKEBOARD_MINI.h" // ATmega2560 env:mega2560 #elif MB(TRIGORILLA_13) - #include "ramps/pins_TRIGORILLA_13.h" // ATmega2560 env:mega2560 + #include "ramps/pins_TRIGORILLA_13.h" // ATmega2560 env:mega2560 #elif MB(TRIGORILLA_14, TRIGORILLA_14_11) - #include "ramps/pins_TRIGORILLA_14.h" // ATmega2560 env:mega2560 + #include "ramps/pins_TRIGORILLA_14.h" // ATmega2560 env:mega2560 #elif MB(RAMPS_ENDER_4) - #include "ramps/pins_RAMPS_ENDER_4.h" // ATmega2560 env:mega2560 + #include "ramps/pins_RAMPS_ENDER_4.h" // ATmega2560 env:mega2560 #elif MB(RAMPS_CREALITY) - #include "ramps/pins_RAMPS_CREALITY.h" // ATmega2560 env:mega2560 + #include "ramps/pins_RAMPS_CREALITY.h" // ATmega2560 env:mega2560 #elif MB(DAGOMA_F5) - #include "ramps/pins_DAGOMA_F5.h" // ATmega2560 env:mega2560 + #include "ramps/pins_DAGOMA_F5.h" // ATmega2560 env:mega2560 #elif MB(FYSETC_F6_13) - #include "ramps/pins_FYSETC_F6_13.h" // ATmega2560 env:FYSETC_F6 + #include "ramps/pins_FYSETC_F6_13.h" // ATmega2560 env:FYSETC_F6 #elif MB(FYSETC_F6_14) - #include "ramps/pins_FYSETC_F6_14.h" // ATmega2560 env:FYSETC_F6 + #include "ramps/pins_FYSETC_F6_14.h" // ATmega2560 env:FYSETC_F6 #elif MB(DUPLICATOR_I3_PLUS) - #include "ramps/pins_DUPLICATOR_I3_PLUS.h" // ATmega2560 env:mega2560 + #include "ramps/pins_DUPLICATOR_I3_PLUS.h" // ATmega2560 env:mega2560 #elif MB(VORON) - #include "ramps/pins_VORON.h" // ATmega2560 env:mega2560 + #include "ramps/pins_VORON.h" // ATmega2560 env:mega2560 #elif MB(TRONXY_V3_1_0) - #include "ramps/pins_TRONXY_V3_1_0.h" // ATmega2560 env:mega2560 + #include "ramps/pins_TRONXY_V3_1_0.h" // ATmega2560 env:mega2560 #elif MB(Z_BOLT_X_SERIES) - #include "ramps/pins_Z_BOLT_X_SERIES.h" // ATmega2560 env:mega2560 + #include "ramps/pins_Z_BOLT_X_SERIES.h" // ATmega2560 env:mega2560 #elif MB(TT_OSCAR) - #include "ramps/pins_TT_OSCAR.h" // ATmega2560 env:mega2560 + #include "ramps/pins_TT_OSCAR.h" // ATmega2560 env:mega2560 #elif MB(TANGO) - #include "ramps/pins_TANGO.h" // ATmega2560 env:mega2560 + #include "ramps/pins_TANGO.h" // ATmega2560 env:mega2560 #elif MB(MKS_GEN_L_V2) - #include "ramps/pins_MKS_GEN_L_V2.h" // ATmega2560 env:mega2560 + #include "ramps/pins_MKS_GEN_L_V2.h" // ATmega2560 env:mega2560 #elif MB(COPYMASTER_3D) - #include "ramps/pins_COPYMASTER_3D.h" // ATmega2560 env:mega2560 + #include "ramps/pins_COPYMASTER_3D.h" // ATmega2560 env:mega2560 #elif MB(ORTUR_4) - #include "ramps/pins_ORTUR_4.h" // ATmega2560 env:mega2560 + #include "ramps/pins_ORTUR_4.h" // ATmega2560 env:mega2560 #elif MB(TENLOG_D3_HERO) - #include "ramps/pins_TENLOG_D3_HERO.h" // ATmega2560 env:mega2560 + #include "ramps/pins_TENLOG_D3_HERO.h" // ATmega2560 env:mega2560 #elif MB(TENLOG_MB1_V23) - #include "ramps/pins_TENLOG_MB1_V23.h" // ATmega2560 env:mega2560 + #include "ramps/pins_TENLOG_MB1_V23.h" // ATmega2560 env:mega2560 #elif MB(MKS_GEN_L_V21) - #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560 + #include "ramps/pins_MKS_GEN_L_V21.h" // ATmega2560 env:mega2560 #elif MB(RAMPS_S_12_EEFB, RAMPS_S_12_EEEB, RAMPS_S_12_EFFB) - #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 + #include "ramps/pins_RAMPS_S_12.h" // ATmega2560 env:mega2560 #elif MB(LONGER3D_LK1_PRO, LONGER3D_LKx_PRO) - #include "ramps/pins_LONGER3D_LKx_PRO.h" // ATmega2560 env:mega2560 + #include "ramps/pins_LONGER3D_LKx_PRO.h" // ATmega2560 env:mega2560 #elif MB(PXMALION_CORE_I3) - #include "ramps/pins_PXMALION_CORE_I3.h" // ATmega2560 env:mega2560 + #include "ramps/pins_PXMALION_CORE_I3.h" // ATmega2560 env:mega2560 #elif MB(PANOWIN_CUTLASS) - #include "ramps/pins_PANOWIN_CUTLASS.h" // ATmega2560 env:mega2560ext + #include "ramps/pins_PANOWIN_CUTLASS.h" // ATmega2560 env:mega2560ext #elif MB(KODAMA_BARDO) - #include "ramps/pins_KODAMA_BARDO.h" // ATmega2560 env:mega2560ext + #include "ramps/pins_KODAMA_BARDO.h" // ATmega2560 env:mega2560ext // // RAMBo and derivatives // #elif MB(RAMBO) - #include "rambo/pins_RAMBO.h" // ATmega2560 env:rambo + #include "rambo/pins_RAMBO.h" // ATmega2560 env:rambo #elif MB(MINIRAMBO, MINIRAMBO_10A) - #include "rambo/pins_MINIRAMBO.h" // ATmega2560 env:rambo + #include "rambo/pins_MINIRAMBO.h" // ATmega2560 env:rambo #elif MB(EINSY_RAMBO) - #include "rambo/pins_EINSY_RAMBO.h" // ATmega2560 env:rambo + #include "rambo/pins_EINSY_RAMBO.h" // ATmega2560 env:rambo #elif MB(EINSY_RETRO) - #include "rambo/pins_EINSY_RETRO.h" // ATmega2560 env:rambo + #include "rambo/pins_EINSY_RETRO.h" // ATmega2560 env:rambo #elif MB(SCOOVO_X9H) - #include "rambo/pins_SCOOVO_X9H.h" // ATmega2560 env:rambo + #include "rambo/pins_SCOOVO_X9H.h" // ATmega2560 env:rambo #elif MB(RAMBO_THINKERV2) - #include "rambo/pins_RAMBO_THINKERV2.h" // ATmega2560 env:rambo + #include "rambo/pins_RAMBO_THINKERV2.h" // ATmega2560 env:rambo // // Other ATmega1280, ATmega2560 // #elif MB(CNCONTROLS_11) - #include "mega/pins_CNCONTROLS_11.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "mega/pins_CNCONTROLS_11.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(CNCONTROLS_12) - #include "mega/pins_CNCONTROLS_12.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "mega/pins_CNCONTROLS_12.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(CNCONTROLS_15) - #include "mega/pins_CNCONTROLS_15.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "mega/pins_CNCONTROLS_15.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MIGHTYBOARD_REVE) - #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega2560, ATmega1280 env:mega2560ext env:MightyBoard1280 env:MightyBoard2560 + #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega2560, ATmega1280 env:mega2560ext env:MightyBoard1280 env:MightyBoard2560 #elif MB(CHEAPTRONIC) - #include "mega/pins_CHEAPTRONIC.h" // ATmega2560 env:mega2560 + #include "mega/pins_CHEAPTRONIC.h" // ATmega2560 env:mega2560 #elif MB(CHEAPTRONIC_V2) - #include "mega/pins_CHEAPTRONICv2.h" // ATmega2560 env:mega2560 + #include "mega/pins_CHEAPTRONICv2.h" // ATmega2560 env:mega2560 #elif MB(MEGATRONICS) - #include "mega/pins_MEGATRONICS.h" // ATmega2560 env:mega2560 + #include "mega/pins_MEGATRONICS.h" // ATmega2560 env:mega2560 #elif MB(MEGATRONICS_2) - #include "mega/pins_MEGATRONICS_2.h" // ATmega2560 env:mega2560 + #include "mega/pins_MEGATRONICS_2.h" // ATmega2560 env:mega2560 #elif MB(MEGATRONICS_3, MEGATRONICS_31, MEGATRONICS_32) - #include "mega/pins_MEGATRONICS_3.h" // ATmega2560 env:mega2560 + #include "mega/pins_MEGATRONICS_3.h" // ATmega2560 env:mega2560 #elif MB(ELEFU_3) - #include "mega/pins_ELEFU_3.h" // ATmega2560 env:mega2560 + #include "mega/pins_ELEFU_3.h" // ATmega2560 env:mega2560 #elif MB(LEAPFROG) - #include "mega/pins_LEAPFROG.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #include "mega/pins_LEAPFROG.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MEGACONTROLLER) - #include "mega/pins_MEGACONTROLLER.h" // ATmega2560 env:mega2560 + #include "mega/pins_MEGACONTROLLER.h" // ATmega2560 env:mega2560 #elif MB(GT2560_REV_A) - #include "mega/pins_GT2560_REV_A.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 + #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 + #include "mega/pins_GT2560_V3.h" // ATmega2560 env:mega2560 #elif MB(GT2560_REV_B) - #include "mega/pins_GT2560_REV_B.h" // ATmega2560 env:mega2560 + #include "mega/pins_GT2560_REV_B.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V4) - #include "mega/pins_GT2560_V4.h" // ATmega2560 env:mega2560 + #include "mega/pins_GT2560_V4.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V4_A20) - #include "mega/pins_GT2560_V4_A20.h" // ATmega2560 env:mega2560 + #include "mega/pins_GT2560_V4_A20.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V3_MC2) - #include "mega/pins_GT2560_V3_MC2.h" // ATmega2560 env:mega2560 + #include "mega/pins_GT2560_V3_MC2.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V3_A20) - #include "mega/pins_GT2560_V3_A20.h" // ATmega2560 env:mega2560 + #include "mega/pins_GT2560_V3_A20.h" // ATmega2560 env:mega2560 #elif MB(EINSTART_S) - #include "mega/pins_EINSTART-S.h" // ATmega2560, ATmega1280 env:mega2560ext env:mega1280 + #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 + #include "mega/pins_WANHAO_ONEPLUS.h" // ATmega2560 env:mega2560 #elif MB(OVERLORD) - #include "mega/pins_OVERLORD.h" // ATmega2560 env:mega2560 + #include "mega/pins_OVERLORD.h" // ATmega2560 env:mega2560 #elif MB(HJC2560C_REV1) - #include "mega/pins_HJC2560C_REV2.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 + #include "mega/pins_HJC2560C_REV2.h" // ATmega2560 env:mega2560 #elif MB(LEAPFROG_XEED2015) - #include "mega/pins_LEAPFROG_XEED2015.h" // ATmega2560 env:mega2560 + #include "mega/pins_LEAPFROG_XEED2015.h" // ATmega2560 env:mega2560 #elif MB(PICA) - #include "mega/pins_PICA.h" // ATmega2560 env:mega2560 + #include "mega/pins_PICA.h" // ATmega2560 env:mega2560 #elif MB(PICA_REVB) - #include "mega/pins_PICAOLD.h" // ATmega2560 env:mega2560 + #include "mega/pins_PICAOLD.h" // ATmega2560 env:mega2560 #elif MB(INTAMSYS40) - #include "mega/pins_INTAMSYS40.h" // ATmega2560 env:mega2560 + #include "mega/pins_INTAMSYS40.h" // ATmega2560 env:mega2560 #elif MB(MALYAN_M180) - #include "mega/pins_MALYAN_M180.h" // ATmega2560 env:mega2560 + #include "mega/pins_MALYAN_M180.h" // ATmega2560 env:mega2560 #elif MB(PROTONEER_CNC_SHIELD_V3) - #include "mega/pins_PROTONEER_CNC_SHIELD_V3.h"// ATmega2560 env:mega2560 + #include "mega/pins_PROTONEER_CNC_SHIELD_V3.h" // ATmega2560 env:mega2560 #elif MB(WEEDO_62A) - #include "mega/pins_WEEDO_62A.h" // ATmega2560 env:mega2560 + #include "mega/pins_WEEDO_62A.h" // ATmega2560 env:mega2560 // // ATmega1281, ATmega2561 // #elif MB(MINITRONICS) - #include "mega/pins_MINITRONICS.h" // ATmega1281 env:mega1280 + #include "mega/pins_MINITRONICS.h" // ATmega1281 env:mega1280 #elif MB(SILVER_GATE) - #include "mega/pins_SILVER_GATE.h" // ATmega2561 env:mega2560 + #include "mega/pins_SILVER_GATE.h" // ATmega2561 env:mega2560 // // Sanguinololu and Derivatives - ATmega644P, ATmega1284P // #elif MB(SANGUINOLOLU_11) - #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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_optiboot_optimized env:melzi_optiboot env:melzi_optimized env:melzi + #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi_optiboot_optimized env:melzi_optiboot env:melzi_optimized env:melzi +#elif MB(MELZI_CREALITY_ENDER2) + #include "sanguino/pins_MELZI_CREALITY_E2.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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p // // Other ATmega644P, ATmega644, ATmega1284P // #elif MB(GEN3_MONOLITHIC) - #include "sanguino/pins_GEN3_MONOLITHIC.h" // ATmega644P env:sanguino644p + #include "sanguino/pins_GEN3_MONOLITHIC.h" // ATmega644P env:sanguino644p #elif MB(GEN3_PLUS) - #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #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 + #include "sanguino/pins_OMCA_A.h" // ATmega644 env:sanguino644p #elif MB(OMCA) - #include "sanguino/pins_OMCA.h" // ATmega644P, ATmega644 env:sanguino644p + #include "sanguino/pins_OMCA.h" // ATmega644P, ATmega644 env:sanguino644p #elif MB(ANET_10) - #include "sanguino/pins_ANET_10.h" // ATmega1284P env:sanguino1284p env:sanguino1284p_optimized env:melzi_optiboot + #include "sanguino/pins_ANET_10.h" // ATmega1284P env:sanguino1284p env:sanguino1284p_optimized env:melzi_optiboot #elif MB(SETHI) - #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p + #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p // // Teensyduino - AT90USB1286, AT90USB1286P // #elif MB(TEENSYLU) - #include "teensy2/pins_TEENSYLU.h" // AT90USB1286, AT90USB1286P env:at90usb1286_cdc + #include "teensy2/pins_TEENSYLU.h" // AT90USB1286, AT90USB1286P env:at90usb1286_cdc #elif MB(PRINTRBOARD) - #include "teensy2/pins_PRINTRBOARD.h" // AT90USB1286 env:at90usb1286_dfu + #include "teensy2/pins_PRINTRBOARD.h" // AT90USB1286 env:at90usb1286_dfu #elif MB(PRINTRBOARD_REVF) - #include "teensy2/pins_PRINTRBOARD_REVF.h" // AT90USB1286 env:at90usb1286_dfu + #include "teensy2/pins_PRINTRBOARD_REVF.h" // AT90USB1286 env:at90usb1286_dfu #elif MB(BRAINWAVE) - #include "teensy2/pins_BRAINWAVE.h" // AT90USB646 env:at90usb1286_cdc + #include "teensy2/pins_BRAINWAVE.h" // AT90USB646 env:at90usb1286_cdc #elif MB(BRAINWAVE_PRO) - #include "teensy2/pins_BRAINWAVE_PRO.h" // AT90USB1286 env:at90usb1286_cdc + #include "teensy2/pins_BRAINWAVE_PRO.h" // AT90USB1286 env:at90usb1286_cdc #elif MB(SAV_MKI) - #include "teensy2/pins_SAV_MKI.h" // AT90USB1286 env:at90usb1286_cdc + #include "teensy2/pins_SAV_MKI.h" // AT90USB1286 env:at90usb1286_cdc #elif MB(TEENSY2) - #include "teensy2/pins_TEENSY2.h" // AT90USB1286 env:teensy20 + #include "teensy2/pins_TEENSY2.h" // AT90USB1286 env:teensy20 #elif MB(5DPRINT) - #include "teensy2/pins_5DPRINT.h" // AT90USB1286 env:at90usb1286_dfu + #include "teensy2/pins_5DPRINT.h" // AT90USB1286 env:at90usb1286_dfu // -// LPC1768 ARM Cortex M3 +// LPC1768 ARM Cortex-M3 // #elif MB(RAMPS_14_RE_ARM_EFB, RAMPS_14_RE_ARM_EEB, RAMPS_14_RE_ARM_EFF, RAMPS_14_RE_ARM_EEF, RAMPS_14_RE_ARM_SF) - #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_RAMPS_RE_ARM.h" // LPC1768 env:LPC1768 #elif MB(MKS_SBASE) - #include "lpc1768/pins_MKS_SBASE.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_MKS_SBASE.h" // LPC1768 env:LPC1768 #elif MB(MKS_SGEN_L) - #include "lpc1768/pins_MKS_SGEN_L.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_MKS_SGEN_L.h" // LPC1768 env:LPC1768 #elif MB(AZSMZ_MINI) - #include "lpc1768/pins_AZSMZ_MINI.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_AZSMZ_MINI.h" // LPC1768 env:LPC1768 #elif MB(BIQU_BQ111_A4) - #include "lpc1768/pins_BIQU_BQ111_A4.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_BIQU_BQ111_A4.h" // LPC1768 env:LPC1768 #elif MB(SELENA_COMPACT) - #include "lpc1768/pins_SELENA_COMPACT.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_SELENA_COMPACT.h" // LPC1768 env:LPC1768 #elif MB(BIQU_B300_V1_0) - #include "lpc1768/pins_BIQU_B300_V1.0.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_BIQU_B300_V1.0.h" // LPC1768 env:LPC1768 #elif MB(GMARSH_X6_REV1) - #include "lpc1768/pins_GMARSH_X6_REV1.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_GMARSH_X6_REV1.h" // LPC1768 env:LPC1768 #elif MB(BTT_SKR_V1_1) - #include "lpc1768/pins_BTT_SKR_V1_1.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_BTT_SKR_V1_1.h" // LPC1768 env:LPC1768 #elif MB(BTT_SKR_V1_3) - #include "lpc1768/pins_BTT_SKR_V1_3.h" // LPC1768 env:LPC1768 + #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 #elif MB(EMOTRONIC) - #include "lpc1768/pins_EMOTRONIC.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_EMOTRONIC.h" // LPC1768 env:LPC1768 // -// LPC1769 ARM Cortex M3 +// LPC1769 ARM Cortex-M3 // #elif MB(MKS_SGEN) - #include "lpc1769/pins_MKS_SGEN.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_MKS_SGEN.h" // LPC1769 env:LPC1769 #elif MB(AZTEEG_X5_GT) - #include "lpc1769/pins_AZTEEG_X5_GT.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_AZTEEG_X5_GT.h" // LPC1769 env:LPC1769 #elif MB(AZTEEG_X5_MINI) - #include "lpc1769/pins_AZTEEG_X5_MINI.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_AZTEEG_X5_MINI.h" // LPC1769 env:LPC1769 #elif MB(AZTEEG_X5_MINI_WIFI) - #include "lpc1769/pins_AZTEEG_X5_MINI_WIFI.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_AZTEEG_X5_MINI_WIFI.h" // LPC1769 env:LPC1769 #elif MB(COHESION3D_REMIX) - #include "lpc1769/pins_COHESION3D_REMIX.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_COHESION3D_REMIX.h" // LPC1769 env:LPC1769 #elif MB(COHESION3D_MINI) - #include "lpc1769/pins_COHESION3D_MINI.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_COHESION3D_MINI.h" // LPC1769 env:LPC1769 #elif MB(SMOOTHIEBOARD) - #include "lpc1769/pins_SMOOTHIEBOARD.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_SMOOTHIEBOARD.h" // LPC1769 env:LPC1769 #elif MB(TH3D_EZBOARD) - #include "lpc1769/pins_TH3D_EZBOARD.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_TH3D_EZBOARD.h" // LPC1769 env:LPC1769 #elif MB(BTT_SKR_V1_4_TURBO) - #include "lpc1769/pins_BTT_SKR_V1_4_TURBO.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_BTT_SKR_V1_4_TURBO.h" // LPC1769 env:LPC1769 #elif MB(MKS_SGEN_L_V2) - #include "lpc1769/pins_MKS_SGEN_L_V2.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_MKS_SGEN_L_V2.h" // LPC1769 env:LPC1769 #elif MB(BTT_SKR_E3_TURBO) - #include "lpc1769/pins_BTT_SKR_E3_TURBO.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_BTT_SKR_E3_TURBO.h" // LPC1769 env:LPC1769 #elif MB(FLY_CDY) - #include "lpc1769/pins_FLY_CDY.h" // LPC1769 env:LPC1769 + #include "lpc1769/pins_FLY_CDY.h" // LPC1769 env:LPC1769 // // Due (ATSAM) boards // #elif MB(DUE3DOM) - #include "sam/pins_DUE3DOM.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_DUE3DOM.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(DUE3DOM_MINI) - #include "sam/pins_DUE3DOM_MINI.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_DUE3DOM_MINI.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RADDS) - #include "sam/pins_RADDS.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_RADDS.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RURAMPS4D_11) - #include "sam/pins_RURAMPS4D_11.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_RURAMPS4D_11.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RURAMPS4D_13) - #include "sam/pins_RURAMPS4D_13.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_RURAMPS4D_13.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_FD_V1) - #include "sam/pins_RAMPS_FD_V1.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_RAMPS_FD_V1.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_FD_V2) - #include "sam/pins_RAMPS_FD_V2.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_RAMPS_FD_V2.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF) - #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_RAMPS_SMART.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS_DUO_EFB, RAMPS_DUO_EEB, RAMPS_DUO_EFF, RAMPS_DUO_EEF, RAMPS_DUO_SF) - #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_RAMPS_DUO.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(RAMPS4DUE_EFB, RAMPS4DUE_EEB, RAMPS4DUE_EFF, RAMPS4DUE_EEF, RAMPS4DUE_SF) - #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug + #include "sam/pins_RAMPS4DUE.h" // SAM3X8E env:DUE env:DUE_USB env:DUE_debug #elif MB(ULTRATRONICS_PRO) - #include "sam/pins_ULTRATRONICS_PRO.h" // SAM3X8E env:DUE env:DUE_debug + #include "sam/pins_ULTRATRONICS_PRO.h" // SAM3X8E env:DUE env:DUE_debug #elif MB(ARCHIM1) - #include "sam/pins_ARCHIM1.h" // SAM3X8E env:DUE_archim env:DUE_archim_debug + #include "sam/pins_ARCHIM1.h" // SAM3X8E env:DUE_archim env:DUE_archim_debug #elif MB(ARCHIM2) - #include "sam/pins_ARCHIM2.h" // SAM3X8E env:DUE_archim env:DUE_archim_debug + #include "sam/pins_ARCHIM2.h" // SAM3X8E env:DUE_archim env:DUE_archim_debug #elif MB(ALLIGATOR) - #include "sam/pins_ALLIGATOR_R2.h" // SAM3X8E env:DUE env:DUE_debug + #include "sam/pins_ALLIGATOR_R2.h" // SAM3X8E env:DUE env:DUE_debug #elif MB(CNCONTROLS_15D) - #include "sam/pins_CNCONTROLS_15D.h" // SAM3X8E env:DUE env:DUE_USB + #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 + #include "sam/pins_KRATOS32.h" // SAM3X8E env:DUE env:DUE_USB #elif MB(PRINTRBOARD_G2) - #include "sam/pins_PRINTRBOARD_G2.h" // SAM3X8C env:DUE_USB + #include "sam/pins_PRINTRBOARD_G2.h" // SAM3X8C env:DUE_USB #elif MB(ADSK) - #include "sam/pins_ADSK.h" // SAM3X8C env:DUE env:DUE_debug + #include "sam/pins_ADSK.h" // SAM3X8C env:DUE env:DUE_debug // // STM32 ARM Cortex-M0 // + #elif MB(MALYAN_M200_V2) - #include "stm32f0/pins_MALYAN_M200_V2.h" // STM32F0 env:STM32F070RB_malyan env:STM32F070CB_malyan + #include "stm32f0/pins_MALYAN_M200_V2.h" // STM32F0 env:STM32F070RB_malyan env:STM32F070CB_malyan #elif MB(MALYAN_M300) - #include "stm32f0/pins_MALYAN_M300.h" // STM32F070 env:malyan_M300 + #include "stm32f0/pins_MALYAN_M300.h" // STM32F0 env:malyan_M300 + +// +// STM32 ARM Cortex-M0+ +// + +#elif MB(BTT_EBB42_V1_1) + #include "stm32g0/pins_BTT_EBB42_V1_1.h" // STM32G0 env:BTT_EBB42_V1_1_filament_extruder +#elif MB(BTT_SKR_MINI_E3_V3_0) + #include "stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h" // STM32G0 env:STM32G0B1RE_btt env:STM32G0B1RE_btt_xfer +#elif MB(BTT_MANTA_M4P_V1_0) + #include "stm32g0/pins_BTT_MANTA_M4P_V1_0.h" // STM32G0 env:STM32G0B1RE_manta_btt env:STM32G0B1RE_manta_btt_xfer +#elif MB(BTT_MANTA_M5P_V1_0) + #include "stm32g0/pins_BTT_MANTA_M5P_V1_0.h" // STM32G0 env:STM32G0B1RE_manta_btt env:STM32G0B1RE_manta_btt_xfer +#elif MB(BTT_MANTA_E3_EZ_V1_0) + #include "stm32g0/pins_BTT_MANTA_E3_EZ_V1_0.h" // STM32G0 env:STM32G0B1RE_manta_btt env:STM32G0B1RE_manta_btt_xfer +#elif MB(BTT_MANTA_M8P_V1_0) + #include "stm32g0/pins_BTT_MANTA_M8P_V1_0.h" // STM32G0 env:STM32G0B1VE_btt env:STM32G0B1VE_btt_xfer +#elif MB(BTT_MANTA_M8P_V1_1) + #include "stm32g0/pins_BTT_MANTA_M8P_V1_1.h" // STM32G0 env:STM32G0B1VE_btt env:STM32G0B1VE_btt_xfer // // STM32 ARM Cortex-M3 // #elif MB(STM32F103RE) - #include "stm32f1/pins_STM32F1R.h" // STM32F103RE env:STM32F103RE env:STM32F103RE_maple + #include "stm32f1/pins_STM32F1R.h" // STM32F1 env:STM32F103RE env:STM32F103RE_maple #elif MB(MALYAN_M200) - #include "stm32f1/pins_MALYAN_M200.h" // STM32F103CB env:STM32F103CB_malyan env:STM32F103CB_malyan_maple + #include "stm32f1/pins_MALYAN_M200.h" // STM32F1 env:STM32F103CB_malyan env:STM32F103CB_malyan_maple #elif MB(STM3R_MINI) - #include "stm32f1/pins_STM3R_MINI.h" // STM32F103VE? env:STM32F103VE env:STM32F103RE_maple + #include "stm32f1/pins_STM3R_MINI.h" // STM32F1 env:STM32F103VE env:STM32F103RE_maple #elif MB(GTM32_PRO_VB) - #include "stm32f1/pins_GTM32_PRO_VB.h" // STM32F103VE env:STM32F103VE env:STM32F103VE_GTM32_maple + #include "stm32f1/pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F103VE env:STM32F103VE_GTM32_maple #elif MB(GTM32_PRO_VD) - #include "stm32f1/pins_GTM32_PRO_VD.h" // STM32F103VE env:STM32F103VE env:STM32F103VE_GTM32_maple + #include "stm32f1/pins_GTM32_PRO_VD.h" // STM32F1 env:STM32F103VE env:STM32F103VE_GTM32_maple #elif MB(GTM32_MINI) - #include "stm32f1/pins_GTM32_MINI.h" // STM32F103VE env:STM32F103VE env:STM32F103VE_GTM32_maple + #include "stm32f1/pins_GTM32_MINI.h" // STM32F1 env:STM32F103VE env:STM32F103VE_GTM32_maple #elif MB(GTM32_MINI_A30) - #include "stm32f1/pins_GTM32_MINI_A30.h" // STM32F103VE env:STM32F103VE env:STM32F103VE_GTM32_maple + #include "stm32f1/pins_GTM32_MINI_A30.h" // STM32F1 env:STM32F103VE env:STM32F103VE_GTM32_maple #elif MB(GTM32_REV_B) - #include "stm32f1/pins_GTM32_REV_B.h" // STM32F103VE env:STM32F103VE env:STM32F103VE_GTM32_maple + #include "stm32f1/pins_GTM32_REV_B.h" // STM32F1 env:STM32F103VE env:STM32F103VE_GTM32_maple #elif MB(MORPHEUS) - #include "stm32f1/pins_MORPHEUS.h" // STM32F103RE env:STM32F103RE env:STM32F103RE_maple + #include "stm32f1/pins_MORPHEUS.h" // STM32F1 env:STM32F103RE env:STM32F103RE_maple #elif MB(CHITU3D) - #include "stm32f1/pins_CHITU3D.h" // STM32F103ZE env:STM32F103ZE env:STM32F103RE_maple + #include "stm32f1/pins_CHITU3D.h" // STM32F1 env:STM32F103ZE env:STM32F103RE_maple #elif MB(MKS_ROBIN) - #include "stm32f1/pins_MKS_ROBIN.h" // STM32F1 env:mks_robin env:mks_robin_maple + #include "stm32f1/pins_MKS_ROBIN.h" // STM32F1 env:mks_robin env:mks_robin_maple #elif MB(MKS_ROBIN_MINI) - #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini env:mks_robin_mini_maple + #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini env:mks_robin_mini_maple #elif MB(MKS_ROBIN_NANO) - #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano_v1v2 env:mks_robin_nano_v1v2_maple env:mks_robin_nano_v1v2_usbmod + #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano_v1v2 env:mks_robin_nano_v1v2_maple env:mks_robin_nano_v1v2_usbmod #elif MB(MKS_ROBIN_NANO_V2) - #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano_v1v2 env:mks_robin_nano_v1v2_maple + #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano_v1v2 env:mks_robin_nano_v1v2_maple #elif MB(MKS_ROBIN_LITE) - #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite env:mks_robin_lite_maple + #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite env:mks_robin_lite_maple #elif MB(MKS_ROBIN_LITE3) - #include "stm32f1/pins_MKS_ROBIN_LITE3.h" // STM32F1 env:mks_robin_lite3 env:mks_robin_lite3_maple + #include "stm32f1/pins_MKS_ROBIN_LITE3.h" // STM32F1 env:mks_robin_lite3 env:mks_robin_lite3_maple #elif MB(MKS_ROBIN_PRO) - #include "stm32f1/pins_MKS_ROBIN_PRO.h" // STM32F1 env:mks_robin_pro env:mks_robin_pro_maple + #include "stm32f1/pins_MKS_ROBIN_PRO.h" // STM32F1 env:mks_robin_pro env:mks_robin_pro_maple #elif MB(MKS_ROBIN_E3) - #include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3 env:mks_robin_e3_maple + #include "stm32f1/pins_MKS_ROBIN_E3.h" // STM32F1 env:mks_robin_e3 env:mks_robin_e3_maple #elif MB(MKS_ROBIN_E3_V1_1) - #include "stm32f1/pins_MKS_ROBIN_E3_V1_1.h" // STM32F1 env:mks_robin_e3 + #include "stm32f1/pins_MKS_ROBIN_E3_V1_1.h" // STM32F1 env:mks_robin_e3 #elif MB(MKS_ROBIN_E3D) - #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3 + #include "stm32f1/pins_MKS_ROBIN_E3D.h" // STM32F1 env:mks_robin_e3 #elif MB(MKS_ROBIN_E3D_V1_1) - #include "stm32f1/pins_MKS_ROBIN_E3D_V1_1.h" // STM32F1 env:mks_robin_e3 env:mks_robin_e3_maple + #include "stm32f1/pins_MKS_ROBIN_E3D_V1_1.h" // STM32F1 env:mks_robin_e3 env:mks_robin_e3_maple #elif MB(MKS_ROBIN_E3P) - #include "stm32f1/pins_MKS_ROBIN_E3P.h" // STM32F1 env:mks_robin_e3p env:mks_robin_e3p_maple -#elif MB(BTT_EBB42_V1_1) - #include "stm32g0/pins_BTT_EBB42_V1_1.h" // STM32G0 env:BTT_EBB42_V1_1_filament_extruder + #include "stm32f1/pins_MKS_ROBIN_E3P.h" // STM32F1 env:mks_robin_e3p env:mks_robin_e3p_maple #elif MB(BTT_SKR_MINI_V1_1) - #include "stm32f1/pins_BTT_SKR_MINI_V1_1.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple + #include "stm32f1/pins_BTT_SKR_MINI_V1_1.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple #elif MB(BTT_SKR_MINI_E3_V1_0) - #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple + #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple #elif MB(BTT_SKR_MINI_E3_V1_2) - #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple + #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple #elif MB(BTT_SKR_MINI_E3_V2_0) - #include "stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple env:STM32F103RE_btt_maple env:STM32F103RE_btt_USB_maple -#elif MB(BTT_SKR_MINI_E3_V3_0) - #include "stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h" // STM32G0 env:STM32G0B1RE_btt env:STM32G0B1RE_btt_xfer -#elif MB(BTT_MANTA_M4P_V1_0) - #include "stm32g0/pins_BTT_MANTA_M4P_V1_0.h" // STM32G0 env:STM32G0B1RE_manta_btt env:STM32G0B1RE_manta_btt_xfer -#elif MB(BTT_MANTA_M5P_V1_0) - #include "stm32g0/pins_BTT_MANTA_M5P_V1_0.h" // STM32G0 env:STM32G0B1RE_manta_btt env:STM32G0B1RE_manta_btt_xfer -#elif MB(BTT_MANTA_E3_EZ_V1_0) - #include "stm32g0/pins_BTT_MANTA_E3_EZ_V1_0.h" // STM32G0 env:STM32G0B1RE_manta_btt env:STM32G0B1RE_manta_btt_xfer -#elif MB(BTT_MANTA_M8P_V1_0) - #include "stm32g0/pins_BTT_MANTA_M8P_V1_0.h" // STM32G0 env:STM32G0B1VE_btt env:STM32G0B1VE_btt_xfer -#elif MB(BTT_MANTA_M8P_V1_1) - #include "stm32g0/pins_BTT_MANTA_M8P_V1_1.h" // STM32G0 env:STM32G0B1VE_btt env:STM32G0B1VE_btt_xfer -#elif MB(BTT_SKR_MINI_E3_V3_0_1) - #include "stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h"// STM32F4 env:STM32F401RC_btt + #include "stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple env:STM32F103RE_btt_maple env:STM32F103RE_btt_USB_maple #elif MB(BTT_SKR_MINI_MZ_V1_0) - #include "stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple + #include "stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple #elif MB(BTT_SKR_E3_DIP) - #include "stm32f1/pins_BTT_SKR_E3_DIP.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple env:STM32F103RE_btt_maple env:STM32F103RE_btt_USB_maple + #include "stm32f1/pins_BTT_SKR_E3_DIP.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple env:STM32F103RE_btt_maple env:STM32F103RE_btt_USB_maple #elif MB(BTT_SKR_CR6) - #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RE_btt_maple env:STM32F103RE_btt_USB_maple + #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RE_btt_maple env:STM32F103RE_btt_USB_maple #elif MB(JGAURORA_A5S_A1) - #include "stm32f1/pins_JGAURORA_A5S_A1.h" // STM32F1 env:jgaurora_a5s_a1 env:jgaurora_a5s_a1_maple + #include "stm32f1/pins_JGAURORA_A5S_A1.h" // STM32F1 env:jgaurora_a5s_a1 env:jgaurora_a5s_a1_maple #elif MB(FYSETC_AIO_II) - #include "stm32f1/pins_FYSETC_AIO_II.h" // STM32F1 env:STM32F103RC_fysetc env:STM32F103RC_fysetc_maple + #include "stm32f1/pins_FYSETC_AIO_II.h" // STM32F1 env:STM32F103RC_fysetc env:STM32F103RC_fysetc_maple #elif MB(FYSETC_CHEETAH) - #include "stm32f1/pins_FYSETC_CHEETAH.h" // STM32F1 env:STM32F103RC_fysetc env:STM32F103RC_fysetc_maple + #include "stm32f1/pins_FYSETC_CHEETAH.h" // STM32F1 env:STM32F103RC_fysetc env:STM32F103RC_fysetc_maple #elif MB(FYSETC_CHEETAH_V12) - #include "stm32f1/pins_FYSETC_CHEETAH_V12.h" // STM32F1 env:STM32F103RC_fysetc env:STM32F103RC_fysetc_maple + #include "stm32f1/pins_FYSETC_CHEETAH_V12.h" // STM32F1 env:STM32F103RC_fysetc env:STM32F103RC_fysetc_maple #elif MB(LONGER3D_LK) - #include "stm32f1/pins_LONGER3D_LK.h" // STM32F1 env:STM32F103VE_longer env:STM32F103VE_longer_maple + #include "stm32f1/pins_LONGER3D_LK.h" // STM32F1 env:STM32F103VE_longer env:STM32F103VE_longer_maple #elif MB(CCROBOT_MEEB_3DP) - #include "stm32f1/pins_CCROBOT_MEEB_3DP.h" // STM32F1 env:STM32F103RC_meeb_maple + #include "stm32f1/pins_CCROBOT_MEEB_3DP.h" // STM32F1 env:STM32F103RC_meeb_maple #elif MB(CHITU3D_V5) - #include "stm32f1/pins_CHITU3D_V5.h" // STM32F1 env:chitu_f103 env:chitu_f103_maple env:chitu_v5_gpio_init env:chitu_v5_gpio_init_maple + #include "stm32f1/pins_CHITU3D_V5.h" // STM32F1 env:chitu_f103 env:chitu_f103_maple env:chitu_v5_gpio_init env:chitu_v5_gpio_init_maple #elif MB(CHITU3D_V6) - #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 env:chitu_f103_maple + #include "stm32f1/pins_CHITU3D_V6.h" // STM32F1 env:chitu_f103 env:chitu_f103_maple #elif MB(CHITU3D_V9) - #include "stm32f1/pins_CHITU3D_V9.h" // STM32F1 env:chitu_f103 env:chitu_f103_maple + #include "stm32f1/pins_CHITU3D_V9.h" // STM32F1 env:chitu_f103 env:chitu_f103_maple #elif MB(CREALITY_V4) - #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V4.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V4210) - #include "stm32f1/pins_CREALITY_V4210.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V4210.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V425) - #include "stm32f1/pins_CREALITY_V425.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V425.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V422) - #include "stm32f1/pins_CREALITY_V422.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V422.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V423) - #include "stm32f1/pins_CREALITY_V423.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer + #include "stm32f1/pins_CREALITY_V423.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer #elif MB(CREALITY_V427) - #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V431, CREALITY_V431_A, CREALITY_V431_B, CREALITY_V431_C, CREALITY_V431_D) - #include "stm32f1/pins_CREALITY_V431.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V431.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V452) - #include "stm32f1/pins_CREALITY_V452.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V452.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V453) - #include "stm32f1/pins_CREALITY_V453.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V453.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V24S1) - #include "stm32f1/pins_CREALITY_V24S1.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V24S1.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V24S1_301) - #include "stm32f1/pins_CREALITY_V24S1_301.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple + #include "stm32f1/pins_CREALITY_V24S1_301.h" // STM32F1 env:STM32F103RE_creality env:STM32F103RE_creality_xfer env:STM32F103RC_creality env:STM32F103RC_creality_xfer env:STM32F103RE_creality_maple #elif MB(CREALITY_V25S1) - #include "stm32f1/pins_CREALITY_V25S1.h" // STM32F1 env:STM32F103RE_creality_smartPro env:STM32F103RE_creality_smartPro_maple + #include "stm32f1/pins_CREALITY_V25S1.h" // STM32F1 env:STM32F103RE_creality_smartPro env:STM32F103RE_creality_smartPro_maple #elif MB(CREALITY_V521) - #include "stm32f1/pins_CREALITY_V521.h" // STM32F103VE env:STM32F103VE_creality + #include "stm32f1/pins_CREALITY_V521.h" // STM32F1 env:STM32F103VE_creality #elif MB(TRIGORILLA_PRO) - #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro env:trigorilla_pro_maple env:trigorilla_pro_disk + #include "stm32f1/pins_TRIGORILLA_PRO.h" // STM32F1 env:trigorilla_pro env:trigorilla_pro_maple env:trigorilla_pro_disk #elif MB(FLY_MINI) - #include "stm32f1/pins_FLY_MINI.h" // STM32F1 env:FLY_MINI env:FLY_MINI_maple + #include "stm32f1/pins_FLY_MINI.h" // STM32F1 env:FLY_MINI env:FLY_MINI_maple #elif MB(FLSUN_HISPEED) - #include "stm32f1/pins_FLSUN_HISPEED.h" // STM32F1 env:flsun_hispeedv1 + #include "stm32f1/pins_FLSUN_HISPEED.h" // STM32F1 env:flsun_hispeedv1 #elif MB(BEAST) - #include "stm32f1/pins_BEAST.h" // STM32F103VE? env:STM32F103VE env:STM32F103RE_maple + #include "stm32f1/pins_BEAST.h" // STM32F1 env:STM32F103VE env:STM32F103RE_maple #elif MB(MINGDA_MPX_ARM_MINI) - #include "stm32f1/pins_MINGDA_MPX_ARM_MINI.h" // STM32F1 env:mingda_mpx_arm_mini + #include "stm32f1/pins_MINGDA_MPX_ARM_MINI.h" // STM32F1 env:mingda_mpx_arm_mini #elif MB(ZONESTAR_ZM3E2) - #include "stm32f1/pins_ZM3E2_V1_0.h" // STM32F1 env:STM32F103RC_ZM3E2_USB env:STM32F103RC_ZM3E2_USB_maple + #include "stm32f1/pins_ZM3E2_V1_0.h" // STM32F1 env:STM32F103RC_ZM3E2_USB env:STM32F103RC_ZM3E2_USB_maple #elif MB(ZONESTAR_ZM3E4) - #include "stm32f1/pins_ZM3E4_V1_0.h" // STM32F1 env:STM32F103VC_ZM3E4_USB env:STM32F103VC_ZM3E4_USB_maple + #include "stm32f1/pins_ZM3E4_V1_0.h" // STM32F1 env:STM32F103VC_ZM3E4_USB env:STM32F103VC_ZM3E4_USB_maple #elif MB(ZONESTAR_ZM3E4V2) - #include "stm32f1/pins_ZM3E4_V2_0.h" // STM32F1 env:STM32F103VE_ZM3E4V2_USB env:STM32F103VE_ZM3E4V2_USB_maple + #include "stm32f1/pins_ZM3E4_V2_0.h" // STM32F1 env:STM32F103VE_ZM3E4V2_USB env:STM32F103VE_ZM3E4V2_USB_maple #elif MB(ERYONE_ERY32_MINI) - #include "stm32f1/pins_ERYONE_ERY32_MINI.h" // STM32F103VET6 env:ERYONE_ERY32_MINI_maple + #include "stm32f1/pins_ERYONE_ERY32_MINI.h" // STM32F1 env:ERYONE_ERY32_MINI_maple #elif MB(PANDA_PI_V29) - #include "stm32f1/pins_PANDA_PI_V29.h" // STM32F103RCT6 env:PANDA_PI_V29 + #include "stm32f1/pins_PANDA_PI_V29.h" // STM32F1 env:PANDA_PI_V29 #elif MB(SOVOL_V131) - #include "gd32f1/pins_SOVOL_V131.h" // GD32F1 env:GD32F103RET6_sovol_maple + #include "gd32f1/pins_SOVOL_V131.h" // GD32F1 env:GD32F103RET6_sovol_maple #elif MB(TRIGORILLA_V006) - #include "gd32f1/pins_TRIGORILLA_V006.h" // GD32F103 env:trigorilla_v006 + #include "gd32f1/pins_TRIGORILLA_V006.h" // GD32F1 env:trigorilla_v006 +#elif MB(KEDI_CONTROLLER_V1_2) + #include "stm32f1/pins_KEDI_CONTROLLER_V1_2.h" // STM32F1 env:STM32F103RC_btt env:STM32F103RC_btt_USB env:STM32F103RC_btt_maple env:STM32F103RC_btt_USB_maple // // ARM Cortex-M4F // #elif MB(TEENSY31_32) - #include "teensy3/pins_TEENSY31_32.h" // TEENSY31_32 env:teensy31 + #include "teensy3/pins_TEENSY31_32.h" // TEENSY31_32 env:teensy31 #elif MB(TEENSY35_36) - #include "teensy3/pins_TEENSY35_36.h" // TEENSY35_36 env:teensy35 env:teensy36 + #include "teensy3/pins_TEENSY35_36.h" // TEENSY35_36 env:teensy35 env:teensy36 // // STM32 ARM Cortex-M4F // #elif MB(ARMED) - #include "stm32f4/pins_ARMED.h" // STM32F4 env:ARMED + #include "stm32f4/pins_ARMED.h" // STM32F4 env:ARMED #elif MB(RUMBA32_V1_0, RUMBA32_V1_1) - #include "stm32f4/pins_RUMBA32_AUS3D.h" // STM32F4 env:rumba32 + #include "stm32f4/pins_RUMBA32_AUS3D.h" // STM32F4 env:rumba32 #elif MB(RUMBA32_MKS) - #include "stm32f4/pins_RUMBA32_MKS.h" // STM32F4 env:rumba32 + #include "stm32f4/pins_RUMBA32_MKS.h" // STM32F4 env:rumba32 #elif MB(RUMBA32_BTT) - #include "stm32f4/pins_RUMBA32_BTT.h" // STM32F4 env:rumba32 + #include "stm32f4/pins_RUMBA32_BTT.h" // STM32F4 env:rumba32 #elif MB(BLACK_STM32F407VE) - #include "stm32f4/pins_BLACK_STM32F407VE.h" // STM32F4 env:STM32F407VE_black + #include "stm32f4/pins_BLACK_STM32F407VE.h" // STM32F4 env:STM32F407VE_black #elif MB(BTT_SKR_PRO_V1_1) - #include "stm32f4/pins_BTT_SKR_PRO_V1_1.h" // STM32F4 env:BIGTREE_SKR_PRO env:BIGTREE_SKR_PRO_usb_flash_drive + #include "stm32f4/pins_BTT_SKR_PRO_V1_1.h" // STM32F4 env:BIGTREE_SKR_PRO env:BIGTREE_SKR_PRO_usb_flash_drive #elif MB(BTT_SKR_PRO_V1_2) - #include "stm32f4/pins_BTT_SKR_PRO_V1_2.h" // STM32F4 env:BIGTREE_SKR_PRO env:BIGTREE_SKR_PRO_usb_flash_drive + #include "stm32f4/pins_BTT_SKR_PRO_V1_2.h" // STM32F4 env:BIGTREE_SKR_PRO env:BIGTREE_SKR_PRO_usb_flash_drive #elif MB(BTT_GTR_V1_0) - #include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BIGTREE_GTR_V1_0 env:BIGTREE_GTR_V1_0_usb_flash_drive + #include "stm32f4/pins_BTT_GTR_V1_0.h" // STM32F4 env:BIGTREE_GTR_V1_0 env:BIGTREE_GTR_V1_0_usb_flash_drive #elif MB(BTT_BTT002_V1_0) - #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 env:BIGTREE_BTT002_VET6 + #include "stm32f4/pins_BTT_BTT002_V1_0.h" // STM32F4 env:BIGTREE_BTT002 env:BIGTREE_BTT002_VET6 #elif MB(BTT_E3_RRF) - #include "stm32f4/pins_BTT_E3_RRF.h" // STM32F4 env:BIGTREE_E3_RRF + #include "stm32f4/pins_BTT_E3_RRF.h" // STM32F4 env:BIGTREE_E3_RRF +#elif MB(BTT_SKR_MINI_E3_V3_0_1) + #include "stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h" // STM32F4 env:STM32F401RC_btt env:STM32F401RC_btt_xfer #elif MB(BTT_SKR_V2_0_REV_A) - #include "stm32f4/pins_BTT_SKR_V2_0_REV_A.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB env:BIGTREE_SKR_2_USB_debug + #include "stm32f4/pins_BTT_SKR_V2_0_REV_A.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB env:BIGTREE_SKR_2_USB_debug #elif MB(BTT_SKR_V2_0_REV_B) - #include "stm32f4/pins_BTT_SKR_V2_0_REV_B.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB env:BIGTREE_SKR_2_USB_debug env:BIGTREE_SKR_2_F429 env:BIGTREE_SKR_2_F429_USB env:BIGTREE_SKR_2_F429_USB_debug + #include "stm32f4/pins_BTT_SKR_V2_0_REV_B.h" // STM32F4 env:BIGTREE_SKR_2 env:BIGTREE_SKR_2_USB env:BIGTREE_SKR_2_USB_debug env:BIGTREE_SKR_2_F429 env:BIGTREE_SKR_2_F429_USB env:BIGTREE_SKR_2_F429_USB_debug #elif MB(BTT_OCTOPUS_V1_0) - #include "stm32f4/pins_BTT_OCTOPUS_V1_0.h" // STM32F4 env:STM32F446ZE_btt env:STM32F446ZE_btt_USB + #include "stm32f4/pins_BTT_OCTOPUS_V1_0.h" // STM32F4 env:STM32F446ZE_btt env:STM32F446ZE_btt_USB #elif MB(BTT_OCTOPUS_V1_1) - #include "stm32f4/pins_BTT_OCTOPUS_V1_1.h" // STM32F4 env:STM32F446ZE_btt env:STM32F446ZE_btt_USB env:STM32F429ZG_btt env:STM32F429ZG_btt_USB env:STM32F407ZE_btt env:STM32F407ZE_btt_USB + #include "stm32f4/pins_BTT_OCTOPUS_V1_1.h" // STM32F4 env:STM32F446ZE_btt env:STM32F446ZE_btt_USB env:STM32F429ZG_btt env:STM32F429ZG_btt_USB env:STM32F407ZE_btt env:STM32F407ZE_btt_USB #elif MB(BTT_OCTOPUS_PRO_V1_0) - #include "stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h" // STM32F4 env:STM32F446ZE_btt env:STM32F446ZE_btt_USB env:STM32F429ZG_btt env:STM32F429ZG_btt_USB env:STM32H723Zx_btt + #include "stm32f4/pins_BTT_OCTOPUS_PRO_V1_0.h" // STM32F4 env:STM32F446ZE_btt env:STM32F446ZE_btt_USB env:STM32F429ZG_btt env:STM32F429ZG_btt_USB env:STM32H723ZE_btt #elif MB(LERDGE_K) - #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:LERDGEK env:LERDGEK_usb_flash_drive + #include "stm32f4/pins_LERDGE_K.h" // STM32F4 env:LERDGEK env:LERDGEK_usb_flash_drive #elif MB(LERDGE_S) - #include "stm32f4/pins_LERDGE_S.h" // STM32F4 env:LERDGES env:LERDGES_usb_flash_drive + #include "stm32f4/pins_LERDGE_S.h" // STM32F4 env:LERDGES env:LERDGES_usb_flash_drive #elif MB(LERDGE_X) - #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGEX env:LERDGEX_usb_flash_drive -#elif MB(VAKE403D) - #include "stm32f4/pins_VAKE403D.h" // STM32F4 + #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGEX env:LERDGEX_usb_flash_drive #elif MB(FYSETC_S6) - #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 + #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 #elif MB(FYSETC_S6_V2_0) - #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 + #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 #elif MB(FYSETC_SPIDER) - #include "stm32f4/pins_FYSETC_SPIDER.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 + #include "stm32f4/pins_FYSETC_SPIDER.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 #elif MB(FYSETC_SPIDER_V2_2) - #include "stm32f4/pins_FYSETC_SPIDER_V2_2.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 + #include "stm32f4/pins_FYSETC_SPIDER_V2_2.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 #elif MB(FLYF407ZG) - #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG + #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG #elif MB(MKS_ROBIN2) - #include "stm32f4/pins_MKS_ROBIN2.h" // STM32F4 env:MKS_ROBIN2 + #include "stm32f4/pins_MKS_ROBIN2.h" // STM32F4 env:mks_robin2 #elif MB(MKS_ROBIN_PRO_V2) - #include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2 + #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 env:mks_robin_nano_v3_usb_flash_drive_msc + #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(MKS_ROBIN_NANO_V3_1) - #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3_1 env:mks_robin_nano_v3_1_usb_flash_drive env:mks_robin_nano_v3_1_usb_flash_drive_msc + #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3_1 env:mks_robin_nano_v3_1_usb_flash_drive env:mks_robin_nano_v3_1_usb_flash_drive_msc #elif MB(ANET_ET4) - #include "stm32f4/pins_ANET_ET4.h" // STM32F4 env:Anet_ET4_no_bootloader env:Anet_ET4_OpenBLT + #include "stm32f4/pins_ANET_ET4.h" // STM32F4 env:Anet_ET4_no_bootloader env:Anet_ET4_OpenBLT #elif MB(ANET_ET4P) - #include "stm32f4/pins_ANET_ET4P.h" // STM32F4 env:Anet_ET4_no_bootloader env:Anet_ET4_OpenBLT + #include "stm32f4/pins_ANET_ET4P.h" // STM32F4 env:Anet_ET4_no_bootloader env:Anet_ET4_OpenBLT #elif MB(FYSETC_CHEETAH_V20) - #include "stm32f4/pins_FYSETC_CHEETAH_V20.h" // STM32F4 env:FYSETC_CHEETAH_V20 + #include "stm32f4/pins_FYSETC_CHEETAH_V20.h" // STM32F4 env:FYSETC_CHEETAH_V20 #elif MB(MKS_MONSTER8_V1) - #include "stm32f4/pins_MKS_MONSTER8_V1.h" // STM32F4 env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc + #include "stm32f4/pins_MKS_MONSTER8_V1.h" // STM32F4 env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc #elif MB(MKS_MONSTER8_V2) - #include "stm32f4/pins_MKS_MONSTER8_V2.h" // STM32F4 env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc + #include "stm32f4/pins_MKS_MONSTER8_V2.h" // STM32F4 env:mks_monster8 env:mks_monster8_usb_flash_drive env:mks_monster8_usb_flash_drive_msc #elif MB(TH3D_EZBOARD_V2) - #include "stm32f4/pins_TH3D_EZBOARD_V2.h" // STM32F4 env:TH3D_EZBoard_V2_no_bootloader env:TH3D_EZBoard_V2_OpenBLT + #include "stm32f4/pins_TH3D_EZBOARD_V2.h" // STM32F4 env:TH3D_EZBoard_V2_no_bootloader env:TH3D_EZBoard_V2_OpenBLT #elif MB(OPULO_LUMEN_REV3) - #include "stm32f4/pins_OPULO_LUMEN_REV3.h" // STM32F4 env:Opulo_Lumen_REV3 + #include "stm32f4/pins_OPULO_LUMEN_REV3.h" // STM32F4 env:Opulo_Lumen_REV3 #elif MB(MKS_ROBIN_NANO_V1_3_F4) - #include "stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h" // STM32F4 env:mks_robin_nano_v1_3_f4 env:mks_robin_nano_v1_3_f4_usbmod + #include "stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h" // STM32F4 env:mks_robin_nano_v1_3_f4 env:mks_robin_nano_v1_3_f4_usbmod #elif MB(MKS_EAGLE) - #include "stm32f4/pins_MKS_EAGLE.h" // STM32F4 env:mks_eagle + #include "stm32f4/pins_MKS_EAGLE.h" // STM32F4 env:mks_eagle #elif MB(ARTILLERY_RUBY) - #include "stm32f4/pins_ARTILLERY_RUBY.h" // STM32F4 env:Artillery_Ruby + #include "stm32f4/pins_ARTILLERY_RUBY.h" // STM32F4 env:Artillery_Ruby #elif MB(CREALITY_V24S1_301F4) - #include "stm32f4/pins_CREALITY_V24S1_301F4.h" // STM32F4 env:STM32F401RC_creality env:STM32F401RC_creality_jlink env:STM32F401RC_creality_stlink + #include "stm32f4/pins_CREALITY_V24S1_301F4.h" // STM32F4 env:STM32F401RC_creality env:STM32F401RC_creality_jlink env:STM32F401RC_creality_stlink #elif MB(OPULO_LUMEN_REV4) - #include "stm32f4/pins_OPULO_LUMEN_REV4.h" // STM32F4 env:Opulo_Lumen_REV4 + #include "stm32f4/pins_OPULO_LUMEN_REV4.h" // STM32F4 env:Opulo_Lumen_REV4 #elif MB(FYSETC_SPIDER_KING407) - #include "stm32f4/pins_FYSETC_SPIDER_KING407.h" // STM32F4 env:FYSETC_SPIDER_KING407 + #include "stm32f4/pins_FYSETC_SPIDER_KING407.h" // STM32F4 env:FYSETC_SPIDER_KING407 #elif MB(MKS_SKIPR_V1) - #include "stm32f4/pins_MKS_SKIPR_V1_0.h" // STM32F4 env:mks_skipr_v1 env:mks_skipr_v1_nobootloader + #include "stm32f4/pins_MKS_SKIPR_V1_0.h" // STM32F4 env:mks_skipr_v1 env:mks_skipr_v1_nobootloader #elif MB(TRONXY_V10) - #include "stm32f4/pins_TRONXY_V10.h" // STM32F4 env:STM32F446_tronxy + #include "stm32f4/pins_TRONXY_V10.h" // STM32F4 env:STM32F446_tronxy +#elif MB(CREALITY_F401RE) + #include "stm32f4/pins_CREALITY_F401.h" // STM32F4 env:STM32F401RE_creality +#elif MB(BLACKPILL_CUSTOM) + #include "stm32f4/pins_BLACKPILL_CUSTOM.h" // STM32F4 env:STM32F401CD_blackpill_stlink +#elif MB(I3DBEEZ9_V1) + #include "stm32f4/pins_I3DBEEZ9.h" // STM32F4 env:I3DBEEZ9_V1 // -// ARM Cortex M7 +// ARM Cortex-M7 // #elif MB(REMRAM_V1) - #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:REMRAM_V1 + #include "stm32f7/pins_REMRAM_V1.h" // STM32F7 env:REMRAM_V1 #elif MB(NUCLEO_F767ZI) - #include "stm32f7/pins_NUCLEO_F767ZI.h" // STM32F7 env:NUCLEO_F767ZI + #include "stm32f7/pins_NUCLEO_F767ZI.h" // STM32F7 env:NUCLEO_F767ZI #elif MB(BTT_SKR_SE_BX_V2) - #include "stm32h7/pins_BTT_SKR_SE_BX_V2.h" // STM32H7 env:BTT_SKR_SE_BX + #include "stm32h7/pins_BTT_SKR_SE_BX_V2.h" // STM32H7 env:BTT_SKR_SE_BX #elif MB(BTT_SKR_SE_BX_V3) - #include "stm32h7/pins_BTT_SKR_SE_BX_V3.h" // STM32H7 env:BTT_SKR_SE_BX + #include "stm32h7/pins_BTT_SKR_SE_BX_V3.h" // STM32H7 env:BTT_SKR_SE_BX #elif MB(BTT_SKR_V3_0) - #include "stm32h7/pins_BTT_SKR_V3_0.h" // STM32H7 env:STM32H723Vx_btt env:STM32H743Vx_btt + #include "stm32h7/pins_BTT_SKR_V3_0.h" // STM32H7 env:STM32H743VI_btt env:STM32H723VG_btt #elif MB(BTT_SKR_V3_0_EZ) - #include "stm32h7/pins_BTT_SKR_V3_0_EZ.h" // STM32H7 env:STM32H723Vx_btt env:STM32H743Vx_btt + #include "stm32h7/pins_BTT_SKR_V3_0_EZ.h" // STM32H7 env:STM32H743VI_btt env:STM32H723VG_btt #elif MB(BTT_OCTOPUS_MAX_EZ_V1_0) - #include "stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h" // STM32H7 env:STM32H723Vx_btt env:STM32H723Zx_btt + #include "stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h" // STM32H7 env:STM32H723ZE_btt #elif MB(TEENSY41) - #include "teensy4/pins_TEENSY41.h" // Teensy-4.x env:teensy41 + #include "teensy4/pins_TEENSY41.h" // Teensy-4.x env:teensy41 #elif MB(T41U5XBB) - #include "teensy4/pins_T41U5XBB.h" // Teensy-4.x env:teensy41 + #include "teensy4/pins_T41U5XBB.h" // Teensy-4.x env:teensy41 // // Espressif ESP32 // #elif MB(ESPRESSIF_ESP32) - #include "esp32/pins_ESP32.h" // ESP32 env:esp32 + #include "esp32/pins_ESP32.h" // ESP32 env:esp32 #elif MB(MRR_ESPA) - #include "esp32/pins_MRR_ESPA.h" // ESP32 env:esp32 + #include "esp32/pins_MRR_ESPA.h" // ESP32 env:esp32 #elif MB(MRR_ESPE) - #include "esp32/pins_MRR_ESPE.h" // ESP32 env:esp32 + #include "esp32/pins_MRR_ESPE.h" // ESP32 env:esp32 #elif MB(E4D_BOX) - #include "esp32/pins_E4D.h" // ESP32 env:esp32 + #include "esp32/pins_E4D.h" // ESP32 env:esp32 #elif MB(RESP32_CUSTOM) - #include "esp32/pins_RESP32_CUSTOM.h" // ESP32 env:esp32 + #include "esp32/pins_RESP32_CUSTOM.h" // ESP32 env:esp32 #elif MB(FYSETC_E4) - #include "esp32/pins_FYSETC_E4.h" // ESP32 env:FYSETC_E4 + #include "esp32/pins_FYSETC_E4.h" // ESP32 env:FYSETC_E4 #elif MB(PANDA_ZHU) - #include "esp32/pins_PANDA_ZHU.h" // ESP32 env:PANDA + #include "esp32/pins_PANDA_ZHU.h" // ESP32 env:PANDA #elif MB(PANDA_M4) - #include "esp32/pins_PANDA_M4.h" // ESP32 env:PANDA + #include "esp32/pins_PANDA_M4.h" // ESP32 env:PANDA #elif MB(MKS_TINYBEE) - #include "esp32/pins_MKS_TINYBEE.h" // ESP32 env:mks_tinybee + #include "esp32/pins_MKS_TINYBEE.h" // ESP32 env:mks_tinybee #elif MB(ENWI_ESPNP) - #include "esp32/pins_ENWI_ESPNP.h" // ESP32 env:esp32 + #include "esp32/pins_ENWI_ESPNP.h" // ESP32 env:esp32 +#elif MB(GODI_CONTROLLER_V1_0) + #include "esp32/pins_GODI_CONTROLLER_V1_0.h" // ESP32 env:godi_esp32 // // Adafruit Grand Central M4 (SAMD51 ARM Cortex-M4) // #elif MB(AGCM4_RAMPS_144) - #include "samd/pins_RAMPS_144.h" // SAMD51 env:SAMD51_grandcentral_m4 + #include "samd/pins_RAMPS_144.h" // SAMD51 env:SAMD51_grandcentral_m4 #elif MB(BRICOLEMON_V1_0) - #include "samd/pins_BRICOLEMON_V1_0.h" // SAMD51 env:SAMD51_grandcentral_m4 + #include "samd/pins_BRICOLEMON_V1_0.h" // SAMD51 env:SAMD51_grandcentral_m4 #elif MB(BRICOLEMON_LITE_V1_0) - #include "samd/pins_BRICOLEMON_LITE_V1_0.h" // SAMD51 env:SAMD51_grandcentral_m4 + #include "samd/pins_BRICOLEMON_LITE_V1_0.h" // SAMD51 env:SAMD51_grandcentral_m4 // // ReprapWorld Minitronics (SAMD21) // #elif MB(MINITRONICS20) - #include "samd/pins_MINITRONICS20.h" // SAMD21 env:SAMD21_minitronics20 + #include "samd/pins_MINITRONICS20.h" // SAMD21 env:SAMD21_minitronics20 // // Custom board (with custom PIO env) // #elif MB(CUSTOM) - #include "pins_custom.h" // env:custom + #include "pins_custom.h" // env:custom // // Linux Native Debug board // #elif MB(SIMULATED) - #include "linux/pins_RAMPS_LINUX.h" // Native or Simulation lin:linux_native mac:simulator_macos_debug mac:simulator_macos_release win:simulator_windows lin:simulator_linux_debug lin:simulator_linux_release + #include "linux/pins_RAMPS_LINUX.h" // Native or Simulation lin:linux_native mac:simulator_macos_debug mac:simulator_macos_release win:simulator_windows lin:simulator_linux_debug lin:simulator_linux_release #else diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index 5b19ff1b2d..9181a5b9da 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -100,7 +100,7 @@ const PinInfo pin_array[] PROGMEM = { */ #if SERIAL_IN_USE(0) - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + #if ANY(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_0, 0, true }, { TXD_NAME_0, 1, true }, #elif AVR_ATmega1284_FAMILY @@ -113,7 +113,7 @@ const PinInfo pin_array[] PROGMEM = { #endif #if SERIAL_IN_USE(1) - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + #if ANY(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_1, 19, true }, { TXD_NAME_1, 18, true }, #elif AVR_ATmega1284_FAMILY @@ -131,7 +131,7 @@ const PinInfo pin_array[] PROGMEM = { #endif #if SERIAL_IN_USE(2) - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + #if ANY(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_2, 17, true }, { TXD_NAME_2, 16, true }, #elif defined(TARGET_LPC1768) @@ -146,7 +146,7 @@ const PinInfo pin_array[] PROGMEM = { #endif #if SERIAL_IN_USE(3) - #if EITHER(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) + #if ANY(AVR_ATmega2560_FAMILY, ARDUINO_ARCH_SAM) { RXD_NAME_3, 15, true }, { TXD_NAME_3, 14, true }, #elif defined(TARGET_LPC1768) @@ -168,18 +168,24 @@ const PinInfo pin_array[] PROGMEM = { }; -#include HAL_PATH(../HAL, pinsDebug.h) // get the correct support file for this CPU +#include HAL_PATH(.., pinsDebug.h) // get the correct support file for this CPU #ifndef M43_NEVER_TOUCH #define M43_NEVER_TOUCH(Q) false #endif +bool pin_is_protected(const pin_t pin); + static void print_input_or_output(const bool isout) { - SERIAL_ECHOPGM_P(isout ? PSTR("Output = ") : PSTR("Input = ")); + SERIAL_ECHO(isout ? F("Output ") : F("Input ")); +} + +static void print_pin_state(const bool state) { + SERIAL_ECHO(state ? F("HIGH") : F("LOW")); } // pretty report with PWM info -inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool extended=false, FSTR_P const start_string=nullptr) { +inline void report_pin_state_extended(const pin_t pin, const bool ignore, const bool extended=false, FSTR_P const start_string=nullptr) { char buffer[MAX_NAME_LENGTH + 1]; // for the sprintf statements bool found = false, multi_name_pin = false; @@ -188,25 +194,25 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e // Use FastIO for pins Teensy doesn't expose if (pin == 46) { print_input_or_output(IS_OUTPUT(46)); - SERIAL_CHAR('0' + READ(46)); + print_pin_state(READ(46)); return false; } else if (pin == 47) { print_input_or_output(IS_OUTPUT(47)); - SERIAL_CHAR('0' + READ(47)); + print_pin_state(READ(47)); return false; } #endif return true; }; - LOOP_L_N(x, COUNT(pin_array)) { // scan entire array and report all instances of this pin + for (uint8_t x = 0; x < COUNT(pin_array); ++x) { // 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) SERIAL_ECHOF(start_string); + if (start_string) SERIAL_ECHO(start_string); SERIAL_ECHOPGM("PIN: "); PRINT_PIN(pin); - PRINT_PORT(pin); + print_port(pin); if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) PRINT_PIN_ANALOG(pin); // analog pin number else SERIAL_ECHO_SP(8); // add padding if not an analog pin } @@ -230,14 +236,14 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e // because this could interfere with inductive/capacitive // sensors (high impedance voltage divider) and with Pt100 amplifier print_input_or_output(false); - SERIAL_ECHO(digitalRead_mod(pin)); + print_pin_state(digitalRead_mod(pin)); } else if (pwm_status(pin)) { // do nothing } else { print_input_or_output(true); - SERIAL_ECHO(digitalRead_mod(pin)); + print_pin_state(digitalRead_mod(pin)); } } if (!multi_name_pin && extended) pwm_details(pin); // report PWM capabilities only on the first pass & only if doing an extended report @@ -251,10 +257,10 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e } // end of for loop if (!found) { - if (start_string) SERIAL_ECHOF(start_string); + if (start_string) SERIAL_ECHO(start_string); SERIAL_ECHOPGM("PIN: "); PRINT_PIN(pin); - PRINT_PORT(pin); + print_port(pin); if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) PRINT_PIN_ANALOG(pin); // analog pin number else SERIAL_ECHO_SP(8); // add padding if not an analog pin SERIAL_ECHOPGM(""); @@ -267,7 +273,7 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e else if (GET_PINMODE(pin)) { SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); print_input_or_output(true); - SERIAL_ECHO(digitalRead_mod(pin)); + print_pin_state(digitalRead_mod(pin)); } else { if (IS_ANALOG(pin)) { @@ -279,7 +285,7 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e SERIAL_ECHO_SP(MAX_NAME_LENGTH - 16); // add padding if not an analog pin print_input_or_output(false); - SERIAL_ECHO(digitalRead_mod(pin)); + print_pin_state(digitalRead_mod(pin)); } //if (!pwm_status(pin)) SERIAL_CHAR(' '); // add padding if it's not a PWM pin if (extended) { diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index 6ae99d2f57..e5467833e5 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -456,6 +456,11 @@ #define TEMP_BED_PIN -1 #endif +// Use ATEMP if TEMP_SOC_PIN is not defined +#if !defined(TEMP_SOC_PIN) && defined(ATEMP) + #define TEMP_SOC_PIN ATEMP +#endif + #ifndef SD_DETECT_PIN #define SD_DETECT_PIN -1 #endif @@ -492,49 +497,39 @@ #undef NEEDS_Z_MINMAX // -// Assign endstop pins for boards with only 3 connectors +// Assign endstop pins, with handling for boards that have only 3 connectors // -#ifdef X_STOP_PIN - #if X_HOME_TO_MIN - #define X_MIN_PIN X_STOP_PIN - #ifndef X_MAX_PIN - #define X_MAX_PIN -1 +#if HAS_X_AXIS + #ifdef X_STOP_PIN + #if X_HOME_TO_MIN + #define X_MIN_PIN X_STOP_PIN + #else + #define X_MAX_PIN X_STOP_PIN #endif + #elif X_HOME_TO_MIN + #define X_STOP_PIN X_MIN_PIN #else - #define X_MAX_PIN X_STOP_PIN - #ifndef X_MIN_PIN - #define X_MIN_PIN -1 - #endif + #define X_STOP_PIN X_MAX_PIN + #endif + #if !defined(X2_STOP_PIN) && ENABLED(X_DUAL_ENDSTOPS) && PIN_EXISTS(X_STOP) + #define X2_STOP_PIN X_STOP_PIN #endif -#elif X_HOME_TO_MIN - #define X_STOP_PIN X_MIN_PIN -#else - #define X_STOP_PIN X_MAX_PIN -#endif -#if !defined(X2_USE_ENDSTOP) && ENABLED(X_DUAL_ENDSTOPS) && PIN_EXISTS(X_STOP) - #define X2_USE_ENDSTOP _XSTOP_ #endif #if HAS_Y_AXIS #ifdef Y_STOP_PIN #if Y_HOME_TO_MIN #define Y_MIN_PIN Y_STOP_PIN - #ifndef Y_MAX_PIN - #define Y_MAX_PIN -1 - #endif #else #define Y_MAX_PIN Y_STOP_PIN - #ifndef Y_MIN_PIN - #define Y_MIN_PIN -1 - #endif #endif #elif Y_HOME_TO_MIN #define Y_STOP_PIN Y_MIN_PIN #else #define Y_STOP_PIN Y_MAX_PIN #endif - #if !defined(Y2_USE_ENDSTOP) && ENABLED(Y_DUAL_ENDSTOPS) && PIN_EXISTS(Y_STOP) - #define Y2_USE_ENDSTOP _YSTOP_ + #if !defined(Y2_STOP_PIN) && ENABLED(Y_DUAL_ENDSTOPS) && PIN_EXISTS(Y_STOP) + #define Y2_STOP_PIN Y_STOP_PIN #endif #endif @@ -542,14 +537,8 @@ #ifdef Z_STOP_PIN #if Z_HOME_TO_MIN #define Z_MIN_PIN Z_STOP_PIN - #ifndef Z_MAX_PIN - #define Z_MAX_PIN -1 - #endif #else #define Z_MAX_PIN Z_STOP_PIN - #ifndef Z_MIN_PIN - #define Z_MIN_PIN -1 - #endif #endif #elif Z_HOME_TO_MIN #define Z_STOP_PIN Z_MIN_PIN @@ -557,14 +546,14 @@ #define Z_STOP_PIN Z_MAX_PIN #endif #if ENABLED(Z_MULTI_ENDSTOPS) && PIN_EXISTS(Z_STOP) - #ifndef Z2_USE_ENDSTOP - #define Z2_USE_ENDSTOP _ZSTOP_ + #ifndef Z2_STOP_PIN + #define Z2_STOP_PIN Z_STOP_PIN #endif - #if NUM_Z_STEPPERS >= 3 && !defined(Z3_USE_ENDSTOP) - #define Z3_USE_ENDSTOP _ZSTOP_ + #if NUM_Z_STEPPERS >= 3 && !defined(Z3_STOP_PIN) + #define Z3_STOP_PIN Z_STOP_PIN #endif - #if NUM_Z_STEPPERS >= 4 && !defined(Z4_USE_ENDSTOP) - #define Z4_USE_ENDSTOP _ZSTOP_ + #if NUM_Z_STEPPERS >= 4 && !defined(Z4_STOP_PIN) + #define Z4_STOP_PIN Z_STOP_PIN #endif #endif #endif @@ -573,138 +562,84 @@ #ifdef I_STOP_PIN #if I_HOME_TO_MIN #define I_MIN_PIN I_STOP_PIN - #ifndef I_MAX_PIN - #define I_MAX_PIN -1 - #endif #else #define I_MAX_PIN I_STOP_PIN - #ifndef I_MIN_PIN - #define I_MIN_PIN -1 - #endif #endif #elif I_HOME_TO_MIN #define I_STOP_PIN I_MIN_PIN #else #define I_STOP_PIN I_MAX_PIN #endif -#else - #undef I_MIN_PIN - #undef I_MAX_PIN #endif #if HAS_J_AXIS #ifdef J_STOP_PIN #if J_HOME_TO_MIN #define J_MIN_PIN J_STOP_PIN - #ifndef J_MAX_PIN - #define J_MAX_PIN -1 - #endif #else #define J_MAX_PIN J_STOP_PIN - #ifndef J_MIN_PIN - #define J_MIN_PIN -1 - #endif #endif #elif J_HOME_TO_MIN #define J_STOP_PIN J_MIN_PIN #else #define J_STOP_PIN J_MAX_PIN #endif -#else - #undef J_MIN_PIN - #undef J_MAX_PIN #endif #if HAS_K_AXIS #ifdef K_STOP_PIN #if K_HOME_TO_MIN #define K_MIN_PIN K_STOP_PIN - #ifndef K_MAX_PIN - #define K_MAX_PIN -1 - #endif #else #define K_MAX_PIN K_STOP_PIN - #ifndef K_MIN_PIN - #define K_MIN_PIN -1 - #endif #endif #elif K_HOME_TO_MIN #define K_STOP_PIN K_MIN_PIN #else #define K_STOP_PIN K_MAX_PIN #endif -#else - #undef K_MIN_PIN - #undef K_MAX_PIN #endif #if HAS_U_AXIS #ifdef U_STOP_PIN #if U_HOME_TO_MIN #define U_MIN_PIN U_STOP_PIN - #ifndef U_MAX_PIN - #define U_MAX_PIN -1 - #endif #else #define U_MAX_PIN U_STOP_PIN - #ifndef U_MIN_PIN - #define U_MIN_PIN -1 - #endif #endif #elif U_HOME_TO_MIN #define U_STOP_PIN U_MIN_PIN #else #define U_STOP_PIN U_MAX_PIN #endif -#else - #undef U_MIN_PIN - #undef U_MAX_PIN #endif #if HAS_V_AXIS #ifdef V_STOP_PIN #if V_HOME_TO_MIN #define V_MIN_PIN V_STOP_PIN - #ifndef V_MAX_PIN - #define V_MAX_PIN -1 - #endif #else #define V_MAX_PIN V_STOP_PIN - #ifndef V_MIN_PIN - #define V_MIN_PIN -1 - #endif #endif #elif V_HOME_TO_MIN #define V_STOP_PIN V_MIN_PIN #else #define V_STOP_PIN V_MAX_PIN #endif -#else - #undef V_MIN_PIN - #undef V_MAX_PIN #endif #if HAS_W_AXIS #ifdef W_STOP_PIN #if W_HOME_TO_MIN #define W_MIN_PIN W_STOP_PIN - #ifndef W_MAX_PIN - #define W_MAX_PIN -1 - #endif #else #define W_MAX_PIN W_STOP_PIN - #ifndef W_MIN_PIN - #define W_MIN_PIN -1 - #endif #endif #elif W_HOME_TO_MIN #define W_STOP_PIN W_MIN_PIN #else #define W_STOP_PIN W_MAX_PIN #endif -#else - #undef W_MIN_PIN - #undef W_MAX_PIN #endif // Filament Sensor first pin alias @@ -737,6 +672,10 @@ #endif #endif +// Utility macros to define extra axis pins in terms of E pins +#define __EPIN(p,q) E##p##_##q##_PIN +#define _EPIN(p,q) __EPIN(p,q) + /** * Auto-Assignment for Dual X, Dual Y, Multi-Z Steppers * @@ -745,12 +684,16 @@ * overridden in Configuration.h or Configuration_adv.h. */ -#define __PEXI(p,q) PIN_EXISTS(E##p##_##q) -#define _PEXI(p,q) __PEXI(p,q) -#define __EPIN(p,q) E##p##_##q##_PIN -#define _EPIN(p,q) __EPIN(p,q) +#define _E_DIAG_EXISTS(p) PIN_EXISTS(E##p##_DIAG) +#define E_DIAG_EXISTS(p) _E_DIAG_EXISTS(p) + +/** + * For endstop auto-assignment some pins files pre-assign MIN/MAX endstops + * to DIAG pins so those should be preferred over just using En_DIAG_PIN. + * DIAG_REMAPPED(X2, X_MIN) ... PIN_EXISTS(X_MIN) && E(X2_E_INDEX)_DIAG_PIN == X_MIN_PIN + */ #define DIAG_REMAPPED(p,q) (PIN_EXISTS(q) && _EPIN(p##_E_INDEX, DIAG) == q##_PIN) -#define _En_DIAG_(p) _E##p##_DIAG_ +#define _En_DIAG_PIN(p) E##p##_DIAG_PIN // The E0/E1 steppers are always used for Dual E #if ENABLED(E_DUAL_STEPPER_DRIVERS) @@ -762,7 +705,8 @@ #define X2_E_INDEX E_STEPPERS #endif -#if HAS_X2_STEPPER && !defined(X2_DIAG_PIN) && !defined(X2_STEP_PIN) && !PIN_EXISTS(X2_CS_PIN) +// X2 auto-assignment will use up an E stepper, but not if it's chained +#if HAS_X2_STEPPER && !defined(X2_STEP_PIN) && !PIN_EXISTS(X2_CS_PIN) #define Y2_E_INDEX INCREMENT(X2_E_INDEX) #else #define Y2_E_INDEX X2_E_INDEX @@ -816,25 +760,23 @@ // // Auto-assign pins for stallGuard sensorless homing // - #if !defined(X2_DIAG_PIN) && !defined(X2_USE_ENDSTOP) && defined(X2_STALL_SENSITIVITY) && ENABLED(X_DUAL_ENDSTOPS) && _PEXI(X2_E_INDEX, DIAG) - #define X2_DIAG_PIN _EPIN(X2_E_INDEX, DIAG) + #if !defined(X2_STOP_PIN) && defined(X2_STALL_SENSITIVITY) && ENABLED(X_DUAL_ENDSTOPS) && E_DIAG_EXISTS(X2_E_INDEX) #if DIAG_REMAPPED(X2, X_MIN) // If already remapped in the pins file... - #define X2_USE_ENDSTOP _XMIN_ + #define X2_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(X2, Y_MIN) - #define X2_USE_ENDSTOP _YMIN_ + #define X2_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(X2, Z_MIN) - #define X2_USE_ENDSTOP _ZMIN_ + #define X2_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(X2, X_MAX) - #define X2_USE_ENDSTOP _XMAX_ + #define X2_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(X2, Y_MAX) - #define X2_USE_ENDSTOP _YMAX_ + #define X2_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(X2, Z_MAX) - #define X2_USE_ENDSTOP _ZMAX_ + #define X2_STOP_PIN Z_MAX_PIN #else // Otherwise pick the next free En_DIAG_PIN directly - #define X2_USE_ENDSTOP _En_DIAG_(X2_E_INDEX) + #define X2_STOP_PIN _En_DIAG_PIN(X2_E_INDEX) #endif #define AUTO_ASSIGNED_X2_DIAG 1 - #undef X2_DIAG_PIN // Defined in Conditionals_post.h based on X2_USE_ENDSTOP #endif #endif @@ -851,14 +793,15 @@ #define X2_MS3_PIN -1 #endif -#if HAS_DUAL_Y_STEPPERS && !defined(Y2_DIAG_PIN) && !defined(Y2_STEP_PIN) && !PIN_EXISTS(Y2_CS_PIN) +// Y2 auto-assignment will use up an E stepper, but not if it's chained +#if HAS_Y2_STEPPER && !defined(Y2_STEP_PIN) && !PIN_EXISTS(Y2_CS_PIN) #define Z2_E_INDEX INCREMENT(Y2_E_INDEX) #else #define Z2_E_INDEX Y2_E_INDEX #endif // The Y2 axis, if any, should be the next open extruder port -#if HAS_DUAL_Y_STEPPERS +#if HAS_Y2_STEPPER #ifndef Y2_STEP_PIN #define Y2_STEP_PIN _EPIN(Y2_E_INDEX, STEP) #define Y2_DIR_PIN _EPIN(Y2_E_INDEX, DIR) @@ -902,25 +845,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(Y2_DIAG_PIN) && !defined(Y2_USE_ENDSTOP) && defined(Y2_STALL_SENSITIVITY) && ENABLED(Y_DUAL_ENDSTOPS) && _PEXI(Y2_E_INDEX, DIAG) - #define Y2_DIAG_PIN _EPIN(Y2_E_INDEX, DIAG) + #if !defined(Y2_STOP_PIN) && defined(Y2_STALL_SENSITIVITY) && ENABLED(Y_DUAL_ENDSTOPS) && E_DIAG_EXISTS(Y2_E_INDEX) #if DIAG_REMAPPED(Y2, X_MIN) - #define Y2_USE_ENDSTOP _XMIN_ + #define Y2_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(Y2, Y_MIN) - #define Y2_USE_ENDSTOP _YMIN_ + #define Y2_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(Y2, Z_MIN) - #define Y2_USE_ENDSTOP _ZMIN_ + #define Y2_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(Y2, X_MAX) - #define Y2_USE_ENDSTOP _XMAX_ + #define Y2_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(Y2, Y_MAX) - #define Y2_USE_ENDSTOP _YMAX_ + #define Y2_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(Y2, Z_MAX) - #define Y2_USE_ENDSTOP _ZMAX_ + #define Y2_STOP_PIN Z_MAX_PIN #else - #define Y2_USE_ENDSTOP _En_DIAG_(Y2_E_INDEX) + #define Y2_STOP_PIN _En_DIAG_PIN(Y2_E_INDEX) #endif #define AUTO_ASSIGNED_Y2_DIAG 1 - #undef Y2_DIAG_PIN // Defined in Conditionals_post.h based on Y2_USE_ENDSTOP #endif #endif @@ -937,7 +878,8 @@ #define Y2_MS3_PIN -1 #endif -#if NUM_Z_STEPPERS >= 2 && !defined(Z2_DIAG_PIN) && !defined(Z2_STEP_PIN) && !PIN_EXISTS(Z2_CS_PIN) +// Z2 auto-assignment will use up an E stepper, but not if it's chained +#if NUM_Z_STEPPERS >= 2 && !defined(Z2_STEP_PIN) && !PIN_EXISTS(Z2_CS_PIN) #define Z3_E_INDEX INCREMENT(Z2_E_INDEX) #else #define Z3_E_INDEX Z2_E_INDEX @@ -988,25 +930,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(Z2_DIAG_PIN) && !defined(Z2_USE_ENDSTOP) && defined(Z2_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && _PEXI(Z2_E_INDEX, DIAG) - #define Z2_DIAG_PIN _EPIN(Z2_E_INDEX, DIAG) + #if !defined(Z2_STOP_PIN) && defined(Z2_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && E_DIAG_EXISTS(Z2_E_INDEX) #if DIAG_REMAPPED(Z2, X_MIN) - #define Z2_USE_ENDSTOP _XMIN_ + #define Z2_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(Z2, Y_MIN) - #define Z2_USE_ENDSTOP _YMIN_ + #define Z2_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(Z2, Z_MIN) - #define Z2_USE_ENDSTOP _ZMIN_ + #define Z2_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(Z2, X_MAX) - #define Z2_USE_ENDSTOP _XMAX_ + #define Z2_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(Z2, Y_MAX) - #define Z2_USE_ENDSTOP _YMAX_ + #define Z2_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(Z2, Z_MAX) - #define Z2_USE_ENDSTOP _ZMAX_ + #define Z2_STOP_PIN Z_MAX_PIN #else - #define Z2_USE_ENDSTOP _En_DIAG_(Z2_E_INDEX) + #define Z2_STOP_PIN _En_DIAG_PIN(Z2_E_INDEX) #endif #define AUTO_ASSIGNED_Z2_DIAG 1 - #undef Z2_DIAG_PIN // Defined in Conditionals_post.h based on Z2_USE_ENDSTOP #endif #endif @@ -1023,7 +963,8 @@ #define Z2_MS3_PIN -1 #endif -#if NUM_Z_STEPPERS >= 3 && !defined(Z3_DIAG_PIN) && !defined(Z3_STEP_PIN) && !PIN_EXISTS(Z3_CS_PIN) +// Z3 auto-assignment will use up an E stepper, but not if it's chained +#if NUM_Z_STEPPERS >= 3 && !defined(Z3_STEP_PIN) && !PIN_EXISTS(Z3_CS_PIN) #define Z4_E_INDEX INCREMENT(Z3_E_INDEX) #else #define Z4_E_INDEX Z3_E_INDEX @@ -1074,25 +1015,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(Z3_DIAG_PIN) && !defined(Z3_USE_ENDSTOP) && defined(Z3_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && _PEXI(Z3_E_INDEX, DIAG) - #define Z3_DIAG_PIN _EPIN(Z3_E_INDEX, DIAG) + #if !defined(Z3_STOP_PIN) && defined(Z3_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && E_DIAG_EXISTS(Z3_E_INDEX) #if DIAG_REMAPPED(Z3, X_MIN) - #define Z3_USE_ENDSTOP _XMIN_ + #define Z3_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(Z3, Y_MIN) - #define Z3_USE_ENDSTOP _YMIN_ + #define Z3_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(Z3, Z_MIN) - #define Z3_USE_ENDSTOP _ZMIN_ + #define Z3_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(Z3, X_MAX) - #define Z3_USE_ENDSTOP _XMAX_ + #define Z3_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(Z3, Y_MAX) - #define Z3_USE_ENDSTOP _YMAX_ + #define Z3_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(Z3, Z_MAX) - #define Z3_USE_ENDSTOP _ZMAX_ + #define Z3_STOP_PIN Z_MAX_PIN #else - #define Z3_USE_ENDSTOP _En_DIAG_(Z3_E_INDEX) + #define Z3_STOP_PIN _En_DIAG_PIN(Z3_E_INDEX) #endif #define AUTO_ASSIGNED_Z3_DIAG 1 - #undef Z3_DIAG_PIN // Defined in Conditionals_post.h based on Z3_USE_ENDSTOP #endif #endif @@ -1109,7 +1048,8 @@ #define Z3_MS3_PIN -1 #endif -#if NUM_Z_STEPPERS >= 4 && !defined(Z4_DIAG_PIN) && !defined(Z4_STEP_PIN) && !PIN_EXISTS(Z4_CS_PIN) +// Z4 auto-assignment will use up an E stepper, but not if it's chained +#if NUM_Z_STEPPERS >= 4 && !defined(Z4_STEP_PIN) && !PIN_EXISTS(Z4_CS_PIN) #define I_E_INDEX INCREMENT(Z4_E_INDEX) #else #define I_E_INDEX Z4_E_INDEX @@ -1160,25 +1100,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(Z4_DIAG_PIN) && !defined(Z4_USE_ENDSTOP) && defined(Z4_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && _PEXI(Z4_E_INDEX, DIAG) - #define Z4_DIAG_PIN _EPIN(Z4_E_INDEX, DIAG) + #if !defined(Z4_STOP_PIN) && defined(Z4_STALL_SENSITIVITY) && ENABLED(Z_MULTI_ENDSTOPS) && E_DIAG_EXISTS(Z4_E_INDEX) #if DIAG_REMAPPED(Z4, X_MIN) - #define Z4_USE_ENDSTOP _XMIN_ + #define Z4_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(Z4, Y_MIN) - #define Z4_USE_ENDSTOP _YMIN_ + #define Z4_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(Z4, Z_MIN) - #define Z4_USE_ENDSTOP _ZMIN_ + #define Z4_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(Z4, X_MAX) - #define Z4_USE_ENDSTOP _XMAX_ + #define Z4_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(Z4, Y_MAX) - #define Z4_USE_ENDSTOP _YMAX_ + #define Z4_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(Z4, Z_MAX) - #define Z4_USE_ENDSTOP _ZMAX_ + #define Z4_STOP_PIN Z_MAX_PIN #else - #define Z4_USE_ENDSTOP _En_DIAG_(Z4_E_INDEX) + #define Z4_STOP_PIN _En_DIAG_PIN(Z4_E_INDEX) #endif #define AUTO_ASSIGNED_Z4_DIAG 1 - #undef Z4_DIAG_PIN // Defined in Conditionals_post.h based on Z4_USE_ENDSTOP #endif #endif @@ -1195,7 +1133,8 @@ #define Z4_MS3_PIN -1 #endif -#if HAS_I_AXIS && !defined(I_DIAG_PIN) && !defined(I_STEP_PIN) && !PIN_EXISTS(I_CS_PIN) +// I auto-assignment will use up an E stepper, but not if it's chained +#if HAS_I_AXIS && !defined(I_STEP_PIN) && !PIN_EXISTS(I_CS_PIN) #define J_E_INDEX INCREMENT(I_E_INDEX) #else #define J_E_INDEX I_E_INDEX @@ -1246,25 +1185,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(I_DIAG_PIN) && !defined(I_USE_ENDSTOP) && defined(I_STALL_SENSITIVITY) && _PEXI(I_E_INDEX, DIAG) - #define I_DIAG_PIN _EPIN(I_E_INDEX, DIAG) + #if !defined(I_STOP_PIN) && defined(I_STALL_SENSITIVITY) && E_DIAG_EXISTS(I_E_INDEX) #if DIAG_REMAPPED(I, X_MIN) - #define I_USE_ENDSTOP _XMIN_ + #define I_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(I, Y_MIN) - #define I_USE_ENDSTOP _YMIN_ + #define I_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(I, Z_MIN) - #define I_USE_ENDSTOP _ZMIN_ + #define I_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(I, X_MAX) - #define I_USE_ENDSTOP _XMAX_ + #define I_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(I, Y_MAX) - #define I_USE_ENDSTOP _YMAX_ + #define I_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(I, Z_MAX) - #define I_USE_ENDSTOP _ZMAX_ + #define I_STOP_PIN Z_MAX_PIN #else - #define I_USE_ENDSTOP _En_DIAG_(I_E_INDEX) + #define I_STOP_PIN _En_DIAG_PIN(I_E_INDEX) #endif #define AUTO_ASSIGNED_I_DIAG 1 - #undef I_DIAG_PIN // Defined in Conditionals_post.h based on I_USE_ENDSTOP #endif #endif @@ -1281,7 +1218,8 @@ #define I_MS3_PIN -1 #endif -#if HAS_J_AXIS && !defined(J_DIAG_PIN) && !defined(J_STEP_PIN) && !PIN_EXISTS(J_CS_PIN) +// J auto-assignment will use up an E stepper, but not if it's chained +#if HAS_J_AXIS && !defined(J_STEP_PIN) && !PIN_EXISTS(J_CS_PIN) #define K_E_INDEX INCREMENT(J_E_INDEX) #else #define K_E_INDEX J_E_INDEX @@ -1332,25 +1270,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(J_DIAG_PIN) && !defined(J_USE_ENDSTOP) && defined(J_STALL_SENSITIVITY) && _PEXI(J_E_INDEX, DIAG) - #define J_DIAG_PIN _EPIN(J_E_INDEX, DIAG) + #if !defined(J_STOP_PIN) && defined(J_STALL_SENSITIVITY) && E_DIAG_EXISTS(J_E_INDEX) #if DIAG_REMAPPED(J, X_MIN) - #define J_USE_ENDSTOP _XMIN_ + #define J_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(J, Y_MIN) - #define J_USE_ENDSTOP _YMIN_ + #define J_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(J, Z_MIN) - #define J_USE_ENDSTOP _ZMIN_ + #define J_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(J, X_MAX) - #define J_USE_ENDSTOP _XMAX_ + #define J_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(J, Y_MAX) - #define J_USE_ENDSTOP _YMAX_ + #define J_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(I, Z_MAX) - #define J_USE_ENDSTOP _ZMAX_ + #define J_STOP_PIN Z_MAX_PIN #else - #define J_USE_ENDSTOP _En_DIAG_(J_E_INDEX) + #define J_STOP_PIN _En_DIAG_PIN(J_E_INDEX) #endif #define AUTO_ASSIGNED_J_DIAG 1 - #undef J_DIAG_PIN // Defined in Conditionals_post.h based on J_USE_ENDSTOP #endif #endif @@ -1367,7 +1303,8 @@ #define J_MS3_PIN -1 #endif -#if HAS_K_AXIS && !defined(K_DIAG_PIN) && !defined(K_STEP_PIN) && !PIN_EXISTS(K_CS_PIN) +// K auto-assignment will use up an E stepper, but not if it's chained +#if HAS_K_AXIS && !defined(K_STEP_PIN) && !PIN_EXISTS(K_CS_PIN) #define U_E_INDEX INCREMENT(K_E_INDEX) #else #define U_E_INDEX K_E_INDEX @@ -1418,25 +1355,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(K_DIAG_PIN) && !defined(K_USE_ENDSTOP) && defined(K_STALL_SENSITIVITY) && _PEXI(K_E_INDEX, DIAG) - #define K_DIAG_PIN _EPIN(K_E_INDEX, DIAG) + #if !defined(K_STOP_PIN) && defined(K_STALL_SENSITIVITY) && E_DIAG_EXISTS(K_E_INDEX) #if DIAG_REMAPPED(K, X_MIN) - #define K_USE_ENDSTOP _XMIN_ + #define K_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(K, Y_MIN) - #define K_USE_ENDSTOP _YMIN_ + #define K_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(K, Z_MIN) - #define K_USE_ENDSTOP _ZMIN_ + #define K_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(K, X_MAX) - #define K_USE_ENDSTOP _XMAX_ + #define K_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(K, Y_MAX) - #define K_USE_ENDSTOP _YMAX_ + #define K_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(K, Z_MAX) - #define K_USE_ENDSTOP _ZMAX_ + #define K_STOP_PIN Z_MAX_PIN #else - #define K_USE_ENDSTOP _En_DIAG_(K_E_INDEX) + #define K_STOP_PIN _En_DIAG_PIN(K_E_INDEX) #endif #define AUTO_ASSIGNED_K_DIAG 1 - #undef K_DIAG_PIN // Defined in Conditionals_post.h based on K_USE_ENDSTOP #endif #endif @@ -1453,7 +1388,8 @@ #define K_MS3_PIN -1 #endif -#if HAS_U_AXIS && !defined(U_DIAG_PIN) && !defined(U_STEP_PIN) && !PIN_EXISTS(U_CS_PIN) +// U auto-assignment will use up an E stepper, but not if it's chained +#if HAS_U_AXIS && !defined(U_STEP_PIN) && !PIN_EXISTS(U_CS_PIN) #define V_E_INDEX INCREMENT(U_E_INDEX) #else #define V_E_INDEX U_E_INDEX @@ -1504,25 +1440,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(U_DIAG_PIN) && !defined(U_USE_ENDSTOP) && defined(U_STALL_SENSITIVITY) && _PEXI(U_E_INDEX, DIAG) - #define U_DIAG_PIN _EPIN(U_E_INDEX, DIAG) + #if !defined(U_STOP_PIN) && defined(U_STALL_SENSITIVITY) && E_DIAG_EXISTS(U_E_INDEX) #if DIAG_REMAPPED(U, X_MIN) - #define U_USE_ENDSTOP _XMIN_ + #define U_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(U, Y_MIN) - #define U_USE_ENDSTOP _YMIN_ + #define U_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(U, Z_MIN) - #define U_USE_ENDSTOP _ZMIN_ + #define U_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(U, X_MAX) - #define U_USE_ENDSTOP _XMAX_ + #define U_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(U, Y_MAX) - #define U_USE_ENDSTOP _YMAX_ + #define U_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(U, Z_MAX) - #define U_USE_ENDSTOP _ZMAX_ + #define U_STOP_PIN Z_MAX_PIN #else - #define U_USE_ENDSTOP _En_DIAG_(U_E_INDEX) + #define U_STOP_PIN _En_DIAG_PIN(U_E_INDEX) #endif #define AUTO_ASSIGNED_U_DIAG 1 - #undef U_DIAG_PIN // Defined in Conditionals_post.h based on U_USE_ENDSTOP #endif #endif @@ -1539,7 +1473,8 @@ #define U_MS3_PIN -1 #endif -#if HAS_V_AXIS && !defined(V_DIAG_PIN) && !defined(V_STEP_PIN) && !PIN_EXISTS(V_CS_PIN) +// V auto-assignment will use up an E stepper, but not if it's chained +#if HAS_V_AXIS && !defined(V_STEP_PIN) && !PIN_EXISTS(V_CS_PIN) #define W_E_INDEX INCREMENT(V_E_INDEX) #else #define W_E_INDEX V_E_INDEX @@ -1590,25 +1525,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(V_DIAG_PIN) && !defined(V_USE_ENDSTOP) && defined(V_STALL_SENSITIVITY) && _PEXI(V_E_INDEX, DIAG) - #define V_DIAG_PIN _EPIN(V_E_INDEX, DIAG) + #if !defined(V_STOP_PIN) && defined(V_STALL_SENSITIVITY) && E_DIAG_EXISTS(V_E_INDEX) #if DIAG_REMAPPED(V, X_MIN) - #define V_USE_ENDSTOP _XMIN_ + #define V_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(V, Y_MIN) - #define V_USE_ENDSTOP _YMIN_ + #define V_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(V, Z_MIN) - #define V_USE_ENDSTOP _ZMIN_ + #define V_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(V, X_MAX) - #define V_USE_ENDSTOP _XMAX_ + #define V_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(V, Y_MAX) - #define V_USE_ENDSTOP _YMAX_ + #define V_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(V, Z_MAX) - #define V_USE_ENDSTOP _ZMAX_ + #define V_STOP_PIN Z_MAX_PIN #else - #define V_USE_ENDSTOP _En_DIAG_(V_E_INDEX) + #define V_STOP_PIN _En_DIAG_PIN(V_E_INDEX) #endif #define AUTO_ASSIGNED_V_DIAG 1 - #undef V_DIAG_PIN // Defined in Conditionals_post.h based on O_USE_ENDSTOP #endif #endif @@ -1670,25 +1603,23 @@ #endif #endif // Auto-assign pins for stallGuard sensorless homing - #if !defined(W_DIAG_PIN) && !defined(W_USE_ENDSTOP) && defined(W_STALL_SENSITIVITY) && _PEXI(W_E_INDEX, DIAG) - #define W_DIAG_PIN _EPIN(W_E_INDEX, DIAG) + #if !defined(W_STOP_PIN) && defined(W_STALL_SENSITIVITY) && E_DIAG_EXISTS(W_E_INDEX) #if DIAG_REMAPPED(W, X_MIN) - #define W_USE_ENDSTOP _XMIN_ + #define W_STOP_PIN X_MIN_PIN #elif DIAG_REMAPPED(W, Y_MIN) - #define W_USE_ENDSTOP _YMIN_ + #define W_STOP_PIN Y_MIN_PIN #elif DIAG_REMAPPED(W, Z_MIN) - #define W_USE_ENDSTOP _ZMIN_ + #define W_STOP_PIN Z_MIN_PIN #elif DIAG_REMAPPED(W, X_MAX) - #define W_USE_ENDSTOP _XMAX_ + #define W_STOP_PIN X_MAX_PIN #elif DIAG_REMAPPED(W, Y_MAX) - #define W_USE_ENDSTOP _YMAX_ + #define W_STOP_PIN Y_MAX_PIN #elif DIAG_REMAPPED(W, Z_MAX) - #define W_USE_ENDSTOP _ZMAX_ + #define W_STOP_PIN Z_MAX_PIN #else - #define W_USE_ENDSTOP _En_DIAG_(W_E_INDEX) + #define W_STOP_PIN _En_DIAG_PIN(W_E_INDEX) #endif #define AUTO_ASSIGNED_W_DIAG 1 - #undef W_DIAG_PIN // Defined in Conditionals_post.h based on Q_USE_ENDSTOP #endif #endif @@ -1705,634 +1636,54 @@ #define W_MS3_PIN -1 #endif -// -// Disable unused endstop / probe pins -// -#define _STOP_IN_USE(N) (X2_USE_ENDSTOP == N || Y2_USE_ENDSTOP == N || Z2_USE_ENDSTOP == N || Z3_USE_ENDSTOP == N || Z4_USE_ENDSTOP == N) -#if !defined(USE_XMAX_PLUG) && _STOP_IN_USE(_XMAX_) - #define USE_XMAX_PLUG -#endif -#if !defined(USE_YMAX_PLUG) && _STOP_IN_USE(_YMAX_) - #define USE_YMAX_PLUG -#endif -#if !defined(USE_ZMAX_PLUG) && _STOP_IN_USE(_ZMAX_) - #define USE_ZMAX_PLUG -#endif -#if !defined(USE_XMIN_PLUG) && _STOP_IN_USE(_XMIN_) - #define USE_XMIN_PLUG -#endif -#if !defined(USE_YMIN_PLUG) && _STOP_IN_USE(_YMIN_) - #define USE_YMIN_PLUG -#endif -#if !defined(USE_ZMIN_PLUG) && _STOP_IN_USE(_ZMIN_) - #define USE_ZMIN_PLUG -#endif -#undef _STOP_IN_USE -#if !USES_Z_MIN_PROBE_PIN - #undef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN -1 -#endif -#if DISABLED(USE_XMIN_PLUG) - #undef X_MIN_PIN - #define X_MIN_PIN -1 -#endif -#if DISABLED(USE_XMAX_PLUG) - #undef X_MAX_PIN - #define X_MAX_PIN -1 -#endif -#if NONE(USE_XMIN_PLUG, USE_XMAX_PLUG) - #undef X_STOP_PIN -#endif -#if DISABLED(USE_YMIN_PLUG) - #undef Y_MIN_PIN - #define Y_MIN_PIN -1 -#endif -#if DISABLED(USE_YMAX_PLUG) - #undef Y_MAX_PIN - #define Y_MAX_PIN -1 -#endif -#if NONE(USE_YMIN_PLUG, USE_YMAX_PLUG) - #undef Y_STOP_PIN -#endif -#if DISABLED(USE_ZMIN_PLUG) - #undef Z_MIN_PIN - #define Z_MIN_PIN -1 -#endif -#if DISABLED(USE_ZMAX_PLUG) - #undef Z_MAX_PIN - #define Z_MAX_PIN -1 -#endif -#if NONE(USE_ZMIN_PLUG, USE_ZMAX_PLUG) - #undef Z_STOP_PIN -#endif -#if DISABLED(USE_IMIN_PLUG) - #undef I_MIN_PIN - #define I_MIN_PIN -1 -#endif -#if DISABLED(USE_IMAX_PLUG) - #undef I_MAX_PIN - #define I_MAX_PIN -1 -#endif -#if NONE(USE_IMIN_PLUG, USE_IMAX_PLUG) - #undef I_STOP_PIN -#endif -#if DISABLED(USE_JMIN_PLUG) - #undef J_MIN_PIN - #define J_MIN_PIN -1 -#endif -#if DISABLED(USE_JMAX_PLUG) - #undef J_MAX_PIN - #define J_MAX_PIN -1 -#endif -#if NONE(USE_JMIN_PLUG, USE_JMAX_PLUG) - #undef J_STOP_PIN -#endif -#if DISABLED(USE_KMIN_PLUG) - #undef K_MIN_PIN - #define K_MIN_PIN -1 -#endif -#if DISABLED(USE_KMAX_PLUG) - #undef K_MAX_PIN - #define K_MAX_PIN -1 -#endif -#if NONE(USE_KMIN_PLUG, USE_KMAX_PLUG) - #undef K_STOP_PIN -#endif -#if DISABLED(USE_UMIN_PLUG) - #undef U_MIN_PIN - #define U_MIN_PIN -1 -#endif -#if DISABLED(USE_UMAX_PLUG) - #undef U_MAX_PIN - #define U_MAX_PIN -1 -#endif -#if NONE(USE_UMIN_PLUG, USE_UMAX_PLUG) - #undef U_STOP_PIN -#endif -#if DISABLED(USE_VMIN_PLUG) - #undef V_MIN_PIN - #define V_MIN_PIN -1 -#endif -#if DISABLED(USE_VMAX_PLUG) - #undef V_MAX_PIN - #define V_MAX_PIN -1 -#endif -#if NONE(USE_VMIN_PLUG, USE_VMAX_PLUG) - #undef V_STOP_PIN -#endif -#if DISABLED(USE_WMIN_PLUG) - #undef W_MIN_PIN - #define W_MIN_PIN -1 -#endif -#if DISABLED(USE_WMAX_PLUG) - #undef W_MAX_PIN - #define W_MAX_PIN -1 -#endif -#if NONE(USE_WMIN_PLUG, USE_WMAX_PLUG) - #undef W_STOP_PIN -#endif - -#if DISABLED(X_DUAL_ENDSTOPS) || X_HOME_TO_MAX - #undef X2_MIN_PIN -#endif -#if DISABLED(X_DUAL_ENDSTOPS) || X_HOME_TO_MIN - #undef X2_MAX_PIN -#endif -#if DISABLED(Y_DUAL_ENDSTOPS) || Y_HOME_TO_MAX - #undef Y2_MIN_PIN -#endif -#if DISABLED(Y_DUAL_ENDSTOPS) || Y_HOME_TO_MIN - #undef Y2_MAX_PIN -#endif -#if DISABLED(Z_MULTI_ENDSTOPS) || Z_HOME_TO_MAX - #undef Z2_MIN_PIN -#endif -#if DISABLED(Z_MULTI_ENDSTOPS) || Z_HOME_TO_MIN - #undef Z2_MAX_PIN -#endif -#if DISABLED(Z_MULTI_ENDSTOPS) || NUM_Z_STEPPERS < 3 || Z_HOME_TO_MAX - #undef Z3_MIN_PIN -#endif -#if DISABLED(Z_MULTI_ENDSTOPS) || NUM_Z_STEPPERS < 3 || Z_HOME_TO_MIN - #undef Z3_MAX_PIN -#endif -#if DISABLED(Z_MULTI_ENDSTOPS) || NUM_Z_STEPPERS < 4 || Z_HOME_TO_MAX - #undef Z4_MIN_PIN -#endif -#if DISABLED(Z_MULTI_ENDSTOPS) || NUM_Z_STEPPERS < 4 || Z_HOME_TO_MIN - #undef Z4_MAX_PIN -#endif - /** * X_DUAL_ENDSTOPS endstop reassignment */ -#if ENABLED(X_DUAL_ENDSTOPS) +#if ENABLED(X_DUAL_ENDSTOPS) && PIN_EXISTS(X2_STOP) #if X_HOME_TO_MAX && !defined(X2_MAX_PIN) - #if PIN_EXISTS(X2_STOP) - #define X2_MAX_PIN X2_STOP_PIN - #elif X2_USE_ENDSTOP == _XMIN_ - #define X2_MAX_PIN X_MIN_PIN - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MAX_PIN X_MAX_PIN - #elif X2_USE_ENDSTOP == _XSTOP_ - #define X2_MAX_PIN X_STOP_PIN - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MAX_PIN Y_MIN_PIN - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MAX_PIN Y_MAX_PIN - #elif X2_USE_ENDSTOP == _YSTOP_ - #define X2_MAX_PIN Y_STOP_PIN - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MAX_PIN Z_MIN_PIN - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MAX_PIN Z_MAX_PIN - #elif X2_USE_ENDSTOP == _ZSTOP_ - #define X2_MAX_PIN Z_STOP_PIN - #elif X2_USE_ENDSTOP == _XDIAG_ - #define X2_MAX_PIN X_DIAG_PIN - #elif X2_USE_ENDSTOP == _YDIAG_ - #define X2_MAX_PIN Y_DIAG_PIN - #elif X2_USE_ENDSTOP == _ZDIAG_ - #define X2_MAX_PIN Z_DIAG_PIN - #elif X2_USE_ENDSTOP == _E0DIAG_ - #define X2_MAX_PIN E0_DIAG_PIN - #elif X2_USE_ENDSTOP == _E1DIAG_ - #define X2_MAX_PIN E1_DIAG_PIN - #elif X2_USE_ENDSTOP == _E2DIAG_ - #define X2_MAX_PIN E2_DIAG_PIN - #elif X2_USE_ENDSTOP == _E3DIAG_ - #define X2_MAX_PIN E3_DIAG_PIN - #elif X2_USE_ENDSTOP == _E4DIAG_ - #define X2_MAX_PIN E4_DIAG_PIN - #elif X2_USE_ENDSTOP == _E5DIAG_ - #define X2_MAX_PIN E5_DIAG_PIN - #elif X2_USE_ENDSTOP == _E6DIAG_ - #define X2_MAX_PIN E6_DIAG_PIN - #elif X2_USE_ENDSTOP == _E7DIAG_ - #define X2_MAX_PIN E7_DIAG_PIN - #endif + #define X2_MAX_PIN X2_STOP_PIN #elif X_HOME_TO_MIN && !defined(X2_MIN_PIN) - #if PIN_EXISTS(X2_STOP) - #define X2_MIN_PIN X2_STOP_PIN - #elif X2_USE_ENDSTOP == _XMIN_ - #define X2_MIN_PIN X_MIN_PIN - #elif X2_USE_ENDSTOP == _XMAX_ - #define X2_MIN_PIN X_MAX_PIN - #elif X2_USE_ENDSTOP == _XSTOP_ - #define X2_MIN_PIN X_STOP_PIN - #elif X2_USE_ENDSTOP == _YMIN_ - #define X2_MIN_PIN Y_MIN_PIN - #elif X2_USE_ENDSTOP == _YMAX_ - #define X2_MIN_PIN Y_MAX_PIN - #elif X2_USE_ENDSTOP == _YSTOP_ - #define X2_MIN_PIN Y_STOP_PIN - #elif X2_USE_ENDSTOP == _ZMIN_ - #define X2_MIN_PIN Z_MIN_PIN - #elif X2_USE_ENDSTOP == _ZMAX_ - #define X2_MIN_PIN Z_MAX_PIN - #elif X2_USE_ENDSTOP == _ZSTOP_ - #define X2_MIN_PIN Z_STOP_PIN - #elif X2_USE_ENDSTOP == _XDIAG_ - #define X2_MIN_PIN X_DIAG_PIN - #elif X2_USE_ENDSTOP == _YDIAG_ - #define X2_MIN_PIN Y_DIAG_PIN - #elif X2_USE_ENDSTOP == _ZDIAG_ - #define X2_MIN_PIN Z_DIAG_PIN - #elif X2_USE_ENDSTOP == _E0DIAG_ - #define X2_MIN_PIN E0_DIAG_PIN - #elif X2_USE_ENDSTOP == _E1DIAG_ - #define X2_MIN_PIN E1_DIAG_PIN - #elif X2_USE_ENDSTOP == _E2DIAG_ - #define X2_MIN_PIN E2_DIAG_PIN - #elif X2_USE_ENDSTOP == _E3DIAG_ - #define X2_MIN_PIN E3_DIAG_PIN - #elif X2_USE_ENDSTOP == _E4DIAG_ - #define X2_MIN_PIN E4_DIAG_PIN - #elif X2_USE_ENDSTOP == _E5DIAG_ - #define X2_MIN_PIN E5_DIAG_PIN - #elif X2_USE_ENDSTOP == _E6DIAG_ - #define X2_MIN_PIN E6_DIAG_PIN - #elif X2_USE_ENDSTOP == _E7DIAG_ - #define X2_MIN_PIN E7_DIAG_PIN - #endif + #define X2_MIN_PIN X2_STOP_PIN #endif -#endif // X_DUAL_ENDSTOPS +#endif /** * Y_DUAL_ENDSTOPS endstop reassignment */ -#if ENABLED(Y_DUAL_ENDSTOPS) +#if ENABLED(Y_DUAL_ENDSTOPS) && PIN_EXISTS(Y2_STOP) #if Y_HOME_TO_MAX && !defined(Y2_MAX_PIN) - #if PIN_EXISTS(Y2_STOP) - #define Y2_MAX_PIN Y2_STOP_PIN - #elif Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MAX_PIN X_MIN_PIN - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MAX_PIN X_MAX_PIN - #elif Y2_USE_ENDSTOP == _XSTOP_ - #define Y2_MAX_PIN X_STOP_PIN - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MAX_PIN Y_MIN_PIN - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MAX_PIN Y_MAX_PIN - #elif Y2_USE_ENDSTOP == _YSTOP_ - #define Y2_MAX_PIN Y_STOP_PIN - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MAX_PIN Z_MIN_PIN - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MAX_PIN Z_MAX_PIN - #elif Y2_USE_ENDSTOP == _ZSTOP_ - #define Y2_MAX_PIN Z_STOP_PIN - #elif Y2_USE_ENDSTOP == _XDIAG_ - #define Y2_MAX_PIN X_DIAG_PIN - #elif Y2_USE_ENDSTOP == _YDIAG_ - #define Y2_MAX_PIN Y_DIAG_PIN - #elif Y2_USE_ENDSTOP == _ZDIAG_ - #define Y2_MAX_PIN Z_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E0DIAG_ - #define Y2_MAX_PIN E0_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E1DIAG_ - #define Y2_MAX_PIN E1_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E2DIAG_ - #define Y2_MAX_PIN E2_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E3DIAG_ - #define Y2_MAX_PIN E3_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E4DIAG_ - #define Y2_MAX_PIN E4_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E5DIAG_ - #define Y2_MAX_PIN E5_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E6DIAG_ - #define Y2_MAX_PIN E6_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E7DIAG_ - #define Y2_MAX_PIN E7_DIAG_PIN - #endif + #define Y2_MAX_PIN Y2_STOP_PIN #elif Y_HOME_TO_MIN && !defined(Y2_MIN_PIN) - #if PIN_EXISTS(Y2_STOP) - #define Y2_MIN_PIN Y2_STOP_PIN - #elif Y2_USE_ENDSTOP == _XMIN_ - #define Y2_MIN_PIN X_MIN_PIN - #elif Y2_USE_ENDSTOP == _XMAX_ - #define Y2_MIN_PIN X_MAX_PIN - #elif Y2_USE_ENDSTOP == _XSTOP_ - #define Y2_MIN_PIN X_STOP_PIN - #elif Y2_USE_ENDSTOP == _YMIN_ - #define Y2_MIN_PIN Y_MIN_PIN - #elif Y2_USE_ENDSTOP == _YMAX_ - #define Y2_MIN_PIN Y_MAX_PIN - #elif Y2_USE_ENDSTOP == _YSTOP_ - #define Y2_MIN_PIN Y_STOP_PIN - #elif Y2_USE_ENDSTOP == _ZMIN_ - #define Y2_MIN_PIN Z_MIN_PIN - #elif Y2_USE_ENDSTOP == _ZMAX_ - #define Y2_MIN_PIN Z_MAX_PIN - #elif Y2_USE_ENDSTOP == _ZSTOP_ - #define Y2_MIN_PIN Z_STOP_PIN - #elif Y2_USE_ENDSTOP == _XDIAG_ - #define Y2_MIN_PIN X_DIAG_PIN - #elif Y2_USE_ENDSTOP == _YDIAG_ - #define Y2_MIN_PIN Y_DIAG_PIN - #elif Y2_USE_ENDSTOP == _ZDIAG_ - #define Y2_MIN_PIN Z_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E0DIAG_ - #define Y2_MIN_PIN E0_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E1DIAG_ - #define Y2_MIN_PIN E1_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E2DIAG_ - #define Y2_MIN_PIN E2_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E3DIAG_ - #define Y2_MIN_PIN E3_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E4DIAG_ - #define Y2_MIN_PIN E4_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E5DIAG_ - #define Y2_MIN_PIN E5_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E6DIAG_ - #define Y2_MIN_PIN E6_DIAG_PIN - #elif Y2_USE_ENDSTOP == _E7DIAG_ - #define Y2_MIN_PIN E7_DIAG_PIN - #endif + #define Y2_MIN_PIN Y2_STOP_PIN #endif -#endif // Y_DUAL_ENDSTOPS +#endif /** * Z_MULTI_ENDSTOPS endstop reassignment */ #if ENABLED(Z_MULTI_ENDSTOPS) - - #if Z_HOME_TO_MAX && !defined(Z2_MAX_PIN) - #if PIN_EXISTS(Z2_STOP) + #if PIN_EXISTS(Z2_STOP) + #if Z_HOME_TO_MAX && !defined(Z2_MAX_PIN) #define Z2_MAX_PIN Z2_STOP_PIN - #elif Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MAX_PIN X_MIN_PIN - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MAX_PIN X_MAX_PIN - #elif Z2_USE_ENDSTOP == _XSTOP_ - #define Z2_MAX_PIN X_STOP_PIN - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MAX_PIN Y_MIN_PIN - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MAX_PIN Y_MAX_PIN - #elif Z2_USE_ENDSTOP == _YSTOP_ - #define Z2_MAX_PIN Y_STOP_PIN - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MAX_PIN Z_MIN_PIN - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MAX_PIN Z_MAX_PIN - #elif Z2_USE_ENDSTOP == _ZSTOP_ - #define Z2_MAX_PIN Z_STOP_PIN - #elif Z2_USE_ENDSTOP == _XDIAG_ - #define Z2_MAX_PIN X_DIAG_PIN - #elif Z2_USE_ENDSTOP == _YDIAG_ - #define Z2_MAX_PIN Y_DIAG_PIN - #elif Z2_USE_ENDSTOP == _ZDIAG_ - #define Z2_MAX_PIN Z_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E0DIAG_ - #define Z2_MAX_PIN E0_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E1DIAG_ - #define Z2_MAX_PIN E1_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E2DIAG_ - #define Z2_MAX_PIN E2_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E3DIAG_ - #define Z2_MAX_PIN E3_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E4DIAG_ - #define Z2_MAX_PIN E4_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E5DIAG_ - #define Z2_MAX_PIN E5_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E6DIAG_ - #define Z2_MAX_PIN E6_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E7DIAG_ - #define Z2_MAX_PIN E7_DIAG_PIN - #endif - #elif Z_HOME_TO_MIN && !defined(Z2_MIN_PIN) - #if PIN_EXISTS(Z2_STOP) + #elif Z_HOME_TO_MIN && !defined(Z2_MIN_PIN) #define Z2_MIN_PIN Z2_STOP_PIN - #elif Z2_USE_ENDSTOP == _XMIN_ - #define Z2_MIN_PIN X_MIN_PIN - #elif Z2_USE_ENDSTOP == _XMAX_ - #define Z2_MIN_PIN X_MAX_PIN - #elif Z2_USE_ENDSTOP == _XSTOP_ - #define Z2_MIN_PIN X_STOP_PIN - #elif Z2_USE_ENDSTOP == _YMIN_ - #define Z2_MIN_PIN Y_MIN_PIN - #elif Z2_USE_ENDSTOP == _YMAX_ - #define Z2_MIN_PIN Y_MAX_PIN - #elif Z2_USE_ENDSTOP == _YSTOP_ - #define Z2_MIN_PIN Y_STOP_PIN - #elif Z2_USE_ENDSTOP == _ZMIN_ - #define Z2_MIN_PIN Z_MIN_PIN - #elif Z2_USE_ENDSTOP == _ZMAX_ - #define Z2_MIN_PIN Z_MAX_PIN - #elif Z2_USE_ENDSTOP == _ZSTOP_ - #define Z2_MIN_PIN Z_STOP_PIN - #elif Z2_USE_ENDSTOP == _XDIAG_ - #define Z2_MIN_PIN X_DIAG_PIN - #elif Z2_USE_ENDSTOP == _YDIAG_ - #define Z2_MIN_PIN Y_DIAG_PIN - #elif Z2_USE_ENDSTOP == _ZDIAG_ - #define Z2_MIN_PIN Z_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E0DIAG_ - #define Z2_MIN_PIN E0_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E1DIAG_ - #define Z2_MIN_PIN E1_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E2DIAG_ - #define Z2_MIN_PIN E2_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E3DIAG_ - #define Z2_MIN_PIN E3_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E4DIAG_ - #define Z2_MIN_PIN E4_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E5DIAG_ - #define Z2_MIN_PIN E5_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E6DIAG_ - #define Z2_MIN_PIN E6_DIAG_PIN - #elif Z2_USE_ENDSTOP == _E7DIAG_ - #define Z2_MIN_PIN E7_DIAG_PIN #endif #endif - - #if NUM_Z_STEPPERS >= 3 + #if NUM_Z_STEPPERS >= 3 && PIN_EXISTS(Z3_STOP) #if Z_HOME_TO_MAX && !defined(Z3_MAX_PIN) - #if PIN_EXISTS(Z3_STOP) - #define Z3_MAX_PIN Z3_STOP_PIN - #elif Z3_USE_ENDSTOP == _XMIN_ - #define Z3_MAX_PIN X_MIN_PIN - #elif Z3_USE_ENDSTOP == _XMAX_ - #define Z3_MAX_PIN X_MAX_PIN - #elif Z3_USE_ENDSTOP == _XSTOP_ - #define Z3_MAX_PIN X_STOP_PIN - #elif Z3_USE_ENDSTOP == _YMIN_ - #define Z3_MAX_PIN Y_MIN_PIN - #elif Z3_USE_ENDSTOP == _YMAX_ - #define Z3_MAX_PIN Y_MAX_PIN - #elif Z3_USE_ENDSTOP == _YSTOP_ - #define Z3_MAX_PIN Y_STOP_PIN - #elif Z3_USE_ENDSTOP == _ZMIN_ - #define Z3_MAX_PIN Z_MIN_PIN - #elif Z3_USE_ENDSTOP == _ZMAX_ - #define Z3_MAX_PIN Z_MAX_PIN - #elif Z3_USE_ENDSTOP == _ZSTOP_ - #define Z3_MAX_PIN Z_STOP_PIN - #elif Z3_USE_ENDSTOP == _XDIAG_ - #define Z3_MAX_PIN X_DIAG_PIN - #elif Z3_USE_ENDSTOP == _YDIAG_ - #define Z3_MAX_PIN Y_DIAG_PIN - #elif Z3_USE_ENDSTOP == _ZDIAG_ - #define Z3_MAX_PIN Z_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E0DIAG_ - #define Z3_MAX_PIN E0_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E1DIAG_ - #define Z3_MAX_PIN E1_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E2DIAG_ - #define Z3_MAX_PIN E2_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E3DIAG_ - #define Z3_MAX_PIN E3_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E4DIAG_ - #define Z3_MAX_PIN E4_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E5DIAG_ - #define Z3_MAX_PIN E5_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E6DIAG_ - #define Z3_MAX_PIN E6_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E7DIAG_ - #define Z3_MAX_PIN E7_DIAG_PIN - #endif + #define Z3_MAX_PIN Z3_STOP_PIN #elif Z_HOME_TO_MIN && !defined(Z3_MIN_PIN) - #if PIN_EXISTS(Z3_STOP) - #define Z3_MIN_PIN Z3_STOP_PIN - #elif Z3_USE_ENDSTOP == _XMIN_ - #define Z3_MIN_PIN X_MIN_PIN - #elif Z3_USE_ENDSTOP == _XMAX_ - #define Z3_MIN_PIN X_MAX_PIN - #elif Z3_USE_ENDSTOP == _XSTOP_ - #define Z3_MIN_PIN X_STOP_PIN - #elif Z3_USE_ENDSTOP == _YMIN_ - #define Z3_MIN_PIN Y_MIN_PIN - #elif Z3_USE_ENDSTOP == _YMAX_ - #define Z3_MIN_PIN Y_MAX_PIN - #elif Z3_USE_ENDSTOP == _YSTOP_ - #define Z3_MIN_PIN Y_STOP_PIN - #elif Z3_USE_ENDSTOP == _ZMIN_ - #define Z3_MIN_PIN Z_MIN_PIN - #elif Z3_USE_ENDSTOP == _ZMAX_ - #define Z3_MIN_PIN Z_MAX_PIN - #elif Z3_USE_ENDSTOP == _ZSTOP_ - #define Z3_MIN_PIN Z_STOP_PIN - #elif Z3_USE_ENDSTOP == _XDIAG_ - #define Z3_MIN_PIN X_DIAG_PIN - #elif Z3_USE_ENDSTOP == _YDIAG_ - #define Z3_MIN_PIN Y_DIAG_PIN - #elif Z3_USE_ENDSTOP == _ZDIAG_ - #define Z3_MIN_PIN Z_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E0DIAG_ - #define Z3_MIN_PIN E0_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E1DIAG_ - #define Z3_MIN_PIN E1_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E2DIAG_ - #define Z3_MIN_PIN E2_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E3DIAG_ - #define Z3_MIN_PIN E3_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E4DIAG_ - #define Z3_MIN_PIN E4_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E5DIAG_ - #define Z3_MIN_PIN E5_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E6DIAG_ - #define Z3_MIN_PIN E6_DIAG_PIN - #elif Z3_USE_ENDSTOP == _E7DIAG_ - #define Z3_MIN_PIN E7_DIAG_PIN - #endif + #define Z3_MIN_PIN Z3_STOP_PIN #endif #endif - - #if NUM_Z_STEPPERS >= 4 + #if NUM_Z_STEPPERS >= 4 && PIN_EXISTS(Z4_STOP) #if Z_HOME_TO_MAX && !defined(Z4_MAX_PIN) - #if PIN_EXISTS(Z4_STOP) - #define Z4_MAX_PIN Z4_STOP_PIN - #elif Z4_USE_ENDSTOP == _XMIN_ - #define Z4_MAX_PIN X_MIN_PIN - #elif Z4_USE_ENDSTOP == _XMAX_ - #define Z4_MAX_PIN X_MAX_PIN - #elif Z4_USE_ENDSTOP == _XSTOP_ - #define Z4_MAX_PIN X_STOP_PIN - #elif Z4_USE_ENDSTOP == _YMIN_ - #define Z4_MAX_PIN Y_MIN_PIN - #elif Z4_USE_ENDSTOP == _YMAX_ - #define Z4_MAX_PIN Y_MAX_PIN - #elif Z4_USE_ENDSTOP == _YSTOP_ - #define Z4_MAX_PIN Y_STOP_PIN - #elif Z4_USE_ENDSTOP == _ZMIN_ - #define Z4_MAX_PIN Z_MIN_PIN - #elif Z4_USE_ENDSTOP == _ZMAX_ - #define Z4_MAX_PIN Z_MAX_PIN - #elif Z4_USE_ENDSTOP == _ZSTOP_ - #define Z4_MAX_PIN Z_STOP_PIN - #elif Z4_USE_ENDSTOP == _XDIAG_ - #define Z4_MAX_PIN X_DIAG_PIN - #elif Z4_USE_ENDSTOP == _YDIAG_ - #define Z4_MAX_PIN Y_DIAG_PIN - #elif Z4_USE_ENDSTOP == _ZDIAG_ - #define Z4_MAX_PIN Z_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E0DIAG_ - #define Z4_MAX_PIN E0_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E1DIAG_ - #define Z4_MAX_PIN E1_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E2DIAG_ - #define Z4_MAX_PIN E2_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E3DIAG_ - #define Z4_MAX_PIN E3_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E4DIAG_ - #define Z4_MAX_PIN E4_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E5DIAG_ - #define Z4_MAX_PIN E5_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E6DIAG_ - #define Z4_MAX_PIN E6_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E7DIAG_ - #define Z4_MAX_PIN E7_DIAG_PIN - #endif + #define Z4_MAX_PIN Z4_STOP_PIN #elif Z_HOME_TO_MIN && !defined(Z4_MIN_PIN) - #if PIN_EXISTS(Z4_STOP) - #define Z4_MIN_PIN Z4_STOP_PIN - #elif Z4_USE_ENDSTOP == _XMIN_ - #define Z4_MIN_PIN X_MIN_PIN - #elif Z4_USE_ENDSTOP == _XMAX_ - #define Z4_MIN_PIN X_MAX_PIN - #elif Z4_USE_ENDSTOP == _XSTOP_ - #define Z4_MIN_PIN X_STOP_PIN - #elif Z4_USE_ENDSTOP == _YMIN_ - #define Z4_MIN_PIN Y_MIN_PIN - #elif Z4_USE_ENDSTOP == _YMAX_ - #define Z4_MIN_PIN Y_MAX_PIN - #elif Z4_USE_ENDSTOP == _YSTOP_ - #define Z4_MIN_PIN Y_STOP_PIN - #elif Z4_USE_ENDSTOP == _ZMIN_ - #define Z4_MIN_PIN Z_MIN_PIN - #elif Z4_USE_ENDSTOP == _ZMAX_ - #define Z4_MIN_PIN Z_MAX_PIN - #elif Z4_USE_ENDSTOP == _ZSTOP_ - #define Z4_MIN_PIN Z_STOP_PIN - #elif Z4_USE_ENDSTOP == _XDIAG_ - #define Z4_MIN_PIN X_DIAG_PIN - #elif Z4_USE_ENDSTOP == _YDIAG_ - #define Z4_MIN_PIN Y_DIAG_PIN - #elif Z4_USE_ENDSTOP == _ZDIAG_ - #define Z4_MIN_PIN Z_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E0DIAG_ - #define Z4_MIN_PIN E0_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E1DIAG_ - #define Z4_MIN_PIN E1_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E2DIAG_ - #define Z4_MIN_PIN E2_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E3DIAG_ - #define Z4_MIN_PIN E3_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E4DIAG_ - #define Z4_MIN_PIN E4_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E5DIAG_ - #define Z4_MIN_PIN E5_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E6DIAG_ - #define Z4_MIN_PIN E6_DIAG_PIN - #elif Z4_USE_ENDSTOP == _E7DIAG_ - #define Z4_MIN_PIN E7_DIAG_PIN - #endif + #define Z4_MIN_PIN Z4_STOP_PIN #endif #endif - -#endif // Z_MULTI_ENDSTOPS +#endif // // Default DOGLCD SPI delays @@ -2358,3 +1709,5 @@ #undef HAS_FREE_AUX2_PINS #undef DIAG_REMAPPED +#undef _E_DIAG_EXISTS +#undef E_DIAG_EXISTS diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index ced9c722f4..d73092c2f6 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -118,10 +118,13 @@ // #define TEMP_0_PIN 0 // Analog Input, Header J2 #define TEMP_1_PIN 1 // Analog Input, Header J3 -#define TEMP_BOARD_PIN 91 // Onboard thermistor, 100k TDK NTCG104LH104JT1 #define TEMP_BED_PIN 2 // Analog Input, Header J6 #define TEMP_PROBE_PIN 3 // Analog Input, Header J15 +#ifndef TEMP_BOARD_PIN + #define TEMP_BOARD_PIN 91 // Onboard thermistor, 100k TDK NTCG104LH104JT1 +#endif + // // Heaters / Fans // @@ -186,10 +189,12 @@ // // M3/M4/M5 - Spindle/Laser Control // -// use P1 connector for spindle pins -#define SPINDLE_LASER_PWM_PIN EXP1_02_PIN // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 18 // Pullup! -#define SPINDLE_DIR_PIN 19 +#if HAS_CUTTER + // Use P1 connector for spindle pins + #define SPINDLE_LASER_PWM_PIN EXP1_02_PIN // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 18 // Pullup! + #define SPINDLE_DIR_PIN 19 +#endif // // Průša i3 MK2 Multiplexer Support diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index 10736d34a9..b4f09b7136 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -153,10 +153,12 @@ // // M3/M4/M5 - Spindle/Laser Control // -// use P1 connector for spindle pins -#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 18 // Pullup! -#define SPINDLE_DIR_PIN 19 +#if HAS_CUTTER + // Use P1 connector for spindle pins + #define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 18 // Pullup! + #define SPINDLE_DIR_PIN 19 +#endif // // Průša i3 MK2 Multiplexer Support diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index 6e1a460838..32a74515d9 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -126,10 +126,12 @@ // // M3/M4/M5 - Spindle/Laser Control // -// use P1 connector for spindle pins -#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 18 // Pullup! -#define SPINDLE_DIR_PIN 19 +#if HAS_CUTTER + // Use P1 connector for spindle pins + #define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 18 // Pullup! + #define SPINDLE_DIR_PIN 19 +#endif // // Průša i3 MK2 Multiplexer Support diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 1e9b9938a5..ba8046d6d0 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -168,9 +168,11 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 31 // Pullup! -#define SPINDLE_DIR_PIN 32 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 31 // Pullup! + #define SPINDLE_DIR_PIN 32 +#endif // // SPI for MAX Thermocouple @@ -210,7 +212,7 @@ #define LCD_PINS_D6 74 #define LCD_PINS_D7 75 - #if EITHER(VIKI2, miniVIKI) + #if ANY(VIKI2, miniVIKI) #define BEEPER_PIN 44 // NB: Panucatt's Viki 2.0 wiring diagram (v1.2) indicates that the // beeper/buzzer is connected to pin 33; however, the pin used in the diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h index f0e107f398..0d212010e0 100644 --- a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h +++ b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h @@ -143,7 +143,7 @@ #define HOME_PIN BTN_HOME -#if EITHER(VIKI2, miniVIKI) +#if ANY(VIKI2, miniVIKI) #define BEEPER_PIN 44 // Pins for DOGM SPI LCD Support #define DOGLCD_A0 70 diff --git a/Marlin/src/pins/ramps/pins_3DRAG.h b/Marlin/src/pins/ramps/pins_3DRAG.h index 6f57b0eca6..2d419e1321 100644 --- a/Marlin/src/pins/ramps/pins_3DRAG.h +++ b/Marlin/src/pins/ramps/pins_3DRAG.h @@ -117,7 +117,7 @@ #define SPINDLE_LASER_PWM_PIN 46 // Hardware PWM #define SPINDLE_LASER_ENA_PIN 62 // Pullup! #define SPINDLE_DIR_PIN 48 - #elif !BOTH(HAS_WIRED_LCD, IS_NEWPANEL) // Use expansion header if no LCD in use + #elif !ALL(HAS_WIRED_LCD, IS_NEWPANEL) // Use expansion header if no LCD in use #define SPINDLE_LASER_ENA_PIN 16 // Pullup or pulldown! #define SPINDLE_DIR_PIN 17 #if !NUM_SERVOS // Use servo connector if possible diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h index 4d3722655d..17581dca62 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h @@ -54,7 +54,7 @@ #undef STAT_LED_RED_PIN #undef STAT_LED_BLUE_PIN -#if EITHER(VIKI2, miniVIKI) +#if ANY(VIKI2, miniVIKI) #undef DOGLCD_A0 #undef DOGLCD_CS diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h index b0eee92c72..ddd56b28e8 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -145,7 +145,7 @@ #undef BEEPER_PIN #define BEEPER_PIN 33 -#if EITHER(VIKI2, miniVIKI) +#if ANY(VIKI2, miniVIKI) #undef SD_DETECT_PIN #define SD_DETECT_PIN 49 // For easy adapter board #undef BEEPER_PIN @@ -172,7 +172,7 @@ #undef SPINDLE_DIR_PIN #if HAS_CUTTER // EXP2 header - #if EITHER(VIKI2, miniVIKI) + #if ANY(VIKI2, miniVIKI) #define BTN_EN2 31 // Pin 7 needed for Spindle PWM #endif #define SPINDLE_LASER_PWM_PIN 7 // Hardware PWM diff --git a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h index f3439aa6bb..cf237fb9c1 100644 --- a/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h +++ b/Marlin/src/pins/ramps/pins_BAM_DICE_DUE.h @@ -37,9 +37,11 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_ENA_PIN 66 // Pullup or pulldown! -#define SPINDLE_DIR_PIN 67 -#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 66 // Pullup or pulldown! + #define SPINDLE_DIR_PIN 67 +#endif // // Temperature Sensors 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 efedb8ffaf..08d4492ccb 100644 --- a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h +++ b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h @@ -95,9 +95,11 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM -#define SPINDLE_DIR_PIN 42 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! + #define SPINDLE_DIR_PIN 42 +#endif // // Misc. Functions diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h index d79eb8041c..65828fd4fb 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR2.h @@ -44,12 +44,12 @@ // #if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) #if !NUM_SERVOS // Try to use servo connector first - #define SPINDLE_LASER_ENA_PIN 6 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 6 // Pullup or pulldown! #define SPINDLE_DIR_PIN 5 #elif !GREEDY_PANEL // Try to use AUX2 - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_DIR_PIN 65 #endif #endif diff --git a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h index fa5bbb5b9e..824dbd9f2d 100644 --- a/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h +++ b/Marlin/src/pins/ramps/pins_FYSETC_F6_13.h @@ -249,7 +249,7 @@ #define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. // Seems to work best if left open. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN 25 #endif diff --git a/Marlin/src/pins/ramps/pins_K8400.h b/Marlin/src/pins/ramps/pins_K8400.h index 56ec66191b..bcb145825b 100644 --- a/Marlin/src/pins/ramps/pins_K8400.h +++ b/Marlin/src/pins/ramps/pins_K8400.h @@ -53,7 +53,7 @@ #define X_STOP_PIN 3 #define Y_STOP_PIN 14 -#if EITHER(BLTOUCH, TOUCH_MI_PROBE) +#if ANY(BLTOUCH, TOUCH_MI_PROBE) #define INVERTED_PROBE_STATE #endif diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h index 89da25d074..cb28762adc 100644 --- a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h @@ -127,7 +127,7 @@ // Aux-1 | D19 D18 GND 5V | J21 | D4 D5 D6 GND | J17 | D11 GND 24V | J18 | D7 GND 5V | // ------------------ ---------------- --------------- ------------- -#if BOTH(CR10_STOCKDISPLAY, LONGER_LK5) +#if ALL(CR10_STOCKDISPLAY, LONGER_LK5) /** CR-10 Stock Display * ------ * BEEPER D11 | 1 2 | D15 ENC diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h index 4cf66ed2cd..9afdc62a53 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_13.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_13.h @@ -63,7 +63,7 @@ // // LCD / Controller // -#if EITHER(VIKI2, miniVIKI) +#if ANY(VIKI2, miniVIKI) /** * VIKI2 Has two groups of wires with... * diff --git a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h b/Marlin/src/pins/ramps/pins_MKS_GEN_L.h index 06bb35c72b..73e7aa577d 100644 --- a/Marlin/src/pins/ramps/pins_MKS_GEN_L.h +++ b/Marlin/src/pins/ramps/pins_MKS_GEN_L.h @@ -38,7 +38,7 @@ // Heaters / Fans // -#define MOSFET_A_PIN 10 // HE0 +#define MOSFET_A_PIN 10 // HE0 #define MOSFET_B_PIN 7 // HE1 or FAN Hotend Cooling #define MOSFET_C_PIN 8 // HBED #define FAN0_PIN 9 // FAN Part Cooling diff --git a/Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h b/Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h index cc651cc8ef..11451e95a4 100755 --- a/Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h +++ b/Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h @@ -102,13 +102,6 @@ #define SPINDLE_LASER_ENA_PIN 74 // J7 #endif -// -// Serial LCD -// -#if LCD_NEEDS_SERIAL_PORT && !defined(LCD_SERIAL_PORT) - #define LCD_SERIAL_PORT 2 // D16 H1 (TX2), D17 H0 (RX2) -#endif - // // SD Card // diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 0334da2da3..8b15f82736 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -250,7 +250,7 @@ #ifndef HEATER_BED_PIN #define HEATER_BED_PIN MOSFET_C_PIN #endif - #if EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) + #if ANY(HAS_MULTI_HOTEND, HEATERS_PARALLEL) #define HEATER_1_PIN MOSFET_D_PIN #else #define FAN1_PIN MOSFET_D_PIN @@ -258,9 +258,9 @@ #endif #ifndef FAN0_PIN - #if EITHER(FET_ORDER_EFB, FET_ORDER_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #if ANY(FET_ORDER_EFB, FET_ORDER_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan #define FAN0_PIN MOSFET_B_PIN - #elif EITHER(FET_ORDER_EEF, FET_ORDER_SF) // Hotend, Hotend, Fan or Spindle, Fan + #elif ANY(FET_ORDER_EEF, FET_ORDER_SF) // Hotend, Hotend, Fan or Spindle, Fan #define FAN0_PIN MOSFET_C_PIN #elif FET_ORDER_EEB // Hotend, Hotend, Bed #define FAN0_PIN 4 // IO pin. Buffer needed @@ -309,8 +309,8 @@ #endif #define SPINDLE_DIR_PIN 5 #elif HAS_FREE_AUX2_PINS - #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! #define SPINDLE_DIR_PIN 65 #else #error "No auto-assignable Spindle/Laser pins available." @@ -337,8 +337,9 @@ * Hardware serial communication ports. * If undefined software serial is used according to the pins below * - * Serial2 -- AUX-4 Pin 18 (D16 TX2) and AUX-4 Pin 17 (D17 RX2) - * Serial1 -- Pins D18 and D19 are used for Z-MIN and Z-MAX + * Serial1 -- TX1 = D18 RX1 = D19 (Z-MIN and Z-MAX on RAMPS) + * Serial2 -- TX2 = D16 RX2 = D17 (AUX4-18 and AUX4-17) + * Serial3 -- TX3 = D14 RX3 = D15 (Available on some RAMPS-like boards) */ //#define X_HARDWARE_SERIAL Serial1 //#define X2_HARDWARE_SERIAL Serial1 @@ -566,7 +567,7 @@ #define EXP1_01_PIN AUX4_09_PIN #define EXP1_02_PIN AUX4_10_PIN - #if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) + #if ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #define EXP2_03_PIN AUX4_11_PIN #define EXP2_05_PIN AUX4_12_PIN #define EXP2_08_PIN -1 // RESET @@ -597,7 +598,7 @@ #define LCD_PINS_EN EXP2_06_PIN // SID (MOSI) #define LCD_PINS_D4 EXP2_02_PIN // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) + #elif ALL(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS AUX2_06_PIN #define LCD_PINS_EN AUX2_08_PIN @@ -641,7 +642,7 @@ #else - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) #define LCD_PINS_DC EXP1_06_PIN // Set as output on init #define LCD_PINS_RS EXP1_07_PIN // Pull low for 1s to init // DOGM SPI LCD Support @@ -735,7 +736,7 @@ #define SD_DETECT_PIN EXP2_07_PIN #endif - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) #define DOGLCD_CS AUX4_05_PIN #define DOGLCD_A0 AUX2_07_PIN @@ -776,7 +777,7 @@ #endif #define KILL_PIN EXP2_08_PIN - #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) + #elif ANY(MKS_MINI_12864, FYSETC_MINI_12864) #define BTN_ENC EXP1_02_PIN #ifndef SD_DETECT_PIN @@ -813,7 +814,7 @@ #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif @@ -913,7 +914,7 @@ #endif #endif -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) +#if ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_RAMPS.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_BTT_16_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_BTT_16_PLUS.h new file mode 100644 index 0000000000..803a1de30b --- /dev/null +++ b/Marlin/src/pins/ramps/pins_RAMPS_BTT_16_PLUS.h @@ -0,0 +1,49 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 + +/** + * Arduino Mega with RAMPS BTT v1.6+ + * Schematic: https://github.com/bigtreetech/ramps-1.6/blob/master/Ramps1.6/hardware/R6%2B-SCH.pdf + * + * Differences from RAMPS v1.4: + * - SPI Stepper drivers use AVR hardware SPI pins + * - SPI Stepper CS pins are different + */ + +#include "env_validate.h" + +#define BOARD_INFO_NAME "RAMPS BTT 1.6+" + +#if HAS_TMC_SPI && DISABLED(TMC_USE_SW_SPI) + #define TMC_SPI_MOSI MOSI // 51 + #define TMC_SPI_MISO MISO // 50 + #define TMC_SPI_SCK SCK // 52 +#endif + +#define X_CS_PIN 63 // A0 +#define Y_CS_PIN 40 +#define Z_CS_PIN 42 +#define E0_CS_PIN 65 // A11 +#define E1_CS_PIN 66 // A12 + +#include "pins_RAMPS.h" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h index 19b048ec81..df24a7f19e 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h @@ -113,6 +113,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_ENA_PIN 41 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM -#define SPINDLE_DIR_PIN 43 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 41 // Pullup or pulldown! + #define SPINDLE_DIR_PIN 43 +#endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h index 87535a7de8..542b3cb816 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h @@ -211,8 +211,8 @@ // M3/M4/M5 - Spindle/Laser Control // #if HAS_CUTTER && !defined(SPINDLE_LASER_ENA_PIN) - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_DIR_PIN 5 #endif diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h index ba3c97c87a..1d2aeb4f0f 100644 --- a/Marlin/src/pins/ramps/pins_RUMBA.h +++ b/Marlin/src/pins/ramps/pins_RUMBA.h @@ -53,9 +53,6 @@ #ifndef X_MIN_PIN #define X_MIN_PIN 37 #endif -#ifndef X_MIN_PIN - #define X_MIN_PIN 37 -#endif #ifndef X_MAX_PIN #define X_MAX_PIN 36 #endif @@ -193,7 +190,7 @@ // // LCD / Controller // -#if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) +#if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) #define LCD_PINS_DC 38 // Set as output on init #define LCD_PINS_RS 41 // Pull low for 1s to init // DOGM SPI LCD Support @@ -212,7 +209,7 @@ #define LCD_RESET_PIN 18 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN 41 #endif diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index 4399014c48..7306272127 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -69,6 +69,7 @@ * IIC : 12V GND D21 D20 GND 5V * (SCL SDA) * + * TX2 RX2 RX3 TX3 * END STOPS : D19 D18 D15 D14 D2 D3 * GND GND GND GND GND GND * 5V 5V 5V 5V 5V 5V @@ -114,11 +115,13 @@ #if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) #define X_MAX_PIN 43 // AUX (2) #define Y_STOP_PIN 19 // Z+ -#elif EITHER(TRIGORILLA_MAPPING_CHIRON, TRIGORILLA_MAPPING_I3MEGA) +#elif ANY(TRIGORILLA_MAPPING_CHIRON, TRIGORILLA_MAPPING_I3MEGA) // Chiron uses AUX header for Y and Z endstops #define Y_STOP_PIN 42 // AUX (1) #define Z_STOP_PIN 43 // AUX (2) - #define Z2_MIN_PIN 18 // Z- + #ifndef Z2_STOP_PIN + #define Z2_STOP_PIN 18 // Z- + #endif #ifndef Z_MIN_PROBE_PIN #define Z_MIN_PROBE_PIN 2 // X+ @@ -142,7 +145,7 @@ #define FIL_RUNOUT_PIN 19 // Z+ #endif - #if EITHER(TRIGORILLA_MAPPING_CHIRON, SWAP_Z_MOTORS) + #if ANY(TRIGORILLA_MAPPING_CHIRON, SWAP_Z_MOTORS) // Chiron and some Anycubic i3 MEGAs swap Z steppers #define Z_STEP_PIN 36 #define Z_DIR_PIN 34 @@ -156,7 +159,7 @@ #endif #endif -#if EITHER(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_I3MEGA) +#if ANY(ANYCUBIC_LCD_CHIRON, ANYCUBIC_LCD_I3MEGA) #ifndef BEEPER_PIN #define BEEPER_PIN EXP2_03_PIN // Chiron Standard Adapter #endif diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index 7078b11b6b..1edeb6b8fe 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -228,12 +228,12 @@ // #if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) #if !NUM_SERVOS // Prefer the servo connector - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_DIR_PIN 5 #elif HAS_FREE_AUX2_PINS // Try to use AUX 2 - #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! #define SPINDLE_DIR_PIN 65 #endif #endif @@ -279,7 +279,7 @@ #define LCD_PINS_EN 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) + #elif ALL(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS 40 #define LCD_PINS_EN 42 @@ -312,7 +312,7 @@ #else - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) #define LCD_PINS_DC 25 // Set as output on init #define LCD_PINS_RS 27 // Pull low for 1s to init // DOGM SPI LCD Support @@ -400,7 +400,7 @@ #define LCD_SDSS 53 #define SD_DETECT_PIN 49 - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) #define DOGLCD_CS 45 #define DOGLCD_A0 44 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index dc06963289..049e8bc5d8 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -151,9 +151,9 @@ // #if HAS_CUTTER // use the LED_PIN for spindle speed control or case light #undef LED_PIN - #define SPINDLE_DIR_PIN 16 - #define SPINDLE_LASER_ENA_PIN 17 // Pullup! #define SPINDLE_LASER_PWM_PIN 8 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 17 // Pullup! + #define SPINDLE_DIR_PIN 16 #else #undef LED_PIN #define CASE_LIGHT_PIN 8 diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index c822a62faf..10adeb1891 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -162,6 +162,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM -#define SPINDLE_LASER_ENA_PIN 10 // Pullup! -#define SPINDLE_DIR_PIN 11 // use the EXP3 PWM header +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 10 // Pullup! + #define SPINDLE_DIR_PIN 11 // use the EXP3 PWM header +#endif diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index 5f5cb6cb12..0e3b25b4f6 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -116,7 +116,7 @@ // // Z Probe (when not Z_MIN_PIN) // -#if !defined(Z_MIN_PROBE_PIN) && !BOTH(HAS_CUTTER, BOARD_REV_1_0) +#if !defined(Z_MIN_PROBE_PIN) && !ALL(HAS_CUTTER, BOARD_REV_1_0) #define Z_MIN_PROBE_PIN Z_MAX_PIN #endif @@ -135,7 +135,7 @@ #define Z_DIR_PIN 39 #define Z_ENABLE_PIN 35 -#if BOTH(HAS_CUTTER, BOARD_REV_1_1_TO_1_3) && EXTRUDERS == 1 +#if ALL(HAS_CUTTER, BOARD_REV_1_1_TO_1_3) && EXTRUDERS == 1 // Move E0 to the spare and get Spindle/Laser signals from E0 #define E0_STEP_PIN 49 #define E0_DIR_PIN 47 @@ -166,7 +166,7 @@ // // LCD / Controller // -#if EITHER(BOARD_REV_1_0, BOARD_REV_1_1_TO_1_3) +#if ANY(BOARD_REV_1_0, BOARD_REV_1_1_TO_1_3) #define LCD_PINS_RS 24 #define LCD_PINS_EN 22 @@ -175,7 +175,7 @@ #define LCD_PINS_D6 32 #define LCD_PINS_D7 30 -#elif BOTH(BOARD_REV_1_5, HAS_WIRED_LCD) +#elif ALL(BOARD_REV_1_5, HAS_WIRED_LCD) #define BEEPER_PIN 18 @@ -225,10 +225,10 @@ // M3/M4/M5 - Spindle/Laser Control // #if HAS_CUTTER - #if EITHER(BOARD_REV_1_0, BOARD_REV_1_5) // Use the last three SW positions - #define SPINDLE_DIR_PIN 10 // 1.0: SW4 1.5: EXP3-6 ("10") + #if ANY(BOARD_REV_1_0, BOARD_REV_1_5) // Use the last three SW positions #define SPINDLE_LASER_PWM_PIN 9 // 1.0: SW5 1.5: EXP3-7 ( "9") .. MUST BE HARDWARE PWM #define SPINDLE_LASER_ENA_PIN 8 // 1.0: SW6 1.5: EXP3-8 ( "8") .. Pin should have a pullup! + #define SPINDLE_DIR_PIN 10 // 1.0: SW4 1.5: EXP3-6 ("10") #elif ENABLED(BOARD_REV_1_1_TO_1_3) /** * Only four hardware PWMs physically connected to anything on these boards: @@ -242,14 +242,14 @@ * They have an LED and resistor pullup to +24V which could damage 3.3V-5V ICs. */ #if EXTRUDERS == 1 - #define SPINDLE_DIR_PIN 43 #define SPINDLE_LASER_PWM_PIN 45 // Hardware PWM #define SPINDLE_LASER_ENA_PIN 41 // Pullup! + #define SPINDLE_DIR_PIN 43 #elif TEMP_SENSOR_BED == 0 // Can't use E0 so see if HEATER_BED_PIN is available #undef HEATER_BED_PIN - #define SPINDLE_DIR_PIN 38 // Probably pin 4 on 10 pin connector closest to the E0 socket #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM - Special precautions usually needed. #define SPINDLE_LASER_ENA_PIN 40 // Pullup! (Probably pin 6 on the 10-pin + #define SPINDLE_DIR_PIN 38 // Probably pin 4 on 10 pin connector closest to the E0 socket // connector closest to the E0 socket) #endif #endif diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V53.h b/Marlin/src/pins/ramps/pins_ZRIB_V53.h index 2b8b583075..8d59eeb1f7 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V53.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V53.h @@ -361,7 +361,7 @@ // OLED 128x64 //================================================================================ -#if EITHER(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) +#if ANY(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define LCD_SDSS 16 #define LCD_PINS_RS 23 // RESET Pull low for 1s to init @@ -372,7 +372,7 @@ #define BTN_ENC 29 #define BEEPER_PIN -1 #define KILL_PIN -1 - #if EITHER(OLED_HW_IIC, OLED_HW_SPI) + #if ANY(OLED_HW_IIC, OLED_HW_SPI) #error "Oops! You must choose SW SPI for ZRIB V53 board and connect the OLED screen to EXP1 connector." #else // SW_SPI #define DOGLCD_A0 LCD_PINS_DC 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 e4603591d1..f63ca83723 100644 --- a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h +++ b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h @@ -170,12 +170,12 @@ // #if HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) #if !defined(NUM_SERVOS) || NUM_SERVOS == 0 // Prefer the servo connector - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_DIR_PIN 5 #elif HAS_FREE_AUX2_PINS - #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown! #define SPINDLE_DIR_PIN 65 #endif #endif diff --git a/Marlin/src/pins/sam/env_validate.h b/Marlin/src/pins/sam/env_validate.h index c6f4d76894..c51583f0a1 100644 --- a/Marlin/src/pins/sam/env_validate.h +++ b/Marlin/src/pins/sam/env_validate.h @@ -22,7 +22,7 @@ #ifndef ENV_VALIDATE_H #define ENV_VALIDATE_H -#if BOTH(ALLOW_MEGA1280, ALLOW_MEGA2560) && NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__, __AVR_ATmega2560__) +#if ALL(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.'" diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index 87a1260c40..312745f11d 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -153,7 +153,6 @@ #define LCD_PINS_EN 15 #define LCD_PINS_D4 19 #define BEEPER_PIN 64 - #undef UI_VOLTAGE_LEVEL #define UI_VOLTAGE_LEVEL 1 #endif diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 41d43c0b04..8ad5e2229c 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -69,7 +69,10 @@ #define TEMP_0_PIN 0 // Analog Input (HOTEND0 thermistor) #define TEMP_1_PIN 2 // Analog Input (unused) #define TEMP_BED_PIN 1 // Analog Input (BED thermistor) -#define TEMP_BOARD_PIN 5 // Analog Input (OnBoard thermistor beta 3950) + +#ifndef TEMP_BOARD_PIN + #define TEMP_BOARD_PIN 5 // Analog Input (OnBoard thermistor beta 3950) +#endif // SPI for MAX Thermocouple #if !HAS_MEDIA diff --git a/Marlin/src/pins/sam/pins_KRATOS32.h b/Marlin/src/pins/sam/pins_KRATOS32.h index f4e3eb479c..74da7a78f6 100644 --- a/Marlin/src/pins/sam/pins_KRATOS32.h +++ b/Marlin/src/pins/sam/pins_KRATOS32.h @@ -32,7 +32,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1F400 // 16K #endif diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index 9301167959..9a3edff0c9 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -32,7 +32,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x2000 // 8K #endif diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h index 92de79bd7f..b00d215cc7 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -68,7 +68,7 @@ // #if HAS_WIRED_LCD - #if BOTH(IS_NEWPANEL, PANEL_ONE) + #if ALL(IS_NEWPANEL, PANEL_ONE) #undef LCD_PINS_D4 #define LCD_PINS_D4 68 diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h index c84d84105c..f5587a6cba 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -191,7 +191,7 @@ #define LCD_RESET_PIN EXP1_06_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_05_PIN #endif @@ -219,7 +219,7 @@ #endif - #if EITHER(VIKI2, miniVIKI) + #if ANY(VIKI2, miniVIKI) #define DOGLCD_A0 EXP1_07_PIN #define KILL_PIN 51 #define STAT_LED_BLUE_PIN EXP1_03_PIN @@ -260,7 +260,7 @@ // M3/M4/M5 - Spindle/Laser Control // #if HOTENDS < 3 && HAS_CUTTER && !PIN_EXISTS(SPINDLE_LASER_ENA) - #define SPINDLE_LASER_ENA_PIN 45 // Use E2 ENA #define SPINDLE_LASER_PWM_PIN 12 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 45 // Use E2 ENA #define SPINDLE_DIR_PIN 47 // Use E2 DIR #endif diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 516063d158..64fad0e081 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -227,7 +227,7 @@ #define SD_DETECT_PIN EXP2_07_PIN #endif - #if EITHER(RADDS_DISPLAY, IS_RRD_SC) + #if ANY(RADDS_DISPLAY, IS_RRD_SC) #define LCD_PINS_RS EXP1_04_PIN #define LCD_PINS_EN EXP1_03_PIN @@ -254,7 +254,7 @@ #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN // D5 #endif diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 9e9aeb9fec..1b66b766db 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -217,7 +217,7 @@ #define SD_DETECT_PIN EXP2_07_PIN #endif - #if EITHER(RADDS_DISPLAY, IS_RRD_SC) + #if ANY(RADDS_DISPLAY, IS_RRD_SC) #define LCD_PINS_RS EXP1_04_PIN #define LCD_PINS_EN EXP1_03_PIN @@ -244,7 +244,7 @@ #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN // D5 #endif diff --git a/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h b/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h index 8af1054a2c..6f41bd6848 100644 --- a/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h +++ b/Marlin/src/pins/samd/pins_BRICOLEMON_LITE_V1_0.h @@ -238,7 +238,7 @@ //#define LCD_PINS_EN EXP2_06_PIN // SID (MOSI) //#define LCD_PINS_D4 EXP2_02_PIN // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) + #elif ALL(IS_NEWPANEL, PANEL_ONE) // TO TEST //#define LCD_PINS_RS EXP1_02_PIN @@ -274,7 +274,7 @@ #else - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) // TO TEST //#define LCD_PINS_DC 25 // Set as output on init //#define LCD_PINS_RS 27 // Pull low for 1s to init @@ -372,7 +372,7 @@ //#define LCD_SDSS SDSS //#define SD_DETECT_PIN EXP2_10_PIN - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) // TO TEST //#define DOGLCD_CS 45 @@ -407,7 +407,7 @@ //#define SD_DETECT_PIN EXP2_10_PIN //#define KILL_PIN EXP1_01_PIN - #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) + #elif ANY(MKS_MINI_12864, FYSETC_MINI_12864) // TO TEST //#define BEEPER_PIN EXP1_06_PIN @@ -452,7 +452,7 @@ //#define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN // TO TEST //#define RGB_LED_R_PIN 25 diff --git a/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h b/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h index 7378731c90..699f10ed48 100644 --- a/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h +++ b/Marlin/src/pins/samd/pins_BRICOLEMON_V1_0.h @@ -291,7 +291,7 @@ //#define LCD_PINS_EN EXP2_06_PIN // SID (MOSI) //#define LCD_PINS_D4 EXP2_02_PIN // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) + #elif ALL(IS_NEWPANEL, PANEL_ONE) // TO TEST //#define LCD_PINS_RS EXP1_02_PIN @@ -327,7 +327,7 @@ #else - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) // TO TEST //#define LCD_PINS_DC 25 // Set as output on init //#define LCD_PINS_RS 27 // Pull low for 1s to init @@ -424,7 +424,7 @@ //#define LCD_SDSS SDSS //#define SD_DETECT_PIN EXP2_10_PIN - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) // TO TEST //#define DOGLCD_CS 45 @@ -459,7 +459,7 @@ //#define SD_DETECT_PIN EXP2_10_PIN //#define KILL_PIN EXP1_01_PIN - #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) + #elif ANY(MKS_MINI_12864, FYSETC_MINI_12864) // TO TEST //#define BEEPER_PIN EXP1_06_PIN @@ -504,7 +504,7 @@ //#define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN // TO TEST //#define RGB_LED_R_PIN 25 diff --git a/Marlin/src/pins/samd/pins_MINITRONICS20.h b/Marlin/src/pins/samd/pins_MINITRONICS20.h index 804750b69a..8c0daa497b 100644 --- a/Marlin/src/pins/samd/pins_MINITRONICS20.h +++ b/Marlin/src/pins/samd/pins_MINITRONICS20.h @@ -197,7 +197,7 @@ #define BTN_EN1 27 #define BTN_EN2 33 - #elif BOTH(IS_NEWPANEL, PANEL_ONE) + #elif ALL(IS_NEWPANEL, PANEL_ONE) // TO TEST //#define LCD_PINS_RS EXP1_02_PIN @@ -233,7 +233,7 @@ #else - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) // TO TEST //#define LCD_PINS_DC 25 // Set as output on init //#define LCD_PINS_RS 27 // Pull low for 1s to init @@ -322,7 +322,7 @@ //#define LCD_SDSS SDSS //#define SD_DETECT_PIN EXP2_10_PIN - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) // TO TEST //#define DOGLCD_CS 45 @@ -357,7 +357,7 @@ //#define SD_DETECT_PIN EXP2_10_PIN //#define KILL_PIN EXP1_01_PIN - #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) + #elif ANY(MKS_MINI_12864, FYSETC_MINI_12864) // TO TEST //#define BEEPER_PIN EXP1_06_PIN @@ -402,7 +402,7 @@ //#define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN // TO TEST //#define RGB_LED_R_PIN 25 diff --git a/Marlin/src/pins/samd/pins_RAMPS_144.h b/Marlin/src/pins/samd/pins_RAMPS_144.h index aa262f5a60..3e5d563929 100644 --- a/Marlin/src/pins/samd/pins_RAMPS_144.h +++ b/Marlin/src/pins/samd/pins_RAMPS_144.h @@ -155,8 +155,8 @@ // #if HAS_CUTTER && !defined(SPINDLE_LASER_ENA_PIN) #if !NUM_SERVOS // Use servo connector if possible - #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown! #define SPINDLE_DIR_PIN 5 #else #error "No auto-assignable Spindle/Laser pins available." @@ -276,7 +276,7 @@ //#define LCD_PINS_EN 51 // SID (MOSI) //#define LCD_PINS_D4 52 // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) + #elif ALL(IS_NEWPANEL, PANEL_ONE) // TO TEST //#define LCD_PINS_RS 40 @@ -312,7 +312,7 @@ #else - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) // TO TEST //#define LCD_PINS_DC 25 // Set as output on init //#define LCD_PINS_RS 27 // Pull low for 1s to init @@ -406,7 +406,7 @@ //#define LCD_SDSS SDSS //#define SD_DETECT_PIN 49 - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) // TO TEST //#define DOGLCD_CS 45 @@ -442,7 +442,7 @@ //#define SD_DETECT_PIN 49 //#define KILL_PIN 41 - #elif EITHER(MKS_MINI_12864, FYSETC_MINI_12864) + #elif ANY(MKS_MINI_12864, FYSETC_MINI_12864) // TO TEST //#define BEEPER_PIN 37 @@ -483,7 +483,7 @@ //#define LCD_RESET_PIN 23 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN // TO TEST //#define RGB_LED_R_PIN 25 diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h index 75138845f4..4a6136e081 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6.h +++ b/Marlin/src/pins/sanguino/pins_GEN6.h @@ -117,6 +117,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_ENA_PIN 5 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM -#define SPINDLE_DIR_PIN 6 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 5 // Pullup or pulldown! + #define SPINDLE_DIR_PIN 6 +#endif diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h index 698bd06606..db80c45eee 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_14.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h @@ -118,6 +118,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_ENA_PIN 20 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM -#define SPINDLE_DIR_PIN 21 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 20 // Pullup or pulldown! + #define SPINDLE_DIR_PIN 21 +#endif diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h index 3927250b15..154e26725f 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h @@ -134,6 +134,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_ENA_PIN 5 // Pullup or pulldown! -#define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM -#define SPINDLE_DIR_PIN 6 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 16 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 5 // Pullup or pulldown! + #define SPINDLE_DIR_PIN 6 +#endif diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h index 398343cb97..e391cd1020 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY.h @@ -45,54 +45,72 @@ #define BOARD_ST7920_DELAY_3 125 #endif +/** + * EXP1 EXP1 as ENDER2 STOCKDISPLAY EXP1 as CR10 STOCKDISPLAY + * ------ ------ ------ + * D27 | 1 2 | D16 SCK | 1 2 | BTN_E BEEPER_PIN | 1 2 | BTN_ENC + * D11 | 3 4 | RESET BTN_EN1 | 3 4 | RESET BTN_EN1 | 3 4 | RESET + * D10 5 6 | D30 BTN_EN2 5 6 | LCD_A0 BTN_EN2 5 6 | LCD_D4 (ST9720 CLK) + * D28 | 7 8 | D17 LCD_CS | 7 8 | MOSI (ST9720 CS) LCD_RS | 7 8 | LCD_EN (ST9720 DAT) + * GND | 9 10 | 5V GND | 9 10 | 5V GND | 9 10 | 5V + * ------ ------ ------ + */ +#define EXP1_01_PIN 27 +#define EXP1_02_PIN 16 +#define EXP1_03_PIN 11 +#define EXP1_04_PIN -1 // RESET +#define EXP1_05_PIN 10 +#define EXP1_06_PIN 30 +#define EXP1_07_PIN 28 +#define EXP1_08_PIN 17 + // // LCD / Controller // #if ANY(MKS_MINI_12864, CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) - #if EITHER(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) - #define LCD_PINS_RS 28 // ST9720 CS - #define LCD_PINS_EN 17 // ST9720 DAT - #define LCD_PINS_D4 30 // ST9720 CLK + #if ENABLED(MKS_MINI_12864) + #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING + #error "CAUTION! MKS_MINI_12864 on MELZI_CREALITY requires wiring modifications. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" + #endif + #define DOGLCD_CS EXP1_07_PIN + #define DOGLCD_A0 EXP1_06_PIN + #elif ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS EXP1_07_PIN // ST9720 CS + #define LCD_PINS_EN EXP1_08_PIN // ST9720 DAT + #define LCD_PINS_D4 EXP1_06_PIN // ST9720 CLK + #define BEEPER_PIN EXP1_01_PIN + #elif ENABLED(ENDER2_STOCKDISPLAY) + #define DOGLCD_CS EXP1_07_PIN + #define DOGLCD_A0 EXP1_06_PIN + #define DOGLCD_SCK EXP1_01_PIN + #define DOGLCD_MOSI EXP1_08_PIN + #define FORCE_SOFT_SPI #endif - #if EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) - #define DOGLCD_CS 28 - #define DOGLCD_A0 30 - #endif - + #define BTN_ENC EXP1_02_PIN + #define BTN_EN1 EXP1_03_PIN + #define BTN_EN2 EXP1_05_PIN #define LCD_SDSS 31 // Controller's SD card - - #define BTN_ENC 16 - #define BTN_EN1 11 - #define BTN_EN2 10 - #define BEEPER_PIN 27 - #define LCD_PINS_DEFINED - #endif #include "pins_MELZI.h" // ... SANGUINOLOLU_12 ... SANGUINOLOLU_11 #if ENABLED(BLTOUCH) #ifndef SERVO0_PIN - #define SERVO0_PIN 27 + #define SERVO0_PIN EXP1_01_PIN #endif #if SERVO0_PIN == BEEPER_PIN #undef BEEPER_PIN #endif #elif HAS_FILAMENT_SENSOR #ifndef FIL_RUNOUT_PIN - #define FIL_RUNOUT_PIN 27 + #define FIL_RUNOUT_PIN EXP1_01_PIN #endif #if FIL_RUNOUT_PIN == BEEPER_PIN #undef BEEPER_PIN #endif #endif -#if ENABLED(MINIPANEL) - #undef DOGLCD_CS - #define DOGLCD_CS LCD_PINS_RS -#endif - /** PIN: 0 Port: B0 E0_DIR_PIN protected PIN: 1 Port: B1 E0_STEP_PIN protected @@ -139,14 +157,3 @@ PIN: 30 Port: A1 LCD_PINS_D4 Output = 1 PIN: 31 Port: A0 SDSS Output = 1 */ - -/** - * EXP1 Connector EXP1 as CR10 STOCKDISPLAY - * ------ ------ - * PA4 | 1 2 | PC0 BEEPER_PIN | 1 2 | BTN_ENC - * PD3 | 3 4 | RESET BTN_EN1 | 3 4 | RESET - * PD2 5 6 | PA1 BTN_EN2 5 6 | LCD_D4 (ST9720 CLK) - * PA3 | 7 8 | PC1 (ST9720 CS) LCD_RS | 7 8 | LCD_EN (ST9720 DAT) - * GND | 9 10 | 5V GND | 9 10 | 5V - * ------ ------ - */ diff --git a/Marlin/src/pins/sanguino/pins_MELZI_CREALITY_E2.h b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY_E2.h new file mode 100644 index 0000000000..4ded3294b9 --- /dev/null +++ b/Marlin/src/pins/sanguino/pins_MELZI_CREALITY_E2.h @@ -0,0 +1,96 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 + +#define BOARD_INFO_NAME "Melzi Ender 2 (Creality)" + +/** + * Connectors. + * FAN1 LASER K-FAN B-MOT(A6) E-TEMP(A7) CHECK AVR ISP + * --------- --------- --------- --------- --------- --------- ---------- + * J11 (Power Switch) |12V GND| |12V D4| |12V D4| |GND D25| |GND D24| |D29 GND| |MISO 5V| + * ------ --------- --------- --------- --------- --------- --------- |SCK MOSI| + * |V-IN|(Regulator) BED HOT-END FAN2 OFF X-STOP Y-STOP Z-STOP |RST GND| + * |GND | --------- --------- --------- --------- --------- --------- --------- ---------- + * |12V | |12V D12| |12V D13| |12V GND| |D27 D17| |GND D18| |GND D19| |GND D20| + * ------ --------- --------- --------- --------- --------- --------- --------- + * + * EXP1 EXP1 as ENDER2 STOCKDISPLAY EXP1 as CR10 STOCKDISPLAY + * ------ ------ ------ + * (AVR_SCK) D7 | 1 2 | D16 SCK | 1 2 | BTN_E BEEPER_PIN | 1 2 | BTN_ENC + * D11 | 3 4 | RESET BTN_EN1 | 3 4 | RESET BTN_EN1 | 3 4 | RESET + * D10 5 6 | D30 BTN_EN2 5 6 | LCD_A0 BTN_EN2 5 6 | LCD_D4 (ST9720 CLK) + * D28 | 7 8 | D5 (AVR_MOSI) LCD_CS | 7 8 | MOSI (ST9720 CS) LCD_RS | 7 8 | LCD_EN (ST9720 DAT) + * GND | 9 10 | 5V GND | 9 10 | 5V GND | 9 10 | 5V + * ------ ------ ------ + */ + +#define EXP1_01_PIN 7 +#define EXP1_02_PIN 16 +#define EXP1_03_PIN 11 +#define EXP1_04_PIN -1 // hardware reset line +#define EXP1_05_PIN 10 +#define EXP1_06_PIN 30 +#define EXP1_07_PIN 28 +#define EXP1_08_PIN 5 + +// +// LCD / Controller +// +#if ANY(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) + #if ENABLED(CR10_STOCKDISPLAY) + #if ENABLED(SDSUPPORT) + #error "Cannot have SDSUPPORT with CR10_STOCKDISPLAY on this motherboard." // Hardware SDCARD SCK and MOSI pins are reallocated. + #endif + #define LCD_PINS_RS EXP1_07_PIN // ST9720 CS + #define LCD_PINS_EN EXP1_08_PIN // ST9720 DAT + #define LCD_PINS_D4 EXP1_06_PIN // ST9720 CLK + #define BEEPER_PIN EXP1_01_PIN + #elif ENABLED(ENDER2_STOCKDISPLAY) + #define DOGLCD_CS EXP1_07_PIN + #define DOGLCD_A0 EXP1_06_PIN + #endif + #define BTN_ENC EXP1_02_PIN + #define BTN_EN1 EXP1_03_PIN + #define BTN_EN2 EXP1_05_PIN + #define LCD_PINS_DEFINED +#endif + +#define LCD_SDSS 31 // Controller's SD card + +#include "pins_MELZI.h" // ... SANGUINOLOLU_12 ... SANGUINOLOLU_11 + +#if ENABLED(BLTOUCH) + #ifndef SERVO0_PIN + #define SERVO0_PIN 27 + #endif + #if SERVO0_PIN == BEEPER_PIN + #undef BEEPER_PIN + #endif +#elif HAS_FILAMENT_SENSOR + #ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 27 + #endif + #if FIL_RUNOUT_PIN == BEEPER_PIN + #undef BEEPER_PIN + #endif +#endif diff --git a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h index 6b47d9186c..7e4cc22bbe 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_TRONXY.h @@ -32,7 +32,7 @@ #define LCD_SDSS -1 -#if EITHER(CR10_STOCKDISPLAY, LCD_FOR_MELZI) +#if ANY(CR10_STOCKDISPLAY, LCD_FOR_MELZI) #define LCD_PINS_RS 30 #define LCD_PINS_EN 28 #define LCD_PINS_D4 16 diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index 45b326e74e..b99437ac93 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -133,7 +133,7 @@ #define LCD_BACKLIGHT_PIN 17 // LCD backlight LED #endif -#if !HAS_CUTTER && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(HAS_WIRED_LCD, IS_NEWPANEL) // try to use IO Header +#if !HAS_CUTTER && ENABLED(SANGUINOLOLU_V_1_2) && !ALL(HAS_WIRED_LCD, IS_NEWPANEL) // try to use IO Header #define CASE_LIGHT_PIN 4 // Hardware PWM - see if IO Header is available #endif @@ -270,10 +270,10 @@ // M3/M4/M5 - Spindle/Laser Control // #if HAS_CUTTER - #if !MB(AZTEEG_X1) && ENABLED(SANGUINOLOLU_V_1_2) && !BOTH(HAS_WIRED_LCD, IS_NEWPANEL) // try to use IO Header + #if !MB(AZTEEG_X1) && ENABLED(SANGUINOLOLU_V_1_2) && !ALL(HAS_WIRED_LCD, IS_NEWPANEL) // try to use IO Header - #define SPINDLE_LASER_ENA_PIN 10 // Pullup or pulldown! #define SPINDLE_LASER_PWM_PIN 4 // Hardware PWM + #define SPINDLE_LASER_ENA_PIN 10 // Pullup or pulldown! #define SPINDLE_DIR_PIN 11 #elif !MB(MELZI) // use X stepper motor socket diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index 1e449579cf..438acb79c7 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -92,7 +92,7 @@ #define X_MIN_PIN 21 #define Y_MIN_PIN 18 -#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) +#if ANY(Z6S_ZFAULT, Z6BS_ZFAULT) #define Z_MIN_PIN 25 #else #define Z_MIN_PIN 13 @@ -109,7 +109,7 @@ #define Y_DIR_PIN 19 #define Y_ENABLE_PIN 24 -#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) +#if ANY(Z6S_ZFAULT, Z6BS_ZFAULT) #define Z_STEP_PIN 27 #define Z_DIR_PIN 26 #else @@ -119,7 +119,7 @@ #define Z_ENABLE_PIN 24 -#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) +#if ANY(Z6S_ZFAULT, Z6BS_ZFAULT) #define E0_STEP_PIN 15 #define E0_DIR_PIN 14 #else @@ -150,7 +150,7 @@ // // Filament Runout Sensor // -#if EITHER(Z6S_ZFAULT, Z6BS_ZFAULT) +#if ANY(Z6S_ZFAULT, Z6BS_ZFAULT) #define FIL_RUNOUT_PIN 13 #else #define FIL_RUNOUT_PIN 25 // Z-MIN @@ -201,7 +201,7 @@ #define BOARD_ST7920_DELAY_2 DELAY_2_NOP #define BOARD_ST7920_DELAY_3 DELAY_2_NOP -#elif EITHER(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) +#elif ANY(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) // // OLED 128x64 // diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h index abccac9dad..7264a26539 100644 --- a/Marlin/src/pins/sensitive_pins.h +++ b/Marlin/src/pins/sensitive_pins.h @@ -24,44 +24,51 @@ // // Prepare a list of protected pins for M42/M43 // +#if HAS_X_AXIS -#if PIN_EXISTS(X_MIN) - #define _X_MIN X_MIN_PIN, -#else - #define _X_MIN -#endif -#if PIN_EXISTS(X_MAX) - #define _X_MAX X_MAX_PIN, -#else - #define _X_MAX -#endif -#if PIN_EXISTS(X_CS) && AXIS_HAS_SPI(X) - #define _X_CS X_CS_PIN, -#else - #define _X_CS -#endif -#if PIN_EXISTS(X_MS1) - #define _X_MS1 X_MS1_PIN, -#else - #define _X_MS1 -#endif -#if PIN_EXISTS(X_MS2) - #define _X_MS2 X_MS2_PIN, -#else - #define _X_MS2 -#endif -#if PIN_EXISTS(X_MS3) - #define _X_MS3 X_MS3_PIN, -#else - #define _X_MS3 -#endif -#if PIN_EXISTS(X_ENABLE) - #define _X_ENABLE_PIN X_ENABLE_PIN, -#else - #define _X_ENABLE_PIN -#endif + #if PIN_EXISTS(X_MIN) + #define _X_MIN X_MIN_PIN, + #else + #define _X_MIN + #endif + #if PIN_EXISTS(X_MAX) + #define _X_MAX X_MAX_PIN, + #else + #define _X_MAX + #endif + #if PIN_EXISTS(X_CS) && AXIS_HAS_SPI(X) + #define _X_CS X_CS_PIN, + #else + #define _X_CS + #endif + #if PIN_EXISTS(X_MS1) + #define _X_MS1 X_MS1_PIN, + #else + #define _X_MS1 + #endif + #if PIN_EXISTS(X_MS2) + #define _X_MS2 X_MS2_PIN, + #else + #define _X_MS2 + #endif + #if PIN_EXISTS(X_MS3) + #define _X_MS3 X_MS3_PIN, + #else + #define _X_MS3 + #endif + #if PIN_EXISTS(X_ENABLE) + #define _X_ENABLE_PIN X_ENABLE_PIN, + #else + #define _X_ENABLE_PIN + #endif -#define _X_PINS X_STEP_PIN, X_DIR_PIN, _X_ENABLE_PIN _X_MIN _X_MAX _X_MS1 _X_MS2 _X_MS3 _X_CS + #define _X_PINS X_STEP_PIN, X_DIR_PIN, _X_ENABLE_PIN _X_MIN _X_MAX _X_MS1 _X_MS2 _X_MS3 _X_CS + +#else + + #define _X_PINS + +#endif #if HAS_Y_AXIS @@ -643,7 +650,7 @@ #endif #endif -#elif EITHER(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) +#elif ANY(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) #undef _E1_PINS #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, _E1_CS _E1_MS1 _E1_MS2 _E1_MS3 @@ -778,7 +785,7 @@ #define _X2_PINS #endif -#if HAS_DUAL_Y_STEPPERS +#if HAS_Y2_STEPPER #if PIN_EXISTS(Y2_CS) && AXIS_HAS_SPI(Y2) #define _Y2_CS Y2_CS_PIN, #else diff --git a/Marlin/src/pins/stm32f1/pins_BEAST.h b/Marlin/src/pins/stm32f1/pins_BEAST.h index eca4529636..b136ca52cd 100644 --- a/Marlin/src/pins/stm32f1/pins_BEAST.h +++ b/Marlin/src/pins/stm32f1/pins_BEAST.h @@ -131,7 +131,7 @@ #error "LCD_I2C_PANELOLU2 is not supported." #elif ENABLED(LCD_I2C_VIKI) #error "LCD_I2C_VIKI is not supported." - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) #error "VIKI2 / miniVIKI is not supported." #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) #error "ELB_FULL_GRAPHIC_CONTROLLER is not supported." diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index aa8795bf3e..8be66eedb5 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -31,7 +31,7 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -131,8 +131,11 @@ #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -201,7 +204,7 @@ #define LCD_PINS_D7 EXP1_01_PIN #define ADC_KEYPAD_PIN PA1 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #elif ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) /** Creality Ender-2 display pinout * ------ @@ -293,7 +296,7 @@ #endif // HAS_WIRED_LCD -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) +#if ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_SKR_E3_DIP.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" @@ -349,7 +352,7 @@ #define SD_SCK_PIN PA5 #define SD_MISO_PIN PA6 #define SD_MOSI_PIN PA7 -#elif SD_CONNECTION_IS(LCD) && BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) +#elif SD_CONNECTION_IS(LCD) && ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #define SD_DETECT_PIN EXP1_01_PIN #define SD_SS_PIN EXP1_05_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h index 44d4f23435..c345a27b76 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h @@ -46,5 +46,8 @@ #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 689e73c4f3..c86e2f7504 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -31,7 +31,7 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -114,15 +114,15 @@ #define USB_CONNECT_INVERTING false /** - * SKR Mini E3 V1.0, V1.2 - * ------ + * SKR Mini E3 V1.0, V1.2 + * ------ * (BEEPER) PB5 | 1 2 | PB6 (BTN_ENC) * (BTN_EN1) PA9 | 3 4 | RESET * (BTN_EN2) PA10 5 6 | PB9 (LCD_D4) * (LCD_RS) PB8 | 7 8 | PB7 (LCD_EN) * GND | 9 10 | 5V - * ------ - * EXP1 + * ------ + * EXP1 */ #ifndef EXP1_02_PIN #define EXP1_02_PIN PB6 @@ -217,7 +217,7 @@ #define LCD_PINS_D7 EXP1_01_PIN #define ADC_KEYPAD_PIN PA1 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #elif ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define BTN_ENC EXP1_02_PIN #define BTN_EN1 EXP1_03_PIN @@ -342,7 +342,7 @@ #endif // HAS_WIRED_LCD -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) +#if ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" @@ -396,7 +396,7 @@ #if SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN PC4 -#elif SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) +#elif SD_CONNECTION_IS(LCD) && (ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) #define SD_DETECT_PIN EXP1_01_PIN #define SD_SS_PIN EXP1_05_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h index eb2f17f40a..6719b09049 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_V1_1.h @@ -31,7 +31,7 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -93,8 +93,11 @@ #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Heaters / Fans @@ -139,7 +142,7 @@ // // LCD / Controller // -#if EITHER(TFT_COLOR_UI, TFT_CLASSIC_UI) +#if ANY(TFT_COLOR_UI, TFT_CLASSIC_UI) #define BEEPER_PIN EXP1_01_PIN #define BTN_ENC EXP1_02_PIN #define BTN_EN1 EXP2_03_PIN @@ -218,7 +221,7 @@ //#define LED_PIN EXP1_07_PIN // green //#define LED_PIN EXP1_08_PIN // blue - //#if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + //#if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) // #ifndef RGB_LED_R_PIN // #define RGB_LED_R_PIN EXP1_06_PIN // #endif @@ -270,7 +273,7 @@ #endif #if SD_CONNECTION_IS(LCD) - #define SPI_DEVICE 3 + #define SPI_DEVICE 3 // Maple #define SD_DETECT_PIN EXP2_07_PIN #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h index 5cb2845d9f..1d501e512b 100644 --- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h +++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h @@ -41,7 +41,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE 0x800U // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -100,7 +100,9 @@ #endif // Reduce baud rate to improve software serial reliability -#define TMC_BAUD_RATE 19200 +#ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 +#endif // // Temperature Sensors diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index 73030c8ef6..2074bbecce 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -104,7 +104,7 @@ #define LCD_PINS_RS PD1 // 49 // CS chip select /SS chip slave select #define LCD_PINS_EN PD3 // 51 // SID (MOSI) #define LCD_PINS_D4 PD4 // 52 // SCK (CLK) clock - #elif BOTH(IS_NEWPANEL, PANEL_ONE) + #elif ALL(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS PB8 #define LCD_PINS_EN PD2 #define LCD_PINS_D4 PB12 @@ -171,7 +171,7 @@ #define LCD_SDSS PD5 // 53 #define SD_DETECT_PIN PD1 // 49 - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) #define BEEPER_PIN PC1 // 33 diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_common.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_common.h index 22f78350cf..7452562c83 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_common.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_common.h @@ -113,18 +113,18 @@ #define FIL_RUNOUT_PIN PA15 // MT_DET #endif -// SPI Flash +// +// SPI Flash (SPI 2) +// #define SPI_FLASH #if ENABLED(SPI_FLASH) #define SPI_FLASH_SIZE 0x200000 // 2MB + #define SPI_FLASH_CS_PIN PB12 + #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif -// SPI 2 -#define SPI_FLASH_CS_PIN PB12 -#define SPI_FLASH_MOSI_PIN PB15 -#define SPI_FLASH_MISO_PIN PB14 -#define SPI_FLASH_SCK_PIN PB13 - // // TFT with FSMC interface // @@ -160,7 +160,7 @@ // SPI1(PA7)=LCD & SPI3(PB5)=STUFF, are not available // so SPI2 is required. -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple #define SD_SCK_PIN PB13 #define SD_MISO_PIN PB14 #define SD_MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h index f2450ffcb4..ce942ba545 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h @@ -33,7 +33,7 @@ #define E_ERROR 1 #endif -#if BOTH(BLTOUCH, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) +#if ALL(BLTOUCH, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) #error "Disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN when using BLTOUCH with Creality V24S1-301." #endif @@ -86,8 +86,8 @@ //#define HEATER_0_PIN -1 //#define HEATER_BED_PIN -1 #define FAN0_PIN -1 - #define SPINDLE_LASER_ENA_PIN PC0 // FET 1 #define SPINDLE_LASER_PWM_PIN PC0 // Bed FET + #define SPINDLE_LASER_ENA_PIN PC0 // FET 1 #define SPINDLE_DIR_PIN PC0 // FET 4 #define LASER_SOFT_PWM_PIN PC0 #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V25S1.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V25S1.h index f78bad624d..61207f90b0 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V25S1.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V25S1.h @@ -51,9 +51,9 @@ #if ENABLED(IIC_BL24CXX_EEPROM) #define IIC_EEPROM_SDA PA11 #define IIC_EEPROM_SCL PA12 - #define MARLIN_EEPROM_SIZE 0x800 // 2K (24C16) -#elif EITHER(SDCARD_EEPROM_EMULATION, FLASH_EEPROM_EMULATION) - #define MARLIN_EEPROM_SIZE 0x800 // 2K + #define MARLIN_EEPROM_SIZE 0x800 // 2K (24C16) +#elif ANY(SDCARD_EEPROM_EMULATION, FLASH_EEPROM_EMULATION) + #define MARLIN_EEPROM_SIZE 0x800 // 2K #endif // @@ -61,19 +61,13 @@ // #define X_STOP_PIN PC4 #define Y_STOP_PIN PC5 +#define Z_STOP_PIN PC15 #if ENABLED(BLTOUCH) - #define Z_STOP_PIN -1 #define SERVO0_PIN PC14 // BLTouch OUT PIN - #ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PC15 // BLTouch IN PIN - #endif -#else - #define Z_STOP_PIN PC15 - #if ENABLED(PROBE_ACTIVATION_SWITCH) - #define PROBE_TARE_PIN PC14 - #define PROBE_ACTIVATION_SWITCH_PIN PB2 - #endif +#elif ENABLED(PROBE_ACTIVATION_SWITCH) + #define PROBE_TARE_PIN PC14 + #define PROBE_ACTIVATION_SWITCH_PIN PB2 #endif // diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 6cb4d48d58..96b3007ca6 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -183,7 +183,7 @@ #define EXP3_07_PIN PB12 #define EXP3_08_PIN PB15 -#elif EITHER(VET6_12864_LCD, DWIN_VET6_CREALITY_LCD) +#elif ANY(VET6_12864_LCD, DWIN_VET6_CREALITY_LCD) /** * VET6 12864 LCD @@ -204,7 +204,7 @@ #define EXP3_07_PIN PA4 #define EXP3_08_PIN PA7 -#elif EITHER(CR10_STOCKDISPLAY, FYSETC_MINI_12864_2_1) +#elif ANY(CR10_STOCKDISPLAY, FYSETC_MINI_12864_2_1) #error "Define RET6_12864_LCD or VET6_12864_LCD to select pins for the LCD with the Creality V4 controller." #endif @@ -299,11 +299,3 @@ #define UART4_RX_PIN PC11 // default uses sdcard SDIO_D3 #define UART5_TX_PIN PC12 // default uses sdcard SDIO_CK #define UART5_RX_PIN PD2 // default uses sdcard SDIO_CMD - -// SDIO pins -#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 diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h index 7a7ec35508..2e0de87641 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h @@ -164,7 +164,7 @@ #define EXP3_07_PIN PB12 #define EXP3_08_PIN PB15 -#elif EITHER(VET6_12864_LCD, DWIN_VET6_CREALITY_LCD) +#elif ANY(VET6_12864_LCD, DWIN_VET6_CREALITY_LCD) /** * VET6 12864 LCD diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V521.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V521.h index e54469afff..d555c0aaa1 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V521.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V521.h @@ -168,7 +168,7 @@ #define EXP3_07_PIN PB12 #define EXP3_08_PIN PB15 -#elif EITHER(VET6_12864_LCD, DWIN_VET6_CREALITY_LCD) +#elif ANY(VET6_12864_LCD, DWIN_VET6_CREALITY_LCD) /** * VET6 12864 LCD @@ -219,8 +219,3 @@ #endif #endif - -// DGUS LCDs -#if HAS_DGUS_LCD - #define LCD_SERIAL_PORT 3 -#endif diff --git a/Marlin/src/pins/stm32f1/pins_ERYONE_ERY32_MINI.h b/Marlin/src/pins/stm32f1/pins_ERYONE_ERY32_MINI.h index de85484eae..b18bd09de8 100644 --- a/Marlin/src/pins/stm32f1/pins_ERYONE_ERY32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_ERYONE_ERY32_MINI.h @@ -39,7 +39,7 @@ #define DISABLE_JTAG //#define ENABLE_SPI3 -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -98,7 +98,7 @@ #define FAN1_PIN PD12 #elif DISABLED(FET_ORDER_SF) // Not Spindle, Fan (i.e., "EFBF" or "EFBE") #define HEATER_BED_PIN PD12 - #if EITHER(HAS_MULTI_HOTEND, HEATERS_PARALLEL) + #if ANY(HAS_MULTI_HOTEND, HEATERS_PARALLEL) #define HEATER_1_PIN PB9 #else #define FAN1_PIN PB9 @@ -106,9 +106,9 @@ #endif #ifndef FAN0_PIN - #if EITHER(FET_ORDER_EFB, FET_ORDER_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan + #if ANY(FET_ORDER_EFB, FET_ORDER_EFF) // Hotend, Fan, Bed or Hotend, Fan, Fan #define FAN0_PIN PB5 - #elif EITHER(FET_ORDER_EEF, FET_ORDER_SF) // Hotend, Hotend, Fan or Spindle, Fan + #elif ANY(FET_ORDER_EEF, FET_ORDER_SF) // Hotend, Hotend, Fan or Spindle, Fan #define FAN0_PIN PD12 #elif ENABLED(FET_ORDER_EEB) // Hotend, Hotend, Bed #define FAN0_PIN -1 // IO pin. Buffer needed @@ -148,18 +148,22 @@ #define E0_SLAVE_ADDRESS 0 #endif #endif + // // Temperature Sensors // -#define TEMP_BED_PIN PC2 //TB -#define TEMP_0_PIN PC1 //TH1 -//#define TEMP_1_PIN PC3 //TH2 -#define TEMP_BOARD_PIN PC3 -#ifndef TEMP_SENSOR_BOARD - #define TEMP_SENSOR_BOARD 13 -#endif +#define TEMP_BED_PIN PC2 // TB +#define TEMP_0_PIN PC1 // TH1 +//#define TEMP_1_PIN PC3 // TH2 #define FIL_RUNOUT_PIN PA10 // MT_DET +#ifndef TEMP_BOARD_PIN + #define TEMP_BOARD_PIN PC3 +#endif +#if TEMP_BOARD_PIN == PC3 && TEMP_SENSOR_BOARD != 13 + #warning "The built-in TEMP_SENSOR_BOARD is 13 for ERYONE Ery32 mini." +#endif + // // LCD Pins // diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h index a02b270337..d1b64dd805 100644 --- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h +++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h @@ -51,7 +51,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -60,22 +60,26 @@ // // SPI -// Note: FLSun Hispeed (clone MKS_Robin_miniV2) board is using SPI2 interface. +// +#define SPI_DEVICE 2 // Maple + +// +// SD Card SPI // #define SD_SCK_PIN PB13 // SPI2 #define SD_MISO_PIN PB14 // SPI2 #define SD_MOSI_PIN PB15 // SPI2 -#define SPI_DEVICE 2 +// // SPI Flash +// #define SPI_FLASH #if ENABLED(SPI_FLASH) - // SPI 2 - #define SPI_FLASH_CS_PIN PB12 // SPI2_NSS / Flash chip-select - #define SPI_FLASH_MOSI_PIN PB15 - #define SPI_FLASH_MISO_PIN PB14 - #define SPI_FLASH_SCK_PIN PB13 #define SPI_FLASH_SIZE 0x1000000 // 16MB + #define SPI_FLASH_CS_PIN PB12 // SPI2_NSS / Flash chip-select + #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif // @@ -128,7 +132,9 @@ #define Y_SERIAL_RX_PIN Y_SERIAL_TX_PIN #define Z_SERIAL_TX_PIN PC7 // IO1 #define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif #else // Motor current PWM pins #define MOTOR_CURRENT_PWM_XY_PIN PA6 // VREF2/3 CONTROL XY @@ -169,7 +175,6 @@ #if AXIS_DRIVER_TYPE_E0(TMC2208) || AXIS_DRIVER_TYPE_E0(TMC2209) #define E0_SERIAL_TX_PIN PA8 // IO0 #define E0_SERIAL_RX_PIN PA8 // IO0 - #define TMC_BAUD_RATE 19200 #else // Motor current PWM pins #define MOTOR_CURRENT_PWM_E_PIN PB0 // VREF1 CONTROL E @@ -302,7 +307,7 @@ #define TFT_CS_PIN FSMC_CS_PIN #define TFT_RS_PIN FSMC_RS_PIN - #ifdef TFT_CLASSIC_UI + #if ENABLED(TFT_CLASSIC_UI) #define TFT_MARLINBG_COLOR 0x3186 // Grey #define TFT_MARLINUI_COLOR 0xC7B6 // Green #define TFT_BTARROWS_COLOR 0xDEE6 // Yellow diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index e723845a2a..69e11be20c 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -30,7 +30,7 @@ // // Flash EEPROM Emulation // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE 0x800 // 2K #define EEPROM_START_ADDRESS (0x8000000 + 256 * 1024 - 2 * EEPROM_PAGE_SIZE) // 256K firmware space @@ -152,7 +152,7 @@ // #if HAS_WIRED_LCD - #define SPI_DEVICE 2 + #define SPI_DEVICE 2 // Maple #define SD_SS_PIN EXP2_04_PIN #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index 1c62c461f9..93ef7b75d4 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -38,7 +38,7 @@ // // Flash EEPROM Emulation // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -118,8 +118,11 @@ #endif // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Stepper current PWM diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 47bea172a8..49b6f25a47 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -35,7 +35,7 @@ #define RESET_STEPPERS_ON_MEDIA_INSERT #define DISABLE_JTAG -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -164,7 +164,7 @@ #define DOGLCD_SCK EXP1_06_PIN #define DOGLCD_MOSI EXP1_08_PIN - #if EITHER(FYSETC_MINI_12864, U8GLIB_ST7920) + #if ANY(FYSETC_MINI_12864, U8GLIB_ST7920) #define FORCE_SOFT_SPI #endif //#define LCD_SCREEN_ROTATE 180 // 0, 90, 180, 270 diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h index 120d6d6f0a..96e90b701c 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h @@ -55,5 +55,8 @@ #define E0_SERIAL_RX_PIN PA3 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index 9c136c11f6..b97ccc8ec7 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -51,7 +51,7 @@ //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define MARLIN_EEPROM_SIZE 0x1000 // 4K #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 2cd77f42b2..4bb8c5dee6 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -51,7 +51,7 @@ //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define MARLIN_EEPROM_SIZE 0x1000 // 4K #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index 5e012c177d..57abf7aca7 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -56,7 +56,7 @@ //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define MARLIN_EEPROM_SIZE 0x1000 // 4K #endif diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index 8a0f15806e..34f7dba91f 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -51,7 +51,7 @@ //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 // Enable EEPROM Emulation for this board as it doesn't have EEPROM -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define MARLIN_EEPROM_SIZE 0x1000 // 4K #endif diff --git a/Marlin/src/pins/stm32f1/pins_KEDI_CONTROLLER_V1_2.h b/Marlin/src/pins/stm32f1/pins_KEDI_CONTROLLER_V1_2.h new file mode 100644 index 0000000000..9b20700adb --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_KEDI_CONTROLLER_V1_2.h @@ -0,0 +1,297 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 "env_validate.h" + +#define BOARD_INFO_NAME "Kedi Controller 32-Bit V1.2" + +//#define DISABLE_DEBUG +#define DISABLE_JTAG + +// Ignore temp readings during development. +//#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 + +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) + #define FLASH_EEPROM_EMULATION + #define EEPROM_PAGE_SIZE (0x800U) // 2KB + #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) + #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB +#endif + +// +// Limit Switches +// +#define X_MIN_PIN PC2 +#define X_MAX_PIN PA2 +#define Y_MIN_PIN PC1 +#define Y_MAX_PIN PA1 +#define Z_MIN_PIN PC0 +#define Z_MAX_PIN PC3 + +// +// Steppers +// + +#define X_STEP_PIN PC6 +#define X_DIR_PIN PC7 +#define X_ENABLE_PIN PB15 + +#define Y_STEP_PIN PB13 +#define Y_DIR_PIN PB14 +#define Y_ENABLE_PIN PB12 + +#define Z_STEP_PIN PB10 +#define Z_DIR_PIN PB11 +#define Z_ENABLE_PIN PB2 + +#define E0_STEP_PIN PC5 +#define E0_DIR_PIN PB0 +#define E0_ENABLE_PIN PC4 + +// Special Drivers + +// L6470 or L6474 on SPI +#if HAS_DRIVER(L6470) || HAS_DRIVER(L6474) // Shared with SPI on EXP2 + #define L6470_CHAIN_SCK_PIN PB3 + #define L6470_CHAIN_MISO_PIN PB4 + #define L6470_CHAIN_MOSI_PIN PB5 + #define L6470_CHAIN_SS_PIN PA15 + #define ENABLE_RESET_L64XX_CHIPS +#endif + +// TMC2130 on SPI +// SPI Pins (Shared for all drivers) +#if ENABLED(TMC_USE_SW_SPI) // Shared with EXP2 + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PB3 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PB4 + #endif + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PB5 + #endif +#endif + +// CS Pins (One pin for each driver) +#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) + #ifndef X_CS_PIN + #define X_CS_PIN PC10 + #endif + #ifndef Y_CS_PIN + #define Y_CS_PIN PC11 + #endif + #ifndef Z_CS_PIN + #define Z_CS_PIN PC12 + #endif + #ifndef E0_CS_PIN + #define E0_CS_PIN PC14 + #endif +#endif + +// TMC2208 or TMC2209 on UART +#if HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) + +// UART Pins (Single pin for both RX & TX) + #ifndef X_PIN_UART + #define X_PIN_UART PC10 + #endif + #ifndef Y_PIN_UART + #define Y_PIN_UART PC11 + #endif + #ifndef Z_PIN_UART + #define Z_PIN_UART PC12 + #endif + #ifndef E0_PIN_UART + #define E0_PIN_UART PC14 + #endif + +// Configurating Pins +#define X_SERIAL_TX_PIN X_PIN_UART +#define X_SERIAL_RX_PIN X_PIN_UART +#define Y_SERIAL_TX_PIN Y_PIN_UART +#define Y_SERIAL_RX_PIN Y_PIN_UART +#define Z_SERIAL_TX_PIN Z_PIN_UART +#define Z_SERIAL_RX_PIN Z_PIN_UART +#define E0_SERIAL_TX_PIN E0_PIN_UART +#define E0_SERIAL_RX_PIN E0_PIN_UART +#endif + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA8 +#define FAN0_PIN PC8 +#define HEATER_BED_PIN PC9 + +// +// Temperature Sensors +// +#define TEMP_BED_PIN PB1 // Analog Input +#define TEMP_0_PIN PA0 // Analog Input + +/** ------ ------ + * (BEEPER) PC10 |10 9 | PC11 (BTN_ENC) (MISO) PB4 |10 9 | PB3 (SCK) + * (LCD_EN) PB6 | 8 7 | PC12 (LCD_RS) (BTN_EN1) PD2 | 8 7 | PA15 (SD_SS) + * (LCD_D4) PC13 6 5 | PB7 (LCD_D5) (BTN_EN2) PB8 6 5 | PB5 (MOSI) + * (LCD_D6) PC15 | 4 3 | PC14 (LCD_D7) (SD_DETECT) PB9 | 4 3 | RESET + * GND | 2 1 | 5V GND | 2 1 | -- + * ------ ------ + * EXP1 EXP2 + */ +#define EXP1_03_PIN PC14 +#define EXP1_04_PIN PC15 +#define EXP1_05_PIN PB7 +#define EXP1_06_PIN PC13 +#define EXP1_07_PIN PC12 +#define EXP1_08_PIN PB6 +#define EXP1_09_PIN PC11 +#define EXP1_10_PIN PC10 + +#define EXP2_03_PIN -1 // RESET +#define EXP2_04_PIN PB9 +#define EXP2_05_PIN PB5 +#define EXP2_06_PIN PB8 +#define EXP2_07_PIN PA15 +#define EXP2_08_PIN PD2 +#define EXP2_09_PIN PB3 +#define EXP2_10_PIN PB4 + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + #define BEEPER_PIN EXP1_10_PIN + #define BTN_ENC EXP1_09_PIN + + #if ENABLED(CR10_STOCKDISPLAY) + #define LCD_PINS_RS EXP1_04_PIN + + #define BTN_EN1 EXP1_08_PIN + #define BTN_EN2 EXP1_06_PIN + + #define LCD_PINS_EN EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN + + #elif IS_TFTGLCD_PANEL + + #undef BEEPER_PIN + #undef BTN_ENC + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS EXP2_08_PIN + #endif + + #define SD_DETECT_PIN EXP2_04_PIN + + #else + + #define LCD_PINS_RS EXP1_07_PIN + + #define BTN_EN1 EXP2_08_PIN + #define BTN_EN2 EXP2_06_PIN + + #define LCD_PINS_EN EXP1_08_PIN + + #if ENABLED(FYSETC_MINI_12864) + + #define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN EXP1_06_PIN + #define DOGLCD_A0 EXP1_07_PIN + #define DOGLCD_CS EXP1_08_PIN + #define DOGLCD_SCK EXP2_09_PIN + #define DOGLCD_MOSI EXP2_05_PIN + + #define FORCE_SOFT_SPI // SPI MODE3 + + #define LED_PIN EXP1_05_PIN // red pwm + //#define LED_PIN EXP1_04_PIN // green + //#define LED_PIN EXP1_03_PIN // blue + + //#if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + // #ifndef RGB_LED_R_PIN + // #define RGB_LED_R_PIN EXP1_05_PIN + // #endif + // #ifndef RGB_LED_G_PIN + // #define RGB_LED_G_PIN EXP1_04_PIN + // #endif + // #ifndef RGB_LED_B_PIN + // #define RGB_LED_B_PIN EXP1_03_PIN + // #endif + //#elif ENABLED(FYSETC_MINI_12864_2_1) + // #define NEOPIXEL_PIN EXP1_05_PIN + //#endif + + #else // !FYSETC_MINI_12864 + + #define LCD_PINS_D4 EXP1_06_PIN + #if IS_ULTIPANEL + #define LCD_PINS_D5 EXP1_05_PIN + #define LCD_PINS_D6 EXP1_04_PIN + #define LCD_PINS_D7 EXP1_03_PIN + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + + #endif + + #endif // !FYSETC_MINI_12864 + + // Alter timing for graphical display + #if IS_U8GLIB_ST7920 + #define BOARD_ST7920_DELAY_1 125 + #define BOARD_ST7920_DELAY_2 125 + #define BOARD_ST7920_DELAY_3 125 + #endif + + #endif + +#endif // HAS_WIRED_LCD + +// +// SD Card +// + +// By default the onboard SD is enabled. +// Change SDCARD_CONNECTION from 'ONBOARD' to 'LCD' for an external (LCD module) SD +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +#if SD_CONNECTION_IS(LCD) + #define SPI_DEVICE 3 // Maple + #define SD_DETECT_PIN EXP2_04_PIN + #define SD_SCK_PIN EXP2_09_PIN + #define SD_MISO_PIN EXP2_10_PIN + #define SD_MOSI_PIN EXP2_05_PIN + #define SD_SS_PIN EXP2_07_PIN +#elif SD_CONNECTION_IS(ONBOARD) + #define SD_DETECT_PIN PA3 + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PA7 + #define SD_SS_PIN PA4 +#endif +#define ONBOARD_SPI_DEVICE 1 // SPI1 +#define ONBOARD_SD_CS_PIN PA4 // Chip select for "System" SD card diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 168317d8b5..d4f0ea7fd2 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -35,18 +35,18 @@ #define BOARD_NO_NATIVE_USB -//#define DISABLE_DEBUG // We still want to debug with STLINK... -#define DISABLE_JTAG // We free the jtag pins (PA15) but keep STLINK - // Release PB4 (STEP_X_PIN) from JTAG NRST role. +//#define DISABLE_DEBUG // Allow debug with STLINK... +#define DISABLE_JTAG // We free the JTAG pins (PA15) but keep STLINK + // Release PB4 (STEP_X_PIN) from JTAG NRST role. // // Limit Switches // -#define X_MIN_PIN PC1 // pin 16 -#define X_MAX_PIN PC0 // pin 15 (Filament sensor on Alfawise setup) -#define Y_MIN_PIN PC15 // pin 9 -#define Y_MAX_PIN PC14 // pin 8 (Unused in stock Alfawise setup) -#define Z_MIN_PIN PE6 // pin 5 Standard Endstop or Z_Probe endstop function -#define Z_MAX_PIN PE5 // pin 4 (Unused in stock Alfawise setup) +#define X_MIN_PIN PC1 +#define X_MAX_PIN PC0 // (Filament sensor on Alfawise setup) +#define Y_MIN_PIN PC15 +#define Y_MAX_PIN PC14 // (Unused in stock Alfawise setup) +#define Z_MIN_PIN PE6 // Standard Endstop or Z_Probe endstop function +#define Z_MAX_PIN PE5 // (Unused in stock Alfawise setup) // May be used for BLTouch Servo function on older variants (<= V08) #define ONBOARD_ENDSTOPPULLUPS @@ -60,35 +60,35 @@ // // Steppers // -#define X_ENABLE_PIN PB5 // pin 91 -#define X_STEP_PIN PB4 // pin 90 -#define X_DIR_PIN PB3 // pin 89 +#define X_ENABLE_PIN PB5 +#define X_STEP_PIN PB4 +#define X_DIR_PIN PB3 -#define Y_ENABLE_PIN PB8 // pin 95 -#define Y_STEP_PIN PB7 // pin 93 -#define Y_DIR_PIN PB6 // pin 92 +#define Y_ENABLE_PIN PB8 +#define Y_STEP_PIN PB7 +#define Y_DIR_PIN PB6 -#define Z_ENABLE_PIN PE1 // pin 98 -#define Z_STEP_PIN PE0 // pin 97 -#define Z_DIR_PIN PB9 // pin 96 +#define Z_ENABLE_PIN PE1 +#define Z_STEP_PIN PE0 +#define Z_DIR_PIN PB9 -#define E0_ENABLE_PIN PE4 // pin 3 -#define E0_STEP_PIN PE3 // pin 2 -#define E0_DIR_PIN PE2 // pin 1 +#define E0_ENABLE_PIN PE4 +#define E0_STEP_PIN PE3 +#define E0_DIR_PIN PE2 // // Temperature Sensors // -#define TEMP_0_PIN PA0 // pin 23 (Nozzle 100K/3950 thermistor) -#define TEMP_BED_PIN PA1 // pin 24 (Hot Bed 100K/3950 thermistor) +#define TEMP_0_PIN PA0 // (Nozzle 100K/3950 thermistor) +#define TEMP_BED_PIN PA1 // (Hot Bed 100K/3950 thermistor) // // Heaters / Fans // -#define HEATER_0_PIN PD3 // pin 84 (Nozzle Heat Mosfet) -#define HEATER_BED_PIN PA8 // pin 67 (Hot Bed Mosfet) +#define HEATER_0_PIN PD3 // (Nozzle Heat Mosfet) +#define HEATER_BED_PIN PA8 // (Hot Bed Mosfet) -#define FAN0_PIN PA15 // pin 77 (4cm Fan) +#define FAN0_PIN PA15 // (4cm Fan) #if TERN(MAPLE_STM32F1, ENABLED(FAN_SOFT_PWM), ENABLED(FAST_PWM_FAN)) && FAN_MIN_PWM < 5 // Required to avoid issues with heating or STLink #error "FAN_MIN_PWM must be 5 or higher." // Fan will not start in 1-30 range @@ -104,10 +104,10 @@ #endif #endif -//#define BEEPER_PIN PD13 // pin 60 (Servo PWM output 5V/GND on Board V0G+) made for BL-Touch sensor +//#define BEEPER_PIN PD13 // (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 -#define LED_PIN PC2 // pin 17 +#define LED_PIN PC2 // Longer3D board mosfets are passing by default // Avoid nozzle heat and fan start before serial init @@ -136,14 +136,14 @@ // #if HAS_FSMC_TFT #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT - #define FSMC_CS_PIN PD7 // pin 88 = FSMC_NE1 - #define FSMC_RS_PIN PD11 // pin 58 A16 Register. Only one address needed + #define FSMC_CS_PIN PD7 // FSMC_NE1 + #define FSMC_RS_PIN PD11 // A16 Register. Only one address needed #define TFT_CS_PIN FSMC_CS_PIN #define TFT_RS_PIN FSMC_RS_PIN - #define TFT_RESET_PIN PC4 // pin 33 - #define TFT_BACKLIGHT_PIN PD12 // pin 59 + #define TFT_RESET_PIN PC4 + #define TFT_BACKLIGHT_PIN PD12 #define TFT_BACKLIGHT_PWM 150 // Brightness with alt. TIM4 chan 1 (1-255) #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h @@ -168,11 +168,11 @@ * declared below. */ #if NEED_TOUCH_PINS - #define TOUCH_CS_PIN PB12 // pin 51 SPI2_NSS - #define TOUCH_SCK_PIN PB13 // pin 52 - #define TOUCH_MOSI_PIN PB14 // pin 53 (Inverted MOSI/MISO = No HW SPI2) - #define TOUCH_MISO_PIN PB15 // pin 54 - #define TOUCH_INT_PIN PC6 // pin 63 (PenIRQ coming from ADS7843) + #define TOUCH_CS_PIN PB12 // SPI2_NSS + #define TOUCH_SCK_PIN PB13 + #define TOUCH_MISO_PIN PB15 // (Swapped MOSI/MISO = No HW SPI2) + #define TOUCH_MOSI_PIN PB14 + #define TOUCH_INT_PIN PC6 // (PenIRQ coming from ADS7843) #endif // @@ -181,25 +181,25 @@ // #if NO_EEPROM_SELECTED //#define SPI_EEPROM - //#define SPI_FLASH // need MARLIN_DEV_MODE for M993/M994 EEPROM backup tests + //#define SPI_FLASH // Use MARLIN_DEV_MODE for M993/M994 EEPROM backup tests #define FLASH_EEPROM_EMULATION #endif #if ENABLED(SPI_EEPROM) // SPI1 EEPROM Winbond W25Q64 (8MB/64Mbits) #define SPI_CHAN_EEPROM1 1 - #define SPI_EEPROM1_CS_PIN PC5 // pin 34 - #define EEPROM_SCK_PIN BOARD_SPI1_SCK_PIN // PA5 pin 30 - #define EEPROM_MISO_PIN BOARD_SPI1_MISO_PIN // PA6 pin 31 - #define EEPROM_MOSI_PIN BOARD_SPI1_MOSI_PIN // PA7 pin 32 + #define SPI_EEPROM1_CS_PIN PC5 + #define EEPROM_SCK_PIN BOARD_SPI1_SCK_PIN // PA5 + #define EEPROM_MISO_PIN BOARD_SPI1_MISO_PIN // PA6 + #define EEPROM_MOSI_PIN BOARD_SPI1_MOSI_PIN // PA7 #define EEPROM_PAGE_SIZE 0x1000U // 4K (from datasheet) - #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64K for now... + #define MARLIN_EEPROM_SIZE 16UL * (EEPROM_PAGE_SIZE) // Limit to 64K for now... #elif ENABLED(SPI_FLASH) - #define SPI_FLASH_SIZE 0x40000U // limit to 256K (M993 will reboot with 512) + #define SPI_FLASH_SIZE 0x40000U // Limit to 256K (M993 will reboot with 512) #define SPI_FLASH_CS_PIN PC5 - #define SPI_FLASH_MOSI_PIN PA7 - #define SPI_FLASH_MISO_PIN PA6 #define SPI_FLASH_SCK_PIN PA5 + #define SPI_FLASH_MISO_PIN PA6 + #define SPI_FLASH_MOSI_PIN PA7 #elif ENABLED(FLASH_EEPROM_EMULATION) // SoC Flash (framework-arduinoststm32-maple/STM32F1/libraries/EEPROM/EEPROM.h) #define EEPROM_PAGE_SIZE (0x800U) // 2K diff --git a/Marlin/src/pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h b/Marlin/src/pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h index a7fc323ba0..6add3ca01c 100644 --- a/Marlin/src/pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MINGDA_MPX_ARM_MINI.h @@ -51,14 +51,14 @@ #define E2END 0xFFFF // EEPROM end address AT24C256 (32kB) */ -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE 0x800U // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2K #endif -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple // // Limit Switches diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index e53ffa008b..d456974e9e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -195,7 +195,7 @@ // SPI2 is shared by LCD touch driver and flash // SPI1(PA7) & SPI3(PB5) not available -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple #define ONBOARD_SDIO #define SDIO_CLOCK 4500000 @@ -274,7 +274,7 @@ #if ENABLED(SPI_FLASH) #define SPI_FLASH_SIZE 0x800000 // 8MB #define SPI_FLASH_CS_PIN PG9 - #define SPI_FLASH_MOSI_PIN PB15 - #define SPI_FLASH_MISO_PIN PB14 #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 3ec2c2cfd9..c7a8da2ddc 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -52,15 +52,15 @@ //#define FLASH_EEPROM_EMULATION //#define SDCARD_EEPROM_EMULATION -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM // EEPROM on I2C-0 #define MARLIN_EEPROM_SIZE 0x1000 // 4K #endif // -// Note: MKS Robin board is using SPI2 interface. +// SPI // -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple // // Servos @@ -156,7 +156,10 @@ #define E0_SERIAL_RX_PIN PD9 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + #endif // HAS_TMC_UART // @@ -379,9 +382,9 @@ #if ENABLED(SPI_FLASH) #define SPI_FLASH_SIZE 0x1000000 // 16MB #define SPI_FLASH_CS_PIN PB12 - #define SPI_FLASH_MOSI_PIN PB15 - #define SPI_FLASH_MISO_PIN PB14 #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif #ifndef BEEPER_PIN 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 4d71fcf656..c3becd3fa1 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -38,7 +38,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -112,8 +112,11 @@ #define E0_SERIAL_RX_PIN PC11 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Heaters 0,1 / Fans / Bed @@ -250,7 +253,7 @@ // SD Card // #define SDCARD_CONNECTION ONBOARD -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple #define ONBOARD_SPI_DEVICE 2 #define SDSS SD_SS_PIN #define ONBOARD_SD_CS_PIN SD_SS_PIN diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index af4e121100..53f31c2784 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -156,7 +156,7 @@ // // SPI // -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple #define SD_SCK_PIN PB13 #define SD_MISO_PIN PB14 #define SD_MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index 6835ec3b56..0651bcebf2 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -152,7 +152,7 @@ // // SPI // -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple #define SD_SCK_PIN PB13 #define SD_MISO_PIN PB14 #define SD_MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index 3a50465a9a..85c8de26ad 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -43,14 +43,14 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2K #endif -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple // // Servos @@ -199,7 +199,7 @@ #if ENABLED(SPI_FLASH) #define SPI_FLASH_SIZE 0x1000000 // 16MB #define SPI_FLASH_CS_PIN PB12 // Flash chip-select - #define SPI_FLASH_MOSI_PIN PB15 - #define SPI_FLASH_MISO_PIN PB14 #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h index 6f641f20dd..983cb6aded 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_V2.h @@ -54,15 +54,15 @@ //#define FLASH_EEPROM_EMULATION //#define SDCARD_EEPROM_EMULATION -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM // EEPROM on I2C-0 #define MARLIN_EEPROM_SIZE 0x1000 // 4K #endif // -// Note: MKS Robin board is using SPI2 interface. +// SPI // -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple // // Servos @@ -163,7 +163,10 @@ #define E1_SERIAL_RX_PIN PD8 // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + #endif // HAS_TMC_UART // @@ -381,9 +384,9 @@ #if ENABLED(SPI_FLASH) #define SPI_FLASH_SIZE 0x1000000 // 16MB #define SPI_FLASH_CS_PIN PB12 - #define SPI_FLASH_MOSI_PIN PB15 - #define SPI_FLASH_MISO_PIN PB14 #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif #ifndef BEEPER_PIN diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_common.h index a329b8a4bb..16ee7757b9 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_common.h @@ -42,14 +42,14 @@ #if ENABLED(SRAM_EEPROM_EMULATION) #undef NO_EEPROM_SELECTED #endif -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2K #endif -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple // // Servos @@ -210,7 +210,7 @@ #if ENABLED(SPI_FLASH) #define SPI_FLASH_SIZE 0x1000000 // 16MB #define SPI_FLASH_CS_PIN PB12 - #define SPI_FLASH_MOSI_PIN PB15 - #define SPI_FLASH_MISO_PIN PB14 #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 922caa556e..114c224b1e 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -41,9 +41,9 @@ #define DISABLE_DEBUG // -// Note: MKS Robin board is using SPI2 interface. +// SPI // -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple // // Servos @@ -167,9 +167,9 @@ #define HEATER_BED_PIN PA0 // +HOT-BED- #define FAN0_PIN PB1 // +FAN- -/** - * Note: MKS Robin Pro board is using SPI2 interface. Make sure your stm32duino library is configured accordingly - */ +// +// Note: Using SPI2 interface. Make sure stm32duino is configured accordingly +// //#define TEMP_0_CS_PIN PE5 // TC1 - CS1 //#define TEMP_0_CS_PIN PF11 // TC2 - CS2 @@ -308,7 +308,7 @@ #if ENABLED(SPI_FLASH) #define SPI_FLASH_SIZE 0x1000000 // 16MB #define SPI_FLASH_CS_PIN PB12 // Flash chip-select - #define SPI_FLASH_MOSI_PIN PB15 - #define SPI_FLASH_MISO_PIN PB14 #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif diff --git a/Marlin/src/pins/stm32f1/pins_PANDA_PI_V29.h b/Marlin/src/pins/stm32f1/pins_PANDA_PI_V29.h index 60211f53f4..4c65ce9f64 100644 --- a/Marlin/src/pins/stm32f1/pins_PANDA_PI_V29.h +++ b/Marlin/src/pins/stm32f1/pins_PANDA_PI_V29.h @@ -31,7 +31,7 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define EEPROM_PAGE_SIZE (0x800U) // 2K #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL) @@ -125,8 +125,11 @@ #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -175,7 +178,7 @@ #define LCD_PINS_D4 PC1 #endif -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) +#if ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_PANDA_PI_V29.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" @@ -216,7 +219,7 @@ #define CLCD_MOD_RESET PA9 #define CLCD_SPI_CS PB8 - #if SD_CONNECTION_IS(LCD) && BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) + #if SD_CONNECTION_IS(LCD) && ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #define SD_DETECT_PIN PA15 #define SD_SS_PIN PA10 #endif diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index 46bd48f93f..a2efa632f8 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -120,7 +120,7 @@ #error "LCD_I2C_PANELOLU2 is not supported." #elif ENABLED(LCD_I2C_VIKI) #error "LCD_I2C_VIKI is not supported." - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) #error "VIKI2 / miniVIKI is not supported." #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) #error "ELB_FULL_GRAPHIC_CONTROLLER is not supported." diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index 4cf464aaee..b4cf21ee7f 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -144,7 +144,7 @@ #error "LCD_I2C_PANELOLU2 is not supported." #elif ENABLED(LCD_I2C_VIKI) #error "LCD_I2C_VIKI is not supported." - #elif EITHER(VIKI2, miniVIKI) + #elif ANY(VIKI2, miniVIKI) #error "VIKI2 / miniVIKI is not supported." #elif ENABLED(ELB_FULL_GRAPHIC_CONTROLLER) #error "ELB_FULL_GRAPHIC_CONTROLLER is not supported." diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index ff2bf5fd8e..d6a5ef3c17 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -184,7 +184,7 @@ #endif // SPI1(PA7) & SPI3(PB5) not available -#define SPI_DEVICE 2 +#define SPI_DEVICE 2 // Maple #if ENABLED(ONBOARD_SDIO) #define SD_SCK_PIN PB13 // SPI2 ok diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h index 08491fc21c..8ce0f48839 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h @@ -205,7 +205,7 @@ #define BOARD_ST7920_DELAY_2 200 #define BOARD_ST7920_DELAY_3 125 -#elif EITHER(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) +#elif ANY(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) //================================================================================ // OLED 128x64 diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h index 8997a5f1db..06f697e270 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h @@ -190,6 +190,7 @@ #define Z2_DIR_PIN PD0 #endif +// TODO: Use different pin names for auto-remapping #ifdef OPTION_Z2_ENDSTOP #define Z2_MIN_PIN PD1 #define Z2_MAX_PIN PB12 diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h index b60cca831b..24c7404360 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h @@ -156,6 +156,7 @@ #define Y_MAX_PIN PB14 #define Z_MAX_PIN PB13 +// TODO: Use different pin names for auto-remapping #ifdef OPTION_Z2_ENDSTOP #define Z2_MIN_PIN PD1 #define Z2_MAX_PIN PB12 diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h index 357ab1bd3b..b466122638 100644 --- a/Marlin/src/pins/stm32f4/pins_ARMED.h +++ b/Marlin/src/pins/stm32f4/pins_ARMED.h @@ -158,7 +158,7 @@ #define LCD_RESET_PIN PB12 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN PB13 #endif @@ -223,5 +223,8 @@ #define Z2_SERIAL_RX_PIN EXT4_PIN #define Z2_SERIAL_TX_PIN EXT4_PIN - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART diff --git a/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h b/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h index 8510e81482..02ad9bb4ad 100644 --- a/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h +++ b/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h @@ -126,7 +126,7 @@ // LCD / Controller // #if HAS_WIRED_LCD - #if EITHER(MKS_12864OLED, MKS_12864OLED_SSD1306) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306) #define LCD_PINS_DC PB8 // Set as output on init #define LCD_PINS_RS PB9 // Pull low for 1s to init // DOGM SPI LCD Support @@ -143,7 +143,7 @@ #define LCD_RESET_PIN PB5 // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN PB9 #endif diff --git a/Marlin/src/pins/stm32f4/pins_BLACKPILL_CUSTOM.h b/Marlin/src/pins/stm32f4/pins_BLACKPILL_CUSTOM.h new file mode 100644 index 0000000000..039333adfa --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_BLACKPILL_CUSTOM.h @@ -0,0 +1,140 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 "env_validate.h" + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Custom Blackpill" +#endif + +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "SLA Printer" +#endif + +#define DISABLE_DEBUG false // DISABLE_(DEBUG|JTAG) is not supported for STM32F4. +#define ALLOW_STM32F4 +#define BOARD_NO_NATIVE_USB + +// +// EEPROM +// +#if NO_EEPROM_SELECTED + #define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 + //#define SDCARD_EEPROM_EMULATION +#endif + +// +// Servos +// +#if !defined(SERVO0_PIN) && !defined(HAS_PIN_27_BOARD) + #define SERVO0_PIN PC13 // BLTouch OUT +#endif + +#define LED_PIN PC13 + +// +// Limit Switches +// +#define Z_STOP_PIN PA15 +#define X_STOP_PIN PA11 +#define Y_STOP_PIN PA12 + +// +// Filament Runout Sensor +// +#define FIL_RUNOUT_PIN PB15 // "Pulled-high" + +// +// Steppers +// +#define X_STEP_PIN PB0 +#define X_DIR_PIN PB1 +#define X_ENABLE_PIN PB2 // Shared + +#define Y_STEP_PIN PB3 +#define Y_DIR_PIN PB4 +#define Y_ENABLE_PIN X_ENABLE_PIN + +#define Z_STEP_PIN PB8 +#define Z_DIR_PIN PB5 +#define Z_ENABLE_PIN X_ENABLE_PIN + +#define E0_STEP_PIN PB9 +#define E0_DIR_PIN PB10 +#define E0_ENABLE_PIN X_ENABLE_PIN + +// +// Temperature Sensors +// +#define TEMP_0_PIN PA0 // TH1 +#define TEMP_BED_PIN PA1 // TB1 + +// +// Heaters / Fans +// +#define HEATER_BED_PIN PA2 // HOT BED +#define FAN1_PIN PA8 // extruder fan +#define HEATER_0_PIN PA3 // HEATER1 + +// +// Encoder pins +// +#if ENABLED(OLED_PANEL_TINYBOY2) +#define BTN_EN1 PB12 +#define BTN_EN2 PB13 +#define BTN_ENC PB14 +#define BEEPER_PIN PC15 +#endif + +// +// SD Card +// +#define ONBOARD_SPI_DEVICE 1 +// #define ONBOARD_SD_CS_PIN PA4 // SDSS + +#define SD_DETECT_PIN -1 +#define SDCARD_CONNECTION ONBOARD +//#define SDIO_SUPPORT +#define NO_SD_HOST_DRIVE // This board's SD is only seen by the printer + +#if SD_CONNECTION_IS(ONBOARD) + #define SDSS PA4 + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PA7 +#endif + +// Pins for documentation and sanity checks only. +// Changing these will not change the pin they are on. + +// Hardware UART pins +#define UART1_TX_PIN PA9 // default uses CH340 RX +#define UART1_RX_PIN PA10 // default uses CH340 TX +#define UART2_TX_PIN PA2 // default uses HEATER_BED_PIN +#define UART2_RX_PIN PA3 // not connected +#define UART3_TX_PIN PB10 // default uses LCD connector +#define UART3_RX_PIN PB11 // default uses LCD connector +#define UART4_TX_PIN PC10 // default uses sdcard SDIO_D2 +#define UART4_RX_PIN PC11 // default uses sdcard SDIO_D3 +#define UART5_TX_PIN PC12 // default uses sdcard SDIO_CK +#define UART5_RX_PIN PD2 // default uses sdcard SDIO_CMD 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 73af02d3ab..bc80720916 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -152,18 +152,24 @@ #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors // #define TEMP_0_PIN PA2 // T0 <-> E0 #define TEMP_1_PIN PA0 // T1 <-> E1 -#define TEMP_BOARD_PIN PC2 // Onboard thermistor, NTC100K #define TEMP_BED_PIN PA1 // T2 <-> Bed #define TEMP_PROBE_PIN PC3 // Shares J4 connector with PD1 +#ifndef TEMP_BOARD_PIN + #define TEMP_BOARD_PIN PC2 // Onboard thermistor, NTC100K +#endif + // // Heaters / Fans // @@ -281,7 +287,7 @@ #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h b/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h index 7e3f070786..4350fad7f7 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_E3_RRF.h @@ -51,11 +51,7 @@ #define Z_STOP_PIN PC2 // Z-STOP #if ENABLED(BTT_E3_RRF_IDEX_BOARD) - #if X2_USE_ENDSTOP == _XMAX_ - #define X_MAX_PIN FPC2_PIN // X2-STOP - #elif X2_USE_ENDSTOP == _XMIN_ - #define X_MIN_PIN FPC2_PIN // X2-STOP - #endif + #define X2_STOP_PIN FPC2_PIN // X2-STOP #endif // @@ -135,8 +131,11 @@ #endif // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -197,7 +196,7 @@ #if HAS_WIRED_LCD - #if EITHER(CR10_STOCKDISPLAY, LCD_FOR_MELZI) + #if ANY(CR10_STOCKDISPLAY, LCD_FOR_MELZI) #define BEEPER_PIN PE8 @@ -259,7 +258,7 @@ #define LCD_PINS_D7 PE8 #define ADC_KEYPAD_PIN PB0 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #elif ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define BTN_ENC PE9 #define BTN_EN1 PE7 @@ -331,7 +330,7 @@ #endif // HAS_WIRED_LCD -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) +#if ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_E3_RRF.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" 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 b81859dd61..2414c07ae3 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -106,11 +106,21 @@ // Pins on the extender // #if ENABLED(M5_EXTENDER) - #define X2_STOP_PIN PI4 // M5 M1_STOP - #define Y2_STOP_PIN PF12 // M5 M5_STOP - #define Z2_STOP_PIN PF4 // M5 M2_STOP - #define Z3_STOP_PIN PI7 // M5 M4_STOP - #define Z4_STOP_PIN PF6 // M5 M3_STOP + #ifndef X2_STOP_PIN + #define X2_STOP_PIN PI4 // M5 M1_STOP + #endif + #ifndef Y2_STOP_PIN + #define Y2_STOP_PIN PF12 // M5 M5_STOP + #endif + #ifndef Z2_STOP_PIN + #define Z2_STOP_PIN PF4 // M5 M2_STOP + #endif + #ifndef Z3_STOP_PIN + #define Z3_STOP_PIN PI7 // M5 M4_STOP + #endif + #ifndef Z4_STOP_PIN + #define Z4_STOP_PIN PF6 // M5 M3_STOP + #endif #endif #ifndef Z_MIN_PROBE_PIN @@ -272,8 +282,11 @@ #endif // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -451,7 +464,7 @@ //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h index d69d8fbef0..4cfb8e7b7e 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h @@ -27,7 +27,7 @@ #define USES_DIAG_JUMPERS // Onboard I2C EEPROM -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #undef NO_EEPROM_SELECTED #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 // 4K (AT24C32) @@ -68,23 +68,6 @@ #define Z_MIN_PROBE_PIN PB7 #endif -// -// Check for additional used endstop pins -// -#if HAS_EXTRA_ENDSTOPS - #define _ENDSTOP_IS_ANY(ES) X2_USE_ENDSTOP == ES || Y2_USE_ENDSTOP == ES || Z2_USE_ENDSTOP == ES || Z3_USE_ENDSTOP == ES || Z4_USE_ENDSTOP == ES - #if _ENDSTOP_IS_ANY(_XMIN_) || _ENDSTOP_IS_ANY(_XMAX_) - #define NEEDS_X_MINMAX - #endif - #if _ENDSTOP_IS_ANY(_YMIN_) || _ENDSTOP_IS_ANY(_YMAX_) - #define NEEDS_Y_MINMAX - #endif - #if _ENDSTOP_IS_ANY(_ZMIN_) || _ENDSTOP_IS_ANY(_ZMAX_) - #define NEEDS_Z_MINMAX - #endif - #undef _ENDSTOP_IS_ANY -#endif - // // Limit Switches // @@ -95,7 +78,7 @@ #else #define X_MIN_PIN E0_DIAG_PIN // E0DET #endif -#elif EITHER(DUAL_X_CARRIAGE, NEEDS_X_MINMAX) +#elif NEEDS_X_MINMAX #ifndef X_MIN_PIN #define X_MIN_PIN X_DIAG_PIN // X-STOP #endif @@ -113,7 +96,7 @@ #else #define Y_MIN_PIN E1_DIAG_PIN // E1DET #endif -#elif ENABLED(NEEDS_Y_MINMAX) +#elif NEEDS_Y_MINMAX #ifndef Y_MIN_PIN #define Y_MIN_PIN Y_DIAG_PIN // Y-STOP #endif @@ -131,7 +114,7 @@ #else #define Z_MIN_PIN E2_DIAG_PIN // PWRDET #endif -#elif ENABLED(NEEDS_Z_MINMAX) +#elif NEEDS_Z_MINMAX #ifndef Z_MIN_PIN #define Z_MIN_PIN Z_DIAG_PIN // Z-STOP #endif @@ -316,8 +299,11 @@ #define E3_SERIAL_RX_PIN E3_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART /** ------ ------ * (BEEPER) PE8 | 1 2 | PE7 (BTN_ENC) (MISO) PA6 | 1 2 | PA5 (SCK) @@ -481,7 +467,7 @@ #define DOGLCD_A0 EXP1_04_PIN //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h index 6f2de83b51..64ab2dd6c9 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h @@ -43,7 +43,7 @@ #endif // Onboard I2C EEPROM -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #undef NO_EEPROM_SELECTED #define I2C_EEPROM #define SOFT_I2C_EEPROM // Force the use of Software I2C @@ -219,7 +219,7 @@ #define LCD_PINS_D7 EXP1_01_PIN #define ADC_KEYPAD_PIN PA1 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #elif ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define BTN_ENC EXP1_02_PIN #define BTN_EN1 EXP1_03_PIN @@ -280,7 +280,7 @@ #endif // HAS_WIRED_LCD -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) +#if ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" @@ -332,7 +332,7 @@ #define SDCARD_CONNECTION ONBOARD #endif -#if SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) +#if SD_CONNECTION_IS(LCD) && (ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) #define SD_DETECT_PIN EXP1_01_PIN #define SD_SS_PIN EXP1_05_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) 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 ad0f594a24..f2fbdb9ece 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -29,8 +29,8 @@ // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT //#define BTT_MOTOR_EXPANSION -#if BOTH(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) - #if EITHER(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) +#if ALL(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) + #if ANY(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) #define EXP_MOT_USE_EXP2_ONLY 1 #else #error "You can't use both an LCD and a Motor Expansion Module on EXP1/EXP2 at the same time." @@ -222,8 +222,11 @@ #define E2_SERIAL_RX_PIN E2_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -502,7 +505,7 @@ #define DOGLCD_A0 EXP1_04_PIN //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h index 183927a5a6..055338f45b 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h @@ -29,8 +29,8 @@ // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT //#define BTT_MOTOR_EXPANSION -#if BOTH(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) - #if EITHER(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) +#if ALL(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) + #if ANY(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) #define EXP_MOT_USE_EXP2_ONLY 1 #else #error "You can't use both an LCD and a Motor Expansion Module on EXP1/EXP2 at the same time." @@ -322,8 +322,11 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // SD Connection @@ -481,7 +484,7 @@ #define DOGLCD_A0 EXP1_04_PIN //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_CREALITY_F401.h b/Marlin/src/pins/stm32f4/pins_CREALITY_F401.h new file mode 100644 index 0000000000..f4b5b7d96a --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_CREALITY_F401.h @@ -0,0 +1,241 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 "env_validate.h" + +#define BOARD_INFO_NAME "STM32F401RET6" +#define DEFAULT_MACHINE_NAME "Ender-5 S1" + +#define IIC_BL24CXX_EEPROM // EEPROM on I2C-0 used only for display settings +#if ENABLED(IIC_BL24CXX_EEPROM) + #define IIC_EEPROM_SDA PA11 + #define IIC_EEPROM_SCL PA12 + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb (24C16) +#else + #define SDCARD_EEPROM_EMULATION // SD EEPROM until all EEPROM is BL24CXX + #define MARLIN_EEPROM_SIZE 0x800 // 2Kb +#endif + +// SPI +//#define SPI_EEPROM // EEPROM on SPI-0 +//#define SPI_CHAN_EEPROM1 ? +//#define SPI_EEPROM1_CS ? + +// 2K EEPROM +//#define SPI_EEPROM2_CS ? + +// 32Mb FLASH +//#define SPI_FLASH_CS ? + +// +// Servos +// +#define SERVO0_PIN PC13 // BLTouch OUT + +// +// Limit Switches +// +#define X_STOP_PIN PA5 +#define Y_STOP_PIN PA6 + +#if ENABLED(BLTOUCH) + #define Z_MAX_PIN PA15 // ROCK_20220730 + #define Z_MIN_PIN PC14 + //#define Z_STOP_PIN_NADD PA15 // Added z-axis limit switch +#elif ENABLED(PROBE_ACTIVATION_SWITCH) + #define Z_MIN_PIN PA15 + #define PROBE_TARE_PIN PC14 + #define PROBE_ACTIVATION_SWITCH_PIN PB2 +#else + #define Z_MIN_PIN PA15 +#endif + +// +// Filament runout +// +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define FIL_RUNOUT_PIN PC15 +#endif + +// +// Steppers Motor drive chip power control +// +#define X_ENABLE_PIN PC3 +#define X_STEP_PIN PC2 +#define X_DIR_PIN PB9 + +#define Y_ENABLE_PIN PC3 +#define Y_STEP_PIN PB8 +#define Y_DIR_PIN PB7 + +#define Z_ENABLE_PIN PC3 +#define Z_STEP_PIN PB6 +#define Z_DIR_PIN PB5 + +#define E0_ENABLE_PIN PC3 +#define E0_STEP_PIN PB4 +#define E0_DIR_PIN PB3 + +// +// Temperature Sensors +// +#ifndef TEMP_0_PIN + #define TEMP_0_PIN PC5 // E1_THERMISTOR PA0 -> PT100 +#endif +#define TEMP_BED_PIN PC4 // BED_THERMISTOR_1 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PA1 // E1_HEAT_PWM +#define HEATER_BED_PIN PA7 // BED_HEAT_1 FET + +#define FAN0_PIN PA0 // Part cooling fan FET +//#define FAN1_PIN PE11 // Extruder fan FET +//#define FAN2_PIN PE1 // Controller fan FET + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN PA1 // FAN1_PIN +#endif + +// +// SD Card +// +#define SD_DETECT_PIN PC7 +#define SDCARD_CONNECTION ONBOARD +#define ONBOARD_SPI_DEVICE 1 +#define ONBOARD_SD_CS_PIN PC12 // SDSS +#define SDIO_SUPPORT +#define NO_SD_HOST_DRIVE // This board's SD is only seen by the printer + +// SPI 2 +#if ENABLED(RET6_12864_LCD) + + #define LCD_PINS_RS PB12 + #define LCD_PINS_EN PB15 + #define LCD_PINS_D4 PB13 + #define BTN_EN2 PB14 +#endif + +//#define LED_CONTROL_PIN PA7 + +// +// WiFI Reset +// +#ifdef MENU_RESET_WIFI + #define RESET_WIFI_PIN PB12 +#endif + +// +// Backpower +// +#ifndef BACKPOWER_CTRL_PIN + #define BACKPOWER_CTRL_PIN PA4 // Pull down on the electricity, When the ADC detects that the 24V power supply is below 20V, Save the continued call data first, PA4 = 1 +#endif + +#ifndef CHECK_24V_PIN + #define POWER_DETECTION_PIN PB0 // Detect ADC input pin of 24V power supply +#endif + +/** + * Logical pin vs. port/pin cross reference + * + * PA0 54 // E1_THERMISTOR PA9 0 // TX + * PA1 55 // E2_THERMISTOR PA10 1 // RX + * PA2 56 // E3_THERMISTOR PD3 2 // CTS + * PA3 53 // BED_THERMISTOR_3 PD4 3 // RTS + * PA4 16 // SPI_CS PD5 4 // TX + * PA5 17 // SPI_SCK PD6 5 // RX + * PA6 18 // SPI_MISO PB5 6 // WIFI_WAKEUP + * PA7 19 // SPI_MOSI PE11 7 // WIFI_RESET + * PA8 43 // V_STOP PE12 8 // WIFI_BOOT + * PA9 0 // TX PE1 9 // STATUS_LED + * PA10 1 // RX PB12 10 // SPI_CS + * PA11 30 // OTG_DM PB15 11 // SPI_MOSI + * PA12 31 // OTG_DP PB14 12 // SPI_MISO + * PA13 20 // JTAG_TMS/SWDIO PB13 13 // SPI_SCK + * PA14 21 // JTAG_TCK/SWCLK PB7 14 // SDA + * PA15 25 // SD_CARD_DETECT PB6 15 // SCL + * PB0 49 // E2_HEAT_PWM PA4 16 // SPI_CS + * PB1 50 // E3_HEAT_PWM PA5 17 // SPI_SCK + * PB3 22 // JTAG_TDO/SWO PA6 18 // SPI_MISO + * PB4 37 // USER4 PA7 19 // SPI_MOSI + * PB5 6 // WIFI_WAKEUP PA13 20 // JTAG_TMS/SWDIO + * PB6 15 // SCL PA14 21 // JTAG_TCK/SWCLK + * PB7 14 // SDA PB3 22 // JTAG_TDO/SWO + * PB8 77 // E3_PWM PC8 23 // SDIO_D0 + * PB9 35 // USER1 PC9 24 // SDIO_D1 + * PB10 64 // Y_PWM PA15 25 // SD_CARD_DETECT + * PB12 10 // SPI_CS PC10 26 // SDIO_D2 + * PB13 13 // SPI_SCK PC11 27 // SDIO_D3 + * PB14 12 // SPI_MISO PC12 28 // SDIO_CK + * PB15 11 // SPI_MOSI PD2 29 // SDIO_CMD + * PC0 68 // Z_DIR PA11 30 // OTG_DM + * PC1 33 // IR_ON PA12 31 // OTG_DP + * PC2 51 // BED_THERMISTOR_1 PD1 32 // IR_OUT + * PC3 52 // BED_THERMISTOR_2 PC1 33 // IR_ON + * PC4 57 // E1_FAN PD7 34 // USER3 + * PC5 58 // E2_FAN PB9 35 // USER1 + * PC6 67 // Z_PWM PE0 36 // USER2 + * PC7 48 // E1_HEAT_PWM PB4 37 // USER4 + * PC8 23 // SDIO_D0 PE7 38 // USER_BUTTON + * PC9 24 // SDIO_D1 PD8 39 // X_STOP + * PC10 26 // SDIO_D2 PD9 40 // Y_STOP + * PC11 27 // SDIO_D3 PD10 41 // Z_STOP + * PC12 28 // SDIO_CK PD11 42 // U_STOP + * PC13 70 // E1_DIR PA8 43 // V_STOP + * PC14 69 // E1_RESET PD0 44 // W_STOP + * PC15 66 // Z_RESET PD13 45 // BED_HEAT_2 + * PD0 44 // W_STOP PD14 46 // BED_HEAT_1 + * PD1 32 // IR_OUT PD15 47 // BED_HEAT_3 + * PD2 29 // SDIO_CMD PC7 48 // E1_HEAT_PWM + * PD3 2 // CTS PB0 49 // E2_HEAT_PWM + * PD4 3 // RTS PB1 50 // E3_HEAT_PWM + * PD5 4 // TX PC2 51 // BED_THERMISTOR_1 + * PD6 5 // RX PC3 52 // BED_THERMISTOR_2 + * PD7 34 // USER3 PA3 53 // BED_THERMISTOR_3 + * PD8 39 // X_STOP PA0 54 // E1_THERMISTOR + * PD9 40 // Y_STOP PA1 55 // E2_THERMISTOR + * PD10 41 // Z_STOP PA2 56 // E3_THERMISTOR + * PD11 42 // U_STOP PC4 57 // E1_FAN + * PD12 71 // E1_PWM PC5 58 // E2_FAN + * PD13 45 // BED_HEAT_2 PE8 59 // E3_FAN + * PD14 46 // BED_HEAT_1 PE13 60 // X_RESET + * PD15 47 // BED_HEAT_3 PE14 61 // X_PWM + * PE0 36 // USER2 PE15 62 // X_DIR + * PE1 9 // STATUS_LED PE10 63 // Y_RESET + * PE2 76 // E3_DIR PB10 64 // Y_PWM + * PE3 75 // E3_RESET PE9 65 // Y_DIR + * PE4 72 // E2_RESET PC15 66 // Z_RESET + * PE5 73 // E2_PWM PC6 67 // Z_PWM + * PE6 74 // E2_DIR PC0 68 // Z_DIR + * PE7 38 // USER_BUTTON PC14 69 // E1_RESET + * PE8 59 // E3_FAN PC13 70 // E1_DIR + * PE9 65 // Y_DIR PD12 71 // E1_PWM + * PE10 63 // Y_RESET PE4 72 // E2_RESET + * PE11 7 // WIFI_RESET PE5 73 // E2_PWM + * PE12 8 // WIFI_BOOT PE6 74 // E2_DIR + * PE13 60 // X_RESET PE3 75 // E3_RESET + * PE14 61 // X_PWM PE2 76 // E3_DIR + * PE15 62 // X_DIR PB8 77 // E3_PWM + */ diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h index 626bdcde76..16973b344f 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h @@ -34,7 +34,7 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #define FLASH_EEPROM_EMULATION #define FLASH_EEPROM_LEVELING @@ -224,7 +224,7 @@ #define DOGLCD_A0 EXP1_04_PIN //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index 7780490799..3daa813952 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -291,7 +291,7 @@ #define LCD_BACKLIGHT_PIN EXP1_07_PIN #endif #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h new file mode 100644 index 0000000000..f63f4adeec --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h @@ -0,0 +1,626 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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 "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 + #error "I3DBEEZ9 supports up to 3 hotends / E-steppers." +#endif + +#define BOARD_INFO_NAME "3DBEE_Z9 V1.0" + +#define USES_DIAG_JUMPERS + +//#define MOTOR_EXPANSION + +#if ALL(HAS_WIRED_LCD, MOTOR_EXPANSION) + #if ANY(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) + #define EXP_MOT_USE_EXP2_ONLY 1 + #else + #error "You can't use both an LCD and a Motor Expansion Module on EXP1/EXP2 at the same time." + #endif +#endif + +// Use one of these or SDCard-based Emulation will be used +#if NO_EEPROM_SELECTED + //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation + #define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation +#endif + +#if ENABLED(FLASH_EEPROM_EMULATION) + // Decrease delays and flash wear by spreading writes across the + // 128 kB sector allocated for EEPROM emulation. + #define FLASH_EEPROM_LEVELING +#endif + +#define HAS_OTG_USB_HOST_SUPPORT // USB Flash Drive support + +// +// Servos +// +#define SERVO0_PIN PA1 +#define SERVO1_PIN PC9 + +// +// Trinamic Stallguard pins +// +#define X_DIAG_PIN PB10 // X- +#define Y_DIAG_PIN PE12 // Y- +#define Z_DIAG_PIN PG8 // Z- +#define E0_DIAG_PIN PE15 // E0 +#define E1_DIAG_PIN PE10 // E1 +#define E2_DIAG_PIN PG5 // E2 +#define E3_DIAG_PIN PD0 // E3 +#define E4_DIAG_PIN PD6 // E4 +#define E5_DIAG_PIN PD1 // E5 + +// +// Limit Switches +// +#ifdef X_STALL_SENSITIVITY + #define X_STOP_PIN X_DIAG_PIN + #if X_HOME_TO_MIN + #define X_MAX_PIN PE15 // E0 + #else + #define X_MIN_PIN PE15 // E0 + #endif +#else + #define X_MIN_PIN PB10 // X- + #define X_MAX_PIN PE15 // E0 +#endif + +#ifdef Y_STALL_SENSITIVITY + #define Y_STOP_PIN Y_DIAG_PIN + #if Y_HOME_TO_MIN + #define Y_MAX_PIN PE10 // E1 + #else + #define Y_MIN_PIN PE10 // E1 + #endif +#else + #define Y_MIN_PIN PE12 // Y- + #define Y_MAX_PIN PE10 // E1 +#endif + +#ifdef Z_STALL_SENSITIVITY + #define Z_STOP_PIN Z_DIAG_PIN + #if Z_HOME_TO_MIN + #define Z_MAX_PIN PG5 // E2 + #else + #define Z_MIN_PIN PG5 // E2 + #endif +#else + #define Z_MIN_PIN PG8 // Z- + #define Z_MAX_PIN PG5 // E2 +#endif + +#ifdef Z2_STALL_SENSITIVITY + #define Z2_STOP_PIN E1_DIAG_PIN + #if Z2_HOME_TO_MIN + #define Z2_MAX_PIN PD0 // E3 + #else + #define Z2_MIN_PIN PD0 // E3 + #endif +#else + #define Z2_MIN_PIN PD0 // Z2- [E3] + #define Z2_MAX_PIN PD6 // E4 +#endif + +// +// Z Probe must be this pin +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PA2 +#endif + +// +// Filament Runout Sensor +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN PE15 +#endif +#ifndef FIL_RUNOUT2_PIN + #define FIL_RUNOUT2_PIN PE10 +#endif +#ifndef FIL_RUNOUT3_PIN + #define FIL_RUNOUT3_PIN PG5 +#endif +#ifndef FIL_RUNOUT4_PIN + #define FIL_RUNOUT4_PIN PD0 +#endif +#ifndef FIL_RUNOUT5_PIN + #define FIL_RUNOUT5_PIN PD6 +#endif +#ifndef FIL_RUNOUT6_PIN + #define FIL_RUNOUT6_PIN PD1 +#endif + +// +// Steppers +// +#define X_STEP_PIN PE9 +#define X_DIR_PIN PF1 +#define X_ENABLE_PIN PF2 +#ifndef X_CS_PIN + #define X_CS_PIN PA15 +#endif + +#define Y_STEP_PIN PE11 +#define Y_DIR_PIN PE1 +#define Y_ENABLE_PIN PD7 +#ifndef Y_CS_PIN + #define Y_CS_PIN PB8 +#endif + +#define Z_STEP_PIN PE13 +#define Z_DIR_PIN PC2 +#define Z_ENABLE_PIN PC0 +#ifndef Z_CS_PIN + #define Z_CS_PIN PB9 +#endif + +#define E0_STEP_PIN PE14 +#define E0_DIR_PIN PA0 +#define E0_ENABLE_PIN PC3 +#ifndef E0_CS_PIN + #define E0_CS_PIN PB3 +#endif + +#define E1_STEP_PIN PD15 +#define E1_DIR_PIN PE7 +#define E1_ENABLE_PIN PA3 +#ifndef E1_CS_PIN + #define E1_CS_PIN PG15 +#endif + +#define E2_STEP_PIN PD13 +#define E2_DIR_PIN PG9 +#define E2_ENABLE_PIN PF0 +#ifndef E2_CS_PIN + #define E2_CS_PIN PG12 +#endif + +#define E3_STEP_PIN PE4 +#define E3_DIR_PIN PE3 +#define E3_ENABLE_PIN PC13 +#ifndef E3_CS_PIN + #define E3_CS_PIN PE2 +#endif + +#define E4_STEP_PIN PG14 +#define E4_DIR_PIN PG13 +#define E4_ENABLE_PIN PE0 +#ifndef E4_CS_PIN + #define E4_CS_PIN PG11 +#endif + +#define E5_STEP_PIN PD4 +#define E5_DIR_PIN PD3 +#define E5_ENABLE_PIN PD5 +#ifndef E5_CS_PIN + #define E5_CS_PIN PD2 +#endif + +// +// SPI pins for TMC2130 stepper drivers +// +#ifndef TMC_SPI_MOSI + #define TMC_SPI_MOSI PC12 +#endif +#ifndef TMC_SPI_MISO + #define TMC_SPI_MISO PC11 +#endif +#ifndef TMC_SPI_SCK + #define TMC_SPI_SCK PC10 +#endif + +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + * + * Hardware serial communication ports. + * If undefined software serial is used according to the pins below + */ + //#define X_HARDWARE_SERIAL Serial1 + //#define X2_HARDWARE_SERIAL Serial1 + //#define Y_HARDWARE_SERIAL Serial1 + //#define Y2_HARDWARE_SERIAL Serial1 + //#define Z_HARDWARE_SERIAL Serial1 + //#define Z2_HARDWARE_SERIAL Serial1 + //#define E0_HARDWARE_SERIAL Serial1 + //#define E1_HARDWARE_SERIAL Serial1 + //#define E2_HARDWARE_SERIAL Serial1 + //#define E3_HARDWARE_SERIAL Serial1 + //#define E4_HARDWARE_SERIAL Serial1 + + #define X_SERIAL_TX_PIN PA15 + #define X_SERIAL_RX_PIN X_SERIAL_TX_PIN + + #define Y_SERIAL_TX_PIN PB8 + #define Y_SERIAL_RX_PIN Y_SERIAL_TX_PIN + + #define Z_SERIAL_TX_PIN PB9 + #define Z_SERIAL_RX_PIN Z_SERIAL_TX_PIN + + #define E0_SERIAL_TX_PIN PB3 + #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN + + #define E1_SERIAL_TX_PIN PG15 + #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN + + #define E2_SERIAL_TX_PIN PG12 + #define E2_SERIAL_RX_PIN E2_SERIAL_TX_PIN + + #define E3_SERIAL_TX_PIN PE2 + #define E3_SERIAL_RX_PIN E3_SERIAL_TX_PIN + + #define E4_SERIAL_TX_PIN PG11 + #define E4_SERIAL_RX_PIN E4_SERIAL_TX_PIN + + #define E5_SERIAL_TX_PIN PD2 + #define E5_SERIAL_RX_PIN E5_SERIAL_TX_PIN + + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + +// +// Temperature Sensors +// Use ADC pins without pullup for sensors that don't need a pullup. +// +#if TEMP_SENSOR_0_IS_AD8495 || TEMP_SENSOR_0 == 20 + #define TEMP_0_PIN PF8 +#else + #define TEMP_0_PIN PF4 // T1 <-> E0 +#endif +#if TEMP_SENSOR_1_IS_AD8495 || TEMP_SENSOR_1 == 20 + #define TEMP_1_PIN PF9 +#else + #define TEMP_1_PIN PF5 // T2 <-> E1 +#endif +#if TEMP_SENSOR_2_IS_AD8495 || TEMP_SENSOR_2 == 20 + #define TEMP_2_PIN PF10 +#else + #define TEMP_2_PIN PF6 // T3 <-> E2 +#endif +#if TEMP_SENSOR_BED_IS_AD8495 || TEMP_SENSOR_BED == 20 + #define TEMP_BED_PIN PF7 +#else + #define TEMP_BED_PIN PF3 // T0 <-> Bed +#endif + +#if TEMP_SENSOR_PROBE && !defined(TEMP_PROBE_PIN) + #if TEMP_SENSOR_PROBE_IS_AD8495 || TEMP_SENSOR_PROBE == 20 + #if HOTENDS == 2 + #define TEMP_PROBE_PIN PF10 + #elif HOTENDS < 2 + #define TEMP_PROBE_PIN PF9 + #endif + #else + #if HOTENDS == 2 + #define TEMP_PROBE_PIN TEMP_2_PIN + #elif HOTENDS < 2 + #define TEMP_PROBE_PIN TEMP_1_PIN + #endif + #endif +#endif + +#if TEMP_SENSOR_CHAMBER && !defined(TEMP_CHAMBER_PIN) + #if TEMP_SENSOR_CHAMBER_IS_AD8495 || TEMP_SENSOR_CHAMBER == 20 + #define TEMP_CHAMBER_PIN PF10 + #else + #define TEMP_CHAMBER_PIN TEMP_2_PIN + #endif +#endif + +// +// Heaters +// +#define HEATER_0_PIN PB1 // Heater0 +#define HEATER_1_PIN PD14 // Heater1 +#if TEMP_SENSOR_CHAMBER && HOTENDS < 3 + #define HEATER_CHAMBER_PIN PB0 // Heater2 +#else + #define HEATER_2_PIN PB0 // Heater2 +#endif +#define HEATER_BED_PIN PD12 // Hotbed + +// +// Fans +// +#define FAN0_PIN PC8 // Fan0 +#define FAN1_PIN PE5 // Fan1 + +#ifndef E0_AUTO_FAN_PIN + #define E0_AUTO_FAN_PIN FAN1_PIN +#endif + +#if !defined(CONTROLLER_FAN_PIN) && ENABLED(USE_CONTROLLER_FAN) && HOTENDS < 2 + #define CONTROLLER_FAN_PIN PE6 // Fan2 +#else + #define FAN2_PIN PE6 // Fan2 +#endif + +// +// Misc. Functions +// + +#ifndef SDCARD_CONNECTION + #define SDCARD_CONNECTION ONBOARD +#endif + +/** ------ ------ + * (BEEPER) PG4 | 1 2 | PA8 (BTN_ENC) (MISO) PB14 | 1 2 | PB13 (SCK) + * (LCD_EN) PD11 | 3 4 | PD10 (LCD_RS) (BTN_EN1) PG10 | 3 4 | PB12 (SD_SS) + * (LCD_D4) PG2 5 6 | PG3 (LCD_D5) (BTN_EN2) PF11 5 6 | PB15 (MOSI) + * (LCD_D6) PG6 | 7 8 | PG7 (LCD_D7) (SD_DETECT) PF12 | 7 8 | RESET + * GND | 9 10 | 5V GND | 9 10 | -- + * ------ ------ + * EXP1 EXP2 + */ +#define EXP1_01_PIN PG4 +#define EXP1_02_PIN PA8 +#define EXP1_03_PIN PD11 +#define EXP1_04_PIN PD10 +#define EXP1_05_PIN PG2 +#define EXP1_06_PIN PG3 +#define EXP1_07_PIN PG6 +#define EXP1_08_PIN PG7 + +#define EXP2_01_PIN PB14 +#define EXP2_02_PIN PB13 +#define EXP2_03_PIN PG10 +#define EXP2_04_PIN PB12 +#define EXP2_05_PIN PF11 +#define EXP2_06_PIN PB15 +#define EXP2_07_PIN PF12 +#define EXP2_08_PIN -1 + +// +// Onboard SD card +// Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2 +// +#if SD_CONNECTION_IS(LCD) + + #define SD_DETECT_PIN EXP2_07_PIN + #define SDSS EXP2_04_PIN + +#elif SD_CONNECTION_IS(ONBOARD) + + // The I3DBEEZ9's ONBOARD SD interface is on SPI1. + // Due to a pull resistor on the clock line, it needs to use SPI Data Mode 3 to + // function with Hardware SPI. This is not currently configurable in the HAL, + // so force Software SPI to work around this issue. + #define SOFTWARE_SPI + #define SDSS PA4 + #define SD_SCK_PIN PA5 + #define SD_MISO_PIN PA6 + #define SD_MOSI_PIN PB5 + #define SD_DETECT_PIN PB11 + +#elif SD_CONNECTION_IS(CUSTOM_CABLE) + #error "CUSTOM_CABLE is not a supported SDCARD_CONNECTION for this board" +#endif + +#if ENABLED(MOTOR_EXPANSION) + /** ----- ----- + * -- | . . | GND -- | . . | GND + * -- | . . | M1EN M2EN | . . | M3EN + * M1STP | . . M1DIR M1RX | . . M1DIAG + * M2DIR | . . | M2STP M2RX | . . | M2DIAG + * M3DIR | . . | M3STP M3RX | . . | M3DIAG + * ----- ----- + * EXP2 EXP1 + * + * NB In EXP_MOT_USE_EXP2_ONLY mode EXP1 is not used and M2EN and M3EN need to be jumpered to M1EN + */ + + // M1 on Driver Expansion Module + #define E6_STEP_PIN EXP2_06_PIN + #define E6_DIR_PIN EXP2_05_PIN + #define E6_ENABLE_PIN EXP2_07_PIN + #if !EXP_MOT_USE_EXP2_ONLY + #define E6_DIAG_PIN EXP1_05_PIN + #define E6_CS_PIN EXP1_06_PIN + #if HAS_TMC_UART + #define E6_SERIAL_TX_PIN EXP1_06_PIN + #define E6_SERIAL_RX_PIN EXP1_06_PIN + #endif + #endif + + // M2 on Driver Expansion Module + #define E7_STEP_PIN EXP2_03_PIN + #define E7_DIR_PIN EXP2_04_PIN + #if !EXP_MOT_USE_EXP2_ONLY + #define E7_ENABLE_PIN EXP1_08_PIN + #define E7_DIAG_PIN EXP1_03_PIN + #define E7_CS_PIN EXP1_04_PIN + #if HAS_TMC_UART + #define E7_SERIAL_TX_PIN EXP1_04_PIN + #define E7_SERIAL_RX_PIN EXP1_04_PIN + #endif + #else + #define E7_ENABLE_PIN EXP2_07_PIN + #endif + + // M3 on Driver Expansion Module + #define E8_STEP_PIN EXP2_01_PIN + #define E8_DIR_PIN EXP2_02_PIN + #if !EXP_MOT_USE_EXP2_ONLY + #define E8_ENABLE_PIN EXP1_07_PIN + #define E8_DIAG_PIN EXP1_01_PIN + #define E8_CS_PIN EXP1_02_PIN + #if HAS_TMC_UART + #define E8_SERIAL_TX_PIN EXP1_02_PIN + #define E8_SERIAL_RX_PIN EXP1_02_PIN + #endif + #else + #define E8_ENABLE_PIN EXP2_07_PIN + #endif + +#endif + +// +// LCDs and Controllers +// +#if IS_TFTGLCD_PANEL + + #if ENABLED(TFTGLCD_PANEL_SPI) + #define TFTGLCD_CS EXP2_03_PIN + #endif + +#elif HAS_WIRED_LCD + + #define BEEPER_PIN EXP1_01_PIN + #define BTN_ENC EXP1_02_PIN + + #if ENABLED(CR10_STOCKDISPLAY) + + #define LCD_PINS_RS EXP1_07_PIN + + #define BTN_EN1 EXP1_03_PIN + #define BTN_EN2 EXP1_05_PIN + + #define LCD_PINS_EN EXP1_08_PIN + #define LCD_PINS_D4 EXP1_06_PIN + + #elif ENABLED(MKS_MINI_12864) + + #define DOGLCD_A0 EXP1_07_PIN + #define DOGLCD_CS EXP1_06_PIN + #define BTN_EN1 EXP2_03_PIN + #define BTN_EN2 EXP2_05_PIN + + #elif ENABLED(WYH_L12864) + + #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING + #error "CAUTION! WYH_L12864 requires wiring modifications. See 'pins_I3DBEEZ9.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" + #endif + + /** + * 1. Cut the tab off the LCD connector so it can be plugged into the "EXP1" connector the other way. + * 2. Swap the LCD's +5V (Pin2) and GND (Pin1) wires. + * + * !!! If you are unsure, ask for help! Your motherboard may be damaged in some circumstances !!! + * + * The WYH_L12864 connector plug: + * + * BEFORE AFTER + * ------ ------ + * -- | 1 2 | MOSI -- | 1 2 | MOSI + * BTN_ENC | 3 4 | SCK BTN_ENC | 3 4 | SCK + * BTN_EN1 | 5 6 SID BTN_EN1 | 5 6 SID + * BTN_EN2 | 7 8 | CS BTN_EN2 | 7 8 | CS + * 5V | 9 10 | GND GND | 9 10 | 5V + * ------ ------ + * LCD LCD + */ + #undef BEEPER_PIN + #undef BTN_ENC + #define BTN_EN1 EXP1_05_PIN + #define BTN_EN2 EXP1_07_PIN + #define BTN_ENC EXP1_03_PIN + #define DOGLCD_CS EXP1_08_PIN + #define DOGLCD_A0 EXP1_06_PIN + #define DOGLCD_SCK EXP1_04_PIN + #define DOGLCD_MOSI EXP1_02_PIN + #define LCD_BACKLIGHT_PIN -1 + + #else + + #define LCD_PINS_RS EXP1_04_PIN + + #define BTN_EN1 EXP2_03_PIN + #define BTN_EN2 EXP2_05_PIN + + #define LCD_PINS_EN EXP1_03_PIN + #define LCD_PINS_D4 EXP1_05_PIN + + #if ENABLED(FYSETC_MINI_12864) + #define DOGLCD_CS EXP1_03_PIN + #define DOGLCD_A0 EXP1_04_PIN + //#define LCD_BACKLIGHT_PIN -1 + #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #ifndef RGB_LED_R_PIN + #define RGB_LED_R_PIN EXP1_06_PIN + #endif + #ifndef RGB_LED_G_PIN + #define RGB_LED_G_PIN EXP1_07_PIN + #endif + #ifndef RGB_LED_B_PIN + #define RGB_LED_B_PIN EXP1_08_PIN + #endif + #elif ENABLED(FYSETC_MINI_12864_2_1) + #define NEOPIXEL_PIN EXP1_06_PIN + #endif + #endif // !FYSETC_MINI_12864 + + #if IS_ULTIPANEL + #define LCD_PINS_D5 EXP1_06_PIN + #define LCD_PINS_D6 EXP1_07_PIN + #define LCD_PINS_D7 EXP1_08_PIN + + #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define BTN_ENC_EN LCD_PINS_D7 // Detect the presence of the encoder + #endif + + #endif + + #endif + +#endif // HAS_WIRED_LCD + +// Alter timing for graphical display +#if IS_U8GLIB_ST7920 + #ifndef BOARD_ST7920_DELAY_1 + #define BOARD_ST7920_DELAY_1 125 + #endif + #ifndef BOARD_ST7920_DELAY_2 + #define BOARD_ST7920_DELAY_2 90 + #endif + #ifndef BOARD_ST7920_DELAY_3 + #define BOARD_ST7920_DELAY_3 600 + #endif +#endif + +#if ENABLED(WIFISUPPORT) + // + // WIFI + // + + /** + * ------ + * RX | 8 7 | 3.3V GPIO0 PF14 ... Leave as unused (ESP3D software configures this with a pullup so OK to leave as floating) + * GPIO0 | 6 5 | Reset GPIO2 PF15 ... must be high (ESP3D software configures this with a pullup so OK to leave as floating) + * GPIO2 | 4 3 | Enable Reset PG0 ... active low, probably OK to leave floating + * GND | 2 1 | TX Enable PG1 ... Must be high for module to run + * ------ + * W1 + */ + #define ESP_WIFI_MODULE_COM 6 // Must also set either SERIAL_PORT or SERIAL_PORT_2 to this + #define ESP_WIFI_MODULE_BAUDRATE BAUDRATE // Must use same BAUDRATE as SERIAL_PORT & SERIAL_PORT_2 + #define ESP_WIFI_MODULE_RESET_PIN PG0 + #define ESP_WIFI_MODULE_ENABLE_PIN PG1 + #define ESP_WIFI_MODULE_GPIO0_PIN PF14 + #define ESP_WIFI_MODULE_GPIO2_PIN PF15 +#endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index 04264ea2e7..da11ce05ef 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -159,8 +159,11 @@ //#define E2_SERIAL_RX_PIN EX_SERIAL_RX_PIN //#define E2_SERIAL_TX_PIN EX_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors diff --git a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_common.h b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_common.h index 33dedf7e8e..05c938037d 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_common.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_common.h @@ -175,8 +175,11 @@ #define E4_SERIAL_RX_PIN E4_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -260,7 +263,7 @@ #endif #endif -#if EITHER(TFT_COLOR_UI, TFT_CLASSIC_UI) +#if ANY(TFT_COLOR_UI, TFT_CLASSIC_UI) #define TFT_CS_PIN EXP1_07_PIN #define TFT_SCK_PIN EXP2_02_PIN #define TFT_MISO_PIN EXP2_01_PIN diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h index 15314c9ca6..96f3d95861 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h @@ -99,3 +99,39 @@ #define SD_DETECT_PIN PF9 #define BEEPER_PIN PG2 + +// +// TFT with FSMC interface +// +#if HAS_FSMC_TFT + /** + * Note: MKS Robin TFT screens use various TFT controllers. + * If the screen stays white, disable 'LCD_RESET_PIN' + * to let the bootloader init the screen. + */ + #define LCD_RESET_PIN PD13 + #define LCD_BACKLIGHT_PIN PD12 + + #define TFT_RESET_PIN LCD_RESET_PIN + #define TFT_BACKLIGHT_PIN LCD_BACKLIGHT_PIN + + #define FSMC_CS_PIN PG12 // NE4 + #define FSMC_RS_PIN PF12 // A0 + #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT + #define TFT_CS_PIN FSMC_CS_PIN + #define TFT_RS_PIN FSMC_RS_PIN + + #define TFT_BUFFER_SIZE 14400 + + #define BEEPER_PIN PG2 + + #if NEED_TOUCH_PINS + #define TOUCH_BUTTONS_HW_SPI + #define TOUCH_BUTTONS_HW_SPI_DEVICE 1 + #define TOUCH_CS_PIN PD11 // SPI1_NSS + #define TOUCH_SCK_PIN PB3 // SPI1_SCK + #define TOUCH_MISO_PIN PB4 // SPI1_MISO + #define TOUCH_MOSI_PIN PB5 // SPI1_MOSI + #endif + +#endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h index 3cba69a7b3..a0a711647b 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h @@ -40,6 +40,4 @@ //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation #endif -#define LED_PIN PB1 - #include "../stm32f1/pins_MKS_ROBIN_NANO_common.h" diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h index 3b1c773b29..cdb9f5edec 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3_common.h @@ -33,7 +33,7 @@ // Use one of these or SDCard-based Emulation will be used //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 // 4K #define I2C_SCL_PIN PB6 @@ -108,8 +108,11 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -210,8 +213,8 @@ // // Onboard SD card +// Detect pin doesn't work when ONBOARD and NO_SD_HOST_DRIVE disabled // -// detect pin doesn't work when ONBOARD and NO_SD_HOST_DRIVE disabled #if SD_CONNECTION_IS(ONBOARD) #define ENABLE_SPI3 #define SD_SS_PIN -1 @@ -224,13 +227,12 @@ #define SPI_FLASH #if ENABLED(SPI_FLASH) - #define SPI_FLASH - #define SPI_DEVICE 2 - #define SPI_FLASH_SIZE 0x1000000 + #define SPI_DEVICE 2 // Maple + #define SPI_FLASH_SIZE 0x1000000 // 16MB #define SPI_FLASH_CS_PIN PB12 - #define SPI_FLASH_MOSI_PIN PC3 - #define SPI_FLASH_MISO_PIN PC2 #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PC2 + #define SPI_FLASH_MOSI_PIN PC3 #endif /** 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 7d537c9643..60fe6fa66d 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -160,7 +160,10 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + #endif // HAS_TMC_UART // @@ -268,19 +271,19 @@ #endif */ -// -// LCD / Controller #define SPI_FLASH -#define SPI_FLASH -#define SPI_DEVICE 2 -#define SPI_FLASH_SIZE 0x1000000 #if ENABLED(SPI_FLASH) + #define SPI_DEVICE 2 // Maple + #define SPI_FLASH_SIZE 0x1000000 // 16MB #define SPI_FLASH_CS_PIN PB12 - #define SPI_FLASH_MOSI_PIN PB15 - #define SPI_FLASH_MISO_PIN PB14 #define SPI_FLASH_SCK_PIN PB13 + #define SPI_FLASH_MISO_PIN PB14 + #define SPI_FLASH_MOSI_PIN PB15 #endif +// +// LCD / Controller +// #if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) #ifndef TOUCH_CALIBRATION_X #define TOUCH_CALIBRATION_X -17253 diff --git a/Marlin/src/pins/stm32f4/pins_MKS_SKIPR_V1_0.h b/Marlin/src/pins/stm32f4/pins_MKS_SKIPR_V1_0.h index c4a7cd886f..f7b9fb4674 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_SKIPR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_SKIPR_V1_0.h @@ -53,29 +53,12 @@ #define E1_DIAG_PIN PC5 // NEOPIXEL #define E2_DIAG_PIN PB14 // Z+ -// -// Check for additional used endstop pins -// -#if HAS_EXTRA_ENDSTOPS - #define _ENDSTOP_IS_ANY(ES) X2_USE_ENDSTOP == ES || Y2_USE_ENDSTOP == ES || Z2_USE_ENDSTOP == ES || Z3_USE_ENDSTOP == ES || Z4_USE_ENDSTOP == ES - #if _ENDSTOP_IS_ANY(_XMIN_) || _ENDSTOP_IS_ANY(_XMAX_) - #define NEEDS_X_MINMAX - #endif - #if _ENDSTOP_IS_ANY(_YMIN_) || _ENDSTOP_IS_ANY(_YMAX_) - #define NEEDS_Y_MINMAX - #endif - #if _ENDSTOP_IS_ANY(_ZMIN_) || _ENDSTOP_IS_ANY(_ZMAX_) - #define NEEDS_Z_MINMAX - #endif - #undef _ENDSTOP_IS_ANY -#endif - // // Limit Switches // #ifdef X_STALL_SENSITIVITY #define X_STOP_PIN X_DIAG_PIN // X- -#elif EITHER(DUAL_X_CARRIAGE, NEEDS_X_MINMAX) +#elif NEEDS_X_MINMAX #ifndef X_MIN_PIN #define X_MIN_PIN X_DIAG_PIN // X- #endif @@ -88,7 +71,7 @@ #ifdef Y_STALL_SENSITIVITY #define Y_STOP_PIN Y_DIAG_PIN // Y- -#elif ENABLED(NEEDS_Y_MINMAX) +#elif NEEDS_Y_MINMAX #ifndef Y_MIN_PIN #define Y_MIN_PIN Y_DIAG_PIN // Y- #endif @@ -101,7 +84,7 @@ #ifdef Z_STALL_SENSITIVITY #define Z_STOP_PIN Z_DIAG_PIN // Z- -#elif ENABLED(NEEDS_Z_MINMAX) +#elif NEEDS_Z_MINMAX #ifndef Z_MIN_PIN #define Z_MIN_PIN Z_DIAG_PIN // Z- #endif @@ -113,7 +96,7 @@ #endif #if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) || ENABLED(USE_PROBE_FOR_Z_HOMING) - #ifndef Z_MIN_PROBE + #ifndef Z_MIN_PROBE_PIN #define Z_MIN_PROBE_PIN E2_DIAG_PIN // defaults to 'Z+' connector #endif #endif @@ -228,8 +211,11 @@ #define E3_SERIAL_RX_PIN E3_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART /** ------ ------ * (BEEPER) PB2 | 1 2 | PE10 (BTN_ENC) (MISO) PA6 | 1 2 | PA5 (SCK) @@ -325,7 +311,7 @@ #define DOGLCD_A0 EXP1_04_PIN //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV3.h b/Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV3.h index eb6edb765e..5802c07241 100644 --- a/Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV3.h +++ b/Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV3.h @@ -144,9 +144,11 @@ #define K_SERIAL_RX_PIN K_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif -#endif +#endif // HAS_TMC_UART // // Heaters / Fans diff --git a/Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV4.h b/Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV4.h index b44061a491..1697cf000e 100644 --- a/Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV4.h +++ b/Marlin/src/pins/stm32f4/pins_OPULO_LUMEN_REV4.h @@ -141,9 +141,11 @@ #define K_SERIAL_RX_PIN K_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif -#endif +#endif // HAS_TMC_UART // // Heaters / Fans diff --git a/Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_V2.h b/Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_V2.h index b74db89f3a..6149000598 100644 --- a/Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_V2.h +++ b/Marlin/src/pins/stm32f4/pins_TH3D_EZBOARD_V2.h @@ -61,7 +61,7 @@ // // Limit Switches // -#if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) +#if ANY(SENSORLESS_HOMING, SENSORLESS_PROBING) // Sensorless homing pins #if ENABLED(X_AXIS_SENSORLESS_HOMING) #define X_STOP_PIN PB4 @@ -132,9 +132,6 @@ #define E0_SERIAL_TX_PIN PC10 #define E0_SERIAL_RX_PIN PC11 - // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 - // Default TMC slave addresses #ifndef X_SLAVE_ADDRESS #define X_SLAVE_ADDRESS 0 @@ -148,7 +145,13 @@ #ifndef E0_SLAVE_ADDRESS #define E0_SLAVE_ADDRESS 3 #endif -#endif + + // Reduce baud rate to improve software serial reliability + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temp Sensors @@ -266,7 +269,7 @@ #endif -#if EITHER(CR10_STOCKDISPLAY, MKS_MINI_12864) +#if ANY(CR10_STOCKDISPLAY, MKS_MINI_12864) #define BTN_EN1 EXP1_03_PIN #define BTN_EN2 EXP1_05_PIN #define BTN_ENC EXP1_02_PIN diff --git a/Marlin/src/pins/stm32f4/pins_TRONXY_V10.h b/Marlin/src/pins/stm32f4/pins_TRONXY_V10.h index 1677b45697..dbf8ddc5d5 100644 --- a/Marlin/src/pins/stm32f4/pins_TRONXY_V10.h +++ b/Marlin/src/pins/stm32f4/pins_TRONXY_V10.h @@ -73,9 +73,9 @@ #if ENABLED(SPI_FLASH) #define SPI_FLASH_SIZE 0x200000 // 2MB #define SPI_FLASH_CS_PIN PG15 // SPI2 - #define SPI_FLASH_MOSI_PIN PB5 - #define SPI_FLASH_MISO_PIN PB4 #define SPI_FLASH_SCK_PIN PB3 + #define SPI_FLASH_MISO_PIN PB4 + #define SPI_FLASH_MOSI_PIN PB5 #endif // @@ -255,10 +255,3 @@ #define SD_DETECT_PIN -1 // PF0, but not connected #define SDIO_CLOCK 4500000 #define SDIO_READ_RETRIES 16 - -#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 diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h deleted file mode 100644 index e4150f3bd2..0000000000 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ /dev/null @@ -1,226 +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 . - * - */ -#pragma once - -#define ALLOW_STM32DUINO -#include "env_validate.h" - -#if HOTENDS > 2 || E_STEPPERS > 2 - #error "STM32F4 VAkE supports up to 2 hotends / E steppers." -#endif - -#define DEFAULT_MACHINE_NAME "STM32F446VET6" -#define BOARD_INFO_NAME "STM32F4 VAkE" - -//#define I2C_EEPROM -#define MARLIN_EEPROM_SIZE 0x1000 // 4K - -// -// Servos -// -//#define SERVO0_PIN PE13 -//#define SERVO1_PIN PE14 - -// -// Limit Switches -// -#define X_STOP_PIN PE10 -#define Y_STOP_PIN PE9 -#define Z_STOP_PIN PE8 - -// -// Z Probe (when not Z_MIN_PIN) -// -#ifndef Z_MIN_PROBE_PIN - #define Z_MIN_PROBE_PIN PA4 -#endif - -// -// Filament runout -// -#define FIL_RUNOUT_PIN PA3 - -// -// Steppers -// - -#define STEPPER_ENABLE_PIN PB2 - -#define X_STEP_PIN PC6 // X_STEP -#define X_DIR_PIN PC7 // X_DIR -#define X_ENABLE_PIN PB2 // -#ifndef X_CS_PIN - #define X_CS_PIN PC8 // X_CS -#endif - -#define Y_STEP_PIN PD9 // Y_STEP -#define Y_DIR_PIN PD10 // Y_DIR -#define Y_ENABLE_PIN PB2 // -#ifndef Y_CS_PIN - #define Y_CS_PIN PD11 // Y_CS -#endif - -#define Z_STEP_PIN PE15 // Z_STEP -#define Z_DIR_PIN PB10 // Z_DIR -#define Z_ENABLE_PIN PB2 -#ifndef Z_CS_PIN - #define Z_CS_PIN PD8 -#endif - -#define E0_STEP_PIN PB1 -#define E0_DIR_PIN PB13 -#define E0_ENABLE_PIN PB2 -#ifndef E0_CS_PIN - #define E0_CS_PIN PE11 -#endif - -#define E1_STEP_PIN PC4 -#define E1_DIR_PIN PC5 -#define E1_ENABLE_PIN PB2 -#ifndef E1_CS_PIN - #define E1_CS_PIN PB0 -#endif - -#define SD_SCK_PIN PE12 // PA5 // SPI1 for SD card -#define SD_MISO_PIN PE13 // PA6 -#define SD_MOSI_PIN PE14 // PA7 - -// added for SD card : optional or not ??? -//#define SD_CHIP_SELECT_PIN SDSS // The default chip select pin for the SD card is SS. -// The following three pins must not be redefined for hardware SPI. -//#define SPI_MOSI_PIN SD_MOSI_PIN // SPI Master Out Slave In pin -//#define SPI_MISO_PIN SD_MISO_PIN // SPI Master In Slave Out pin -//#define SPI_SCK_PIN SD_SCK_PIN // SPI Clock pin - -// -// Temperature Sensors (Analog inputs) -// - -#define TEMP_0_PIN PC0 // Analog Input -#define TEMP_1_PIN PC1 // Analog Input -#define TEMP_2_PIN PC2 // Analog Input -#define TEMP_3_PIN PC3 // Analog Input -#define TEMP_BED_PIN PC3 // Analog Input - -// -// Heaters / Fans -// - -#define HEATER_0_PIN PD15 -#define HEATER_1_PIN PD14 -#define HEATER_BED_PIN PD12 - -#ifndef FAN0_PIN - #define FAN0_PIN PD13 -#endif -#define FAN1_PIN PB5 // PA0 -#define FAN2_PIN PB4 // PA1 - -#ifndef E0_AUTO_FAN_PIN - #define E0_AUTO_FAN_PIN PD13 -#endif - -// -// Misc. Functions -// - -//#define CASE_LIGHT_PIN_CI PF13 -//#define CASE_LIGHT_PIN_DO PF14 -//#define NEOPIXEL_PIN PF13 - -// -// Průša i3 MK2 Multi Material Multiplexer Support -// -#if HAS_PRUSA_MMU1 - //#define E_MUX0_PIN PG3 - //#define E_MUX1_PIN PG4 -#endif - -#define LED_PIN PB14 // Alive -#define PS_ON_PIN PE0 -#define KILL_PIN PD5 -#define POWER_LOSS_PIN PA4 // ?? Power loss / nAC_FAULT - -#if HAS_MEDIA - #define SD_DETECT_PIN EXP2_07_PIN - #define SD_SS_PIN PB15 // USD_CS -> CS for onboard SD -#endif - -/** - * ------ ------ - * PC9 | 1 2 | PB12 ? | 1 2 | ? - * PD7 | 3 4 | PC12 PD6 | 3 4 | ? - * PD1 | 5 6 PD2 PD0 | 5 6 ? - * PD3 | 7 8 | PD4 PB7 | 7 8 | RESET - * GND | 9 10 | 5V GND | 9 10 | 3.3V - * ------ ------ - * EXP1 EXP2 - */ -#define EXP1_01_PIN PC9 -#define EXP1_02_PIN PB12 -#define EXP1_03_PIN PD7 -#define EXP1_04_PIN PC12 -#define EXP1_05_PIN PD1 -#define EXP1_06_PIN PD2 -#define EXP1_07_PIN PD3 -#define EXP1_08_PIN PD4 - -//#define EXP2_01_PIN ? -//#define EXP2_02_PIN ? -#define EXP2_03_PIN PD6 -//#define EXP2_04_PIN ? -#define EXP2_05_PIN PD0 -//#define EXP2_06_PIN ? -#define EXP2_07_PIN PB7 -#define EXP2_08_PIN -1 - -// -// LCD / Controller -// -#if HAS_WIRED_LCD - - #if HAS_MEDIA - #define SDSS PB6 // CS for SD card in LCD - #endif - - #define BEEPER_PIN EXP1_01_PIN - - #define BTN_EN1 EXP2_03_PIN - #define BTN_EN2 EXP2_05_PIN - #define BTN_ENC EXP1_02_PIN - - #define LCD_PINS_EN EXP1_03_PIN - #define LCD_PINS_RS EXP1_04_PIN - - #define LCD_PINS_D4 EXP1_05_PIN - #define LCD_PINS_D5 EXP1_06_PIN - #define LCD_PINS_D6 EXP1_07_PIN - #define LCD_PINS_D7 EXP1_08_PIN - -#endif - -// Alter timing for graphical display -#if IS_U8GLIB_ST7920 - #define BOARD_ST7920_DELAY_1 96 - #define BOARD_ST7920_DELAY_2 48 - #define BOARD_ST7920_DELAY_3 715 -#endif diff --git a/Marlin/src/pins/stm32g0/pins_BTT_EBB42_V1_1.h b/Marlin/src/pins/stm32g0/pins_BTT_EBB42_V1_1.h index c79f8ab084..6c31fdc572 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_EBB42_V1_1.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_EBB42_V1_1.h @@ -38,7 +38,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #undef NO_EEPROM_SELECTED #ifndef FLASH_EEPROM_EMULATION #define FLASH_EEPROM_EMULATION @@ -80,17 +80,6 @@ // // Steppers // -#define X_ENABLE_PIN -1 -#define X_STEP_PIN PA10 // Unused. Assigned so Marlin will compile -#define X_DIR_PIN -1 - -#define Y_ENABLE_PIN -1 -#define Y_STEP_PIN PA10 // Unused. Assigned so Marlin will compile -#define Y_DIR_PIN -1 - -#define Z_ENABLE_PIN -1 -#define Z_STEP_PIN PA10 // Unused. Assigned so Marlin will compile -#define Z_DIR_PIN -1 #define E0_ENABLE_PIN PD2 #define E0_STEP_PIN PD0 @@ -110,7 +99,9 @@ #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif // Default TMC slave addresses #ifndef E0_SLAVE_ADDRESS @@ -134,7 +125,8 @@ // // Heaters / Fans // -#define HEATER_0_PIN PA2 // "HE" +#define HEATER_0_PIN PA2 // "HE" V1.1 +#define HEATER_1_PIN PB13 // "HE" V1.2 #define FAN0_PIN PA0 // "FAN0" #define FAN1_PIN PA1 // "FAN1" diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_E3_EZ_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_E3_EZ_V1_0.h index e2e276f89a..fdcdd36ae8 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_E3_EZ_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_E3_EZ_V1_0.h @@ -35,7 +35,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #undef NO_EEPROM_SELECTED #ifndef FLASH_EEPROM_EMULATION #define FLASH_EEPROM_EMULATION @@ -172,8 +172,11 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -235,21 +238,36 @@ #define EXP1_10_PIN -1 #if HAS_DWIN_E3V2 || IS_DWIN_MARLINUI + /** + * ------ ------ --- + * (PC1) BEEP | 1 2 | | 1 2 | | 1 | (5V) + * | 3 4 | RX | 3 4 | TX | 2 | (GND) + * (PC0) ENT 5 6 | ENT 5 6 | BEEP | 3 | RX (PD8) + * (PA2) B | 7 8 | A (PA1) B | 7 8 | A | 4 | TX (PD9) + * GND | 9 10 | 5V GND | 9 10 | VCC | 5 | (RST) + * ------ ------ --- + * EXP1 DWIN TFT + * + * DWIN pins are labeled as printed on DWIN PCB. GND, VCC, A, B, ENT & BEEP can be connected in the same orientation as the + * existing plug/DWIN to EXP1. DWIN TX/RX need to be connected to the Manta E3 EZ's TFT port, with DWIN TX->PD9, DWIN RX->PD8. + * + * Needs custom cable: + * + * Board Adapter Display + * ------------------------------------------ + * (EXP1-1) PC1 <-----------> BEEP (DWIN-6) + * (EXP1-5) PC0 <-----------> ENT (DWIN-5) + * (TFT-4) PD9 <-----------> RX (DWIN-3) + * (TFT-3) PD8 <-----------> TX (DWIN-4) + * (EXP1-7) PA2 <-----------> B (DWIN-7) + * (EXP1-9) GND <-----------> GND (DWIN-9) + * (EXP1-8) PA1 <-----------> A (DWIN-8) + * (EXP1-10) 5V <-----------> VCC (DWIN-10) + */ #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING #error "CAUTION! Ender-3 V2 display requires a custom cable with TX = PA0, RX = PC2. See 'pins_BTT_MANTA_E3_EZ_V1_0.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" #endif - /** - * Ender-3 V2 display Manta E3 EZ V1.0 Ender-3 V2 display --> Manta E3 EZ V1.0 - * ------ ------ RX 3 --> 5 P0_15 - * -- | 1 2 | -- (BEEPER) PC1 | 1 2 | PC2 (BTN_ENC) TX 4 --> 9 P0_16 - * (MANTA TX1) RX | 3 4 | TX (MANTA RX1) (BTN_EN1) PC3 | 3 4 | RESET BEEPER 6 --> 10 P2_08 - * (BTN_ENC) ENT 5 6 | BEEPER (BTN_EN2) PC0 5 6 | PA0 (LCD_D4) - * (BTN_E2) B | 7 8 | A (BTN_E1) (LCD_RS) PA2 | 7 8 | PA1 (LCD_EN) - * GND | 9 10 | 5V GND | 9 10 | 5V - * ------ ------ - */ - #define BEEPER_PIN EXP1_01_PIN #define BTN_EN1 EXP1_08_PIN #define BTN_EN2 EXP1_07_PIN @@ -283,7 +301,7 @@ #define LCD_PINS_D7 EXP1_01_PIN #define ADC_KEYPAD_PIN PA7 // Repurpose default SERVO0_PIN for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #elif ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define BTN_EN1 EXP1_03_PIN #define BTN_EN2 EXP1_05_PIN @@ -307,14 +325,13 @@ // // SD Support // - #ifndef SDCARD_CONNECTION #define SDCARD_CONNECTION ONBOARD #endif #define SD_DETECT_PIN -1 -#if SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) +#if SD_CONNECTION_IS(LCD) && (ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) #define SD_SS_PIN EXP1_05_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) #error "SD CUSTOM_CABLE is not compatible with Manta E3 EZ." diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V1_0.h index 8f3cc618e7..33b957f53a 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V1_0.h @@ -37,7 +37,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #undef NO_EEPROM_SELECTED #ifndef FLASH_EEPROM_EMULATION #define FLASH_EEPROM_EMULATION @@ -138,8 +138,11 @@ #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -256,7 +259,7 @@ // results in LCD soft SPI mode 3, SD soft SPI mode 0 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h index fd926c014f..286a59a00b 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h @@ -35,7 +35,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #undef NO_EEPROM_SELECTED #ifndef FLASH_EEPROM_EMULATION #define FLASH_EEPROM_EMULATION @@ -158,8 +158,11 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -284,7 +287,7 @@ // results in LCD soft SPI mode 3, SD soft SPI mode 0 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_V1_0.h index 4f8d30b6b7..824e44130f 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_V1_0.h @@ -64,8 +64,11 @@ #define E3_SERIAL_RX_PIN E3_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // NeoPixel LED diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_V1_1.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_V1_1.h index a21bb59e69..d7c15eaa04 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_V1_1.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_V1_1.h @@ -63,8 +63,11 @@ #define E3_SERIAL_RX_PIN E3_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // NeoPixel LED diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_common.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_common.h index bd9a1cf0b5..d4a21ba2f2 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_common.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_common.h @@ -33,7 +33,7 @@ // // EEPROM // -#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) +#if ANY(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION) #undef NO_EEPROM_SELECTED #ifndef FLASH_EEPROM_EMULATION #define FLASH_EEPROM_EMULATION @@ -75,20 +75,6 @@ //#define Z_MIN_PROBE_PIN PF6 // IND-PROBE (with adjustable voltage & pullup set via jumpers) #endif -// -// Check for additional used endstop pins -// -#if HAS_EXTRA_ENDSTOPS - #define _ENDSTOP_IS_ANY(ES) X2_USE_ENDSTOP == ES || Y2_USE_ENDSTOP == ES || Z2_USE_ENDSTOP == ES || Z3_USE_ENDSTOP == ES || Z4_USE_ENDSTOP == ES - #if _ENDSTOP_IS_ANY(_XMIN_) || _ENDSTOP_IS_ANY(_XMAX_) - #define NEEDS_X_MINMAX - #endif - #if _ENDSTOP_IS_ANY(_YMIN_) || _ENDSTOP_IS_ANY(_YMAX_) - #define NEEDS_Y_MINMAX - #endif - #undef _ENDSTOP_IS_ANY -#endif - // // Limit Switches // @@ -99,7 +85,7 @@ #else #define X_MIN_PIN E0_DIAG_PIN // MIN5 #endif -#elif EITHER(DUAL_X_CARRIAGE, NEEDS_X_MINMAX) +#elif NEEDS_X_MINMAX #ifndef X_MIN_PIN #define X_MIN_PIN X_DIAG_PIN // MIN1 #endif @@ -117,7 +103,7 @@ #else #define Y_MIN_PIN E1_DIAG_PIN // MIN6 #endif -#elif ENABLED(NEEDS_Y_MINMAX) +#elif NEEDS_Y_MINMAX #ifndef Y_MIN_PIN #define Y_MIN_PIN Y_DIAG_PIN // MIN2 #endif @@ -208,8 +194,11 @@ #define E0_SERIAL_RX_PIN E0_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors @@ -348,7 +337,7 @@ // results in LCD soft SPI mode 3, SD soft SPI mode 0 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h b/Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h index 0f7da52572..ef6a22b88f 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h @@ -37,7 +37,7 @@ #define LED_PIN PD8 // Onboard I2C EEPROM -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #undef NO_EEPROM_SELECTED #define I2C_EEPROM #define SOFT_I2C_EEPROM // Force the use of Software I2C @@ -255,7 +255,7 @@ #define LCD_PINS_D7 EXP1_01_PIN #define ADC_KEYPAD_PIN PA1 // Repurpose servo pin for ADC - CONNECTING TO 5V WILL DAMAGE THE BOARD! - #elif EITHER(MKS_MINI_12864, ENDER2_STOCKDISPLAY) + #elif ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY) #define BTN_ENC EXP1_02_PIN #define BTN_EN1 EXP1_03_PIN @@ -363,7 +363,7 @@ #endif // HAS_WIRED_LCD -#if BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) +#if ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) #ifndef NO_CONTROLLER_CUSTOM_WIRING_WARNING #error "CAUTION! LCD_FYSETC_TFT81050 requires wiring modifications. See 'pins_BTT_SKR_MINI_E3_common.h' for details. (Define NO_CONTROLLER_CUSTOM_WIRING_WARNING to suppress this warning.)" @@ -416,7 +416,7 @@ #if SD_CONNECTION_IS(ONBOARD) #define SD_DETECT_PIN PC3 -#elif SD_CONNECTION_IS(LCD) && (BOTH(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) +#elif SD_CONNECTION_IS(LCD) && (ALL(TOUCH_UI_FTDI_EVE, LCD_FYSETC_TFT81050) || IS_TFTGLCD_PANEL) #define SD_DETECT_PIN EXP1_01_PIN #define SD_SS_PIN EXP1_05_PIN #elif SD_CONNECTION_IS(CUSTOM_CABLE) diff --git a/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h b/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h index e8e984fcb7..ee92372b5a 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h @@ -28,7 +28,7 @@ #define USES_DIAG_JUMPERS // Onboard I2C EEPROM -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #undef NO_EEPROM_SELECTED #define I2C_EEPROM #define SOFT_I2C_EEPROM // Force the use of Software I2C @@ -68,23 +68,6 @@ #define Z_MIN_PROBE_PIN PB15 #endif -// -// Check for additional used endstop pins -// -#if HAS_EXTRA_ENDSTOPS - #define _ENDSTOP_IS_ANY(ES) X2_USE_ENDSTOP == ES || Y2_USE_ENDSTOP == ES || Z2_USE_ENDSTOP == ES || Z3_USE_ENDSTOP == ES || Z4_USE_ENDSTOP == ES - #if _ENDSTOP_IS_ANY(_XMIN_) || _ENDSTOP_IS_ANY(_XMAX_) - #define NEEDS_X_MINMAX - #endif - #if _ENDSTOP_IS_ANY(_YMIN_) || _ENDSTOP_IS_ANY(_YMAX_) - #define NEEDS_Y_MINMAX - #endif - #if _ENDSTOP_IS_ANY(_ZMIN_) || _ENDSTOP_IS_ANY(_ZMAX_) - #define NEEDS_Z_MINMAX - #endif - #undef _ENDSTOP_IS_ANY -#endif - // // Limit Switches // @@ -95,7 +78,7 @@ #else #define X_MIN_PIN E0_DIAG_PIN // E0DET #endif -#elif EITHER(DUAL_X_CARRIAGE, NEEDS_X_MINMAX) +#elif NEEDS_X_MINMAX #ifndef X_MIN_PIN #define X_MIN_PIN X_DIAG_PIN // X-STOP #endif @@ -113,7 +96,7 @@ #else #define Y_MIN_PIN E1_DIAG_PIN // E1DET #endif -#elif ENABLED(NEEDS_Y_MINMAX) +#elif NEEDS_Y_MINMAX #ifndef Y_MIN_PIN #define Y_MIN_PIN Y_DIAG_PIN // Y-STOP #endif @@ -131,7 +114,7 @@ #else #define Z_MIN_PIN E2_DIAG_PIN // PWRDET #endif -#elif ENABLED(NEEDS_Z_MINMAX) +#elif NEEDS_Z_MINMAX #ifndef Z_MIN_PIN #define Z_MIN_PIN Z_DIAG_PIN // Z-STOP #endif @@ -335,8 +318,11 @@ #define E5_SERIAL_RX_PIN E3_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART /** * ---- @@ -454,7 +440,7 @@ // results in LCD soft SPI mode 3, SD soft SPI mode 0 //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h index 7f5f5269d1..caa2272f4d 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h @@ -141,8 +141,11 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // Temperature Sensors diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h index 09b305f700..d6a7358f3e 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h @@ -27,8 +27,8 @@ // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT //#define BTT_MOTOR_EXPANSION -#if BOTH(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) - #if EITHER(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) +#if ALL(HAS_WIRED_LCD, BTT_MOTOR_EXPANSION) + #if ANY(CR10_STOCKDISPLAY, ENDER2_STOCKDISPLAY) #define EXP_MOT_USE_EXP2_ONLY 1 #else #error "You can't use both an LCD and a Motor Expansion Module on EXP1/EXP2 at the same time." @@ -38,7 +38,7 @@ #define USES_DIAG_JUMPERS // Onboard I2C EEPROM -#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) +#if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #undef NO_EEPROM_SELECTED #define I2C_EEPROM #define SOFT_I2C_EEPROM // Force the use of Software I2C @@ -119,6 +119,7 @@ #define Z_STOP_PIN PC0 // Z-STOP #endif #endif +#define ONBOARD_ENDSTOPPULLUPS // Board has built-in pullups // // Z Probe (when not Z_MIN_PIN) @@ -310,8 +311,11 @@ #define E1_SERIAL_RX_PIN E1_SERIAL_TX_PIN // Reduce baud rate to improve software serial reliability - #define TMC_BAUD_RATE 19200 -#endif + #ifndef TMC_BAUD_RATE + #define TMC_BAUD_RATE 19200 + #endif + +#endif // HAS_TMC_UART // // SD Connection @@ -470,7 +474,7 @@ #define DOGLCD_A0 EXP1_04_PIN //#define LCD_BACKLIGHT_PIN -1 #define LCD_RESET_PIN EXP1_05_PIN // Must be high or open for LCD to operate normally. - #if EITHER(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) + #if ANY(FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0) #ifndef RGB_LED_R_PIN #define RGB_LED_R_PIN EXP1_06_PIN #endif diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index 124faa7691..c1eee00c2d 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -139,7 +139,7 @@ #define LCD_PINS_D6 5 // D5 JP11-6 #define LCD_PINS_D7 4 // D4 JP11-5 - #if EITHER(VIKI2, miniVIKI) + #if ANY(VIKI2, miniVIKI) #define BEEPER_PIN 8 // E0 JP11-10 #define DOGLCD_A0 40 // F2 JP2-2 diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index b208b08826..62922399d8 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -220,7 +220,7 @@ #define LCD_PINS_D6 5 // D5 JP11-6 #define LCD_PINS_D7 4 // D4 JP11-5 - #if EITHER(VIKI2, miniVIKI) + #if ANY(VIKI2, miniVIKI) #define BEEPER_PIN 8 // E0 JP11-10 #define DOGLCD_A0 40 // F2 JP2-2 diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h index c1809eed6b..28b0aebe42 100644 --- a/Marlin/src/pins/teensy2/pins_SAV_MKI.h +++ b/Marlin/src/pins/teensy2/pins_SAV_MKI.h @@ -163,7 +163,7 @@ #define SR_CLK_PIN EXT_AUX_SCL_D0 #endif -#if EITHER(SAV_3DLCD, SAV_3DGLCD) +#if ANY(SAV_3DLCD, SAV_3DGLCD) #define BTN_EN1 EXT_AUX_A1_IO #define BTN_EN2 EXT_AUX_A0_IO diff --git a/Marlin/src/pins/teensy2/pins_TEENSY2.h b/Marlin/src/pins/teensy2/pins_TEENSY2.h index 2b65f17bc5..9c8c6ce628 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSY2.h +++ b/Marlin/src/pins/teensy2/pins_TEENSY2.h @@ -182,6 +182,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_ENA_PIN 5 // D5 Pin should have a pullup! -#define SPINDLE_LASER_PWM_PIN 0 // D0 PWM0B MUST BE HARDWARE PWM -#define SPINDLE_DIR_PIN 7 // D7 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 0 // D0 PWM0B MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENA_PIN 5 // D5 Pin should have a pullup! + #define SPINDLE_DIR_PIN 7 // D7 +#endif diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index 81bb56349f..deeffe9038 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -167,6 +167,8 @@ // // M3/M4/M5 - Spindle/Laser Control // -#define SPINDLE_LASER_PWM_PIN 24 // B4 IO-3 PWM2A - MUST BE HARDWARE PWM -#define SPINDLE_LASER_ENA_PIN 39 // F1 IO-11 - Pin should have a pullup! -#define SPINDLE_DIR_PIN 40 // F2 IO-9 +#if HAS_CUTTER + #define SPINDLE_LASER_PWM_PIN 24 // B4 IO-3 PWM2A - MUST BE HARDWARE PWM + #define SPINDLE_LASER_ENA_PIN 39 // F1 IO-11 - Pin should have a pullup! + #define SPINDLE_DIR_PIN 40 // F2 IO-9 +#endif diff --git a/Marlin/src/pins/teensy4/env_validate.h b/Marlin/src/pins/teensy4/env_validate.h new file mode 100644 index 0000000000..5a89e8a409 --- /dev/null +++ b/Marlin/src/pins/teensy4/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2023 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(IS_TEENSY41) + #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" +#endif diff --git a/Marlin/src/pins/teensy4/pins_T41U5XBB.h b/Marlin/src/pins/teensy4/pins_T41U5XBB.h index 5f62bb05a6..2ee4f2970e 100644 --- a/Marlin/src/pins/teensy4/pins_T41U5XBB.h +++ b/Marlin/src/pins/teensy4/pins_T41U5XBB.h @@ -27,9 +27,7 @@ * https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ -#if NOT_TARGET(IS_TEENSY41) - #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Teensy4.1" diff --git a/Marlin/src/pins/teensy4/pins_TEENSY41.h b/Marlin/src/pins/teensy4/pins_TEENSY41.h index 263d9e8f8b..2a8a76f17c 100644 --- a/Marlin/src/pins/teensy4/pins_TEENSY41.h +++ b/Marlin/src/pins/teensy4/pins_TEENSY41.h @@ -27,9 +27,7 @@ * https://www.pjrc.com/teensy/teensyduino.html ****************************************************************************************/ -#if NOT_TARGET(IS_TEENSY41) - #error "Oops! Select 'Teensy 4.1' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Teensy4.1" diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index 81cc032304..7deebd4776 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -74,7 +74,7 @@ #else static uint8_t CRC7(const uint8_t *data, uint8_t n) { uint8_t crc = 0; - LOOP_L_N(i, n) { + for (uint8_t i = 0; i < n; ++i) { uint8_t d = data[i]; d ^= crc << 1; if (d & 0x80) d ^= 9; @@ -111,7 +111,7 @@ uint8_t DiskIODriver_SPI_SD::cardCommand(const uint8_t cmd, const uint32_t arg) d[5] = CRC7(d, 5); // Send message - LOOP_L_N(k, 6) spiSend(d[k]); + for (uint8_t k = 0; k < 6; ++k) spiSend(d[k]); #else // Send command @@ -268,7 +268,7 @@ bool DiskIODriver_SPI_SD::init(const uint8_t sckRateID, const pin_t chipSelectPi spiInit(spiRate_); // Must supply min of 74 clock cycles with CS high. - LOOP_L_N(i, 10) spiSend(0xFF); + for (uint8_t i = 0; i < 10; ++i) spiSend(0xFF); hal.watchdog_refresh(); // In case init takes too long @@ -294,7 +294,7 @@ bool DiskIODriver_SPI_SD::init(const uint8_t sckRateID, const pin_t chipSelectPi } // Get the last byte of r7 response - LOOP_L_N(i, 4) status_ = spiRec(); + for (uint8_t i = 0; i < 4; ++i) status_ = spiRec(); if (status_ == 0xAA) { type(SD_CARD_TYPE_SD2); break; @@ -325,7 +325,7 @@ bool DiskIODriver_SPI_SD::init(const uint8_t sckRateID, const pin_t chipSelectPi } if ((spiRec() & 0xC0) == 0xC0) type(SD_CARD_TYPE_SDHC); // Discard rest of ocr - contains allowed voltage range - LOOP_L_N(i, 3) spiRec(); + for (uint8_t i = 0; i < 3; ++i) spiRec(); } chipDeselect(); diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index 23677b24fa..49569af512 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -70,7 +70,7 @@ typedef enum : uint8_t { SD_CARD_ERROR_WRITE_PROGRAMMING = 0x16, // Card returned an error to a CMD13 status check after a write SD_CARD_ERROR_WRITE_TIMEOUT = 0x17, // Timeout occurred during write programming SD_CARD_ERROR_SCK_RATE = 0x18, // Incorrect rate selected - SD_CARD_ERROR_INIT_NOT_CALLED = 0x19, // Init() not called + SD_CARD_ERROR_INIT_NOT_CALLED = 0x19, // init() not called // 0x1A is unused now, it was: card returned an error for CMD59 (CRC_ON_OFF) SD_CARD_ERROR_READ_CRC = 0x1B // Invalid read CRC } sd_error_code_t; @@ -83,7 +83,7 @@ uint8_t const SD_CARD_TYPE_SD1 = 1, // Standard capacity V1 SD card /** * Define SOFTWARE_SPI to use bit-bang SPI */ -#if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) +#if ANY(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) #define SOFTWARE_SPI #endif diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index cf403d4b3a..46312bca82 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -209,7 +209,7 @@ bool SdBaseFile::dirEntry(dir_t *dir) { */ void SdBaseFile::dirName(const dir_t &dir, char *name) { uint8_t j = 0; - LOOP_L_N(i, 11) { + for (uint8_t i = 0; i < 11; ++i) { if (dir.name[i] == ' ')continue; if (i == 8) name[j++] = '.'; name[j++] = dir.name[i]; @@ -322,12 +322,12 @@ void SdBaseFile::getpos(filepos_t * const pos) { * \param[in] indent Amount of space before file name. Used for recursive * list to indicate subdirectory level. */ -void SdBaseFile::ls(uint8_t flags, uint8_t indent) { +void SdBaseFile::ls(const uint8_t flags/*=0*/, const uint8_t indent/*=0*/) { rewind(); int8_t status; while ((status = lsPrintNext(flags, indent))) { if (status > 1 && (flags & LS_R)) { - uint16_t index = curPosition() / 32 - 1; + const uint16_t index = curPosition() / 32 - 1; SdBaseFile s; if (s.open(this, index, O_READ)) s.ls(flags, indent + 2); seekSet(32 * (index + 1)); @@ -350,10 +350,10 @@ int8_t SdBaseFile::lsPrintNext(const uint8_t flags, const uint8_t indent) { && DIR_IS_FILE_OR_SUBDIR(&dir)) break; } // indent for dir level - LOOP_L_N(i, indent) SERIAL_CHAR(' '); + for (uint8_t i = 0; i < indent; ++i) SERIAL_CHAR(' '); // print name - LOOP_L_N(i, 11) { + for (uint8_t i = 0; i < 11; ++i) { if (dir.name[i] == ' ')continue; if (i == 8) { SERIAL_CHAR('.'); @@ -504,7 +504,7 @@ bool SdBaseFile::mkdir(SdBaseFile * const parent, const uint8_t dname[11] dir_t d; memcpy(&d, p, sizeof(d)); d.name[0] = '.'; - LOOP_S_L_N(i, 1, 11) d.name[i] = ' '; + for (uint8_t i = 1; i < 11; ++i) d.name[i] = ' '; // cache block for '.' and '..' uint32_t block = vol_->clusterStartBlock(firstCluster_); @@ -771,7 +771,7 @@ bool SdBaseFile::open(SdBaseFile * const dirFile, const uint8_t dname[11] if (!dirFile->seekSet(32 * index)) return false; // Dir entries write loop: [LFN] + SFN(1) - LOOP_L_N(dirWriteIdx, reqEntriesNum) { + for (uint8_t dirWriteIdx = 0; dirWriteIdx < reqEntriesNum; ++dirWriteIdx) { index = (dirFile->curPosition_ / 32) & 0xF; p = dirFile->readDirCache(); // LFN or SFN Entry? @@ -1137,7 +1137,7 @@ bool SdBaseFile::openNext(SdBaseFile *dirFile, const uint8_t oflag) { */ void SdBaseFile::getLFNName(vfat_t *pFatDir, char *lname, const uint8_t sequenceNumber) { const uint8_t startOffset = (sequenceNumber - 1) * FILENAME_LENGTH; - LOOP_L_N(i, FILENAME_LENGTH) { + for (uint8_t i = 0; i < FILENAME_LENGTH; ++i) { const uint16_t utf16_ch = (i >= 11) ? pFatDir->name3[i - 11] : (i >= 5) ? pFatDir->name2[i - 5] : pFatDir->name1[i]; #if ENABLED(UTF_FILENAME_SUPPORT) // We can't reconvert to UTF-8 here as UTF-8 is variable-size encoding, but joining LFN blocks @@ -1158,7 +1158,7 @@ bool SdBaseFile::openNext(SdBaseFile *dirFile, const uint8_t oflag) { void SdBaseFile::setLFNName(vfat_t *pFatDir, char *lname, const uint8_t sequenceNumber) { const uint8_t startOffset = (sequenceNumber - 1) * FILENAME_LENGTH, nameLength = strlen(lname); - LOOP_L_N(i, FILENAME_LENGTH) { + for (uint8_t i = 0; i < FILENAME_LENGTH; ++i) { uint16_t ch = 0; if ((startOffset + i) < nameLength) ch = lname[startOffset + i]; @@ -1479,7 +1479,7 @@ int8_t SdBaseFile::readDir(dir_t * const dir, char * const longFilename) { n = (seq - 1) * (FILENAME_LENGTH); - LOOP_L_N(i, FILENAME_LENGTH) { + for (uint8_t i = 0; i < FILENAME_LENGTH; ++i) { const uint16_t utf16_ch = (i >= 11) ? VFAT->name3[i - 11] : (i >= 5) ? VFAT->name2[i - 5] : VFAT->name1[i]; #if ENABLED(UTF_FILENAME_SUPPORT) // We can't reconvert to UTF-8 here as UTF-8 is variable-size encoding, but joining LFN blocks @@ -1627,7 +1627,7 @@ bool SdBaseFile::remove() { // Check if the entry has a LFN bool lastEntry = false; // loop back to search for any LFN entries related to this file - LOOP_S_LE_N(sequenceNumber, 1, VFAT_ENTRIES_LIMIT) { + for (uint8_t sequenceNumber = 1; sequenceNumber <= VFAT_ENTRIES_LIMIT; ++sequenceNumber) { dirIndex_ = (dirIndex_ - 1) & 0xF; if (dirBlock_ == 0) break; if (dirIndex_ == 0xF) dirBlock_--; diff --git a/Marlin/src/sd/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h index 3ac23138b1..b806a3cd70 100644 --- a/Marlin/src/sd/SdBaseFile.h +++ b/Marlin/src/sd/SdBaseFile.h @@ -283,7 +283,7 @@ class SdBaseFile { bool isRoot() const { return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32; } bool getDosName(char * const name); - void ls(uint8_t flags=0, uint8_t indent=0); + void ls(const uint8_t flags=0, const uint8_t indent=0); bool mkdir(SdBaseFile *parent, const char *path, const bool pFlag=true); bool open(SdBaseFile * const dirFile, uint16_t index, const uint8_t oflag); diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 4e864e5672..e09bc5265a 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -56,7 +56,11 @@ #include "../feature/pause.h" #endif -#define DEBUG_OUT EITHER(DEBUG_CARDREADER, MARLIN_DEV_MODE) +#if ENABLED(ONE_CLICK_PRINT) + #include "../../src/lcd/menu/menu.h" +#endif + +#define DEBUG_OUT ANY(DEBUG_CARDREADER, MARLIN_DEV_MODE) #include "../core/debug_out.h" #include "../libs/hex_print.h" @@ -172,7 +176,7 @@ CardReader::CardReader() { workDirDepth = 0; ZERO(workDirParents); - #if BOTH(HAS_MEDIA, HAS_SD_DETECT) + #if ALL(HAS_MEDIA, HAS_SD_DETECT) SET_INPUT_PULLUP(SD_DETECT_PIN); #endif @@ -186,7 +190,7 @@ CardReader::CardReader() { // char *createFilename(char * const buffer, const dir_t &p) { char *pos = buffer; - LOOP_L_N(i, 11) { + for (uint8_t i = 0; i < 11; ++i) { if (p.name[i] == ' ') continue; if (i == 8) *pos++ = '.'; *pos++ = p.name[i]; @@ -290,7 +294,7 @@ void CardReader::printListing(MediaFile parent, const char * const prepend, cons while (parent.readDir(&p, longFilename) > 0) { if (DIR_IS_SUBDIR(&p)) { - size_t lenPrepend = prepend ? strlen(prepend) + 1 : 0; + const size_t lenPrepend = prepend ? strlen(prepend) + 1 : 0; // Allocate enough stack space for the full path including / separator char path[lenPrepend + FILENAME_LENGTH]; if (prepend) { strcpy(path, prepend); path[lenPrepend - 1] = '/'; } @@ -349,7 +353,7 @@ void CardReader::printListing(MediaFile parent, const char * const prepend, cons // // List all files on the SD card // -void CardReader::ls(const uint8_t lsflags) { +void CardReader::ls(const uint8_t lsflags/*=0*/) { if (flag.mounted) { root.rewind(); printListing(root, nullptr, lsflags); @@ -495,7 +499,7 @@ void CardReader::mount() { if (flag.mounted) cdroot(); else { - #if EITHER(HAS_SD_DETECT, USB_FLASH_DRIVE_SUPPORT) + #if ANY(HAS_SD_DETECT, USB_FLASH_DRIVE_SUPPORT) if (marlin_state != MF_INITIALIZING) LCD_ALERTMESSAGE(MSG_MEDIA_INIT_FAIL); #endif } @@ -545,20 +549,28 @@ void CardReader::manage_media() { if (!stat) return; // Exit if no media is present - if (old_stat != 2) return; // First mount? - - DEBUG_ECHOLNPGM("First mount."); - - // Load settings the first time media is inserted (not just during init) - TERN_(SDCARD_EEPROM_EMULATION, settings.first_load()); - bool do_auto = true; UNUSED(do_auto); - // Check for PLR file. - TERN_(POWER_LOSS_RECOVERY, if (recovery.check()) do_auto = false); + // First mount on boot? Load emulated EEPROM and look for PLR file. + if (old_stat == 2) { + DEBUG_ECHOLNPGM("First mount."); - // Look for auto0.g on the next idle() - IF_DISABLED(NO_SD_AUTOSTART, if (do_auto) autofile_begin()); + // Load settings the first time media is inserted (not just during init) + TERN_(SDCARD_EEPROM_EMULATION, settings.first_load()); + + // Check for PLR file. Skip One-Click and auto#.g if found + TERN_(POWER_LOSS_RECOVERY, if (recovery.check()) do_auto = false); + } + + // Find the newest file and prompt to print it. + TERN_(ONE_CLICK_PRINT, if (do_auto && one_click_check()) do_auto = false); + + // Also for the first mount run auto#.g for machine init. + // (Skip if PLR or One-Click Print was invoked.) + if (old_stat == 2) { + // Look for auto0.g on the next idle() + IF_DISABLED(NO_SD_AUTOSTART, if (do_auto) autofile_begin()); + } } /** @@ -609,7 +621,7 @@ void CardReader::startOrResumeFilePrinting() { // void CardReader::endFilePrintNow(TERN_(SD_RESORT, const bool re_sort/*=false*/)) { TERN_(ADVANCED_PAUSE_FEATURE, did_pause_print = 0); - TERN_(DWIN_CREALITY_LCD, HMI_flag.print_finish = flag.sdprinting); + TERN_(DWIN_CREALITY_LCD, hmiFlag.print_finish = flag.sdprinting); flag.abort_sd_printing = false; if (isFileOpen()) file.close(); TERN_(SD_RESORT, if (re_sort) presort()); @@ -638,7 +650,7 @@ void CardReader::getAbsFilenameInCWD(char *dst) { if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; } }; - LOOP_L_N(i, workDirDepth) // Loop down to current work dir + for (uint8_t i = 0; i < workDirDepth; ++i) // Loop down to current work dir appendAtom(workDirParents[i]); if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH) - 1) { // Leave room for filename and nul @@ -656,9 +668,7 @@ void announceOpen(const uint8_t doing, const char * const path) { if (doing) { PORT_REDIRECT(SerialMask::All); SERIAL_ECHO_START(); - SERIAL_ECHOPGM("Now "); - SERIAL_ECHOF(doing == 1 ? F("doing") : F("fresh")); - SERIAL_ECHOLNPGM(" file: ", path); + SERIAL_ECHOLN(F("Now "), doing == 1 ? F("doing") : F("fresh"), F(" file: "), path); } } @@ -887,6 +897,81 @@ void CardReader::write_command(char * const buf) { } #endif +#if ENABLED(ONE_CLICK_PRINT) + + /** + * Select the newest file and ask the user if they want to print it. + */ + bool CardReader::one_click_check() { + const bool found = selectNewestFile(); + if (found) { + //SERIAL_ECHO_MSG(" OCP File: ", longest_filename(), "\n"); + //ui.init(); + one_click_print(); + } + return found; + } + + /** + * Recurse the entire directory to find the newest file. + * This may take a very long time so watch out for watchdog reset. + * It may be best to only look at root for reasonable boot and mount times. + */ + void CardReader::diveToNewestFile(MediaFile parent, uint32_t &compareDateTime, MediaFile &outdir, char * const outname) { + // Iterate the given parent dir + parent.rewind(); + for (dir_t p; parent.readDir(&p, longFilename) > 0;) { + + // If the item is a dir, recurse into it + if (DIR_IS_SUBDIR(&p)) { + // Get the name of the dir for opening + char dirname[FILENAME_LENGTH]; + createFilename(dirname, p); + + // Open the item in a new MediaFile + MediaFile child; // child.close() in destructor + if (child.open(&parent, dirname, O_READ)) + diveToNewestFile(child, compareDateTime, outdir, outname); + } + else if (is_visible_entity(p)) { + // Get the newer of the modified/created date and time + const uint32_t modDateTime = uint32_t(p.lastWriteDate) << 16 | p.lastWriteTime, + createDateTime = uint32_t(p.creationDate) << 16 | p.creationTime, + newerDateTime = _MAX(modDateTime, createDateTime); + // If a newer item is found overwrite the outdir and outname + if (newerDateTime > compareDateTime) { + compareDateTime = newerDateTime; + outdir = parent; + createFilename(outname, p); + } + } + } + } + + /** + * Recurse the entire directory to find the newest file. + * Make the found file the current selection. + */ + bool CardReader::selectNewestFile() { + uint32_t dateTimeStorage = 0; + MediaFile foundDir; + char foundName[FILENAME_LENGTH]; + foundName[0] = '\0'; + + diveToNewestFile(root, dateTimeStorage, foundDir, foundName); + + if (foundName[0]) { + workDir = foundDir; + workDir.rewind(); + selectByName(workDir, foundName); + //workDir.close(); // Not needed? + return true; + } + return false; + } + +#endif // ONE_CLICK_PRINT + void CardReader::closefile(const bool store_location/*=false*/) { file.sync(); file.close(); @@ -1268,7 +1353,7 @@ void CardReader::cdroot() { } else { sort_order[0] = 0; - #if BOTH(SDSORT_USES_RAM, SDSORT_CACHE_NAMES) + #if ALL(SDSORT_USES_RAM, SDSORT_CACHE_NAMES) #if ENABLED(SDSORT_DYNAMIC_RAM) sortnames = new char*[1]; sortshort = new char*[1]; @@ -1290,7 +1375,7 @@ void CardReader::cdroot() { #if ENABLED(SDSORT_DYNAMIC_RAM) delete [] sort_order; #if ENABLED(SDSORT_CACHE_NAMES) - LOOP_L_N(i, sort_count) { + for (uint8_t i = 0; i < sort_count; ++i) { free(sortshort[i]); // strdup free(sortnames[i]); // strdup } @@ -1360,8 +1445,7 @@ void CardReader::fileHasFinished() { recovery.init(); removeFile(recovery.filename); #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) - SERIAL_ECHOPGM("Power-loss file delete"); - SERIAL_ECHOF(jobRecoverFileExists() ? F(" failed.\n") : F("d.\n")); + SERIAL_ECHOLN(F("Power-loss file delete"), jobRecoverFileExists() ? F(" failed.") : F("d.")); #endif } } diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 3b7b7debcf..80e317ebcf 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -128,6 +128,12 @@ public: static void autofile_cancel() { autofile_index = 0; } #endif + #if ENABLED(ONE_CLICK_PRINT) + static bool one_click_check(); // Check for the newest file and prompt to run it. + static void diveToNewestFile(MediaFile parent, uint32_t &compareDateTime, MediaFile &outdir, char * const outname); + static bool selectNewestFile(); + #endif + // Basic file ops static void openFileRead(const char * const path, const uint8_t subcall=0); static void openFileWrite(const char * const path); @@ -203,7 +209,7 @@ public: } #endif - static void ls(const uint8_t lsflags); + static void ls(const uint8_t lsflags=0); #if ENABLED(POWER_LOSS_RECOVERY) static bool jobRecoverFileExists(); @@ -278,7 +284,7 @@ private: static uint8_t sort_order[SDSORT_LIMIT]; #endif - #if BOTH(SDSORT_USES_RAM, SDSORT_CACHE_NAMES) && DISABLED(SDSORT_DYNAMIC_RAM) + #if ALL(SDSORT_USES_RAM, SDSORT_CACHE_NAMES) && DISABLED(SDSORT_DYNAMIC_RAM) #define SORTED_LONGNAME_MAXLEN (SDSORT_CACHE_VFATS) * (FILENAME_LENGTH) #define SORTED_LONGNAME_STORAGE (SORTED_LONGNAME_MAXLEN + 1) #else diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index b5968b7021..76d69c789e 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -84,10 +84,10 @@ #elif ENABLED(USE_OTG_USB_HOST) #if HAS_SD_HOST_DRIVE - #include HAL_PATH(../../HAL, msc_sd.h) + #include HAL_PATH(../.., msc_sd.h) #endif - #include HAL_PATH(../../HAL, usb_host.h) + #include HAL_PATH(../.., usb_host.h) #define UHS_START usb.start() #define rREVISION 0 diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index 3390bc51be..f722c873ae 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -33,7 +33,7 @@ /** * Define SOFTWARE_SPI to use bit-bang SPI */ - #if EITHER(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) + #if ANY(MEGA_SOFT_SPI, USE_SOFTWARE_SPI) #define SOFTWARE_SPI #endif diff --git a/buildroot/bin/build_example b/buildroot/bin/build_example index 34549769bb..a8878e8d9f 100755 --- a/buildroot/bin/build_example +++ b/buildroot/bin/build_example @@ -32,6 +32,9 @@ $SED -i~ -e "20,30{/#error/d}" Marlin/Configuration.h rm Marlin/Configuration.h~ unset IFS; set +f +# Suppress fatal warnings +echo -e "\n#define NO_CONTROLLER_CUSTOM_WIRING_WARNING" >> Marlin/Configuration.h + echo "Building the firmware now..." $HERE/mftest -s -a -n1 || { echo "Failed"; exit 1; } diff --git a/buildroot/share/PlatformIO/boards/marlin_CREALITY_STM32F401RC.json b/buildroot/share/PlatformIO/boards/marlin_CREALITY_STM32F401RE.json similarity index 85% rename from buildroot/share/PlatformIO/boards/marlin_CREALITY_STM32F401RC.json rename to buildroot/share/PlatformIO/boards/marlin_CREALITY_STM32F401RE.json index 82f49fa815..31739c3a38 100644 --- a/buildroot/share/PlatformIO/boards/marlin_CREALITY_STM32F401RC.json +++ b/buildroot/share/PlatformIO/boards/marlin_CREALITY_STM32F401RE.json @@ -15,11 +15,11 @@ ] ], "ldscript": "ldscript.ld", - "mcu": "stm32f401rct6", - "variant": "MARLIN_CREALITY_STM32F401RC" + "mcu": "stm32f401ret6", + "variant": "MARLIN_CREALITY_STM32F401RE" }, "debug": { - "jlink_device": "STM32F401RC", + "jlink_device": "STM32F401RE", "openocd_target": "stm32f4x", "svd_path": "STM32F40x.svd", "tools": { @@ -45,11 +45,11 @@ "arduino", "stm32cube" ], - "name": "STM32F401RC (64k RAM. 256k Flash)", + "name": "STM32F401RE (64k RAM. 512k Flash)", "upload": { "disable_flushing": false, "maximum_ram_size": 65536, - "maximum_size": 262144, + "maximum_size": 514288, "protocol": "stlink", "protocols": [ "stlink", @@ -60,6 +60,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f401rc.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f401re.html", "vendor": "Generic" } diff --git a/buildroot/share/PlatformIO/boards/marlin_I3DBEEZ9.json b/buildroot/share/PlatformIO/boards/marlin_I3DBEEZ9.json new file mode 100644 index 0000000000..0f0927d28e --- /dev/null +++ b/buildroot/share/PlatformIO/boards/marlin_I3DBEEZ9.json @@ -0,0 +1,46 @@ +{ + "build": { + "core": "stm32", + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F4 -DSTM32F407xx -DSTM32F40_41xxx", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "mcu": "stm32f407zgt6", + "variant": "MARLIN_I3DBEEZ9" + }, + "debug": { + "jlink_device": "STM32F407ZG", + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd" + }, + "frameworks": [ + "arduino" + ], + "name": "STM32F407ZG (192k RAM. 1024k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 196608, + "maximum_size": 1048576, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink" + ], + "offset_address": "0x8008000", + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32f407zg.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/boards/marlin_MKS_ROBIN2.json b/buildroot/share/PlatformIO/boards/marlin_MKS_ROBIN2.json new file mode 100644 index 0000000000..325001df1b --- /dev/null +++ b/buildroot/share/PlatformIO/boards/marlin_MKS_ROBIN2.json @@ -0,0 +1,65 @@ +{ + "build": { + "cpu": "cortex-m4", + "extra_flags": "-DSTM32F407xx", + "f_cpu": "168000000L", + "hwids": [ + [ + "0x1EAF", + "0x0003" + ], + [ + "0x0483", + "0x3748" + ] + ], + "ldscript": "ldscript.ld", + "mcu": "stm32f407zet6", + "variant": "MARLIN_MKS_ROBIN2" + }, + "debug": { + "jlink_device": "STM32F407ZE", + "openocd_target": "stm32f4x", + "svd_path": "STM32F40x.svd", + "tools": { + "stlink": { + "server": { + "arguments": [ + "-f", + "scripts/interface/stlink.cfg", + "-c", + "transport select hla_swd", + "-f", + "scripts/target/stm32f4x.cfg", + "-c", + "reset_config none" + ], + "executable": "bin/openocd", + "package": "tool-openocd" + } + } + } + }, + "frameworks": [ + "arduino", + "stm32cube" + ], + "name": "STM32F407ZE (192k RAM. 512k Flash)", + "upload": { + "disable_flushing": false, + "maximum_ram_size": 131072, + "maximum_size": 514288, + "protocol": "stlink", + "protocols": [ + "stlink", + "dfu", + "jlink", + "cmsis-dap" + ], + "require_upload_port": true, + "use_1200bps_touch": false, + "wait_for_upload_port": false + }, + "url": "http://www.st.com/en/microcontrollers/stm32f407ze.html", + "vendor": "Generic" +} diff --git a/buildroot/share/PlatformIO/boards/marlin_STM32H723Vx.json b/buildroot/share/PlatformIO/boards/marlin_STM32H723VG.json similarity index 86% rename from buildroot/share/PlatformIO/boards/marlin_STM32H723Vx.json rename to buildroot/share/PlatformIO/boards/marlin_STM32H723VG.json index a2154d448a..44a37e94ec 100644 --- a/buildroot/share/PlatformIO/boards/marlin_STM32H723Vx.json +++ b/buildroot/share/PlatformIO/boards/marlin_STM32H723VG.json @@ -4,16 +4,16 @@ "cpu": "cortex-m7", "extra_flags": "-DSTM32H7xx -DSTM32H723xx", "f_cpu": "550000000L", - "mcu": "stm32h723vet6", + "mcu": "stm32h723vgt6", "product_line": "STM32H723xx", - "variant": "MARLIN_H723Vx" + "variant": "MARLIN_H723VG" }, "connectivity": [ "can", "ethernet" ], "debug": { - "jlink_device": "STM32H723VE", + "jlink_device": "STM32H723VG", "openocd_target": "stm32h7x", "svd_path": "STM32H7x3.svd", "tools": { @@ -39,11 +39,11 @@ "arduino", "stm32cube" ], - "name": "STM32H723VE (564k RAM. 512k Flash)", + "name": "STM32H723VG (564k RAM. 1024k Flash)", "upload": { "disable_flushing": false, "maximum_ram_size": 577536, - "maximum_size": 524288, + "maximum_size": 1048576, "protocol": "stlink", "protocols": [ "stlink", @@ -56,6 +56,6 @@ "use_1200bps_touch": false, "wait_for_upload_port": false }, - "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32h723ze.html", + "url": "https://www.st.com/en/microcontrollers-microprocessors/stm32h723vg.html", "vendor": "ST" } diff --git a/buildroot/share/PlatformIO/boards/marlin_STM32H723Zx.json b/buildroot/share/PlatformIO/boards/marlin_STM32H723ZE.json similarity index 97% rename from buildroot/share/PlatformIO/boards/marlin_STM32H723Zx.json rename to buildroot/share/PlatformIO/boards/marlin_STM32H723ZE.json index 8525793c4e..f4bb75b5da 100644 --- a/buildroot/share/PlatformIO/boards/marlin_STM32H723Zx.json +++ b/buildroot/share/PlatformIO/boards/marlin_STM32H723ZE.json @@ -6,7 +6,7 @@ "f_cpu": "550000000L", "mcu": "stm32h723zet6", "product_line": "STM32H723xx", - "variant": "MARLIN_H723Zx" + "variant": "MARLIN_H723ZE" }, "connectivity": [ "can", diff --git a/buildroot/share/PlatformIO/boards/marlin_STM32H743Vx.json b/buildroot/share/PlatformIO/boards/marlin_STM32H743VI.json similarity index 97% rename from buildroot/share/PlatformIO/boards/marlin_STM32H743Vx.json rename to buildroot/share/PlatformIO/boards/marlin_STM32H743VI.json index 4ec34e5b35..56e853cad4 100644 --- a/buildroot/share/PlatformIO/boards/marlin_STM32H743Vx.json +++ b/buildroot/share/PlatformIO/boards/marlin_STM32H743VI.json @@ -6,7 +6,7 @@ "f_cpu": "480000000L", "mcu": "stm32h743vit6", "product_line": "STM32H743xx", - "variant": "MARLIN_H743Vx" + "variant": "MARLIN_H743VI" }, "connectivity": [ "can", diff --git a/buildroot/share/PlatformIO/ldscripts/creality.ld b/buildroot/share/PlatformIO/ldscripts/creality.ld index 785345543c..8b330c9457 100644 --- a/buildroot/share/PlatformIO/ldscripts/creality.ld +++ b/buildroot/share/PlatformIO/ldscripts/creality.ld @@ -1,7 +1,7 @@ MEMORY { ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K - 40 - rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 28K + rom (rx) : ORIGIN = 0x08007000, LENGTH = 512K - 64K } /* Provide memory region aliases for common.inc */ diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index 9bdcac5db1..b37a377df9 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -33,7 +33,7 @@ // #if ENABLED(SR_LCD_3W_NL) // Feature checks for SR_LCD_3W_NL -#elif EITHER(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) +#elif ANY(LCD_I2C_TYPE_MCP23017, LCD_I2C_TYPE_MCP23008) #define USES_LIQUIDTWI2 #elif ENABLED(LCD_I2C_TYPE_PCA8574) #define USES_LIQUIDCRYSTAL_I2C @@ -59,10 +59,10 @@ #if ENABLED(CANCEL_OBJECTS) #define HAS_MENU_CANCELOBJECT #endif - #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) + #if ANY(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) #define HAS_MENU_DELTA_CALIBRATE #endif - #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_MENU) + #if ANY(LED_CONTROL_MENU, CASE_LIGHT_MENU) #define HAS_MENU_LED #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) @@ -104,4 +104,20 @@ #if ENABLED(AUTO_BED_LEVELING_UBL) #define HAS_MENU_UBL #endif + #if ENABLED(ONE_CLICK_PRINT) + #define HAS_MENU_ONE_CLICK_PRINT + #endif +#endif + +#if HAS_GRAPHICAL_TFT + #define NOTOSANS 1 + #define UNIFONT 2 + #define HELVETICA 3 + #if TFT_FONT == NOTOSANS + #define TFT_FONT_NOTOSANS + #elif TFT_FONT == UNIFONT + #define TFT_FONT_UNIFONT + #elif TFT_FONT == HELVETICA + #define TFT_FONT_HELVETICA + #endif #endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 6b5a9aea57..e90ba24dd3 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -5,7 +5,9 @@ import pioutil if pioutil.is_pio_build(): - import subprocess,os,re + import subprocess,os,re,fnmatch,glob + srcfilepattern = re.compile(r".*[.](cpp|c)$") + marlinbasedir = os.path.join(os.getcwd(), "Marlin/") Import("env") from platformio.package.meta import PackageSpec @@ -53,14 +55,15 @@ if pioutil.is_pio_build(): # Get a reference to the FEATURE_CONFIG under construction feat = FEATURE_CONFIG[feature] - # Split up passed lines on commas or newlines and iterate - # Add common options to the features config under construction - # For lib_deps replace a previous instance of the same library - atoms = re.sub(r',\s*', '\n', flines).strip().split('\n') + # Split up passed lines on commas or newlines and iterate. + # Take care to convert Windows '\' paths to Unix-style '/'. + # Add common options to the features config under construction. + # For lib_deps replace a previous instance of the same library. + atoms = re.sub(r',\s*', '\n', flines.replace('\\', '/')).strip().split('\n') for line in atoms: parts = line.split('=') name = parts.pop(0) - if name in ['build_flags', 'extra_scripts', 'src_filter', 'lib_ignore']: + if name in ['build_flags', 'extra_scripts', 'build_src_filter', 'lib_ignore']: feat[name] = '='.join(parts) blab("[%s] %s=%s" % (feature, name, feat[name]), 3) else: @@ -128,6 +131,7 @@ if pioutil.is_pio_build(): def apply_features_config(): load_features() blab("========== Apply enabled features...") + build_filters = ' '.join(env.GetProjectOption('build_src_filter')) for feature in FEATURE_CONFIG: if not env.MarlinHas(feature): continue @@ -172,25 +176,89 @@ if pioutil.is_pio_build(): blab("Running extra_scripts for %s... " % feature, 2) env.SConscript(feat['extra_scripts'], exports="env") - if 'src_filter' in feat: + if 'build_src_filter' in feat: blab("========== Adding build_src_filter for %s... " % feature, 2) - src_filter = ' '.join(env.GetProjectOption('src_filter')) - # first we need to remove the references to the same folder - my_srcs = re.findall(r'[+-](<.*?>)', feat['src_filter']) - cur_srcs = re.findall(r'[+-](<.*?>)', src_filter) - for d in my_srcs: - if d in cur_srcs: - src_filter = re.sub(r'[+-]' + d, '', src_filter) - - src_filter = feat['src_filter'] + ' ' + src_filter - set_env_field('build_src_filter', [src_filter]) - env.Replace(SRC_FILTER=src_filter) + build_filters = build_filters + ' ' + feat['build_src_filter'] + # Just append the filter in the order that the build environment specifies. + # Important here is the order of entries in the "features.ini" file. if 'lib_ignore' in feat: blab("========== Adding lib_ignore for %s... " % feature, 2) lib_ignore = env.GetProjectOption('lib_ignore') + [feat['lib_ignore']] set_env_field('lib_ignore', lib_ignore) + build_src_filter = "" + if True: + # Build the actual equivalent build_src_filter list based on the inclusions by the features. + # PlatformIO doesn't do it this way, but maybe in the future.... + cur_srcs = set() + # Remove the references to the same folder + my_srcs = re.findall(r'([+-]<.*?>)', build_filters) + for d in my_srcs: + # Assume normalized relative paths + plain = d[2:-1] + if d[0] == '+': + def addentry(fullpath, info=None): + relp = os.path.relpath(fullpath, marlinbasedir) + if srcfilepattern.match(relp): + if info: + blab("Added src file %s (%s)" % (relp, str(info))) + else: + blab("Added src file %s " % relp) + cur_srcs.add(relp) + # Special rule: If a direct folder is specified add all files within. + fullplain = os.path.join(marlinbasedir, plain) + if os.path.isdir(fullplain): + blab("Directory content addition for %s " % plain) + gpattern = os.path.join(fullplain, "**") + for fname in glob.glob(gpattern, recursive=True): + addentry(fname, "dca") + else: + # Add all the things from the pattern by GLOB. + def srepl(matchi): + g0 = matchi.group(0) + return r"**" + g0[1:] + gpattern = re.sub(r'[*]($|[^*])', srepl, plain) + gpattern = os.path.join(marlinbasedir, gpattern) + + for fname in glob.glob(gpattern, recursive=True): + addentry(fname) + else: + # Special rule: If a direct folder is specified then remove all files within. + def onremove(relp, info=None): + if info: + blab("Removed src file %s (%s)" % (relp, str(info))) + else: + blab("Removed src file %s " % relp) + fullplain = os.path.join(marlinbasedir, plain) + if os.path.isdir(fullplain): + blab("Directory content removal for %s " % plain) + def filt(x): + common = os.path.commonpath([plain, x]) + if not common == os.path.normpath(plain): return True + onremove(x, "dcr") + return False + cur_srcs = set(filter(filt, cur_srcs)) + else: + # Remove matching source entries. + def filt(x): + if not fnmatch.fnmatch(x, plain): return True + onremove(x) + return False + cur_srcs = set(filter(filt, cur_srcs)) + # Transform the resulting set into a string. + for x in cur_srcs: + if len(build_src_filter) > 0: build_src_filter += ' ' + build_src_filter += "+<" + x + ">" + + #blab("Final build_src_filter: " + build_src_filter) + else: + build_src_filter = build_filters + + # Update in PlatformIO + set_env_field('build_src_filter', [build_src_filter]) + env.Replace(SRC_FILTER=build_src_filter) + # # Use the compiler to get a list of all enabled features # @@ -226,6 +294,8 @@ if pioutil.is_pio_build(): elif val in env['MARLIN_FEATURES']: some_on = env.MarlinHas(val) + #blab("%s is %s" % (feature, str(some_on))) + return some_on validate_pio() diff --git a/buildroot/share/PlatformIO/scripts/configuration.py b/buildroot/share/PlatformIO/scripts/configuration.py index 3fc43ed6d8..250d9bbd7f 100644 --- a/buildroot/share/PlatformIO/scripts/configuration.py +++ b/buildroot/share/PlatformIO/scripts/configuration.py @@ -18,7 +18,16 @@ def apply_opt(name, val, conf=None): if name == "lcd": name, val = val, "on" # Create a regex to match the option and capture parts of the line - regex = re.compile(rf'^(\s*)(//\s*)?(#define\s+)({name}\b)(\s*)(.*?)(\s*)(//.*)?$', re.IGNORECASE) + # 1: Indentation + # 2: Comment + # 3: #define and whitespace + # 4: Option name + # 5: First space after name + # 6: Remaining spaces between name and value + # 7: Option value + # 8: Whitespace after value + # 9: End comment + regex = re.compile(rf'^(\s*)(//\s*)?(#define\s+)({name}\b)(\s?)(\s*)(.*?)(\s*)(//.*)?$', re.IGNORECASE) # Find and enable and/or update all matches for file in ("Configuration.h", "Configuration_adv.h"): @@ -37,10 +46,11 @@ def apply_opt(name, val, conf=None): newline = re.sub(r'^(\s*)(#define)(\s{1,3})?(\s*)', r'\1//\2 \4', line) else: # For options with values, enable and set the value - newline = match[1] + match[3] + match[4] + match[5] + val - if match[8]: - sp = match[7] if match[7] else ' ' - newline += sp + match[8] + addsp = '' if match[5] else ' ' + newline = match[1] + match[3] + match[4] + match[5] + addsp + val + match[6] + if match[9]: + sp = match[8] if match[8] else ' ' + newline += sp + match[9] lines[i] = newline blab(f"Set {name} to {val}") diff --git a/buildroot/share/PlatformIO/scripts/download_mks_assets.py b/buildroot/share/PlatformIO/scripts/download_mks_assets.py index 661fb2e438..0186f59896 100644 --- a/buildroot/share/PlatformIO/scripts/download_mks_assets.py +++ b/buildroot/share/PlatformIO/scripts/download_mks_assets.py @@ -14,7 +14,7 @@ if pioutil.is_pio_build(): assets_path = Path(env.Dictionary("PROJECT_BUILD_DIR"), env.Dictionary("PIOENV"), "assets") def download_mks_assets(): - print("Downloading MKS Assets") + print("Downloading MKS Assets for TFT_LVGL_UI") r = requests.get(url, stream=True) # the user may have a very clean workspace, # so create the PROJECT_LIBDEPS_DIR directory if not exits @@ -25,7 +25,7 @@ if pioutil.is_pio_build(): fd.write(chunk) def copy_mks_assets(): - print("Copying MKS Assets") + print("Copying MKS Assets for TFT_LVGL_UI") output_path = Path(tempfile.mkdtemp()) zip_obj = zipfile.ZipFile(zip_path, 'r') zip_obj.extractall(output_path) diff --git a/buildroot/share/PlatformIO/scripts/offset_and_rename.py b/buildroot/share/PlatformIO/scripts/offset_and_rename.py index de14ccbbbf..e9940a50d0 100644 --- a/buildroot/share/PlatformIO/scripts/offset_and_rename.py +++ b/buildroot/share/PlatformIO/scripts/offset_and_rename.py @@ -60,6 +60,7 @@ if pioutil.is_pio_build(): def rename_target(source, target, env): from pathlib import Path - Path(target[0].path).replace(Path(target[0].dir.path, new_name)) + from datetime import datetime + Path(target[0].path).replace(Path(target[0].dir.path, datetime.now().strftime(new_name.replace('{date}', '%Y%m%d').replace('{time}', '%H%M%S')))) marlin.add_post_action(rename_target) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 3f7c97af9d..54d7f3db55 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -72,7 +72,7 @@ if pioutil.is_pio_build(): 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" % \ + err = "Error: Build environment '%s' is incompatible with %s. Use one of these environments: %s" % \ ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) raise SystemExit(err) diff --git a/buildroot/share/PlatformIO/scripts/random-bin.py b/buildroot/share/PlatformIO/scripts/random-bin.py deleted file mode 100644 index dc8634ea7d..0000000000 --- a/buildroot/share/PlatformIO/scripts/random-bin.py +++ /dev/null @@ -1,9 +0,0 @@ -# -# random-bin.py -# Set a unique firmware name based on current date and time -# -import pioutil -if pioutil.is_pio_build(): - from datetime import datetime - Import("env") - env['PROGNAME'] = datetime.now().strftime("firmware-%Y%m%d-%H%M%S") diff --git a/buildroot/share/PlatformIO/scripts/schema.py b/buildroot/share/PlatformIO/scripts/schema.py index 103aa1f072..afac7b5d27 100755 --- a/buildroot/share/PlatformIO/scripts/schema.py +++ b/buildroot/share/PlatformIO/scripts/schema.py @@ -190,7 +190,7 @@ def extract(): elif state == Parse.BLOCK_COMMENT: # Look for temperature sensors - if cline == "Temperature sensors available:": + if re.match(r'temperature sensors.*:', cline, re.IGNORECASE): state, cline = Parse.GET_SENSORS, "Temperature Sensors" options_json, section = use_comment(cline, options_json, section, comment_buff) diff --git a/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/PeripheralPins.c new file mode 100644 index 0000000000..418ef5aa7a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/PeripheralPins.c @@ -0,0 +1,252 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + * Automatically generated from STM32F401R[(B-C)|(D-E)]Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used per default. + * If you change them, you will have to know what you do + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +WEAK const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + {NC, NP, 0} +}; +#endif + +//*** No DAC *** + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +WEAK const PinMap PinMap_I2C_SDA[] = { + {PB_3, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C2)}, + {PB_4, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)}, + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {NC, NP, 0} +}; + +WEAK const PinMap PinMap_I2C_SCL[] = { + {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +WEAK const PinMap PinMap_PWM[] = { + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + {PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +WEAK const PinMap PinMap_UART_TX[] = { + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PA_11, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; + +WEAK const PinMap PinMap_UART_RX[] = { + {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PA_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {NC, NP, 0} +}; + +WEAK const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {NC, NP, 0} +}; + +WEAK const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +WEAK const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +WEAK const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +WEAK const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +WEAK const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + //{PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + //{PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {NC, NP, 0} +}; +#endif + +//*** No CAN *** + +//*** No ETHERNET *** + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +WEAK const PinMap PinMap_USB_OTG_FS[] = { +#ifndef ARDUINO_CoreBoard_F401RC + {PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + {PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + {PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID +#endif + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; +#endif + +//*** No USB_OTG_HS *** + +//*** SD *** + +#ifdef HAL_SD_MODULE_ENABLED +WEAK const PinMap PinMap_SD[] = { + {PB_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D4 + {PB_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D5 + {PC_6, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D6 + {PC_7, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D7 + {PC_8, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D0 + {PC_9, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D1 + {PC_10, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D2 + {PC_11, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_SDIO)}, // SDIO_D3 + {PC_12, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CK + {PD_2, SDIO, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF12_SDIO)}, // SDIO_CMD + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/PinNamesVar.h new file mode 100644 index 0000000000..f5db451e6f --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/PinNamesVar.h @@ -0,0 +1,33 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_SOF = PA_8, + USB_OTG_FS_VBUS = PA_9, + USB_OTG_FS_ID = PA_10, + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/hal_conf_custom.h new file mode 100644 index 0000000000..1dd047bb90 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/hal_conf_custom.h @@ -0,0 +1,495 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_CUSTOM +#define __STM32F4xx_HAL_CONF_CUSTOM + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ + /** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_IWDG_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_RTC_MODULE_ENABLED +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_PCD_MODULE_ENABLED // Automatically added if any type of USB is enabled, as in Arduino IDE. (STM32 v3.10700.191028) + +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED +//#define HAL_DAC_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_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_SD_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_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 ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#ifndef HSE_VALUE +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#ifndef HSE_STARTUP_TIMEOUT +#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#ifndef HSI_VALUE +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz */ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#ifndef LSI_VALUE +#define LSI_VALUE 32000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations +in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#ifndef LSE_VALUE +#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#ifndef LSE_STARTUP_TIMEOUT +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#ifndef EXTERNAL_CLOCK_VALUE +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#if !defined (VDD_VALUE) +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#endif +#if !defined (TICK_INT_PRIORITY) +#define TICK_INT_PRIORITY 0x00U /*!< tick interrupt priority */ +#endif +#if !defined (USE_RTOS) +#define USE_RTOS 0U +#endif +#if !defined (PREFETCH_ENABLE) +#define PREFETCH_ENABLE 1U +#endif +#if !defined (INSTRUCTION_CACHE_ENABLE) +#define INSTRUCTION_CACHE_ENABLE 1U +#endif +#if !defined (DATA_CACHE_ENABLE) +#define DATA_CACHE_ENABLE 1U +#endif + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ +#ifndef USE_SPI_CRC +#define USE_SPI_CRC 0U +#endif + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED +#include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED +#include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED +#include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED +#include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED +#include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED +#include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_CUSTOM_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/ldscript.ld new file mode 100644 index 0000000000..881b72167e --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/ldscript.ld @@ -0,0 +1,186 @@ +/* +***************************************************************************** +** +** File : ldscript.ld +** +** Abstract : Linker script for STM32F401RETx Device with +** 512KByte FLASH, 96KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20010000; /* end of RAM */ + +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_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 = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text ALIGN(4): + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} \ No newline at end of file diff --git a/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/variant.cpp new file mode 100644 index 0000000000..d603ad6ef1 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/variant.cpp @@ -0,0 +1,238 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Digital PinName array +const PinName digitalPin[] = { + PA_0, // Digital pin 0 + PA_1, // Digital pin 1 + PA_2, // Digital pin 2 + PA_3, // Digital pin 3 + PA_4, // Digital pin 4 + PA_5, // Digital pin 5 + PA_6, // Digital pin 6 + PA_7, // Digital pin 7 + PA_8, // Digital pin 8 + PA_9, // Digital pin 9 + PA_10, // Digital pin 10 + PA_11, // Digital pin 11 + PA_12, // Digital pin 12 + PA_13, // Digital pin 13 + PA_14, // Digital pin 14 + PA_15, // Digital pin 15 + + PB_0, // Digital pin 16 + PB_1, // Digital pin 17 + PB_2, // Digital pin 18 + PB_3, // Digital pin 19 + PB_4, // Digital pin 20 + PB_5, // Digital pin 21 + PB_6, // Digital pin 22 + PB_7, // Digital pin 23 + PB_8, // Digital pin 24 + PB_9, // Digital pin 25 + PB_10, // Digital pin 26 + PB_12, // Digital pin 27 + PB_13, // Digital pin 28 + PB_14, // Digital pin 29 + PB_15, // Digital pin 30 + + PC_0, // Digital pin 31 + PC_1, // Digital pin 32 + PC_2, // Digital pin 33 + PC_3, // Digital pin 34 + PC_4, // Digital pin 35 + PC_5, // Digital pin 36 + PC_6, // Digital pin 37 + PC_7, // Digital pin 38 + PC_8, // Digital pin 39 + PC_9, // Digital pin 40 + PC_10, // Digital pin 41 + PC_11, // Digital pin 42 + PC_12, // Digital pin 43 + PC_13, // Digital pin 44 + PC_14, // Digital pin 45 + PC_15, // Digital pin 46 + + PD_2, // Digital pin 47 + + PH_0, // Digital pin 48, used by the external oscillator + PH_1 // Digital pin 49, used by the external oscillator +}; + +// Analog (Ax) pin number array +const uint32_t analogInputPin[] = { + 0, // A0, PA0 + 1, // A1, PA1 + 2, // A2, PA2 + 3, // A3, PA3 + 4, // A4, PA4 + 5, // A5, PA5 + 6, // A6, PA6 + 7, // A7, PA7 + 16, // A8, PB0 + 17, // A9, PB1 + 31, // A10, PC0 + 32, // A11, PC1 + 33, // A12, PC2 + 34, // A13, PC3 + 35, // A14, PC4 + 36 // A15, PC5 +}; + +#ifdef __cplusplus +} +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * @brief Configures the System clock source, PLL Multiplier and Divider factors, + * AHB/APBx prescalers and Flash settings + * @note This function should be called only once the RCC clock configuration + * is reset to the default reset state (done in SystemInit() function). + * @param None + * @retval None + */ + +/******************************************************************************/ +/* PLL (clocked by HSE) used as System clock source */ +/******************************************************************************/ +static uint8_t SetSysClock_PLL_HSE(uint8_t bypass) +{ + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + + // Enable HSE oscillator and activate PLL with HSE as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + if (bypass == 0) { + RCC_OscInitStruct.HSEState = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT + } else { + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN + } + + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = HSE_VALUE / 1000000L; // Expects an 8 MHz external clock by default. Redefine HSE_VALUE if not + RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336) + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 84 MHz (336 MHz / 4) + RCC_OscInitStruct.PLL.PLLQ = 7; // USB clock = 48 MHz (336 MHz / 7) --> OK for USB + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 84 MHz + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 84 MHz + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 42 MHz + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 84 MHz + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { + return 0; // FAIL + } + + /* Output clock on MCO1 pin(PA8) for debugging purpose */ + /* + if (bypass == 0) + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz + else + HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz + */ + + return 1; // OK +} + +/******************************************************************************/ +/* PLL (clocked by HSI) used as System clock source */ +/******************************************************************************/ +uint8_t SetSysClock_PLL_HSI(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /* The voltage scaling allows optimizing the power consumption when the device is + clocked below the maximum system frequency, to update the voltage scaling value + regarding system frequency refer to product datasheet. */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + + // Enable HSI oscillator and activate PLL with HSI as source + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSEState = RCC_HSE_OFF; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; // VCO input clock = 1 MHz (16 MHz / 16) + RCC_OscInitStruct.PLL.PLLN = 336; // VCO output clock = 336 MHz (1 MHz * 336) + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; // PLLCLK = 84 MHz (336 MHz / 4) + RCC_OscInitStruct.PLL.PLLQ = 7; // USB clock = 48 MHz (336 MHz / 7) --> freq is ok but not precise enough + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + return 0; // FAIL + } + + /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ + RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 84 MHz + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 84 MHz + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // 42 MHz + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 84 MHz + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { + return 0; // FAIL + } + + /* Output clock on MCO1 pin(PA8) for debugging purpose */ + //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 16 MHz + + return 1; // OK +} + +WEAK void SystemClock_Config(void) +{ + /* 1- If fail try to start with HSE and external xtal */ + if (SetSysClock_PLL_HSE(0) == 0) { + /* 2- Try to start with HSE and external clock */ + if (SetSysClock_PLL_HSE(1) == 0) { + /* 3- If fail start with HSI clock */ + if (SetSysClock_PLL_HSI() == 0) { + Error_Handler(); + } + } + } + /* Output clock on MCO2 pin(PC9) for debugging purpose */ + //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/variant.h new file mode 100644 index 0000000000..591571bf2c --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_CREALITY_STM32F401RE/variant.h @@ -0,0 +1,151 @@ +/* + Copyright (c) 2011 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + + +// | DIGITAL | ANALOG | USART | TWI | SPI | SPECIAL | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PA0 0 // | 0 | A0 | | | | | +#define PA1 1 // | 1 | A1 | | | | | +#define PA2 2 // | 2 | A2 | USART2_TX | | | | +#define PA3 3 // | 3 | A3 | USART2_RX | | | | +#define PA4 4 // | 4 | A4 | | | SPI1_SS, (SPI3_SS) | | +#define PA5 5 // | 5 | A5 | | | SPI1_SCK | | +#define PA6 6 // | 6 | A6 | | | SPI1_MISO | | +#define PA7 7 // | 7 | A7 | | | SPI1_MOSI | | +#define PA8 8 // | 8 | | | TWI3_SCL | | | +#define PA9 9 // | 9 | | USART1_TX | | | | +#define PA10 10 // | 10 | | USART1_RX | | | | +#define PA11 11 // | 11 | | USART6_TX | | | | +#define PA12 12 // | 12 | | USART6_RX | | | | +#define PA13 13 // | 13 | | | | | SWD_SWDIO | +#define PA14 14 // | 14 | | | | | SWD_SWCLK | +#define PA15 15 // | 15 | | | | SPI3_SS, (SPI1_SS) | | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PB0 16 // | 16 | A8 | | | | | +#define PB1 17 // | 17 | A9 | | | | | +#define PB2 18 // | 18 | | | | | BOOT1 | +#define PB3 19 // | 19 | | | TWI2_SDA | SPI3_SCK, (SPI1_SCK) | | +#define PB4 20 // | 20 | | | TWI3_SDA | SPI3_MISO, (SPI1_MISO) | | +#define PB5 21 // | 21 | | | | SPI3_MOSI, (SPI1_MOSI) | | +#define PB6 22 // | 22 | | USART1_TX | TWI1_SCL | | | +#define PB7 23 // | 23 | | USART1_RX | TWI1_SDA | | | +#define PB8 24 // | 24 | | | TWI1_SCL | | | +#define PB9 25 // | 25 | | | TWI1_SDA | SPI2_SS | | +#define PB10 26 // | 26 | | | TWI2_SCL | SPI2_SCK | | +#define PB12 27 // | 27 | | | | SPI2_SS | | +#define PB13 28 // | 28 | | | | SPI2_SCK | | +#define PB14 29 // | 29 | | | | SPI2_MISO | | +#define PB15 30 // | 30 | | | | SPI2_MOSI | | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PC0 31 // | 31 | A10 | | | | | +#define PC1 32 // | 32 | A11 | | | | | +#define PC2 33 // | 33 | A12 | | | SPI2_MISO | | +#define PC3 34 // | 34 | A13 | | | SPI2_MOSI | | +#define PC4 35 // | 35 | A14 | | | | | +#define PC5 36 // | 36 | A15 | | | | | +#define PC6 37 // | 37 | | USART6_TX | | | | +#define PC7 38 // | 38 | | USART6_RX | | | | +#define PC8 39 // | 39 | | | | | | +#define PC9 40 // | 40 | | | TWI3_SDA | | | +#define PC10 41 // | 41 | | | | SPI3_SCK | | +#define PC11 42 // | 42 | | | | SPI3_MISO | | +#define PC12 43 // | 43 | | | | SPI3_MOSI | | +#define PC13 44 // | 44 | | | | | | +#define PC14 45 // | 45 | | | | | OSC32_IN | +#define PC15 46 // | 46 | | | | | OSC32_OUT | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PD2 47 // | 47 | | | | | | +// |---------|--------|-----------|----------|------------------------|-----------| +#define PH0 48 // | 48 | | | | | OSC_IN | +#define PH1 49 // | 49 | | | | | OSC_OUT | +// |---------|--------|-----------|----------|------------------------|-----------| + +// This must be a literal +#define NUM_DIGITAL_PINS 50 +#define NUM_ANALOG_INPUTS 16 + +// SPI definitions +#define PIN_SPI_SS PA4 +#define PIN_SPI_SS1 PA4 +#define PIN_SPI_MOSI PA7 +#define PIN_SPI_MISO PA6 +#define PIN_SPI_SCK PA5 + + +// Timer Definitions +#define TIMER_TONE TIM2 +#define TIMER_SERVO TIM11 +#define TIMER_SERIAL TIM5 + +// UART Definitions +//#define ENABLE_HWSERIAL1 done automatically by the #define SERIAL_UART_INSTANCE below +#define ENABLE_HWSERIAL2 + + +// Define here Serial instance number to map on Serial generic name (if not already used by SerialUSB) +#define SERIAL_UART_INSTANCE 1 //1 for Serial = Serial1 (USART1) + +// Default pin used for 'Serial' instance +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +// Used when user instanciate a hardware Serial using its peripheral name. +// Example: HardwareSerial mySerial(USART3); +// will use PIN_SERIAL3_RX and PIN_SERIAL3_TX if defined. +#define PIN_SERIAL1_RX PA10 +#define PIN_SERIAL1_TX PA9 +#define PIN_SERIAL2_RX PA3 +#define PIN_SERIAL2_TX PA2 + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus + // These serial port names are intended to allow libraries and architecture-neutral + // sketches to automatically default to the correct port name for a particular type + // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, + // the first hardware serial port whose RX/TX pins are not dedicated to another use. + // + // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor + // + // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial + // + // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library + // + // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. + // + // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX + // pins are NOT connected to anything by default. + #define SERIAL_PORT_MONITOR Serial + #define SERIAL_PORT_HARDWARE Serial1 + #define SERIAL_PORT_HARDWARE_OPEN Serial2 +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Rx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F103Rx/PeripheralPins.c old mode 100755 new mode 100644 diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F103Rx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F103Rx/PinNamesVar.h index d9e759f5d0..d9076b4dfb 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F103Rx/PinNamesVar.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F103Rx/PinNamesVar.h @@ -27,4 +27,4 @@ #ifdef USBCON USB_DM = PA_11, USB_DP = PA_12, -#endif \ No newline at end of file +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F407ZE/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F407ZE/PeripheralPins.c index d0905853a9..de796f4ef5 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F407ZE/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_F407ZE/PeripheralPins.c @@ -413,7 +413,7 @@ const PinMap PinMap_USB_OTG_HS[] = { */ {NC, NP, 0} }; - +#endif #ifdef HAL_SD_MODULE_ENABLED WEAK const PinMap PinMap_SD[] = { @@ -430,4 +430,3 @@ WEAK const PinMap PinMap_SD[] = { {NC, NP, 0} }; #endif -#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_H723VG/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Vx/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_H723VG/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Vx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_H723VG/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Vx/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_H723VG/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Vx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_H723VG/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Vx/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_H723VG/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Vx/variant_MARLIN_STM32H723VX.cpp b/buildroot/share/PlatformIO/variants/MARLIN_H723VG/variant_MARLIN_STM32H723VG.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Vx/variant_MARLIN_STM32H723VX.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_H723VG/variant_MARLIN_STM32H723VG.cpp diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Vx/variant_MARLIN_STM32H723VX.h b/buildroot/share/PlatformIO/variants/MARLIN_H723VG/variant_MARLIN_STM32H723VG.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Vx/variant_MARLIN_STM32H723VX.h rename to buildroot/share/PlatformIO/variants/MARLIN_H723VG/variant_MARLIN_STM32H723VG.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Zx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Zx/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_H723ZE/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Zx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Zx/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_H723ZE/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Zx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Zx/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_H723ZE/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Zx/variant_MARLIN_STM32H723ZX.cpp b/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/variant_MARLIN_STM32H723ZE.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Zx/variant_MARLIN_STM32H723ZX.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_H723ZE/variant_MARLIN_STM32H723ZE.cpp diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H723Zx/variant_MARLIN_STM32H723ZX.h b/buildroot/share/PlatformIO/variants/MARLIN_H723ZE/variant_MARLIN_STM32H723ZE.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H723Zx/variant_MARLIN_STM32H723ZX.h rename to buildroot/share/PlatformIO/variants/MARLIN_H723ZE/variant_MARLIN_STM32H723ZE.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H743Vx/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_H743VI/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H743Vx/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_H743VI/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H743Vx/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_H743VI/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H743Vx/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_H743VI/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H743Vx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_H743VI/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H743Vx/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_H743VI/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H743Vx/variant_MARLIN_STM32H743VX.cpp b/buildroot/share/PlatformIO/variants/MARLIN_H743VI/variant_MARLIN_STM32H743VI.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H743Vx/variant_MARLIN_STM32H743VX.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_H743VI/variant_MARLIN_STM32H743VI.cpp diff --git a/buildroot/share/PlatformIO/variants/MARLIN_H743Vx/variant_MARLIN_STM32H743VX.h b/buildroot/share/PlatformIO/variants/MARLIN_H743VI/variant_MARLIN_STM32H743VI.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_H743Vx/variant_MARLIN_STM32H743VX.h rename to buildroot/share/PlatformIO/variants/MARLIN_H743VI/variant_MARLIN_STM32H743VI.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/PeripheralPins.c new file mode 100644 index 0000000000..4ea275d4cf --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/PeripheralPins.c @@ -0,0 +1,370 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + * Automatically generated from STM32F407Z(E-G)Tx.xml + */ +#include +#include + +/* ===== + * Note: Commented lines are alternative possibilities which are not used by default. + * If you change them, you should know what you're doing first. + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 E0_DIR + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 BLTOUCH_2 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 BLTOUCH_4 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 E1_EN + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 TF_SS + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 TF_SCLK + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 TF_MISO + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 LED + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 HEATER2 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 HEATER0 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 Z_EN + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 EXP_14 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 Z_DIR + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 E0_EN + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 EXP_8 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 EXP_7 + + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 TH_0 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 TH_1 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 TH_2 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 TH_3 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 EXP_13 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 EXP_3 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 EXP_6 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 EXP_5 + #endif + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio + #if STM32F4X_PIN_NUM >= 176 + {PH_5, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #else + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + #endif + {NC, NP, 0} +}; + +const PinMap PinMap_I2C_SCL[] = { + {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #if STM32F4X_PIN_NUM >= 144 // 144 pins mcu, 114 gpio + #if STM32F4X_PIN_NUM >= 176 + //{PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_4, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PH_7, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #else + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + #endif + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +const PinMap PinMap_PWM[] = { + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 HEATER0 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 HEATER1 + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 HEATER2 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 BED + {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 FAN0 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 FAN1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 FAN2 + {PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 EXTENSION1-4 + {PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 BL-TOUCH-SERVO + + // These pins have been defined for something else on the board but they MIGHT be + // used by the user as PWM pins if they aren't used for their primary purpose. + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 ESP8266 connector. Available if 8266 isn't used + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 ESP8266 connector. Available if 8266 isn't used + {PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 I2C connector, SDA pin. Available if I2C isn't used. + // TIM5_CH1 is used by the Servo Library + {PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 BL-TOUCH port. Available if Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + + /** + * Unused by specifications on SKR-Pro. + * Uncomment the corresponding line if you want to have HardwarePWM on some pins. + * WARNING: check timers' usage first to avoid conflicts. + * If you don't know what you're doing leave things as they are or you WILL break something (including hardware) + * If you alter this section DO NOT report bugs to Marlin team since they are most likely caused by you. Thank you. + */ + //{PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + //{PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 BLTOUCH is a "servo" + //{PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 BLTOUCH is a "servo" + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + //{PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + //{PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + //{PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + //{PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + //{PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + //{PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + //{PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + //{PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + //{PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + //{PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + //{PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + //{PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + //{PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + //{PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + //{PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + //{PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + #endif + #if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + {PH_10, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + {PH_6, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + //{PH_11, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + {PI_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + {PI_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + #endif + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_TX[] = { + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + //{PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {NC, NP, 0} +}; + +const PinMap PinMap_UART_RX[] = { + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + //{PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + //{PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +const PinMap PinMap_UART_RTS[] = { + //{PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; + +const PinMap PinMap_UART_CTS[] = { + //{PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + //{PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + //{PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + //{PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + //{PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + //{PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MOSI[] = { + {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; + +const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +#error "CAN bus isn't available on this board. Driver should be disabled." +#endif + +//*** ETHERNET *** +#ifdef HAL_ETH_MODULE_ENABLED +#error "Ethernet port isn't available on this board. Driver should be disabled." +#endif + +//*** No QUADSPI *** + +//*** USB *** +#ifdef HAL_PCD_MODULE_ENABLED +const PinMap PinMap_USB_OTG_FS[] = { + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF used by LCD + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS available on wifi port, if empty + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID available on UART1_RX if not used + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; + +const PinMap PinMap_USB_OTG_HS[] = { /* + #ifdef USE_USB_HS_IN_FS + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP + #else + #error "USB in HS mode isn't supported by the board" + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT + #endif // USE_USB_HS_IN_FS + */ + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/PinNamesVar.h new file mode 100644 index 0000000000..b4bb9d45f8 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/PinNamesVar.h @@ -0,0 +1,50 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_SOF = PA_8, + USB_OTG_FS_VBUS = PA_9, + USB_OTG_FS_ID = PA_10, + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, + USB_OTG_HS_ULPI_D0 = PA_3, + USB_OTG_HS_SOF = PA_4, + USB_OTG_HS_ULPI_CK = PA_5, + USB_OTG_HS_ULPI_D1 = PB_0, + USB_OTG_HS_ULPI_D2 = PB_1, + USB_OTG_HS_ULPI_D7 = PB_5, + USB_OTG_HS_ULPI_D3 = PB_10, + USB_OTG_HS_ULPI_D4 = PB_11, + USB_OTG_HS_ID = PB_12, + USB_OTG_HS_ULPI_D5 = PB_12, + USB_OTG_HS_ULPI_D6 = PB_13, + USB_OTG_HS_VBUS = PB_13, + USB_OTG_HS_DM = PB_14, + USB_OTG_HS_DP = PB_15, + USB_OTG_HS_ULPI_STP = PC_0, + USB_OTG_HS_ULPI_DIR = PC_2, + USB_OTG_HS_ULPI_NXT = PC_3, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/hal_conf_extra.h new file mode 100644 index 0000000000..ef621d57bf --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/hal_conf_extra.h @@ -0,0 +1,52 @@ +#pragma once + +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +#define HAL_CRC_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED // Needed for Endstop (and other external) Interrupts +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED // Real Time Clock...do we use it? +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_USART_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED // by default +//#define HAL_PCD_MODULE_ENABLED // Automatically added if any type of USB is enabled, as in Arduino IDE. (STM32 v3.10700.191028) + +//#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_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/MARLIN_I3DBEEZ9/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/ldscript.ld new file mode 100644 index 0000000000..f7e09b8ef0 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/ldscript.ld @@ -0,0 +1,204 @@ +/* +***************************************************************************** +** + +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F407ZGTx Device with +** 1024KByte FLASH, 128KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +** Copyright (c) 2014 Ac6 +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20020000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200;; /* required amount of heap */ +_Min_Stack_Size = 0x400;; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +FLASH (rx) : ORIGIN = 0x8008000, LENGTH = 1024K +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text ALIGN(4): + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata ALIGN(4): + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/variant.cpp new file mode 100644 index 0000000000..1486b21830 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/variant.cpp @@ -0,0 +1,260 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#include "pins_arduino.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Pin number +// This array allows to wrap Arduino pin number(Dx or x) +// to STM32 PinName (PX_n) +const PinName digitalPin[] = { +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + PC_13, //D0 + PC_14, //D1 - OSC32_IN + PC_15, //D2 - OSC32_OUT + PH_0, //D3 - OSC_IN + PH_1, //D4 - OSC_OUT + PB_2, //D5 - BOOT1 + PB_10, //D6 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + PB_11, //D7 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 + PB_12, //D8 - 1:SPI2_NSS / OTG_HS_ID + PB_13, //D9 - 1:SPI2_SCK 2:OTG_HS_VBUS + PB_14, //D10 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + PB_15, //D11 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + PC_6, //D12 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + PC_7, //D13 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + PC_8, //D14 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + PC_9, //D15 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + PA_8, //D16 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + PA_9, //D17 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + PA_10, //D18 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID + PA_11, //D19 - 1:TIM1_CH4 / OTG_FS_DM + PA_12, //D20 - 1:OTG_FS_DP + PA_13, //D21 - 0:JTMS-SWDIO + PA_14, //D22 - 0:JTCK-SWCLK + PA_15, //D23 - 0:JTDI 1:SPI3_NSS / SPI1_NSS + PC_10, //D24 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + PC_11, //D25 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + PC_12, //D26 - 1:UART5_TX / SPI3_MOSI / SDIO_CK + PD_2, //D27 - 1:UART5_RX / SDIO_CMD + PB_3, //D28 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + PB_4, //D29 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + PB_5, //D30 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + PB_6, //D31 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX + PB_7, //D32 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX + PB_8, //D33 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + PB_9, //D34 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + PA_0, //D35/A0 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + PA_1, //D36/A1 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + PA_2, //D37/A2 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + PA_3, //D38/A3 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + PA_4, //D39/A4 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + PA_5, //D40/A5 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + PA_6, //D41/A6 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + PA_7, //D42/A7 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + PB_0, //D43/A8 - 1:TIM3_CH3 2:ADC12_IN8 + PB_1, //D44/A9 - 1:TIM3_CH4 2:ADC12_IN9 + PC_0, //D45/A10 - 1: 2:ADC123_IN10 + PC_1, //D46/A11 - 1: 2:ADC123_IN11 + PC_2, //D47/A12 - 1:SPI2_MISO 2:ADC123_IN12 + PC_3, //D48/A13 - 1:SPI2_MOSI 2:ADC123_IN13 + PC_4, //D49/A14 - 1: 2:ADC12_IN14 + PC_5, //D50/A15 - 1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + PF_3, //D51/A16 - 1:FSMC_A3 2:ADC3_IN9 + PF_4, //D52/A17 - 1:FSMC_A4 2:ADC3_IN14 + PF_5, //D53/A18 - 1:FSMC_A5 2:ADC3_IN15 + PF_6, //D54/A19 - 1:TIM10_CH1 2:ADC3_IN4 + PF_7, //D55/A20 - 1:TIM11_CH1 2:ADC3_IN5 + PF_8, //D56/A21 - 1:TIM13_CH1 2:ADC3_IN6 + PF_9, //D57/A22 - 1;TIM14_CH1 2:ADC3_IN7 + PF_10, //D58/A23 - 2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + PE_2, //D59 - 1:FSMC_A23 + PE_3, //D60 - 1:FSMC_A19 + PE_4, //D61 - 1:FSMC_A20 + PE_5, //D62 - 1:FSMC_A21 + PE_6, //D63 - 1:FSMC_A22 + PE_7, //D64 - 1:FSMC_D4 + PE_8, //D65 - 1:FSMC_D5 + PE_9, //D66 - 1:FSMC_D6 / TIM1_CH1 + PE_10, //D67 - 1:FSMC_D7 + PE_11, //D68 - 1:FSMC_D8 / TIM1_CH2 + PE_12, //D69 - 1:FSMC_D9 + PE_13, //D70 - 1:FSMC_D10 / TIM1_CH3 + PE_14, //D71 - 1:FSMC_D11 / TIM1_CH4 + PE_15, //D72 - 1:FSMC_D12 + PD_8, //D73 - 1:FSMC_D13 / USART3_TX + PD_9, //D74 - 1:FSMC_D14 / USART3_RX + PD_10, //D75 - 1:FSMC_D15 + PD_11, //D76 - 1:FSMC_A16 + PD_12, //D77 - 1:FSMC_A17 / TIM4_CH1 + PD_13, //D78 - 1:FSMC_A18 / TIM4_CH2 + PD_14, //D79 - 1:FSMC_D0 / TIM4_CH3 + PD_15, //D80 - 1:FSMC_D1 / TIM4_CH4 + PD_0, //D81 - 1:FSMC_D2 + PD_1, //D82 - 1:FSMC_D3 + PD_3, //D83 - 1:FSMC_CLK + PD_4, //D84 - 1:FSMC_NOE + PD_5, //D85 - 1:USART2_TX + PD_6, //D86 - 1:USART2_RX + PD_7, //D87 + PE_0, //D88 + PE_1, //D89 +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + PF_0, //D90 - 1:FSMC_A0 / I2C2_SDA + PF_1, //D91 - 1:FSMC_A1 / I2C2_SCL + PF_2, //D92 - 1:FSMC_A2 + PF_11, //D93 + PF_12, //D94 - 1:FSMC_A6 + PF_13, //D95 - 1:FSMC_A7 + PF_14, //D96 - 1:FSMC_A8 + PF_15, //D97 - 1:FSMC_A9 + PG_0, //D98 - 1:FSMC_A10 + PG_1, //D99 - 1:FSMC_A11 + PG_2, //D100 - 1:FSMC_A12 + PG_3, //D101 - 1:FSMC_A13 + PG_4, //D102 - 1:FSMC_A14 + PG_5, //D103 - 1:FSMC_A15 + PG_6, //D104 + PG_7, //D105 + PG_8, //D106 + PG_9, //D107 - 1:USART6_RX + PG_10, //D108 - 1:FSMC_NE3 + PG_11, //D109 + PG_12, //D110 - 1:FSMC_NE4 + PG_13, //D111 - 1:FSMC_A24 + PG_14, //D112 - 1:FSMC_A25 / USART6_TX + PG_15, //D113 +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + PI_8, //D114 + PI_9, //D115 + PI_10, //D116 + PI_11, //D117 + PH_2, //D118 + PH_3, //D119 + PH_4, //D120 - 1:I2C2_SCL + PH_5, //D121 - 1:I2C2_SDA + PH_6, //D122 - 1:TIM12_CH1 + PH_7, //D123 - 1:I2C3_SCL + PH_8, //D124 - 1:I2C3_SDA + PH_9, //D125 - 1:TIM12_CH2 + PH_10, //D126 - 1:TIM5_CH1 + PH_11, //D127 - 1:TIM5_CH2 + PH_12, //D128 - 1:TIM5_CH3 + PH_13, //D129 + PH_14, //D130 + PH_15, //D131 + PI_0, //D132 - 1:TIM5_CH4 / SPI2_NSS + PI_1, //D133 - 1:SPI2_SCK + PI_2, //D134 - 1:TIM8_CH4 /SPI2_MISO + PI_3, //D135 - 1:SPI2_MOS + PI_4, //D136 + PI_5, //D137 - 1:TIM8_CH1 + PI_6, //D138 - 1:TIM8_CH2 + PI_7, //D139 - 1:TIM8_CH3 +#endif +}; + +#ifdef __cplusplus +} +#endif + +// ------------------------ + +#ifdef __cplusplus +extern "C" { +#endif + + /** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config() { + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/variant.h new file mode 100644 index 0000000000..cdb0dc2677 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_I3DBEEZ9/variant.h @@ -0,0 +1,323 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ + +#ifdef STM32F405RX + #define STM32F4X_PIN_NUM 64 //64 pins mcu, 51 gpio + #define STM32F4X_GPIO_NUM 51 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5VX) + #define STM32F4X_PIN_NUM 100 //100 pins mcu, 82 gpio + #define STM32F4X_GPIO_NUM 82 + #define STM32F4X_ADC_NUM 16 +#elif defined(STM32F407_5ZX) + #define STM32F4X_PIN_NUM 144 //144 pins mcu, 114 gpio + #define STM32F4X_GPIO_NUM 114 + #define STM32F4X_ADC_NUM 24 +#elif defined(STM32F407IX) + #define STM32F4X_PIN_NUM 176 //176 pins mcu, 140 gpio + #define STM32F4X_GPIO_NUM 140 + #define STM32F4X_ADC_NUM 24 +#else + #error "no match MCU defined" +#endif + +#if STM32F4X_PIN_NUM >= 64 //64 pins mcu, 51 gpio + #define PC13 0 + #define PC14 1 //OSC32_IN + #define PC15 2 //OSC32_OUT + #define PH0 3 //OSC_IN + #define PH1 4 //OSC_OUT + #define PB2 5 //BOOT1 + #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 + #define PB12 8 //1:SPI2_NSS / OTG_HS_ID + #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS + #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID + #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM + #define PA12 20 //1:OTG_FS_DP + #define PA13 21 //0:JTMS-SWDIO + #define PA14 22 //0:JTCK-SWCLK + #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS + #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK + #define PD2 27 //1:UART5_RX / SDIO_CMD + #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX + #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX + #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + #define PA0 35 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + #define PA1 36 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + #define PA2 37 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + #define PA3 38 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + #define PA4 39 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + #define PA5 40 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + #define PA6 41 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + #define PA7 42 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + #define PB0 43 //1:TIM3_CH3 2:ADC12_IN8 + #define PB1 44 //1:TIM3_CH4 2:ADC12_IN9 + #define PC0 45 //1: 2:ADC123_IN10 + #define PC1 46 //1: 2:ADC123_IN11 + #define PC2 47 //1:SPI2_MISO 2:ADC123_IN12 + #define PC3 48 //1:SPI2_MOSI 2:ADC123_IN13 + #define PC4 49 //1: 2:ADC12_IN14 + #define PC5 50 //1: 2:ADC12_IN15 + #if STM32F4X_PIN_NUM >= 144 + #define PF3 51 //1:FSMC_A3 2:ADC3_IN9 + #define PF4 52 //1:FSMC_A4 2:ADC3_IN14 + #define PF5 53 //1:FSMC_A5 2:ADC3_IN15 + #define PF6 54 //1:TIM10_CH1 2:ADC3_IN4 + #define PF7 55 //1:TIM11_CH1 2:ADC3_IN5 + #define PF8 56 //1:TIM13_CH1 2:ADC3_IN6 + #define PF9 57 //1;TIM14_CH1 2:ADC3_IN7 + #define PF10 58 //2:ADC3_IN8 + #endif +#endif +#if STM32F4X_PIN_NUM >= 100 //100 pins mcu, 82 gpio + #define PE2 (35+STM32F4X_ADC_NUM) //1:FSMC_A23 + #define PE3 (36+STM32F4X_ADC_NUM) //1:FSMC_A19 + #define PE4 (37+STM32F4X_ADC_NUM) //1:FSMC_A20 + #define PE5 (38+STM32F4X_ADC_NUM) //1:FSMC_A21 + #define PE6 (39+STM32F4X_ADC_NUM) //1:FSMC_A22 + #define PE7 (40+STM32F4X_ADC_NUM) //1:FSMC_D4 + #define PE8 (41+STM32F4X_ADC_NUM) //1:FSMC_D5 + #define PE9 (42+STM32F4X_ADC_NUM) //1:FSMC_D6 / TIM1_CH1 + #define PE10 (43+STM32F4X_ADC_NUM) //1:FSMC_D7 + #define PE11 (44+STM32F4X_ADC_NUM) //1:FSMC_D8 / TIM1_CH2 + #define PE12 (45+STM32F4X_ADC_NUM) //1:FSMC_D9 + #define PE13 (46+STM32F4X_ADC_NUM) //1:FSMC_D10 / TIM1_CH3 + #define PE14 (47+STM32F4X_ADC_NUM) //1:FSMC_D11 / TIM1_CH4 + #define PE15 (48+STM32F4X_ADC_NUM) //1:FSMC_D12 + #define PD8 (49+STM32F4X_ADC_NUM) //1:FSMC_D13 / USART3_TX + #define PD9 (50+STM32F4X_ADC_NUM) //1:FSMC_D14 / USART3_RX + #define PD10 (51+STM32F4X_ADC_NUM) //1:FSMC_D15 + #define PD11 (52+STM32F4X_ADC_NUM) //1:FSMC_A16 + #define PD12 (53+STM32F4X_ADC_NUM) //1:FSMC_A17 / TIM4_CH1 + #define PD13 (54+STM32F4X_ADC_NUM) //1:FSMC_A18 / TIM4_CH2 + #define PD14 (55+STM32F4X_ADC_NUM) //1:FSMC_D0 / TIM4_CH3 + #define PD15 (56+STM32F4X_ADC_NUM) //1:FSMC_D1 / TIM4_CH4 + #define PD0 (57+STM32F4X_ADC_NUM) //1:FSMC_D2 + #define PD1 (58+STM32F4X_ADC_NUM) //1:FSMC_D3 + #define PD3 (59+STM32F4X_ADC_NUM) //1:FSMC_CLK + #define PD4 (60+STM32F4X_ADC_NUM) //1:FSMC_NOE + #define PD5 (61+STM32F4X_ADC_NUM) //1:USART2_TX + #define PD6 (62+STM32F4X_ADC_NUM) //1:USART2_RX + #define PD7 (63+STM32F4X_ADC_NUM) + #define PE0 (64+STM32F4X_ADC_NUM) + #define PE1 (65+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + #define PF0 (66+STM32F4X_ADC_NUM) //1:FSMC_A0 / I2C2_SDA + #define PF1 (67+STM32F4X_ADC_NUM) //1:FSMC_A1 / I2C2_SCL + #define PF2 (68+STM32F4X_ADC_NUM) //1:FSMC_A2 + #define PF11 (69+STM32F4X_ADC_NUM) + #define PF12 (70+STM32F4X_ADC_NUM) //1:FSMC_A6 + #define PF13 (71+STM32F4X_ADC_NUM) //1:FSMC_A7 + #define PF14 (72+STM32F4X_ADC_NUM) //1:FSMC_A8 + #define PF15 (73+STM32F4X_ADC_NUM) //1:FSMC_A9 + #define PG0 (74+STM32F4X_ADC_NUM) //1:FSMC_A10 + #define PG1 (75+STM32F4X_ADC_NUM) //1:FSMC_A11 + #define PG2 (76+STM32F4X_ADC_NUM) //1:FSMC_A12 + #define PG3 (77+STM32F4X_ADC_NUM) //1:FSMC_A13 + #define PG4 (78+STM32F4X_ADC_NUM) //1:FSMC_A14 + #define PG5 (79+STM32F4X_ADC_NUM) //1:FSMC_A15 + #define PG6 (80+STM32F4X_ADC_NUM) + #define PG7 (81+STM32F4X_ADC_NUM) + #define PG8 (82+STM32F4X_ADC_NUM) + #define PG9 (83+STM32F4X_ADC_NUM) //1:USART6_RX + #define PG10 (84+STM32F4X_ADC_NUM) //1:FSMC_NE3 + #define PG11 (85+STM32F4X_ADC_NUM) + #define PG12 (86+STM32F4X_ADC_NUM) //1:FSMC_NE4 + #define PG13 (87+STM32F4X_ADC_NUM) //1:FSMC_A24 + #define PG14 (88+STM32F4X_ADC_NUM) //1:FSMC_A25 / USART6_TX + #define PG15 (89+STM32F4X_ADC_NUM) +#endif +#if STM32F4X_PIN_NUM >= 176 //176 pins mcu, 140 gpio + #define PI8 (90+STM32F4X_ADC_NUM) + #define PI9 (91+STM32F4X_ADC_NUM) + #define PI10 (92+STM32F4X_ADC_NUM) + #define PI11 (93+STM32F4X_ADC_NUM) + #define PH2 (94+STM32F4X_ADC_NUM) + #define PH3 (95+STM32F4X_ADC_NUM) + #define PH4 (96+STM32F4X_ADC_NUM) //1:I2C2_SCL + #define PH5 (97+STM32F4X_ADC_NUM) //1:I2C2_SDA + #define PH6 (98+STM32F4X_ADC_NUM) //1:TIM12_CH1 + #define PH7 (99+STM32F4X_ADC_NUM) //1:I2C3_SCL + #define PH8 (100+STM32F4X_ADC_NUM) //1:I2C3_SDA + #define PH9 (101+STM32F4X_ADC_NUM) //1:TIM12_CH2 + #define PH10 (102+STM32F4X_ADC_NUM) //1:TIM5_CH1 + #define PH11 (103+STM32F4X_ADC_NUM) //1:TIM5_CH2 + #define PH12 (104+STM32F4X_ADC_NUM) //1:TIM5_CH3 + #define PH13 (105+STM32F4X_ADC_NUM) + #define PH14 (106+STM32F4X_ADC_NUM) + #define PH15 (107+STM32F4X_ADC_NUM) + #define PI0 (108+STM32F4X_ADC_NUM) //1:TIM5_CH4 / SPI2_NSS + #define PI1 (109+STM32F4X_ADC_NUM) //1:SPI2_SCK + #define PI2 (110+STM32F4X_ADC_NUM) //1:TIM8_CH4 /SPI2_MISO + #define PI3 (111+STM32F4X_ADC_NUM) //1:SPI2_MOS + #define PI4 (112+STM32F4X_ADC_NUM) + #define PI5 (113+STM32F4X_ADC_NUM) //1:TIM8_CH1 + #define PI6 (114+STM32F4X_ADC_NUM) //1:TIM8_CH2 + #define PI7 (115+STM32F4X_ADC_NUM) //1:TIM8_CH3 +#endif + + +// This must be a literal +#define NUM_DIGITAL_PINS (STM32F4X_GPIO_NUM) +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS (STM32F4X_ADC_NUM) +#define NUM_ANALOG_FIRST 35 + +// Below ADC, DAC and PWM definitions already done in the core +// Could be redefined here if needed +// ADC resolution is 12bits +//#define ADC_RESOLUTION 12 +//#define DACC_RESOLUTION 12 + +// PWM resolution +/* + * BEWARE: + * Changing this value from the default (1000) will affect the PWM output value of analogWrite (to a PWM pin) + * Since the pin is toggled on capture, if you change the frequency of the timer you have to adapt the compare value (analogWrite thinks you did) + */ +//#define PWM_FREQUENCY 20000 +//The bottom values are the default and don't need to be redefined +//#define PWM_RESOLUTION 8 +//#define PWM_MAX_DUTY_CYCLE 255 + +// On-board LED pin number +#define LED_BUILTIN PA7 +#define LED_GREEN LED_BUILTIN + +// Below SPI and I2C definitions already done in the core +// Could be redefined here if differs from the default one +// SPI Definitions +#define PIN_SPI_MOSI PB15 +#define PIN_SPI_MISO PB14 +#define PIN_SPI_SCK PB13 +#define PIN_SPI_SS PB12 + +// I2C Definitions +#if STM32F4X_PIN_NUM >= 176 + #define PIN_WIRE_SDA PH5 + #define PIN_WIRE_SCL PH4 +#else + #define PIN_WIRE_SDA PB7 + #define PIN_WIRE_SCL PB6 +#endif + +// Timer Definitions +// Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c +#define TIMER_TONE TIM2 // TIMER_TONE must be defined in this file +#define TIMER_SERVO TIM5 // Only 1 Servo PIN on BEEZ9, so use the same timer as defined in PeripheralPins +#define TIMER_SERIAL TIM7 // TIMER_SERIAL must be defined in this file + +// UART Definitions +//#define ENABLE_HWSERIAL1 done automatically by the #define SERIAL_UART_INSTANCE below +#define ENABLE_HWSERIAL3 +#define ENABLE_HWSERIAL6 + +// Define here Serial instance number to map on Serial generic name (if not already used by SerialUSB) +#define SERIAL_UART_INSTANCE 1 //1 for Serial = Serial1 (USART1) + +// DEBUG_UART could be redefined to print on another instance than 'Serial' +//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 +// DEBUG_UART baudrate, default: 9600 if not defined +//#define DEBUG_UART_BAUDRATE x +// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART +//#define DEBUG_PINNAME_TX PX_n // PinName used for TX + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PA10 +#define PIN_SERIAL_TX PA9 + +// Optional PIN_SERIALn_RX and PIN_SERIALn_TX where 'n' is the U(S)ART number +// Used when user instantiate a hardware Serial using its peripheral name. +// Example: HardwareSerial mySerial(USART3); +// will use PIN_SERIAL3_RX and PIN_SERIAL3_TX if defined. +#define PIN_SERIAL1_RX PA10 +#define PIN_SERIAL1_TX PA9 +#define PIN_SERIAL3_RX PD9 +#define PIN_SERIAL3_TX PD8 +#define PIN_SERIAL6_RX PC7 +#define PIN_SERIAL6_TX PC6 +//#define PIN_SERIALLP1_RX x // For LPUART1 RX +//#define PIN_SERIALLP1_TX x // For LPUART1 TX + +#ifdef __cplusplus +} // extern "C" +#endif + +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE Serial1 +#define SERIAL_PORT_HARDWARE_OPEN Serial3 +#define SERIAL_PORT_HARDWARE_OPEN1 Serial6 +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/PeripheralPins.c new file mode 100644 index 0000000000..63763e9db7 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/PeripheralPins.c @@ -0,0 +1,437 @@ +/* + ******************************************************************************* + * Copyright (c) 2019, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + * Automatically generated from STM32F407Z(E-G)Tx.xml + */ +#include "Arduino.h" +#include "PeripheralPins.h" + +/* ===== + * Note: Commented lines are alternative possibilities which are not used by default. + * If you change them, you should know what you're doing first. + * ===== + */ + +//*** ADC *** + +#ifdef HAL_ADC_MODULE_ENABLED +const PinMap PinMap_ADC[] = { + {PA_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 + //{PA_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 + //{PA_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 + {PA_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 + //{PA_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 + //{PA_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 + {PA_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 + //{PA_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 + //{PA_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 + {PA_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 + //{PA_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 + //{PA_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 + {PA_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 + //{PA_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 + {PA_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 + //{PA_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 + {PA_6, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 + //{PA_6, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 + {PA_7, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 + //{PA_7, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 + {PB_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 + //{PB_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 + {PB_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 + //{PB_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 + {PC_0, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 + //{PC_0, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 + //{PC_0, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 + {PC_1, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 + //{PC_1, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 + //{PC_1, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 + {PC_2, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 + //{PC_2, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 + //{PC_2, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 + {PC_3, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 + //{PC_3, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 + //{PC_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 + {PC_4, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 + //{PC_4, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 + {PC_5, ADC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 + //{PC_5, ADC2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 + + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio, 24 ADC + {PF_3, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 + {PF_4, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 + {PF_5, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 + {PF_6, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4 + {PF_7, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 + {PF_8, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 + {PF_9, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 + {PF_10, ADC3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 + #endif + {NC, NP, 0} +}; +#endif + +//*** DAC *** + +#ifdef HAL_DAC_MODULE_ENABLED +const PinMap PinMap_DAC[] = { + {PA_4, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 + {PA_5, DAC1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 + {NC, NP, 0} +}; +#endif + +//*** I2C *** + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SDA[] = { + {PB_7, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_9, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_11, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + {PC_9, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PF_0, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + {NC, NP, 0} +}; +#endif + +#ifdef HAL_I2C_MODULE_ENABLED +const PinMap PinMap_I2C_SCL[] = { + {PA_8, I2C3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, + {PB_6, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_8, I2C1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, + {PB_10, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PF_1, I2C2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, + #endif + {NC, NP, 0} +}; +#endif + +//*** PWM *** + +#ifdef HAL_TIM_MODULE_ENABLED +const PinMap PinMap_PWM[] = { + {PA_0, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_0, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 + {PA_1, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + //{PA_1, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 + {PA_2, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + //{PA_2, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 + //{PA_2, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PA_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + //{PA_3, TIM5, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 + //{PA_3, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PA_5, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PA_5, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + {PA_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + //{PA_6, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + //{PA_7, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PA_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PA_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N + //{PA_7, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + {PA_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PA_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PA_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PA_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + //{PA_15, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 + //{PB_0, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_0, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + //{PB_0, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + //{PB_1, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_1, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PB_1, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + //{PB_3, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 + {PB_4, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PB_5, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + //{PB_6, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + //{PB_7, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + //{PB_8, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PB_8, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + //{PB_9, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PB_9, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PB_10, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 + {PB_11, TIM2, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 + {PB_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PB_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PB_14, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N + {PB_14, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 + {PB_15, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PB_15, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N + {PB_15, TIM12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 + {PC_6, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 + {PC_6, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 + {PC_7, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 + {PC_7, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 + {PC_8, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 + {PC_8, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3 + //{PC_9, TIM3, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 + //{PC_9, TIM8, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 + {PD_12, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 + {PD_13, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 + {PD_14, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 + {PD_15, TIM4, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 + {PE_5, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 + {PE_6, TIM9, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 + {PE_8, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N + {PE_9, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 + {PE_10, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N + {PE_11, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 + {PE_12, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N + {PE_13, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 + {PE_14, TIM1, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PF_6, TIM10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 + {PF_7, TIM11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 + {PF_8, TIM13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 + {PF_9, TIM14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 + #endif + {NC, NP, 0} +}; +#endif + +//*** SERIAL *** + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_TX[] = { + {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_9, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_6, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_6, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PC_10, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_10, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_12, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_5, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_8, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_14, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_RX[] = { + {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_10, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_7, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PC_7, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PC_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, + {PC_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_2, UART5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, + {PD_6, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_9, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_9, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_RTS[] = { + {PA_1, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_12, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_14, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_4, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_12, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_8, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PG_12, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; +#endif + +#ifdef HAL_UART_MODULE_ENABLED +const PinMap PinMap_UART_CTS[] = { + {PA_0, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PA_11, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, + {PB_13, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + {PD_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, + {PD_11, USART3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_13, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + {PG_15, USART6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, + #endif + {NC, NP, 0} +}; +#endif + +//*** SPI *** + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MOSI[] = { + {PA_7, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_5, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_15, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_3, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_12, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_MISO[] = { + {PA_6, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_14, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_2, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_11, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_SCLK[] = { + {PA_5, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PB_3, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_10, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_13, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PC_10, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_SPI_MODULE_ENABLED +const PinMap PinMap_SPI_SSEL[] = { + {PA_4, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_4, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PA_15, SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI1)}, + {PA_15, SPI3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_SPI3)}, + {PB_9, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {PB_12, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_SPI2)}, + {NC, NP, 0} +}; +#endif + +//*** CAN *** + +#ifdef HAL_CAN_MODULE_ENABLED +const PinMap PinMap_CAN_RD[] = { + {PA_11, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_5, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PB_8, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_12, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PD_0, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {NC, NP, 0} +}; +#endif + +#ifdef HAL_CAN_MODULE_ENABLED +const PinMap PinMap_CAN_TD[] = { + {PA_12, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_6, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PB_9, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {PB_13, CAN2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, + {PD_1, CAN1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, + {NC, NP, 0} +}; +#endif + +//*** ETHERNET *** + +#ifdef HAL_ETH_MODULE_ENABLED +const PinMap PinMap_Ethernet[] = { + {PA_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS + {PA_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_REF_CLK|ETH_RX_CLK + {PA_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDIO + {PA_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_COL + {PA_7, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_CRS_DV|ETH_RX_DV + {PB_0, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD2 + {PB_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD3 + {PB_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + {PB_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + {PB_10, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RX_ER + {PB_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + {PB_12, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + {PB_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + {PC_1, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_MDC + {PC_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD2 + {PC_3, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_CLK + {PC_4, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD0 + {PC_5, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_RXD1 + {PE_2, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD3 + #if STM32F4X_PIN_NUM >= 144 //144 pins mcu, 114 gpio + {PG_8, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_PPS_OUT + {PG_11, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TX_EN + {PG_13, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD0 + {PG_14, ETH, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_ETH)}, // ETH_TXD1 + #endif + {NC, NP, 0} +}; +#endif + +//*** No QUADSPI *** + +//*** USB *** + +#ifdef HAL_PCD_MODULE_ENABLED +const PinMap PinMap_USB_OTG_FS[] = { + //{PA_8, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF + //{PA_9, USB_OTG_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS + //{PA_10, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID + {PA_11, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM + {PA_12, USB_OTG_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP + {NC, NP, 0} +}; +#endif + +#ifdef HAL_PCD_MODULE_ENABLED +const PinMap PinMap_USB_OTG_HS[] = { + #ifdef USE_USB_HS_IN_FS + {PA_4, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS + {PB_14, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM + {PB_15, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP + #else + {PA_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 + {PA_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK + {PB_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 + {PB_1, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 + {PB_5, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 + {PB_10, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 + {PB_11, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 + {PB_12, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 + {PB_13, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 + {PC_0, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP + {PC_2, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR + {PC_3, USB_OTG_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT + #endif /* USE_USB_HS_IN_FS */ + {NC, NP, 0} +}; +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/PinNamesVar.h new file mode 100644 index 0000000000..2424885937 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/PinNamesVar.h @@ -0,0 +1,50 @@ +/* SYS_WKUP */ +#ifdef PWR_WAKEUP_PIN1 + SYS_WKUP1 = PA_0, +#endif +#ifdef PWR_WAKEUP_PIN2 + SYS_WKUP2 = NC, +#endif +#ifdef PWR_WAKEUP_PIN3 + SYS_WKUP3 = NC, +#endif +#ifdef PWR_WAKEUP_PIN4 + SYS_WKUP4 = NC, +#endif +#ifdef PWR_WAKEUP_PIN5 + SYS_WKUP5 = NC, +#endif +#ifdef PWR_WAKEUP_PIN6 + SYS_WKUP6 = NC, +#endif +#ifdef PWR_WAKEUP_PIN7 + SYS_WKUP7 = NC, +#endif +#ifdef PWR_WAKEUP_PIN8 + SYS_WKUP8 = NC, +#endif +/* USB */ +#ifdef USBCON + USB_OTG_FS_SOF = PA_8, + USB_OTG_FS_VBUS = PA_9, + USB_OTG_FS_ID = PA_10, + USB_OTG_FS_DM = PA_11, + USB_OTG_FS_DP = PA_12, + USB_OTG_HS_ULPI_D0 = PA_3, + USB_OTG_HS_SOF = PA_4, + USB_OTG_HS_ULPI_CK = PA_5, + USB_OTG_HS_ULPI_D1 = PB_0, + USB_OTG_HS_ULPI_D2 = PB_1, + USB_OTG_HS_ULPI_D7 = PB_5, + USB_OTG_HS_ULPI_D3 = PB_10, + USB_OTG_HS_ULPI_D4 = PB_11, + USB_OTG_HS_ID = PB_12, + USB_OTG_HS_ULPI_D5 = PB_12, + USB_OTG_HS_ULPI_D6 = PB_13, + USB_OTG_HS_VBUS = PB_13, + USB_OTG_HS_DM = PB_14, + USB_OTG_HS_DP = PB_15, + USB_OTG_HS_ULPI_STP = PC_0, + USB_OTG_HS_ULPI_DIR = PC_2, + USB_OTG_HS_ULPI_NXT = PC_3, +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/hal_conf_custom.h new file mode 100644 index 0000000000..3640bd1616 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/hal_conf_custom.h @@ -0,0 +1,481 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_CUSTOM +#define __STM32F4xx_HAL_CONF_CUSTOM + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +#define HAL_ADC_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_DAC_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_GPIO_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_PWR_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_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_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 */ + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) +#define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) +#define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations +in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) +#define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED +#include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED +#include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED +#include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED +#include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED +#include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED +#include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED +#include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED +#include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/ldscript.ld new file mode 100644 index 0000000000..e83d35496a --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/ldscript.ld @@ -0,0 +1,206 @@ +/* +***************************************************************************** +** + +** File : LinkerScript.ld +** +** Abstract : Linker script for STM32F407ZGTx Device with +** 1024KByte FLASH, 128KByte RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

© COPYRIGHT(c) 2014 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20020000; /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200;; /* required amount of heap */ +_Min_Stack_Size = 0x400;; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +FLASH (rx) : ORIGIN = 0x800C000, LENGTH = 512K-48K +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text ALIGN(4): + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata ALIGN(4): + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + _siccmram = LOADADDR(.ccmram); + + /* CCM-RAM section + * + * IMPORTANT NOTE! + * If initialized variables will be placed in this section, + * the startup code needs to be modified to copy the init-values. + */ + .ccmram : + { + . = ALIGN(4); + _sccmram = .; /* create a global symbol at ccmram start */ + *(.ccmram) + *(.ccmram*) + + . = ALIGN(4); + _eccmram = .; /* create a global symbol at ccmram end */ + } >CCMRAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(4); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(4); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/variant.cpp new file mode 100644 index 0000000000..cfc7f0affd --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/variant.cpp @@ -0,0 +1,228 @@ +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#include "variant.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include "pins_arduino.h" + + +// Pin number +// This array allows to wrap Arduino pin number(Dx or x) +// to STM32 PinName (PX_n) +const PinName digitalPin[] = { + PC_13, //D0 + PC_14, //D1 - OSC32_IN + PC_15, //D2 - OSC32_OUT + PH_0, //D3 - OSC_IN + PH_1, //D4 - OSC_OUT + PB_2, //D21 - BOOT1 + PB_10, //D22 - 1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + PB_11, //D23 - 1:I2C2_SDA / USART3_RX / TIM2_CH4 + PB_12, //D24 - 1:SPI2_NSS / OTG_HS_ID + PB_13, //D25 - 1:SPI2_SCK 2:OTG_HS_VBUS + PB_14, //D26 - 1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + PB_15, //D27 - SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + PC_6, //D28 - 1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + PC_7, //D29 - 1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + PC_8, //D30 - 1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + PC_9, //D31 - 1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + PA_8, //D32 - 1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + PA_9, //D33 - 1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + PA_10, //34 - 1:USART1_RX / TIM1_CH3 / OTG_FS_ID + PA_11, //D35 - 1:TIM1_CH4 / OTG_FS_DM + PA_12, //D36 - 1:OTG_FS_DP + PA_13, //D37 - 0:JTMS-SWDIO + PA_14, //D38 - 0:JTCK-SWCLK + PA_15, //D39 - 0:JTDI 1:SPI3_NSS / SPI1_NSS + PC_10, //D40 - 1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + PC_11, //D41 - 1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + PC_12, //D42 - 1:UART5_TX / SPI3_MOSI / SDIO_CK + PD_2, //D43 - 1:UART5_RX / SDIO_CMD + PB_3, //D44 - 0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + PB_4, //D45 - 0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + PB_5, //D45 - 1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + PB_6, //D47 - 1:I2C1_SCL / TIM4_CH1 / USART1_TX + PB_7, //D48 - 1:I2C1_SDA / TIM4_CH2 / USART1_RX + PB_8, //D49 - 1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + PB_9, //D50 - 1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + PE_2, //D51 - 1:FSMC_A23 + PE_3, //D52 - 1:FSMC_A19 + PE_4, //D53 - 1:FSMC_A20 + PE_5, //D54 - 1:FSMC_A21 + PE_6, //D55 - 1:FSMC_A22 + PE_7, //D56 - 1:FSMC_D4 + PE_8, //D57 - 1:FSMC_D5 + PE_9, //D58 - 1:FSMC_D6 / TIM1_CH1 + PE_10, //D59 - 1:FSMC_D7 + PE_11, //D60 - 1:FSMC_D8 / TIM1_CH2 + PE_12, //D61 - 1:FSMC_D9 + PE_13, //D62 - 1:FSMC_D10 / TIM1_CH3 + PE_14, //D63 - 1:FSMC_D11 / TIM1_CH4 + PE_15, //D64 - 1:FSMC_D12 + PD_8, //D65 - 1:FSMC_D13 / USART3_TX + PD_9, //D66 - 1:FSMC_D14 / USART3_RX + PD_10, //D67 - 1:FSMC_D15 + PD_11, //D68 - 1:FSMC_A16 + PD_12, //D69 - 1:FSMC_A17 / TIM4_CH1 + PD_13, //D70 - 1:FSMC_A18 / TIM4_CH2 + PD_14, //D71 - 1:FSMC_D0 / TIM4_CH3 + PD_15, //D72 - 1:FSMC_D1 / TIM4_CH4 + PD_0, //D73 - 1:FSMC_D2 + PD_1, //D74 - 1:FSMC_D3 + PD_3, //D75 - 1:FSMC_CLK + PD_4, //D76 - 1:FSMC_NOE + PD_5, //D77 - 1:USART2_TX + PD_6, //D78 - 1:USART2_RX + PD_7, //D79 + PE_0, //D80 + PE_1, //D81 + PF_0, //D82 - 1:FSMC_A0 / I2C2_SDA + PF_1, //D83 - 1:FSMC_A1 / I2C2_SCL + PF_2, //D84 - 1:FSMC_A2 + PF_11, //D93 + PF_12, //D94 - 1:FSMC_A6 + PF_13, //D95 - 1:FSMC_A7 + PF_14, //D96 - 1:FSMC_A8 + PF_15, //D97 - 1:FSMC_A9 + PG_0, //D98 - 1:FSMC_A10 + PG_1, //D99 - 1:FSMC_A11 + PG_2, //D100 - 1:FSMC_A12 + PG_3, //D101 - 1:FSMC_A13 + PG_4, //D102 - 1:FSMC_A14 + PG_5, //D103 - 1:FSMC_A15 + PG_6, //D104 + PG_7, //D105 + PG_8, //D106 + PG_9, //D107 - 1:USART6_RX + PG_10, //D108 - 1:FSMC_NE3 + PG_11, //D109 + PG_12, //D110 - 1:FSMC_NE4 + PG_13, //D111 - 1:FSMC_A24 + PG_14, //D112 - 1:FSMC_A25 / USART6_TX + PG_15, //D113 + PA_0, //D140/A0 = D9 - 1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + PA_1, //D141/A1 = D10 - 1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + PA_2, //D142/A2 = D11 - 1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + PA_3, //D143/A3 = D12 - 1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + PA_4, //D144/A4 = D13 - NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + PA_5, //D145/A5 = D14 - NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + PA_6, //D146/A6 = D15 - 1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + PA_7, //D147/A7 = D16 - 1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + PB_0, //D148/A8 = D19 - 1:TIM3_CH3 2:ADC12_IN8 + PB_1, //D149/A9 = D20 - 1:TIM3_CH4 2:ADC12_IN9 + PC_0, //D150/A10 = D5 - 1: 2:ADC123_IN10 + PC_1, //D151/A11 = D6 - 1: 2:ADC123_IN11 + PC_2, //D152/A12 = D7 - 1:SPI2_MISO 2:ADC123_IN12 + PC_3, //D153/A13 = D8 - 1:SPI2_MOSI 2:ADC123_IN13 + PC_4, //D154/A14 = D17 - 1: 2:ADC12_IN14 + PC_5, //D155/A15 = D18 - 1: 2:ADC12_IN15 + PF_3, //D156/A16 = D85 - 1:FSMC_A3 2:ADC3_IN9 + PF_4, //D157/A17 = D86 - 1:FSMC_A4 2:ADC3_IN14 + PF_5, //D158/A18 = D87 - 1:FSMC_A5 2:ADC3_IN15 + PF_6, //D159/A19 = D88 - 1:TIM10_CH1 2:ADC3_IN4 + PF_7, //D160/A20 = D89 - 1:TIM11_CH1 2:ADC3_IN5 + PF_8, //D161/A21 = D90 - 1:TIM13_CH1 2:ADC3_IN6 + PF_9, //D162/A22 = D91 - 1;TIM14_CH1 2:ADC3_IN7 + PF_10, //D163/A23 = D92 - 2:ADC3_IN8 +}; + +#ifdef __cplusplus +} +#endif + +// ------------------------ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief System Clock Configuration + * @param None + * @retval None + */ +WEAK void SystemClock_Config(void) +{ + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +#ifdef __cplusplus +} +#endif diff --git a/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/variant.h new file mode 100644 index 0000000000..51c2935798 --- /dev/null +++ b/buildroot/share/PlatformIO/variants/MARLIN_MKS_ROBIN2/variant.h @@ -0,0 +1,242 @@ + +/* + ******************************************************************************* + * Copyright (c) 2017, STMicroelectronics + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ******************************************************************************* + */ + +#ifndef _VARIANT_ARDUINO_STM32_ +#define _VARIANT_ARDUINO_STM32_ + +/*---------------------------------------------------------------------------- + * Headers + *----------------------------------------------------------------------------*/ +// #include "PeripheralPins.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/*---------------------------------------------------------------------------- + * Pins + *----------------------------------------------------------------------------*/ +//extern const PinName digitalPin[]; + + #define PC13 0 + #define PC14 1 //OSC32_IN + #define PC15 2 //OSC32_OUT + #define PH0 3 //OSC_IN + #define PH1 4 //OSC_OUT + #define PB2 5 //BOOT1 + #define PB10 6 //1:SPI2_SCK / I2C2_SCL / USART3_TX / TIM2_CH3 + #define PB11 7 //1:I2C2_SDA / USART3_RX / TIM2_CH4 + #define PB12 8 //1:SPI2_NSS / OTG_HS_ID + #define PB13 9 //1:SPI2_SCK 2:OTG_HS_VBUS + #define PB14 10 //1:SPI2_MISO / TIM12_CH1 / OTG_HS_DM + #define PB15 11 //SPI2_MOSI / TIM12_CH2 / OTG_HS_DP + #define PC6 12 //1:TIM8_CH1 / SDIO_D6 / USART6_TX / TIM3_CH1 + #define PC7 13 //1:TIM8_CH2 / SDIO_D7 / USART6_RX / TIM3_CH2 + #define PC8 14 //1:TIM8_CH3 / SDIO_D0 / TIM3_CH3 + #define PC9 15 //1:TIM8_CH4 / SDIO_D1 / TIM3_CH4 + #define PA8 16 //1:TIM1_CH1 / I2C3_SCL / OTG_FS_SOF + #define PA9 17 //1:USART1_TX / TIM1_CH2 2:OTG_FS_VBUS + #define PA10 18 //1:USART1_RX / TIM1_CH3 / OTG_FS_ID + #define PA11 19 //1:TIM1_CH4 / OTG_FS_DM + #define PA12 20 //1:OTG_FS_DP + #define PA13 21 //0:JTMS-SWDIO + #define PA14 22 //0:JTCK-SWCLK + #define PA15 23 //0:JTDI 1:SPI3_NSS / SPI1_NSS + #define PC10 24 //1:UART4_TX / SPI3_SCK / SDIO_D2 / USART3_TX + #define PC11 25 //1:UART4_RX / SPI3_MISO / SDIO_D3 / USART3_RX + #define PC12 26 //1:UART5_TX / SPI3_MOSI / SDIO_CK + #define PD2 27 //1:UART5_RX / SDIO_CMD + #define PB3 28 //0:JTDO 1:SPI3_SCK / TIM2_CH2 / SPI1_SCK + #define PB4 29 //0:NJTRST 1:SPI3_MISO / TIM3_CH1 / SPI1_MISO + #define PB5 30 //1:TIM3_CH2 / SPI1_MOSI / SPI3_MOSI + #define PB6 31 //1:I2C1_SCL / TIM4_CH1 / USART1_TX + #define PB7 32 //1:I2C1_SDA / TIM4_CH2 / USART1_RX + #define PB8 33 //1:I2C1_SCL / TIM4_CH3 / SDIO_D4 / TIM10_CH1 + #define PB9 34 //1:I2C1_SDA / TIM4_CH4 / SDIO_D5 / TIM11_CH1 / SPI2_NSS + #define PE2 35 //1:FSMC_A23 + #define PE3 36 //1:FSMC_A19 + #define PE4 37 //1:FSMC_A20 + #define PE5 38 //1:FSMC_A21 + #define PE6 39 //1:FSMC_A22 + #define PE7 40 //1:FSMC_D4 + #define PE8 41 //1:FSMC_D5 + #define PE9 42 //1:FSMC_D6 / TIM1_CH1 + #define PE10 43 //1:FSMC_D7 + #define PE11 44 //1:FSMC_D8 / TIM1_CH2 + #define PE12 45 //1:FSMC_D9 + #define PE13 46 //1:FSMC_D10 / TIM1_CH3 + #define PE14 47 //1:FSMC_D11 / TIM1_CH4 + #define PE15 48 //1:FSMC_D12 + #define PD8 49 //1:FSMC_D13 / USART3_TX + #define PD9 50 //1:FSMC_D14 / USART3_RX + #define PD10 51 //1:FSMC_D15 + #define PD11 52 //1:FSMC_A16 + #define PD12 53 //1:FSMC_A17 / TIM4_CH1 + #define PD13 54 //1:FSMC_A18 / TIM4_CH2 + #define PD14 55 //1:FSMC_D0 / TIM4_CH3 + #define PD15 56 //1:FSMC_D1 / TIM4_CH4 + #define PD0 57 //1:FSMC_D2 + #define PD1 58 //1:FSMC_D3 + #define PD3 59 //1:FSMC_CLK + #define PD4 60 //1:FSMC_NOE + #define PD5 61 //1:USART2_TX + #define PD6 62 //1:USART2_RX + #define PD7 63 + #define PE0 64 + #define PE1 65 + #define PF0 66 //1:FSMC_A0 / I2C2_SDA + #define PF1 67 //1:FSMC_A1 / I2C2_SCL + #define PF2 68 //1:FSMC_A2 + #define PF11 69 + #define PF12 70 //1:FSMC_A6 + #define PF13 71 //1:FSMC_A7 + #define PF14 72 //1:FSMC_A8 + #define PF15 73 //1:FSMC_A9 + #define PG0 74 //1:FSMC_A10 + #define PG1 75 //1:FSMC_A11 + #define PG2 76 //1:FSMC_A12 + #define PG3 77 //1:FSMC_A13 + #define PG4 78 //1:FSMC_A14 + #define PG5 79 //1:FSMC_A15 + #define PG6 80 + #define PG7 81 + #define PG8 82 + #define PG9 83 //1:USART6_RX + #define PG10 84 //1:FSMC_NE3 + #define PG11 85 + #define PG12 86 //1:FSMC_NE4 + #define PG13 87 //1:FSMC_A24 + #define PG14 88 //1:FSMC_A25 / USART6_TX + #define PG15 89 + #define PA0 90 //1:UART4_TX / TIM5_CH1 2:ADC123_IN0 + #define PA1 91 //1:UART4_RX / TIM5_CH2 / TIM2_CH2 2:ADC123_IN1 + #define PA2 92 //1:USART2_TX /TIM5_CH3 / TIM9_CH1 / TIM2_CH3 2:ADC123_IN2 + #define PA3 93 //1:USART2_RX /TIM5_CH4 / TIM9_CH2 / TIM2_CH4 2:ADC123_IN3 + #define PA4 94 //NOT FT 1:SPI1_NSS / SPI3_NSS / USART2_CK 2:ADC12_IN4 / DAC_OUT1 + #define PA5 95 //NOT FT 1:SPI1_SCK 2:ADC12_IN5 / DAC_OUT2 + #define PA6 96 //1:SPI1_MISO / TIM13_CH1 / TIM3_CH1 2:ADC12_IN6 + #define PA7 97 //1:SPI1_MOSI / TIM14_CH1 / TIM3_CH2 2:ADC12_IN7 + #define PB0 98 //1:TIM3_CH3 2:ADC12_IN8 + #define PB1 99 //1:TIM3_CH4 2:ADC12_IN9 + #define PC0 100 //1: 2:ADC123_IN10 + #define PC1 101 //1: 2:ADC123_IN11 + #define PC2 102 //1:SPI2_MISO 2:ADC123_IN12 + #define PC3 103 //1:SPI2_MOSI 2:ADC123_IN13 + #define PC4 104 //1: 2:ADC12_IN14 + #define PC5 105 //1: 2:ADC12_IN15 + #define PF3 106 //1:FSMC_A3 2:ADC3_IN9 + #define PF4 107 //1:FSMC_A4 2:ADC3_IN14 + #define PF5 108 //1:FSMC_A5 2:ADC3_IN15 + #define PF6 109 //1:TIM10_CH1 2:ADC3_IN4 + #define PF7 110 //1:TIM11_CH1 2:ADC3_IN5 + #define PF8 111 //1:TIM13_CH1 2:ADC3_IN6 + #define PF9 112 //1;TIM14_CH1 2:ADC3_IN7 + #define PF10 113 //2:ADC3_IN8 + +// This must be a literal +#define NUM_DIGITAL_PINS 114 +// This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS +#define NUM_ANALOG_INPUTS 24 +#define NUM_ANALOG_FIRST 90 + +// Below ADC, DAC and PWM definitions already done in the core +// Could be redefined here if needed +// ADC resolution is 12bits +//#define ADC_RESOLUTION 12 +//#define DACC_RESOLUTION 12 + +// PWM resolution +#define PWM_RESOLUTION 8 +#define PWM_FREQUENCY 20000 +#define PWM_MAX_DUTY_CYCLE 255 + +// Below SPI and I2C definitions already done in the core +// Could be redefined here if differs from the default one +// SPI Definitions +#define PIN_SPI_MOSI PB15 +#define PIN_SPI_MISO PB14 +#define PIN_SPI_SCK PB13 +#define PIN_SPI_SS PB12 + +// I2C Definitions +#define PIN_WIRE_SDA PB7 +#define PIN_WIRE_SCL PB6 + +// Timer Definitions +//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c +#define TIMER_TONE TIM6 + +// Do not use basic timer: OC is required +#define TIMER_SERVO TIM2 //TODO: advanced-control timers don't work + +// UART Definitions +// Define here Serial instance number to map on Serial generic name +#define SERIAL_UART_INSTANCE 3 //ex: 2 for Serial2 (USART2) +// DEBUG_UART could be redefined to print on another instance than 'Serial' +//#define DEBUG_UART ((USART_TypeDef *) U(S)ARTX) // ex: USART3 +// DEBUG_UART baudrate, default: 9600 if not defined +//#define DEBUG_UART_BAUDRATE x +// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART +//#define DEBUG_PINNAME_TX PX_n // PinName used for TX + +// Default pin used for 'Serial' instance (ex: ST-Link) +// Mandatory for Firmata +#define PIN_SERIAL_RX PB11//PA10 +#define PIN_SERIAL_TX PB10//PA9 + +#ifdef __cplusplus +} // extern "C" +#endif +/*---------------------------------------------------------------------------- + * Arduino objects - C++ only + *----------------------------------------------------------------------------*/ + +#ifdef __cplusplus +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial +#define SERIAL_PORT_HARDWARE Serial1 +#endif + +#endif /* _VARIANT_ARDUINO_STM32_ */ diff --git a/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board/board.h b/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board/board.h index 80261d3027..5664a1ad2c 100644 --- a/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board/board.h +++ b/buildroot/share/PlatformIO/variants/marlin_maple_CHITU_F103/board/board.h @@ -100,12 +100,12 @@ /* * SDIO Pins */ -#define BOARD_SDIO_D0 PC8 -#define BOARD_SDIO_D1 PC9 -#define BOARD_SDIO_D2 PC10 -#define BOARD_SDIO_D3 PC11 -#define BOARD_SDIO_CLK PC12 -#define BOARD_SDIO_CMD PD2 +#define BOARD_SDIO_D0 PC8 +#define BOARD_SDIO_D1 PC9 +#define BOARD_SDIO_D2 PC10 +#define BOARD_SDIO_D3 PC11 +#define BOARD_SDIO_CLK PC12 +#define BOARD_SDIO_CMD PD2 /* Pin aliases: these give the GPIO port/bit for each pin as an * enum. These are optional, but recommended. They make it easier to diff --git a/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board/board.h b/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board/board.h index 6ffa244746..24458fe79a 100644 --- a/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board/board.h +++ b/buildroot/share/PlatformIO/variants/marlin_maple_MEEB_3DP/board/board.h @@ -100,12 +100,12 @@ /* * SDIO Pins */ -#define BOARD_SDIO_D0 PC8 -#define BOARD_SDIO_D1 PC9 -#define BOARD_SDIO_D2 PC10 -#define BOARD_SDIO_D3 PC11 -#define BOARD_SDIO_CLK PC12 -#define BOARD_SDIO_CMD PD2 +#define BOARD_SDIO_D0 PC8 +#define BOARD_SDIO_D1 PC9 +#define BOARD_SDIO_D2 PC10 +#define BOARD_SDIO_D3 PC11 +#define BOARD_SDIO_CLK PC12 +#define BOARD_SDIO_CMD PD2 /* Pin aliases: these give the GPIO port/bit for each pin as an * enum. These are optional, but recommended. They make it easier to diff --git a/buildroot/share/cmake/CMakeLists.txt b/buildroot/share/cmake/CMakeLists.txt index 1ed9091e01..b861f79b95 100644 --- a/buildroot/share/cmake/CMakeLists.txt +++ b/buildroot/share/cmake/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 2.8.12) #====================================================================# # Usage under Linux: # # # @@ -24,21 +24,67 @@ set(SCRIPT_BRANCH 1.0.2) #Set to wanted marlin-cmake release tag or branch if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake) - file(DOWNLOAD https://github.com/tohara/marlin-cmake/archive/${SCRIPT_BRANCH}.tar.gz - ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake-src.tar.gz SHOW_PROGRESS) + file(DOWNLOAD https://github.com/tohara/marlin-cmake/archive/${SCRIPT_BRANCH}.tar.gz + ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake-src.tar.gz SHOW_PROGRESS) - execute_process(COMMAND ${CMAKE_COMMAND} -E tar -xvf ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake-src.tar.gz WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) - - file(RENAME ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake-${SCRIPT_BRANCH} ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake) - file(REMOVE ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake-src.tar.gz) + execute_process(COMMAND ${CMAKE_COMMAND} -E tar -xvf ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake-src.tar.gz WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + file(RENAME ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake-${SCRIPT_BRANCH} ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake) + file(REMOVE ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake-src.tar.gz) endif() -if(WIN32 AND NOT EXISTS ${CMAKE_BINARY_DIR}/make.exe) - file(COPY ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/resources/make.exe DESTINATION ${CMAKE_BINARY_DIR}/) +if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/modules/Arduino_SDK.cmake) + file(DOWNLOAD https://raw.githubusercontent.com/tohara/marlin-cmake/master/modules/Arduino_SDK.cmake + ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/modules/Arduino_SDK.cmake SHOW_PROGRESS) endif() +if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/modules/marlin_cmake_functions.cmake) + file(DOWNLOAD https://raw.githubusercontent.com/tohara/marlin-cmake/master/modules/marlin_cmake_functions.cmake + ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/modules/marlin_cmake_functions.cmake SHOW_PROGRESS) +endif() + +if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/Platform/Arduino.cmake) + file(DOWNLOAD https://raw.githubusercontent.com/tohara/marlin-cmake/master/Platform/Arduino.cmake + ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/Platform/Arduino.cmake SHOW_PROGRESS) +endif() + +if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/settings/marlin_boards.txt) + file(DOWNLOAD https://raw.githubusercontent.com/tohara/marlin-cmake/master/settings/marlin_boards.txt + ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/settings/marlin_boards.txt SHOW_PROGRESS) +endif() + +if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/toolchain/ArduinoToolchain.cmake) + file(DOWNLOAD https://raw.githubusercontent.com/tohara/marlin-cmake/master/toolchain/ArduinoToolchain.cmake + ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/toolchain/ArduinoToolchain.cmake SHOW_PROGRESS) +endif() + +if(WIN32) + if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/resources/make.exe) + file(DOWNLOAD https://raw.githubusercontent.com/tohara/marlin-cmake/master/resources/make.exe + ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/resources/make.exe SHOW_PROGRESS) + endif() +endif(WIN32) + +if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/arduino-1.8.19) + + file(DOWNLOAD https://downloads.arduino.cc/arduino-1.8.19-windows.zip + ${CMAKE_CURRENT_LIST_DIR}/arduino-1.8.19-windows.zip SHOW_PROGRESS) + + execute_process(COMMAND ${CMAKE_COMMAND} -E tar -xvzf ${CMAKE_CURRENT_LIST_DIR}/arduino-1.8.19-windows.zip WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + + file(REMOVE ${CMAKE_CURRENT_LIST_DIR}/arduino-1.8.19-windows.zip) + +endif() + +# Print CMake version +message("-- Running CMake version: " ${CMAKE_VERSION}) + +# Replace the CMake Ver. in the Arduino.cmake +file(READ "${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/Platform/Arduino.cmake" ORIGINAL_FILE_CONTENTS) +string(REPLACE "cmake_minimum_required(VERSION 2.8.5)" "cmake_minimum_required(VERSION 2.8.12)" NEW_FILE_CONTENTS "${ORIGINAL_FILE_CONTENTS}") +file(WRITE "${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/Platform/Arduino.cmake" "${NEW_FILE_CONTENTS}") + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/marlin-cmake/modules) #====================================================================# @@ -46,7 +92,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/marlin-cma # It can also be set from command line. eg.: # # cmake .. -DARDUINO_SDK_PATH="/path/to/arduino-1.x.x" # #====================================================================# -#set(ARDUINO_SDK_PATH ${CMAKE_CURRENT_LIST_DIR}/arduino-1.6.8) +set(ARDUINO_SDK_PATH ${CMAKE_CURRENT_LIST_DIR}/arduino-1.8.19) #set(ARDUINO_SDK_PATH /Applications/Arduino.app/Contents/Java) #set(ARDUINO_SDK_PATH $HOME/ArduinoAddons/Arduino_1.6.x) #====================================================================# @@ -79,7 +125,6 @@ project(Marlin C CXX) print_board_list() print_programmer_list() - #====================================================================# # Get motherboard settings from Configuration.h # # setup_motherboard(TARGET Marlin_src_folder) # @@ -105,9 +150,9 @@ set(${PROJECT_NAME}_SRCS "${SOURCES};../../../Marlin/Marlin.ino") # cmake .. -DUPLOAD_PORT=/dev/ttyACM0 # #====================================================================# if(UPLOAD_PORT) - set(${PROJECT_NAME}_PORT ${UPLOAD_PORT}) + set(${PROJECT_NAME}_PORT ${UPLOAD_PORT}) else() - set(${PROJECT_NAME}_PORT /dev/ttyACM0) + set(${PROJECT_NAME}_PORT /dev/ttyACM0) endif() #====================================================================# diff --git a/buildroot/share/git/mfconfig b/buildroot/share/git/mfconfig index 8528859446..0c4a0de5c8 100755 --- a/buildroot/share/git/mfconfig +++ b/buildroot/share/git/mfconfig @@ -144,7 +144,7 @@ if [[ $ACTION == "init" ]]; then find config -name "Conf*.h" -print0 | while read -d $'\0' fn ; do fldr=$(dirname "$fn") blank_line=$(awk '/^\s*$/ {print NR; exit}' "$fn") - $SED -i~ "${blank_line}i\\\n#define CONFIG_EXAMPLES_DIR \"$fldr\"\\ " "$fn" + $SED -i~ "${blank_line}i\\\n#define CONFIG_EXAMPLES_DIR \"$fldr\"" "$fn" rm -f "$fn~" done } diff --git a/buildroot/share/scripts/MarlinBinaryProtocol.py b/buildroot/share/scripts/MarlinBinaryProtocol.py index ecf9df35e2..dca5e167f7 100644 --- a/buildroot/share/scripts/MarlinBinaryProtocol.py +++ b/buildroot/share/scripts/MarlinBinaryProtocol.py @@ -11,11 +11,14 @@ import sys import datetime import random try: - import heatshrink + import heatshrink2 as heatshrink heatshrink_exists = True except ImportError: - heatshrink_exists = False - + try: + import heatshrink + heatshrink_exists = True + except ImportError: + heatshrink_exists = False def millis(): return time.perf_counter() * 1000 @@ -393,18 +396,19 @@ class FileTransferProtocol(object): def copy(self, filename, dest_filename, compression, dummy): self.connect() - compression_support = heatshrink_exists and self.compression['algorithm'] == 'heatshrink' and compression - if compression and (not heatshrink_exists or not self.compression['algorithm'] == 'heatshrink'): - print("Compression not supported by client") - #compression_support = False + has_heatshrink = heatshrink_exists and self.compression['algorithm'] == 'heatshrink' + if compression and not has_heatshrink: + hs = '2' if sys.version_info[0] > 2 else '' + print("Compression not supported by client. Use 'pip install heatshrink%s' to fix." % hs) + compression = False data = open(filename, "rb").read() filesize = len(data) - self.open(dest_filename, compression_support, dummy) + self.open(dest_filename, compression, dummy) block_size = self.protocol.block_size - if compression_support: + if compression: data = heatshrink.encode(data, window_sz2=self.compression['window'], lookahead_sz2=self.compression['lookahead']) cratio = filesize / len(data) @@ -419,17 +423,17 @@ class FileTransferProtocol(object): self.write(data[start:end]) kibs = (( (i+1) * block_size) / 1024) / (millis() + 1 - start_time) * 1000 if (i / blocks) >= dump_pctg: - print("\r{0:2.0f}% {1:4.2f}KiB/s {2} Errors: {3}".format((i / blocks) * 100, kibs, "[{0:4.2f}KiB/s]".format(kibs * cratio) if compression_support else "", self.protocol.errors), end='') + print("\r{0:2.0f}% {1:4.2f}KiB/s {2} Errors: {3}".format((i / blocks) * 100, kibs, "[{0:4.2f}KiB/s]".format(kibs * cratio) if compression else "", self.protocol.errors), end='') dump_pctg += 0.1 if self.protocol.errors > 0: # Dump last status (errors may not be visible) - print("\r{0:2.0f}% {1:4.2f}KiB/s {2} Errors: {3} - Aborting...".format((i / blocks) * 100, kibs, "[{0:4.2f}KiB/s]".format(kibs * cratio) if compression_support else "", self.protocol.errors), end='') + print("\r{0:2.0f}% {1:4.2f}KiB/s {2} Errors: {3} - Aborting...".format((i / blocks) * 100, kibs, "[{0:4.2f}KiB/s]".format(kibs * cratio) if compression else "", self.protocol.errors), end='') print("") # New line to break the transfer speed line self.close() print("Transfer aborted due to protocol errors") #raise Exception("Transfer aborted due to protocol errors") return False; - print("\r{0:2.0f}% {1:4.2f}KiB/s {2} Errors: {3}".format(100, kibs, "[{0:4.2f}KiB/s]".format(kibs * cratio) if compression_support else "", self.protocol.errors)) # no one likes transfers finishing at 99.8% + print("\r{0:2.0f}% {1:4.2f}KiB/s {2} Errors: {3}".format(100, kibs, "[{0:4.2f}KiB/s]".format(kibs * cratio) if compression else "", self.protocol.errors)) # no one likes transfers finishing at 99.8% if not self.close(): print("Transfer failed") diff --git a/buildroot/share/scripts/exportTranslations.py b/buildroot/share/scripts/exportTranslations.py new file mode 100755 index 0000000000..620c2e77b1 --- /dev/null +++ b/buildroot/share/scripts/exportTranslations.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python3 +# +# exportTranslations.py +# +# Export LCD language strings to CSV files for easier translation. +# Use importTranslations.py to import CSV into the language files. +# + +import re +from pathlib import Path + +# Write multiple sheets if true, otherwise write one giant sheet +MULTISHEET = True + +# Where to look for the language files +LANGHOME = "Marlin/src/lcd/language" + +# Check for the path to the language files +if not Path(LANGHOME).is_dir(): + print("Error: Couldn't find the '%s' directory." % LANGHOME) + print("Edit LANGHOME or cd to the root of the repo before running.") + exit(1) + +# A dictionary to contain language names +LANGNAME = { + 'an': "Aragonese", + 'bg': "Bulgarian", + 'ca': "Catalan", + 'cz': "Czech", + 'da': "Danish", + 'de': "German", + 'el': "Greek", 'el_CY': "Greek (Cyprus)", 'el_gr': "Greek (Greece)", + 'en': "English", + 'es': "Spanish", + 'eu': "Basque-Euskera", + 'fi': "Finnish", + 'fr': "French", 'fr_na': "French (no accent)", + 'gl': "Galician", + 'hr': "Croatian (Hrvatski)", + 'hu': "Hungarian / Magyar", + 'it': "Italian", + 'jp_kana': "Japanese (Kana)", + 'ko_KR': "Korean", + 'nl': "Dutch", + 'pl': "Polish", + 'pt': "Portuguese", 'pt_br': "Portuguese (Brazil)", + 'ro': "Romanian", + 'ru': "Russian", + 'sk': "Slovak", + 'sv': "Swedish", + 'tr': "Turkish", + 'uk': "Ukrainian", + 'vi': "Vietnamese", + 'zh_CN': "Simplified Chinese", 'zh_TW': "Traditional Chinese" +} + +# A limit just for testing +LIMIT = 0 + +# A dictionary to contain strings for each language. +# Init with 'en' so English will always be first. +language_strings = { 'en': 0 } + +# A dictionary to contain all distinct LCD string names +names = {} + +# Get all "language_*.h" files +langfiles = sorted(list(Path(LANGHOME).glob('language_*.h'))) + +# Read each language file +for langfile in langfiles: + # Get the language code from the filename + langcode = langfile.name.replace('language_', '').replace('.h', '') + + # Skip 'test' and any others that we don't want + if langcode in ['test']: continue + + # Open the file + f = open(langfile, 'r', encoding='utf-8') + if not f: continue + + # Flags to indicate a wide or tall section + wideflag = False + tallflag = False + # A counter for the number of strings in the file + stringcount = 0 + # A dictionary to hold all the strings + strings = { 'narrow': {}, 'wide': {}, 'tall': {} } + # Read each line in the file + for line in f: + # Clean up the line for easier parsing + line = line.split("//")[0].strip() + if line.endswith(';'): line = line[:-1].strip() + + # Check for wide or tall sections, assume no complicated nesting + if line.startswith("#endif") or line.startswith("#else"): + wideflag = False + tallflag = False + elif re.match(r'#if.*WIDTH\s*>=?\s*2[01].*', line): wideflag = True + elif re.match(r'#if.*LCD_HEIGHT\s*>=?\s*4.*', line): tallflag = True + + # For string-defining lines capture the string data + match = re.match(r'LSTR\s+([A-Z0-9_]+)\s*=\s*(.+)\s*', line) + if match: + # The name is the first captured group + name = match.group(1) + # The value is the second captured group + value = match.group(2) + # Replace escaped quotes temporarily + value = value.replace('\\"', '__Q__') + + # Remove all _UxGT wrappers from the value in a non-greedy way + value = re.sub(r'_UxGT\((".*?")\)', r'\1', value) + + # Multi-line strings will get one or more bars | for identification + multiline = 0 + multimatch = re.match(r'.*MSG_(\d)_LINE\s*\(\s*(.+?)\s*\).*', value) + if multimatch: + multiline = int(multimatch.group(1)) + value = '|' + re.sub(r'"\s*,\s*"', '|', multimatch.group(2)) + + # Wrap inline defines in parentheses + value = re.sub(r' *([A-Z0-9]+_[A-Z0-9_]+) *', r'(\1)', value) + # Remove quotes around strings + value = re.sub(r'"(.*?)"', r'\1', value).replace('__Q__', '"') + # Store all unique names as dictionary keys + names[name] = 1 + # Store the string as narrow or wide + strings['tall' if tallflag else 'wide' if wideflag else 'narrow'][name] = value + + # Increment the string counter + stringcount += 1 + # Break for testing + if LIMIT and stringcount >= LIMIT: break + + # Close the file + f.close() + # Store the array in the dict + language_strings[langcode] = strings + +# Get the language codes from the dictionary +langcodes = list(language_strings.keys()) + +# Print the array +#print(language_strings) + +# Write a single language entry to the CSV file with narrow, wide, and tall strings +def write_csv_lang(f, strings, name): + f.write(',') + if name in strings['narrow']: f.write('"%s"' % strings['narrow'][name]) + f.write(',') + if name in strings['wide']: f.write('"%s"' % strings['wide'][name]) + f.write(',') + if name in strings['tall']: f.write('"%s"' % strings['tall'][name]) + +if MULTISHEET: + # + # Export a separate sheet for each language + # + OUTDIR = 'csv-out' + Path.mkdir(Path(OUTDIR), exist_ok=True) + + for lang in langcodes: + f = open("%s/language_%s.csv" % (OUTDIR, lang), 'w', encoding='utf-8') + if not f: continue + + lname = lang + ' ' + LANGNAME[lang] + header = ['name', lname, lname + ' (wide)', lname + ' (tall)'] + f.write('"' + '","'.join(header) + '"\n') + + for name in names.keys(): + f.write('"' + name + '"') + write_csv_lang(f, language_strings[lang], name) + f.write('\n') + f.close() + +else: + # + # Export one large sheet containing all languages + # + f = open("languages.csv", 'w', encoding='utf-8') + if f: + header = ['name'] + for lang in langcodes: + lname = lang + ' ' + LANGNAME[lang] + header += [lname, lname + ' (wide)', lname + ' (tall)'] + f.write('"' + '","'.join(header) + '"\n') + + for name in names.keys(): + f.write('"' + name + '"') + for lang in langcodes: write_csv_lang(f, language_strings[lang], name) + f.write('\n') + f.close() diff --git a/buildroot/share/scripts/findMissingTranslations.sh b/buildroot/share/scripts/findMissingTranslations.sh index 24a2a910a2..366075d5b9 100755 --- a/buildroot/share/scripts/findMissingTranslations.sh +++ b/buildroot/share/scripts/findMissingTranslations.sh @@ -9,6 +9,29 @@ # If no language codes are specified then all languages will be checked # +langname() { + case "$1" in + an ) echo "Aragonese" ;; bg ) echo "Bulgarian" ;; + ca ) echo "Catalan" ;; cz ) echo "Czech" ;; + da ) echo "Danish" ;; de ) echo "German" ;; + el ) echo "Greek" ;; el_CY ) echo "Greek (Cyprus)" ;; + el_gr) echo "Greek (Greece)" ;; en ) echo "English" ;; + es ) echo "Spanish" ;; eu ) echo "Basque-Euskera" ;; + fi ) echo "Finnish" ;; fr ) echo "French" ;; + fr_na) echo "French (no accent)" ;; gl ) echo "Galician" ;; + hr ) echo "Croatian (Hrvatski)" ;; hu ) echo "Hungarian / Magyar" ;; + it ) echo "Italian" ;; jp_kana) echo "Japanese (Kana)" ;; + ko_KR) echo "Korean" ;; nl ) echo "Dutch" ;; + pl ) echo "Polish" ;; pt ) echo "Portuguese" ;; + pt_br) echo "Portuguese (Brazil)" ;; ro ) echo "Romanian" ;; + ru ) echo "Russian" ;; sk ) echo "Slovak" ;; + sv ) echo "Swedish" ;; tr ) echo "Turkish" ;; + uk ) echo "Ukrainian" ;; vi ) echo "Vietnamese" ;; + zh_CN) echo "Simplified Chinese" ;; zh_TW ) echo "Traditional Chinese" ;; + * ) echo "" ;; + esac +} + LANGHOME="Marlin/src/lcd/language" [ -d $LANGHOME ] && cd $LANGHOME @@ -20,7 +43,7 @@ TEST_LANGS="" if [[ -n $@ ]]; then for K in "$@"; do for F in $FILES; do - [[ "$F" != "${F%$K*}" ]] && TEST_LANGS+="$F " + [[ $F == $K ]] && TEST_LANGS+="$F " done done [[ -z $TEST_LANGS ]] && { echo "No languages matching $@." ; exit 0 ; } @@ -28,20 +51,54 @@ else TEST_LANGS=$FILES fi -echo "Missing strings for $TEST_LANGS..." +echo "Finding all missing strings for $TEST_LANGS..." +WORD_LINES=() # Complete lines for all words (or, grep out of en at the end instead) +ALL_MISSING=() # All missing languages for each missing word +#NEED_WORDS=() # All missing words across all specified languages + +WORD_COUNT=0 + +# Go through all strings in the English language file +# For each word, query all specified languages for the word +# If the word is missing, add its language to the list for WORD in $(awk '/LSTR/{print $2}' language_en.h); do + # Skip MSG_MARLIN [[ $WORD == "MSG_MARLIN" ]] && break - LANG_LIST="" + + ((WORD_COUNT++)) + + # Find all selected languages that lack the string + LANG_MISSING=" " for LANG in $TEST_LANGS; do if [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${LANG}.h) -eq 0 ]]; then INHERIT=$(awk '/using namespace/{print $3}' language_${LANG}.h | sed -E 's/Language_([a-zA-Z_]+)\s*;/\1/') if [[ -z $INHERIT || $INHERIT == "en" ]]; then - LANG_LIST+=" $LANG" + LANG_MISSING+="$LANG " elif [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${INHERIT}.h) -eq 0 ]]; then - LANG_LIST+=" $LANG" + LANG_MISSING+="$LANG " fi fi done - [[ -n $LANG_LIST ]] && printf "%-38s :%s\n" "$WORD" "$LANG_LIST" + # For each word store all the missing languages + if [[ $LANG_MISSING != " " ]]; then + WORD_LINES+=("$(grep -m 1 -E "$WORD\b" language_en.h)") + ALL_MISSING+=("$LANG_MISSING") + #NEED_WORDS+=($WORD) + fi +done + +echo +echo "${#WORD_LINES[@]} out of $WORD_COUNT LCD strings need translation" + +for LANG in $TEST_LANGS; do + HED=0 ; IND=0 + for WORDLANGS in "${ALL_MISSING[@]}"; do + # If the current word is missing from the current language then print it + if [[ $WORDLANGS =~ " $LANG " ]]; then + [[ $HED == 0 ]] && { echo ; echo "Missing strings for language_$LANG.h ($(langname $LANG)):" ; HED=1 ; } + echo "${WORD_LINES[$IND]}" + fi + ((IND++)) + done done diff --git a/buildroot/share/scripts/upload.py b/buildroot/share/scripts/upload.py index af15a82590..c97605e3f4 100644 --- a/buildroot/share/scripts/upload.py +++ b/buildroot/share/scripts/upload.py @@ -7,17 +7,6 @@ import serial Import("env") -# Needed (only) for compression, but there are problems with pip install heatshrink -#try: -# import heatshrink -#except ImportError: -# # Install heatshrink -# print("Installing 'heatshrink' python module...") -# env.Execute(env.subst("$PYTHONEXE -m pip install heatshrink")) -# -# Not tested: If it's safe to install python libraries in PIO python try: -# env.Execute(env.subst("$PYTHONEXE -m pip install https://github.com/p3p/pyheatshrink/releases/download/0.3.3/pyheatshrink-pip.zip")) - import MarlinBinaryProtocol #-----------------# @@ -191,6 +180,21 @@ def Upload(source, target, env): # "upload_random_name": generate a random 8.3 firmware filename to upload upload_random_filename = upload_delete_old_bins and not marlin_long_filename_host_support + # Heatshrink module is needed (only) for compression + if upload_compression: + if sys.version_info[0] > 2: + try: + import heatshrink2 + except ImportError: + print("Installing 'heatshrink2' python module...") + env.Execute(env.subst("$PYTHONEXE -m pip install heatshrink2")) + else: + try: + import heatshrink + except ImportError: + print("Installing 'heatshrink' python module...") + env.Execute(env.subst("$PYTHONEXE -m pip install heatshrink")) + try: # Start upload job diff --git a/buildroot/tests/DUE b/buildroot/tests/DUE index 4ed234ab3a..81e60c9623 100755 --- a/buildroot/tests/DUE +++ b/buildroot/tests/DUE @@ -37,7 +37,7 @@ exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options # restore_configs opt_set MOTHERBOARD BOARD_RADDS Z_DRIVER_TYPE A4988 Z2_DRIVER_TYPE A4988 Z3_DRIVER_TYPE A4988 -opt_enable USE_XMAX_PLUG USE_YMAX_PLUG ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ +opt_enable ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ Z_STEPPER_AUTO_ALIGN Z_STEPPER_ALIGN_STEPPER_XY Z_SAFE_HOMING pins_set ramps/RAMPS X_MAX_PIN -1 pins_set ramps/RAMPS Y_MAX_PIN -1 @@ -47,6 +47,6 @@ exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN, # Test SWITCHING_EXTRUDER # restore_configs -opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF LCD_LANGUAGE fi EXTRUDERS 2 NUM_SERVOS 1 +opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF LCD_LANGUAGE fi EXTRUDERS 2 TEMP_SENSOR_BED 0 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/FYSETC_F6 b/buildroot/tests/FYSETC_F6 index 0c5f25a155..314e207c58 100755 --- a/buildroot/tests/FYSETC_F6 +++ b/buildroot/tests/FYSETC_F6 @@ -11,7 +11,7 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_FYSETC_F6_13 LCD_SERIAL_PORT 1 DGUS_LCD_UI FYSETC -exec_test $1 $2 "FYSETC F6 1.3 with DGUS (FYSETC)" "$3" +exec_test $1 $2 "DGUS (FYSETC)" "$3" # # Test DGUS_LCD_UI RELOADED @@ -20,7 +20,14 @@ restore_configs opt_set MOTHERBOARD BOARD_FYSETC_F6_13 TEMP_SENSOR_BED 2 LCD_SERIAL_PORT 1 DGUS_LCD_UI RELOADED GRID_MAX_POINTS_X 5 opt_enable ADVANCED_PAUSE_FEATURE LCD_BED_TRAMMING CLASSIC_JERK BABYSTEPPING BABYSTEP_ALWAYS_AVAILABLE BABYSTEP_ZPROBE_OFFSET \ BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR NOZZLE_PARK_FEATURE -exec_test $1 $2 "FYSETC F6 1.3 with DGUS (RELOADED)" "$3" +exec_test $1 $2 "ABL | DGUS (RELOADED)" "$3" + +# +# Delta Config (FLSUN AC because it's complex) +# +use_example_configs delta/FLSUN/auto_calibrate +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 +exec_test $1 $2 "DELTA / FLSUN Auto-Calibrate" "$3" # # Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 @@ -29,8 +36,8 @@ use_example_configs delta/generic opt_set MOTHERBOARD BOARD_FYSETC_F6_13 LCD_LANGUAGE ko_KR opt_enable RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS EEPROM_CHITCHAT \ Z_PROBE_ALLEN_KEY AUTO_BED_LEVELING_UBL UBL_MESH_WIZARD \ - OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU -exec_test $1 $2 "DELTA, FYSETC F6 1.3, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." "$3" + OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU BABYSTEPPING +exec_test $1 $2 "DELTA | UBL | Allen Key | EEPROM | OLED_PANEL_TINYBOY2..." "$3" # # Test mixed TMC config @@ -43,15 +50,8 @@ opt_set MOTHERBOARD BOARD_FYSETC_F6_13 \ 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 \ - USE_ZMIN_PLUG SENSORLESS_HOMING TMC_DEBUG M114_DETAIL -exec_test $1 $2 "RAMPS | Mixed TMC | Sensorless | RRDFGSC | Games" "$3" - -# -# Delta Config (FLSUN AC because it's complex) -# -use_example_configs delta/FLSUN/auto_calibrate -opt_set MOTHERBOARD BOARD_FYSETC_F6_13 -exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" "$3" + SENSORLESS_HOMING TMC_DEBUG M114_DETAIL +exec_test $1 $2 "Mixed TMC | Sensorless | RRDFGSC | Games" "$3" # # SCARA with Mixed TMC @@ -62,10 +62,10 @@ opt_set MOTHERBOARD BOARD_FYSETC_F6_13 \ X_MAX_ENDSTOP_HIT_STATE HIGH \ 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 \ +opt_enable 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 EDGE_STEPPING -exec_test $1 $2 "FYSETC_F6 | SCARA | Mixed TMC | EEPROM" "$3" +exec_test $1 $2 "SCARA | Mixed TMC | EEPROM" "$3" # clean up restore_configs diff --git a/buildroot/tests/I3DBEEZ9_V1 b/buildroot/tests/I3DBEEZ9_V1 new file mode 100755 index 0000000000..7c11d2e6c8 --- /dev/null +++ b/buildroot/tests/I3DBEEZ9_V1 @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F407ZG I3DBEEZ9 Board +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +restore_configs +opt_set MOTHERBOARD BOARD_I3DBEEZ9_V1 SERIAL_PORT 1 +exec_test $1 $2 "I3DBEE Z9 Board | Default Configuration" "$3" + +restore_configs +opt_set MOTHERBOARD BOARD_I3DBEEZ9_V1 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 "I3DBEE Z9 Board | 3 Extruders | Auto-Fan | BLTOUCH | Mixed TMC" "$3" + +restore_configs +opt_set MOTHERBOARD BOARD_I3DBEEZ9_V1 SERIAL_PORT -1 \ + CUTTER_POWER_UNIT PERCENT \ + 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 LASER_SAFETY_TIMEOUT_MS REPRAP_DISCOUNT_SMART_CONTROLLER +exec_test $1 $2 "I3DBEE Z9 Board | HD44780 | Laser (Percent) | Cooling | LCD" "$3" + +# clean up +restore_configs diff --git a/buildroot/tests/LPC1768 b/buildroot/tests/LPC1768 index ee01bb621f..d616f7f48f 100755 --- a/buildroot/tests/LPC1768 +++ b/buildroot/tests/LPC1768 @@ -44,7 +44,7 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING TE 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 \ ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD REPORT_TRAMMING_MM ASSISTED_TRAMMING_WAIT_POSITION \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET BABYSTEP_GFX_OVERLAY \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET EP_BABYSTEPPING BABYSTEP_GFX_OVERLAY \ 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 \ HOST_KEEPALIVE_FEATURE HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT \ diff --git a/buildroot/tests/LPC1769 b/buildroot/tests/LPC1769 index cf2838bdd5..733201e009 100755 --- a/buildroot/tests/LPC1769 +++ b/buildroot/tests/LPC1769 @@ -29,7 +29,7 @@ exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI and many features" "$3" #restore_configs #opt_set MOTHERBOARD BOARD_AZTEEG_X5_MINI_WIFI -#opt_enable COREYX USE_XMAX_PLUG DAC_MOTOR_CURRENT_DEFAULT \ +#opt_enable COREYX DAC_MOTOR_CURRENT_DEFAULT \ # REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT BABYSTEPPING \ # AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS \ # FILAMENT_LCD_DISPLAY FILAMENT_WIDTH_SENSOR FAN_SOFT_PWM \ @@ -56,7 +56,7 @@ opt_set MOTHERBOARD BOARD_COHESION3D_REMIX \ 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 \ - AXIS4_ROTATES I_MIN_POS I_MAX_POS I_HOME_DIR I_ENABLE_ON USE_IMIN_PLUG INVERT_I_DIR \ + AXIS4_ROTATES I_MIN_POS I_MAX_POS I_HOME_DIR I_ENABLE_ON INVERT_I_DIR \ EXPERIMENTAL_I2CBUS opt_disable PSU_CONTROL Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN exec_test $1 $2 "Cohesion3D Remix DELTA + ABL Bilinear + EEPROM + SENSORLESS_PROBING + I Axis" "$3" diff --git a/buildroot/tests/STM32F103RC_btt b/buildroot/tests/STM32F103RC_btt index 95a18c615f..8df20740c4 100755 --- a/buildroot/tests/STM32F103RC_btt +++ b/buildroot/tests/STM32F103RC_btt @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for STM32F103RC BigTreeTech (SKR Mini E3) +# Build tests for STM32F103RC_btt (BigTreeTech SKR Mini E3) # # exit on first failure @@ -12,7 +12,7 @@ set -e restore_configs 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 FT_MOTION +opt_enable CR10_STOCKDISPLAY PINS_DEBUGGING Z_IDLE_HEIGHT FT_MOTION FT_MOTION_MENU exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - TMC2209 HW Serial, FT_MOTION" "$3" # clean up diff --git a/buildroot/tests/STM32F103RC_btt_USB b/buildroot/tests/STM32F103RC_btt_USB index 8381de0ea6..3981466c46 100755 --- a/buildroot/tests/STM32F103RC_btt_USB +++ b/buildroot/tests/STM32F103RC_btt_USB @@ -10,8 +10,8 @@ set -e # Build with the default configurations # restore_configs -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" +opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 SERIAL_PORT 1 SERIAL_PORT_2 -1 TEMP_SENSOR_SOC 1 +exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - SOC Temperature" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RC_fysetc b/buildroot/tests/STM32F103RC_fysetc new file mode 100755 index 0000000000..93b0fedf3d --- /dev/null +++ b/buildroot/tests/STM32F103RC_fysetc @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# Build tests for STM32F103RC_fysetc +# + +# exit on first failure +set -e + +# +# Build with the default configurations +# +use_example_configs "Creality/Ender-3/FYSETC Cheetah 1.2/BLTouch" +exec_test $1 $2 "Ender-3 with Cheetah 1.2 | BLTouch" "$3" + +# clean up +restore_configs diff --git a/buildroot/tests/STM32F103RC_fysetc_maple b/buildroot/tests/STM32F103RC_fysetc_maple index 0e78c73188..09dba7ef61 100755 --- a/buildroot/tests/STM32F103RC_fysetc_maple +++ b/buildroot/tests/STM32F103RC_fysetc_maple @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for STM32F103RC FYSETC +# Build tests for STM32F103RC_fysetc_maple # # exit on first failure @@ -10,7 +10,7 @@ set -e # Build with the default configurations # use_example_configs "Creality/Ender-3/FYSETC Cheetah 1.2/base" -exec_test $1 $2 "Cheetah 1.2 Configuration" "$3" +exec_test $1 $2 "Maple build of Cheetah 1.2 Configuration" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RE_creality b/buildroot/tests/STM32F103RE_creality index 834580fac8..bf56e12d7d 100755 --- a/buildroot/tests/STM32F103RE_creality +++ b/buildroot/tests/STM32F103RE_creality @@ -29,7 +29,7 @@ opt_enable DWIN_LCD_PROUI INDIVIDUAL_AXIS_HOMING_SUBMENU SET_PROGRESS_MANUALLY S SOUND_MENU_ITEM PRINTCOUNTER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_SENSOR \ BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU \ LIMITED_MAX_FR_EDITING LIMITED_MAX_ACCEL_EDITING LIMITED_JERK_EDITING BAUD_RATE_GCODE -opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 +opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 BOOTSCREEN_TIMEOUT 1100 exec_test $1 $2 "Ender-3 S1 - ProUI (PIDTEMP)" "$3" restore_configs diff --git a/buildroot/tests/at90usb1286_cdc b/buildroot/tests/at90usb1286_cdc index 01d752db8b..7dcf8d541a 100755 --- a/buildroot/tests/at90usb1286_cdc +++ b/buildroot/tests/at90usb1286_cdc @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for AT90USB1286 ARMED +# Build tests for AT90USB1286 (CDC) # # exit on first failure diff --git a/buildroot/tests/at90usb1286_dfu b/buildroot/tests/at90usb1286_dfu index 75672a6a51..a753097694 100755 --- a/buildroot/tests/at90usb1286_dfu +++ b/buildroot/tests/at90usb1286_dfu @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Build tests for AT90USB1286 ARMED +# Build tests for AT90USB1286 (DFU) # # exit on first failure diff --git a/buildroot/tests/mega1280 b/buildroot/tests/mega1280 index d948623f48..53016e8406 100755 --- a/buildroot/tests/mega1280 +++ b/buildroot/tests/mega1280 @@ -40,7 +40,7 @@ restore_configs opt_set MOTHERBOARD BOARD_ZRIB_V52 \ LCD_LANGUAGE pt REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 \ EXTRUDERS 2 TEMP_SENSOR_1 1 X2_DRIVER_TYPE A4988 -opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD +opt_enable DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD exec_test $1 $2 "ZRIB_V52 | DUAL_X_CARRIAGE" "$3" # diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index c2a3452e67..46de664e43 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -30,7 +30,7 @@ opt_enable AUTO_BED_LEVELING_UBL AVOID_OBSTACLES RESTORE_LEVELING_AFTER_G28 DEBU 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 MEDIA_MENU_AT_TOP \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_MENU_MAIN FREEZE_FEATURE CANCEL_OBJECTS SOUND_MENU_ITEM \ - MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE ADVANCE_K_EXTRA QUICK_HOME \ + EMERGENCY_PARSER MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE ADVANCE_K_EXTRA QUICK_HOME \ SET_PROGRESS_MANUALLY SET_PROGRESS_PERCENT PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ ENCODER_NOISE_FILTER BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE ..." "$3" @@ -71,13 +71,26 @@ opt_enable VIKI2 BOOT_MARLIN_LOGO_ANIMATED SDSUPPORT AUTO_REPORT_SD_STATUS \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULLUP exec_test $1 $2 "Z Servo Probe | Multiple runout sensors (x5)" "$3" +# +# Extruder Only. No XYZ axes at all. +# +restore_configs +opt_set DEFAULT_AXIS_STEPS_PER_UNIT '{ 4000 }' \ + DEFAULT_MAX_FEEDRATE '{ 5 }' \ + DEFAULT_MAX_ACCELERATION '{ 100 }' \ + MANUAL_FEEDRATE '{ 4*60 }' \ + AXIS_RELATIVE_MODES '{ false }' \ + HOMING_BUMP_MM '{}' HOMING_BUMP_DIVISOR '{}' HOMING_FEEDRATE_MM_M '{}' +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +opt_disable X_DRIVER_TYPE Y_DRIVER_TYPE Z_DRIVER_TYPE +exec_test $1 $2 "E Axis Only | DOGM MarlinUI" "$3" # # Mixing Extruder with 5 steppers, Greek # restore_configs opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO MIXING_STEPPERS 5 LCD_LANGUAGE ru \ - NUM_RUNOUT_SENSORS E_STEPPERS REDUNDANT_PART_COOLING_FAN 1 \ + NUM_RUNOUT_SENSORS E_STEPPERS TEMP_SENSOR_BED 0 REDUNDANT_PART_COOLING_FAN 1 \ 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 \ diff --git a/buildroot/tests/mks_robin_pro2 b/buildroot/tests/mks_robin_pro2 new file mode 100755 index 0000000000..3919437433 --- /dev/null +++ b/buildroot/tests/mks_robin_pro2 @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# +# Build tests for mks_robin_pro2 (STM32F407VE) +# + +# exit on first failure +set -e + +# +# Robin Pro v2 with LVGL TFT +# +restore_configs +opt_set MOTHERBOARD BOARD_MKS_ROBIN_PRO_V2 SERIAL_PORT 1 +opt_enable SDSUPPORT USB_FLASH_DRIVE_SUPPORT USE_OTG_USB_HOST MULTI_VOLUME \ + TFT_GENERIC TFT_INTERFACE_SPI TFT_RES_480x320 TFT_LVGL_UI TOUCH_SCREEN \ + BLTOUCH Z_SAFE_HOMING LCD_BED_TRAMMING BED_TRAMMING_USE_PROBE +exec_test $1 $2 "MKS Robin Pro v2 | TFT_LVGL_UI | SD/FD Multi-Volume" "$3" + +# cleanup +restore_configs diff --git a/buildroot/tests/mks_tinybee b/buildroot/tests/mks_tinybee index 9dcc33ede7..0351946d0a 100755 --- a/buildroot/tests/mks_tinybee +++ b/buildroot/tests/mks_tinybee @@ -25,8 +25,8 @@ opt_set MOTHERBOARD BOARD_MKS_TINYBEE \ LCD_INFO_SCREEN_STYLE 0 \ DISPLAY_CHARSET_HD44780 WESTERN \ NEOPIXEL_TYPE NEO_RGB -opt_enable FYSETC_MINI_12864_2_1 SDSUPPORT -opt_enable LED_CONTROL_MENU LED_USER_PRESET_STARTUP LED_COLOR_PRESETS NEOPIXEL_LED +opt_enable FYSETC_MINI_12864_2_1 SDSUPPORT ONE_CLICK_PRINT NO_SD_AUTOSTART \ + NEOPIXEL_LED LED_CONTROL_MENU LED_USER_PRESET_STARTUP LED_COLOR_PRESETS exec_test $1 $2 "MKS TinyBee with NeoPixel LCD, SD and Speaker" "$3" # cleanup diff --git a/buildroot/tests/rambo b/buildroot/tests/rambo index b50f220404..c0784b95a0 100755 --- a/buildroot/tests/rambo +++ b/buildroot/tests/rambo @@ -17,7 +17,7 @@ opt_set MOTHERBOARD BOARD_RAMBO \ GRID_MAX_POINTS_X 16 AUTO_POWER_E_TEMP 80 \ FANMUX0_PIN 53 FIL_MOTION1_PIN 45 opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN USE_WATCHDOG -opt_enable USE_ZMAX_PLUG REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ FIX_MOUNTED_PROBE CODEPENDENT_XY_HOMING PIDTEMPBED PTC_PROBE PTC_BED \ 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 \ @@ -53,8 +53,7 @@ opt_set MOTHERBOARD BOARD_RAMBO \ AXIS_RELATIVE_MODES '{ false, false, false }' \ BED_TRAMMING_LEVELING_ORDER '{ LF, RF }' \ X2_DRIVER_TYPE A4988 Y2_DRIVER_TYPE A4988 -opt_enable USE_XMAX_PLUG USE_YMAX_PLUG USE_ZMAX_PLUG \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER REVERSE_ENCODER_DIRECTION SDSUPPORT EEPROM_SETTINGS \ +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER REVERSE_ENCODER_DIRECTION SDSUPPORT EEPROM_SETTINGS \ S_CURVE_ACCELERATION X_DUAL_ENDSTOPS Y_DUAL_ENDSTOPS \ ADAPTIVE_STEP_SMOOTHING CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES \ LCD_BED_TRAMMING BED_TRAMMING_INCLUDE_CENTER @@ -74,6 +73,14 @@ opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 0 TEMP_SENSOR_BED 1 TEMP_SENSOR_PROBE opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER FIX_MOUNTED_PROBE Z_SAFE_HOMING exec_test $1 $2 "Rambo heated bed only" "$3" +# +# Rambo with MMU2 +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 5 MMU_MODEL PRUSA_MMU2 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE EMERGENCY_PARSER MMU2_DEBUG +exec_test $1 $2 "Rambo with PRUSA_MMU2 " "$3" + # # Build with the default configurations # @@ -115,7 +122,7 @@ opt_set MOTHERBOARD BOARD_RAMBO \ 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 \ +opt_enable COREYX MIXING_EXTRUDER GRADIENT_MIX \ BABYSTEPPING BABYSTEP_XY BABYSTEP_DISPLAY_TOTAL FILAMENT_LCD_DISPLAY \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER MENU_ADDAUTOSTART SDSUPPORT SDCARD_SORT_ALPHA \ ENDSTOP_NOISE_THRESHOLD FAN_SOFT_PWM \ diff --git a/buildroot/tests/rumba32 b/buildroot/tests/rumba32 index 833769d0b9..c3d7603e4e 100755 --- a/buildroot/tests/rumba32 +++ b/buildroot/tests/rumba32 @@ -13,7 +13,7 @@ opt_set MOTHERBOARD BOARD_RUMBA32_V1_0 SERIAL_PORT -1 \ opt_disable PIDTEMP opt_enable PIDTEMPBED FAN_SOFT_PWM opt_disable THERMAL_PROTECTION_BED -exec_test $1 $2 "RUMBA32 V1.0 with TMC2130, PID Bed, and bed thermal protection disabled" "$3" +exec_test $1 $2 "RUMBA32 V1.0 with TMC2130, PID Bed, no Bed Thermal Protection" "$3" # Build examples restore_configs diff --git a/buildroot/tests/teensy31 b/buildroot/tests/teensy31 index 7465a67fdd..5f5b84e0c4 100755 --- a/buildroot/tests/teensy31 +++ b/buildroot/tests/teensy31 @@ -15,7 +15,6 @@ exec_test $1 $2 "Teensy3.1 with default config" "$3" # restore_configs opt_set MOTHERBOARD BOARD_TEENSY31_32 X_HOME_DIR 0 Y_HOME_DIR 0 Z_HOME_DIR 0 -opt_disable USE_XMIN_PLUG USE_YMIN_PLUG USE_ZMIN_PLUG exec_test $1 $2 "Teensy3.1 with Zero Endstops" "$3" # diff --git a/buildroot/tests/teensy35 b/buildroot/tests/teensy35 index fd6ae86387..38da97c25b 100755 --- a/buildroot/tests/teensy35 +++ b/buildroot/tests/teensy35 @@ -87,7 +87,7 @@ opt_set MOTHERBOARD BOARD_TEENSY35_36 \ X_DRIVER_TYPE TMC5160 Y_DRIVER_TYPE TMC5160 \ X_MIN_ENDSTOP_HIT_STATE LOW Y_MIN_ENDSTOP_HIT_STATE LOW \ X_CS_PIN 46 Y_CS_PIN 47 -opt_enable COREXY USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +opt_enable COREXY MONITOR_DRIVER_STATUS SENSORLESS_HOMING exec_test $1 $2 "Teensy 3.5/3.6 COREXY" "$3" # @@ -103,7 +103,7 @@ exec_test $1 $2 "Teensy 3.5/3.6 COREXZ | BACKLASH" "$3" # restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 Z_DRIVER_TYPE A4988 Z2_DRIVER_TYPE A4988 Z2_MIN_PIN 2 -opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG +opt_enable Z_MULTI_ENDSTOPS pins_set ramps/RAMPS X_MAX_PIN -1 exec_test $1 $2 "Dual Z with Dual Z endstops" "$3" diff --git a/buildroot/tests/teensy41 b/buildroot/tests/teensy41 index 11b5e34025..e6a769c282 100755 --- a/buildroot/tests/teensy41 +++ b/buildroot/tests/teensy41 @@ -90,7 +90,7 @@ opt_set MOTHERBOARD BOARD_TEENSY41 \ X_DRIVER_TYPE TMC5160 Y_DRIVER_TYPE TMC5160 \ X_MIN_ENDSTOP_HIT_STATE LOW Y_MIN_ENDSTOP_HIT_STATE LOW \ X_CS_PIN 46 Y_CS_PIN 47 -opt_enable COREXY USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +opt_enable COREXY MONITOR_DRIVER_STATUS SENSORLESS_HOMING exec_test $1 $2 "Teensy 4.0/4.1 COREXY" "$3" # @@ -106,7 +106,7 @@ exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" "$3" # restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 Z_DRIVER_TYPE A4988 Z2_DRIVER_TYPE A4988 Z2_MIN_PIN 2 -opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG +opt_enable Z_MULTI_ENDSTOPS pins_set ramps/RAMPS X_MAX_PIN -1 exec_test $1 $2 "Dual Z with Dual Z endstops" "$3" diff --git a/docs/Serial.md b/docs/Serial.md index 88846e1bb4..5e0d7e63eb 100644 --- a/docs/Serial.md +++ b/docs/Serial.md @@ -57,18 +57,15 @@ The following macros are defined (in `serial.h`) to output data to the serial po |-------|------------|-------|---------|-----------------| | `SERIAL_ECHO` | Any basic type is supported (`char`, `uint8_t`, `int16_t`, `int32_t`, `float`, `long`, `const char*`, ...). | For a numeric type it prints the number in decimal. A string is output as a string. | `uint8_t a = 123; SERIAL_ECHO(a); SERIAL_CHAR(' '); SERIAL_ECHO(' '); ` | `123 32` | | `SERIAL_ECHOLN` | Same as `SERIAL_ECHO` | Do `SERIAL_ECHO`, adding a newline | `int a = 456; SERIAL_ECHOLN(a);` | `456\n` | -| `SERIAL_ECHO_F` | `float` or `double` | Print a decimal value with a given precision (default 2) | `float a = 3.1415; SERIAL_ECHO_F(a); SERIAL_CHAR(' '); SERIAL_ECHO_F(a, 4);` | `3.14 3.1415`| | `SERIAL_ECHOPGM` | String / Value pairs | Print a series of string literals and values alternately | `SERIAL_ECHOPGM("Bob", 34);` | `Bob34` | | `SERIAL_ECHOLNPGM` | Same as `SERIAL_ECHOPGM` | Do `SERIAL_ECHOPGM`, adding a newline | `SERIAL_ECHOPGM("Alice", 56);` | `alice56` | | `SERIAL_ECHOPGM_P` | Like `SERIAL_ECHOPGM` but takes PGM strings | Print a series of PGM strings and values alternately | `SERIAL_ECHOPGM_P(GET_TEXT(MSG_HELLO), 123);` | `Hello123` | | `SERIAL_ECHOLNPGM_P` | Same as `SERIAL_ECHOPGM_P` | Do `SERIAL_ECHOPGM_P`, adding a newline | `SERIAL_ECHOLNPGM_P(PSTR("Alice"), 78);` | `alice78\n` | -| `SERIAL_ECHOLIST` | String literal, values | Print a string literal and a list of values | `SERIAL_ECHOLIST(F("Key "), 1, 2, 3);` | `Key 1, 2, 3` | | `SERIAL_ECHO_START` | None | Prefix an echo line | `SERIAL_ECHO_START();` | `echo:` | | `SERIAL_ECHO_MSG` | Same as `SERIAL_ECHOLNPGM` | Print a full echo line | `SERIAL_ECHO_MSG("Count is ", count);` | `echo:Count is 3` | | `SERIAL_ERROR_START`| None | Prefix an error line | `SERIAL_ERROR_START();` | `Error:` | | `SERIAL_ERROR_MSG` | Same as `SERIAL_ECHOLNPGM` | Print a full error line | `SERIAL_ERROR_MSG("Not found");` | `Error:Not found` | | `SERIAL_ECHO_SP` | Number of spaces | Print one or more spaces | `SERIAL_ECHO_SP(3)` | ` ` | | `SERIAL_EOL` | None | Print an end of line | `SERIAL_EOL();` | `\n` | -| `SERIAL_OUT` | `SERIAL_OUT(myMethod)` | Call a custom serial method | `SERIAL_OUT(msgDone);` | ... | *This document was written by [X-Ryl669](https://blog.cyril.by) and is under [CC-SA license](https://creativecommons.org/licenses/by-sa)* diff --git a/ini/esp32.ini b/ini/esp32.ini index f12ef99759..98c3e06755 100644 --- a/ini/esp32.ini +++ b/ini/esp32.ini @@ -40,3 +40,9 @@ monitor_speed = 115200 [env:mks_tinybee] extends = env:esp32 board_build.partitions = default_8MB.csv + +[env:godi_esp32] +extends = env:esp32 +board_build.partitions = Marlin/src/HAL/ESP32/esp32.csv +upload_speed = 115200 +monitor_speed = 115200 diff --git a/ini/features.ini b/ini/features.ini index a8ee50b9ed..86e7d2e396 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -9,242 +9,263 @@ # # ################################# +# The order of the features matters for source-filter resolution inside of common-dependencies.py. + [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=+ + build_src_filter=+ extra_scripts=download_mks_assets.py -MARLIN_TEST_BUILD = src_filter=+ -POSTMORTEM_DEBUGGING = src_filter=+ + +MARLIN_TEST_BUILD = build_src_filter=+ +POSTMORTEM_DEBUGGING = build_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.3 - src_filter=+ + + + + -HAS_T(RINAMIC_CONFIG|MC_SPI) = src_filter=+ -HAS_STEALTHCHOP = src_filter=+ + build_src_filter=+ + + + + +HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+ +HAS_STEALTHCHOP = build_src_filter=+ SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip +HAS_MOTOR_CURRENT_(I2C|DAC|SPI|PWM) = build_src_filter=+ HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster - src_filter=+ + build_src_filter=+ HAS_TMC26X = TMC26XStepper=https://github.com/MarlinFirmware/TMC26XStepper/archive/master.zip - src_filter=+ -LIB_INTERNAL_MAX31865 = src_filter=+ + build_src_filter=+ +LIB_INTERNAL_MAX31865 = build_src_filter=+ NEOPIXEL_LED = adafruit/Adafruit NeoPixel@~1.8.0 - src_filter=+ + build_src_filter=+ I2C_AMMETER = peterus/INA226Lib@1.1.2 - src_filter=+ + build_src_filter=+ USES_LIQUIDCRYSTAL = LiquidCrystal=https://github.com/MarlinFirmware/New-LiquidCrystal/archive/1.5.1.zip USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 -HAS_LCDPRINT = src_filter=+ -HAS_MARLINUI_HD44780 = src_filter=+ +HAS_LCDPRINT = build_src_filter=+ +HAS_MARLINUI_HD44780 = build_src_filter=+ HAS_MARLINUI_U8GLIB = marlinfirmware/U8glib-HAL@~0.5.2 - src_filter=+ -HAS_(FSMC|SPI|LTDC)_TFT = src_filter=+ + + -HAS_FSMC_TFT = src_filter=+ + -HAS_SPI_TFT = src_filter=+ + -I2C_EEPROM = src_filter=+ + build_src_filter=+ +HAS_(FSMC|SPI|LTDC)_TFT = build_src_filter=+ +HAS_LTDC_TFT = build_src_filter=+ +HAS_FSMC_TFT = build_src_filter=+ + +HAS_SPI_TFT = build_src_filter=+ + + +HAS_TFT_XPT2046 = build_src_filter=+ + + +TFT_TOUCH_DEVICE_GT911 = build_src_filter=+ +I2C_EEPROM = build_src_filter=+ SOFT_I2C_EEPROM = SlowSoftI2CMaster, SlowSoftWire=https://github.com/felias-fogg/SlowSoftWire/archive/master.zip -SPI_EEPROM = src_filter=+ -HAS_DWIN_E3V2|IS_DWIN_MARLINUI = src_filter=+ -DWIN_CREALITY_LCD = src_filter=+ -DWIN_LCD_PROUI = src_filter=+ -DWIN_CREALITY_LCD_JYERSUI = src_filter=+ -IS_DWIN_MARLINUI = src_filter=+ -HAS_GRAPHICAL_TFT = src_filter=+ -IS_TFTGLCD_PANEL = src_filter=+ -HAS_TOUCH_BUTTONS = src_filter=+ -HAS_MARLINUI_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=+ -LCD_BED_LEVELING = src_filter=+ -HAS_MENU_BED_TRAMMING = 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_WIZARD = src_filter=+ -HAS_MENU_UBL = src_filter=+ -ANYCUBIC_LCD_(CHIRON|VYPER) = src_filter=+ -ANYCUBIC_LCD_CHIRON = src_filter=+ -ANYCUBIC_LCD_VYPER = src_filter=+ -ANYCUBIC_LCD_I3MEGA = src_filter=+ -HAS_DGUS_LCD_CLASSIC = src_filter=+ -DGUS_LCD_UI_RELOADED = 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=+ -DGUS_LCD_UI_IA_CREALITY = src_filter=+ -EXTUI_EXAMPLE = src_filter=+ -TOUCH_UI_FTDI_EVE = src_filter=+ -MALYAN_LCD = src_filter=+ -NEXTION_TFT = src_filter=+ -USE_UHS2_USB = src_filter=+ -USE_UHS3_USB = src_filter=+ -USB_FLASH_DRIVE_SUPPORT = src_filter=+ -HAS_MCP3426_ADC = src_filter=+ + -AUTO_BED_LEVELING_BILINEAR = src_filter=+ -AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ -X_AXIS_TWIST_COMPENSATION = src_filter=+ + + +SPI_EEPROM = build_src_filter=+ +HAS_DWIN_E3V2|IS_DWIN_MARLINUI = build_src_filter=+ +DWIN_CREALITY_LCD = build_src_filter=+ +DWIN_LCD_PROUI = build_src_filter=+ +DWIN_CREALITY_LCD_JYERSUI = build_src_filter=+ +IS_DWIN_MARLINUI = build_src_filter=+ +HAS_GRAPHICAL_TFT = build_src_filter=+ - +TFT_FONT_HELVETICA = build_src_filter=+ +TFT_FONT_NOTOSANS = build_src_filter=+ +TFT_FONT_UNIFONT = build_src_filter=+ +IS_TFTGLCD_PANEL = build_src_filter=+ +HAS_TOUCH_BUTTONS = build_src_filter=+ +HAS_MARLINUI_MENU = build_src_filter=+ - +HAS_GAMES = build_src_filter=+ +MARLIN_BRICKOUT = build_src_filter=+ +MARLIN_INVADERS = build_src_filter=+ +MARLIN_MAZE = build_src_filter=+ +MARLIN_SNAKE = build_src_filter=+ +HAS_MENU_BACKLASH = build_src_filter=+ +LCD_BED_LEVELING = build_src_filter=+ +HAS_MENU_BED_TRAMMING = build_src_filter=+ +HAS_MENU_CANCELOBJECT = build_src_filter=+ +HAS_MENU_DELTA_CALIBRATE = build_src_filter=+ +HAS_MENU_FILAMENT = build_src_filter=+ +LCD_INFO_MENU = build_src_filter=+ +HAS_MENU_JOB_RECOVERY = build_src_filter=+ +HAS_MENU_MULTI_LANGUAGE = build_src_filter=+ +HAS_MENU_LED = build_src_filter=+ +HAS_MENU_MEDIA = build_src_filter=+ +HAS_MENU_MIXER = build_src_filter=+ +HAS_MENU_MMU2 = build_src_filter=+ +HAS_MENU_ONE_CLICK_PRINT = build_src_filter=+ +HAS_MENU_PASSWORD = build_src_filter=+ +HAS_MENU_POWER_MONITOR = build_src_filter=+ +HAS_MENU_CUTTER = build_src_filter=+ +HAS_MENU_TEMPERATURE = build_src_filter=+ +HAS_MENU_TMC = build_src_filter=+ +HAS_MENU_TOUCH_SCREEN = build_src_filter=+ +HAS_MENU_TRAMMING_WIZARD = build_src_filter=+ +HAS_MENU_UBL = build_src_filter=+ +EXTENSIBLE_UI = build_src_filter=+ +ANYCUBIC_LCD_(CHIRON|VYPER) = build_src_filter=+ +ANYCUBIC_LCD_CHIRON = build_src_filter=+ +ANYCUBIC_LCD_VYPER = build_src_filter=+ +ANYCUBIC_LCD_I3MEGA = build_src_filter=+ +HAS_DGUS_LCD_CLASSIC = build_src_filter=+ +DGUS_LCD_UI_RELOADED = build_src_filter=+ +DGUS_LCD_UI_FYSETC = build_src_filter=+ +DGUS_LCD_UI_HIPRECY = build_src_filter=+ +DGUS_LCD_UI_MKS = build_src_filter=+ +DGUS_LCD_UI_ORIGIN = build_src_filter=+ +DGUS_LCD_UI_IA_CREALITY = build_src_filter=+ +EXTUI_EXAMPLE = build_src_filter=+ +TOUCH_UI_FTDI_EVE = build_src_filter=+ +MALYAN_LCD = build_src_filter=+ +NEXTION_TFT = build_src_filter=+ +USE_UHS2_USB = build_src_filter=+ +USE_UHS3_USB = build_src_filter=+ +USB_FLASH_DRIVE_SUPPORT = build_src_filter=+ +HAS_MCP3426_ADC = build_src_filter=+ + +AUTO_BED_LEVELING_BILINEAR = build_src_filter=+ +AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = build_src_filter=+ +X_AXIS_TWIST_COMPENSATION = build_src_filter=+ + + BD_SENSOR = markyue/Panda_SoftMasterI2C - 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_COOLER|LASER_COOLANT_FLOW_METER = src_filter=+ -HAS_MOTOR_CURRENT_DAC = src_filter=+ -DIRECT_STEPPING = src_filter=+ + -EMERGENCY_PARSER = src_filter=+ - -EASYTHREED_UI = src_filter=+ -I2C_POSITION_ENCODERS = src_filter=+ -IIC_BL24CXX_EEPROM = src_filter=+ -SPI_FLASH = src_filter=+ -HAS_ETHERNET = src_filter=+ + -HAS_FANCHECK = 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=+ + + -PSU_CONTROL = src_filter=+ -HAS_POWER_MONITOR = src_filter=+ + -POWER_LOSS_RECOVERY = src_filter=+ + -HAS_PTC = src_filter=+ + -HAS_FILAMENT_SENSOR = src_filter=+ + -(EXT|MANUAL)_SOLENOID.* = src_filter=+ + -MK2_MULTIPLEXER = src_filter=+ -HAS_CUTTER = src_filter=+ + -HAS_DRIVER_SAFE_POWER_PROTECT = src_filter=+ -EXPERIMENTAL_I2CBUS = src_filter=+ + -G26_MESH_VALIDATION = src_filter=+ -ASSISTED_TRAMMING = src_filter=+ + -HAS_MESH = src_filter=+ -HAS_LEVELING = src_filter=+ + -MECHANICAL_GANTRY_CAL.+ = src_filter=+ -Z_MULTI_ENDSTOPS|Z_STEPPER_AUTO_ALIGN = src_filter=+ -Z_STEPPER_AUTO_ALIGN = 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|AIR_ASSIST = src_filter=+ -AIR_EVACUATION = src_filter=+ -HAS_SOFTWARE_ENDSTOPS = src_filter=+ -SERVO_DETACH_GCODE = src_filter=+ -HAS_DUPLICATION_MODE = src_filter=+ -FT_MOTION = src_filter=+ + -LIN_ADVANCE = src_filter=+ -PHOTO_GCODE = src_filter=+ -CONTROLLER_FAN_EDITABLE = src_filter=+ -HAS_ZV_SHAPING = 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=+ -AUTO_REPORT_POSITION = src_filter=+ -REPETIER_GCODE_M360 = src_filter=+ -HAS_GCODE_M876 = src_filter=+ -HAS_RESUME_CONTINUE = src_filter=+ -SET_PROGRESS_MANUALLY = src_filter=+ -HAS_STATUS_MESSAGE = src_filter=+ -HAS_PREHEAT = src_filter=+ -HAS_LCD_CONTRAST = src_filter=+ -HAS_GCODE_M255 = src_filter=+ -HAS_LCD_BRIGHTNESS = src_filter=+ -HAS_SOUND = 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=+ -HAS_MEDIA = src_filter=+ + + + + + + -HAS_MEDIA_SUBCALLS = src_filter=+ -GCODE_REPEAT_MARKERS = src_filter=+ + -HAS_EXTRUDERS = src_filter=+ + + -HAS_TEMP_PROBE = src_filter=+ -HAS_COOLER = src_filter=+ -AUTO_REPORT_TEMPERATURES = src_filter=+ -MPCTEMP = 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=+ + -POLARGRAPH = 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=+ + build_src_filter=+ + +MESH_BED_LEVELING = build_src_filter=+ + +AUTO_BED_LEVELING_UBL = build_src_filter=+ + +UBL_HILBERT_CURVE = build_src_filter=+ +BACKLASH_COMPENSATION = build_src_filter=+ +BARICUDA = build_src_filter=+ + +BINARY_FILE_TRANSFER = build_src_filter=+ + +BLTOUCH = build_src_filter=+ +CANCEL_OBJECTS = build_src_filter=+ + +CASE_LIGHT_ENABLE = build_src_filter=+ + +EXTERNAL_CLOSED_LOOP_CONTROLLER = build_src_filter=+ + +USE_CONTROLLER_FAN = build_src_filter=+ +HAS_COOLER|LASER_COOLANT_FLOW_METER = build_src_filter=+ +HAS_MOTOR_CURRENT_DAC = build_src_filter=+ +DIRECT_STEPPING = build_src_filter=+ + +EMERGENCY_PARSER = build_src_filter=+ - +EASYTHREED_UI = build_src_filter=+ +I2C_POSITION_ENCODERS = build_src_filter=+ +IIC_BL24CXX_EEPROM = build_src_filter=+ +SPI_FLASH = build_src_filter=+ +HAS_ETHERNET = build_src_filter=+ + +HAS_FANCHECK = build_src_filter=+ + +HAS_FANMUX = build_src_filter=+ +FILAMENT_WIDTH_SENSOR = build_src_filter=+ + +FWRETRACT = build_src_filter=+ + +HOST_ACTION_COMMANDS = build_src_filter=+ +HOTEND_IDLE_TIMEOUT = build_src_filter=+ +JOYSTICK = build_src_filter=+ +BLINKM = build_src_filter=+ +HAS_COLOR_LEDS = build_src_filter=+ + +PCA9533 = build_src_filter=+ +PCA9632 = build_src_filter=+ +PRINTER_EVENT_LEDS = build_src_filter=+ +TEMP_STAT_LEDS = build_src_filter=+ +MAX7219_DEBUG = build_src_filter=+ + +HAS_MEATPACK = build_src_filter=+ +MIXING_EXTRUDER = build_src_filter=+ + +HAS_PRUSA_MMU1 = build_src_filter=+ +HAS_PRUSA_MMU2 = build_src_filter=+ + +PASSWORD_FEATURE = build_src_filter=+ + +ADVANCED_PAUSE_FEATURE = build_src_filter=+ + + +PSU_CONTROL = build_src_filter=+ +HAS_POWER_MONITOR = build_src_filter=+ + +POWER_LOSS_RECOVERY = build_src_filter=+ + +HAS_PTC = build_src_filter=+ + +HAS_FILAMENT_SENSOR = build_src_filter=+ + +(EXT|MANUAL)_SOLENOID.* = build_src_filter=+ + +MK2_MULTIPLEXER = build_src_filter=+ +HAS_CUTTER = build_src_filter=+ + +HAS_DRIVER_SAFE_POWER_PROTECT = build_src_filter=+ +EXPERIMENTAL_I2CBUS = build_src_filter=+ + +G26_MESH_VALIDATION = build_src_filter=+ +ASSISTED_TRAMMING = build_src_filter=+ + +HAS_MESH = build_src_filter=+ +HAS_LEVELING = build_src_filter=+ + +MECHANICAL_GANTRY_CAL.+ = build_src_filter=+ +Z_MULTI_ENDSTOPS|Z_STEPPER_AUTO_ALIGN = build_src_filter=+ +Z_STEPPER_AUTO_ALIGN = build_src_filter=+ +DELTA_AUTO_CALIBRATION = build_src_filter=+ +CALIBRATION_GCODE = build_src_filter=+ +Z_MIN_PROBE_REPEATABILITY_TEST = build_src_filter=+ +M100_FREE_MEMORY_WATCHER = build_src_filter=+ +BACKLASH_GCODE = build_src_filter=+ +IS_KINEMATIC = build_src_filter=+ +HAS_EXTRA_ENDSTOPS = build_src_filter=+ +SKEW_CORRECTION_GCODE = build_src_filter=+ +DIRECT_PIN_CONTROL = build_src_filter=+ + +PINS_DEBUGGING = build_src_filter=+ +HAS_MULTI_EXTRUDER = build_src_filter=+ +HAS_HOTEND_OFFSET = build_src_filter=+ +EDITABLE_SERVO_ANGLES = build_src_filter=+ +PIDTEMP = build_src_filter=+ +PREVENT_COLD_EXTRUSION = build_src_filter=+ +PIDTEMPBED = build_src_filter=+ +HAS_USER_THERMISTORS = build_src_filter=+ +PIDTEMPCHAMBER = build_src_filter=+ +SD_ABORT_ON_ENDSTOP_HIT = build_src_filter=+ +BAUD_RATE_GCODE = build_src_filter=+ +HAS_SMART_EFF_MOD = build_src_filter=+ +COOLANT_CONTROL|AIR_ASSIST = build_src_filter=+ +AIR_EVACUATION = build_src_filter=+ +HAS_SOFTWARE_ENDSTOPS = build_src_filter=+ +SERVO_DETACH_GCODE = build_src_filter=+ +HAS_DUPLICATION_MODE = build_src_filter=+ +SPI_FLASH_BACKUP = build_src_filter=+ +PLATFORM_M997_SUPPORT = build_src_filter=+ +FT_MOTION = build_src_filter=+ + +LIN_ADVANCE = build_src_filter=+ +PHOTO_GCODE = build_src_filter=+ +CONTROLLER_FAN_EDITABLE = build_src_filter=+ +HAS_ZV_SHAPING = build_src_filter=+ +GCODE_MACROS = build_src_filter=+ +GRADIENT_MIX = build_src_filter=+ +OTA_FIRMWARE_UPDATE = build_src_filter=+ +HAS_SAVED_POSITIONS = build_src_filter=+ + +PARK_HEAD_ON_PAUSE = build_src_filter=+ +FILAMENT_LOAD_UNLOAD_GCODES = build_src_filter=+ +CNC_WORKSPACE_PLANES = build_src_filter=+ +CNC_COORDINATE_SYSTEMS = build_src_filter=+ +HAS_M206_COMMAND = build_src_filter=+ +EXPECTED_PRINTER_CHECK = build_src_filter=+ +HOST_KEEPALIVE_FEATURE = build_src_filter=+ +AUTO_REPORT_POSITION = build_src_filter=+ +REPETIER_GCODE_M360 = build_src_filter=+ +HAS_GCODE_M876 = build_src_filter=+ +HAS_RESUME_CONTINUE = build_src_filter=+ +SET_PROGRESS_MANUALLY = build_src_filter=+ +HAS_STATUS_MESSAGE = build_src_filter=+ +HAS_PREHEAT = build_src_filter=+ +HAS_LCD_CONTRAST = build_src_filter=+ +HAS_GCODE_M255 = build_src_filter=+ +HAS_LCD_BRIGHTNESS = build_src_filter=+ +HAS_SOUND = build_src_filter=+ +HAS_MULTI_LANGUAGE = build_src_filter=+ +TOUCH_SCREEN_CALIBRATION = build_src_filter=+ +ARC_SUPPORT = build_src_filter=+ +GCODE_MOTION_MODES = build_src_filter=+ +BABYSTEPPING = build_src_filter=+ + +Z_PROBE_SLED = build_src_filter=+ +G38_PROBE_TARGET = build_src_filter=+ +MAGNETIC_PARKING_EXTRUDER = build_src_filter=+ +HAS_MEDIA = build_src_filter=+ + + + + + + +HAS_MEDIA_SUBCALLS = build_src_filter=+ +GCODE_REPEAT_MARKERS = build_src_filter=+ + +HAS_EXTRUDERS = build_src_filter=+ + +HAS_HOTEND = build_src_filter=+ +HAS_FAN = build_src_filter=+ +HAS_HEATED_BED = build_src_filter=+ +HAS_HEATED_CHAMBER = build_src_filter=+ +HAS_COOLER = build_src_filter=+ +AUTO_REPORT_TEMPERATURES = build_src_filter=+ +HAS_TEMP_PROBE = build_src_filter=+ +HAS_PID_HEATING = build_src_filter=+ +MPCTEMP = build_src_filter=+ +INCH_MODE_SUPPORT = build_src_filter=+ +TEMPERATURE_UNITS_SUPPORT = build_src_filter=+ +NEED_HEX_PRINT = build_src_filter=+ +NEED_LSF = build_src_filter=+ +NOZZLE_PARK_FEATURE = build_src_filter=+ + +NOZZLE_CLEAN_FEATURE = build_src_filter=+ + +DELTA = build_src_filter=+ + +POLARGRAPH = build_src_filter=+ +BEZIER_CURVE_SUPPORT = build_src_filter=+ + +PRINTCOUNTER = build_src_filter=+ +HAS_BED_PROBE = build_src_filter=+ + + + +IS_SCARA = build_src_filter=+ +HAS_SERVOS = build_src_filter=+ + +MORGAN_SCARA = build_src_filter=+ +HAS_MICROSTEPS = build_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 + build_flags=-DSRCHOME=${platformio.src_dir}/src -DHALHOME=SRCHOME diff --git a/ini/lpc176x.ini b/ini/lpc176x.ini index 223ba3cabd..548baaa410 100644 --- a/ini/lpc176x.ini +++ b/ini/lpc176x.ini @@ -20,12 +20,13 @@ lib_ldf_mode = off lib_compat_mode = strict extra_scripts = ${common.extra_scripts} Marlin/src/HAL/LPC1768/upload_extra_script.py -build_src_filter = ${common.default_src_filter} + + +build_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 +build_flags = ${common.build_flags} -DU8G_HAL_LINKS -DPLATFORM_M997_SUPPORT + -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g # debug options for backtrace #-funwind-tables #-mpoke-function-name diff --git a/ini/native.ini b/ini/native.ini index 481dac1777..03c6c59265 100644 --- a/ini/native.ini +++ b/ini/native.ini @@ -43,7 +43,7 @@ debug_build_flags = -fstack-protector-strong -g -g3 -ggdb lib_compat_mode = off build_src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} - MarlinSimUI=https://github.com/p3p/MarlinSimUI/archive/refs/heads/bugfix-2.1.x.zip + MarlinSimUI=https://github.com/p3p/MarlinSimUI/archive/bugfix-2.1.x.zip Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/marlin_sim_native.zip LiquidCrystal=https://github.com/p3p/LiquidCrystal/archive/master.zip extra_scripts = ${common.extra_scripts} diff --git a/ini/renamed.ini b/ini/renamed.ini index ae1b5742b5..9d2706e3b3 100644 --- a/ini/renamed.ini +++ b/ini/renamed.ini @@ -71,3 +71,12 @@ extends = renamed [env:BIGTREE_OCTOPUS_V1_F407_USB] ;=> STM32F407ZE_btt_USB extends = renamed + +[env:STM32H723Vx_btt] ;=> STM32H723VG_btt +extends = renamed + +[env:STM32H723Zx_btt] ;=> STM32H723ZE_btt +extends = renamed + +[env:STM32H743Vx_btt] ;=> STM32H743VI_btt +extends = renamed diff --git a/ini/stm32-common.ini b/ini/stm32-common.ini index c8f28cd0e3..464d8f4757 100644 --- a/ini/stm32-common.ini +++ b/ini/stm32-common.ini @@ -12,13 +12,11 @@ [common_stm32] platform = ststm32@~12.1 board_build.core = stm32 -build_flags = ${common.build_flags} - -std=gnu++14 -DHAL_STM32 - -DUSBCON -DUSBD_USE_CDC - -DTIM_IRQ_PRIO=13 - -DADC_RESOLUTION=12 +build_flags = ${common.build_flags} -std=gnu++14 + -DHAL_STM32 -DPLATFORM_M997_SUPPORT + -DUSBCON -DUSBD_USE_CDC -DTIM_IRQ_PRIO=13 -DADC_RESOLUTION=12 build_unflags = -std=gnu++11 -build_src_filter = ${common.default_src_filter} + + +build_src_filter = ${common.default_src_filter} + - + extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/stm32_serialbuffer.py diff --git a/ini/stm32f0.ini b/ini/stm32f0.ini index d62ac3acf5..d23ee2a603 100644 --- a/ini/stm32f0.ini +++ b/ini/stm32f0.ini @@ -48,4 +48,4 @@ board = malyanm300_f070cb build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -build_src_filter = ${common.default_src_filter} + +build_src_filter = ${common.default_src_filter} + - diff --git a/ini/stm32f1-maple.ini b/ini/stm32f1-maple.ini index d361a0d40a..6f9ac32e0e 100644 --- a/ini/stm32f1-maple.ini +++ b/ini/stm32f1-maple.ini @@ -26,9 +26,9 @@ platform = ststm32@~12.1 board_build.core = maple build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py - ${common.build_flags} -DARDUINO_ARCH_STM32 -DMAPLE_STM32F1 + ${common.build_flags} -DARDUINO_ARCH_STM32 -DMAPLE_STM32F1 -DPLATFORM_M997_SUPPORT build_unflags = -std=gnu11 -std=gnu++11 -build_src_filter = ${common.default_src_filter} + +build_src_filter = ${common.default_src_filter} + - lib_ignore = SPI, FreeRTOS701, FreeRTOS821 lib_deps = ${common.lib_deps} SoftwareSerialM @@ -118,8 +118,7 @@ extends = env:STM32F103RE_maple build_flags = ${env:STM32F103RE_maple.build_flags} -DTEMP_TIMER_CHAN=4 board_build.address = 0x08007000 board_build.ldscript = creality.ld -extra_scripts = ${env:STM32F103RE_maple.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/random-bin.py +board_build.rename = firmware-{date}-{time}.bin debug_tool = jlink upload_protocol = jlink @@ -131,8 +130,7 @@ extends = env:STM32F103RC_maple build_flags = ${env:STM32F103RC_maple.build_flags} -DTEMP_TIMER_CHAN=4 board_build.address = 0x08007000 board_build.ldscript = creality.ld -extra_scripts = ${env:STM32F103RC_maple.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/random-bin.py +board_build.rename = firmware-{date}-{time}.bin debug_tool = jlink upload_protocol = jlink @@ -400,8 +398,8 @@ extends = env:STM32F103RE_maple build_flags = ${STM32F1_maple.build_flags} -DTEMP_TIMER_CHAN=4 board_build.address = 0x08007000 board_build.ldscript = sovol.ld +board_build.rename = firmware-{date}-{time}.bin extra_scripts = ${STM32F1_maple.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/random-bin.py buildroot/share/PlatformIO/scripts/custom_board.py debug_tool = jlink upload_protocol = jlink diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini index 9aaa39ea20..08686a1fb4 100644 --- a/ini/stm32f1.ini +++ b/ini/stm32f1.ini @@ -121,6 +121,7 @@ debug_tool = stlink extends = stm32_variant board_build.variant = MARLIN_F103Rx board_build.offset = 0x7000 +board_build.rename = firmware-{date}-{time}.bin board_upload.offset_address = 0x08007000 build_flags = ${stm32_variant.build_flags} -DMCU_STM32F103RE -DHAL_SD_MODULE_ENABLED @@ -128,8 +129,6 @@ build_flags = ${stm32_variant.build_flags} -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 build_unflags = ${stm32_variant.build_unflags} -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${stm32_variant.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/random-bin.py monitor_speed = 115200 debug_tool = jlink upload_protocol = jlink @@ -253,7 +252,7 @@ board = malyanm200_f103cb build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -build_src_filter = ${common.default_src_filter} + +build_src_filter = ${common.default_src_filter} + - # # FLYmaker FLY Mini (STM32F103RCT6) @@ -371,6 +370,7 @@ extra_scripts = ${stm32_variant.extra_scripts} extends = common_STM32F103RC_variant extra_scripts = ${common_STM32F103RC_variant.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +build_flags = ${common_STM32F103RC_variant.build_flags} -DTIMER_SERVO=TIM1 lib_ldf_mode = chain debug_tool = stlink upload_protocol = serial diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 7060f95db7..8708a6dbca 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -419,7 +419,20 @@ monitor_speed = 500000 upload_protocol = dfu # -# MKS Robin Pro V2 +# STM32F407ZET6 ARM Cortex-M4 +# +[env:mks_robin2] +extends = stm32_variant +board = marlin_MKS_ROBIN2 +board_build.offset = 0xC000 +board_upload.offset_address = 0x0800C000 +board_build.encrypt_mks = Robin2.bin +build_flags = ${stm32_variant.build_flags} + -DTARGET_STM32F4 -DSTM32F407_5ZX + -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 -DUSBD_PID=0x3748 -DUSB_PRODUCT=\"MKS_Robin2\" + +# +# MKS Robin Pro V2 (No bootloader!) # [env:mks_robin_pro2] extends = stm32_variant @@ -671,23 +684,45 @@ board = genericSTM32F401RC board_build.variant = MARLIN_CREALITY_STM32F401RC board_build.offset = 0x10000 board_upload.offset_address = 0x08010000 +board_build.rename = firmware-{date}-{time}.bin build_flags = ${stm32_variant.build_flags} -DMCU_STM32F401RC -DSTM32F4 -DSS_TIMER=4 -DTIMER_SERVO=TIM5 -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8 build_unflags = ${stm32_variant.build_unflags} -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${stm32_variant.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/random-bin.py monitor_speed = 115200 [env:STM32F401RC_creality_jlink] -extends = env:STM32F401RC_creality -debug_tool = jlink -upload_protocol = jlink +extends = env:STM32F401RC_creality +debug_tool = jlink +upload_protocol = jlink [env:STM32F401RC_creality_stlink] -extends = env:STM32F401RC_creality -debug_tool = stlink -upload_protocol = stlink +extends = env:STM32F401RC_creality +debug_tool = stlink +upload_protocol = stlink + +# +# Ender-5 S1 STM32F401RE_creality (CR4NS200141C13 with STM32F401RET6) +# +[env:STM32F401RE_creality] +extends = stm32_variant +board = marlin_CREALITY_STM32F401RE +board_build.offset = 0x10000 +board_upload.offset_address = 0x08010000 +board_build.rename = firmware-{date}-{time}.bin +build_flags = ${stm32_variant.build_flags} -DSTM32F401xE -DSTM32F4 -DSTM32F4_UPDATE_FOLDER +build_unflags = ${stm32_variant.build_unflags} -DUSBCON -DUSBD_USE_CDC +monitor_speed = 115200 + +[env:STM32F401RE_creality_jlink] +extends = env:STM32F401RE_creality +debug_tool = jlink +upload_protocol = jlink + +[env:STM32F401RE_creality_stlink] +extends = env:STM32F401RC_creality +debug_tool = stlink +upload_protocol = stlink # # BigTree SKR mini E3 V3.0.1 (STM32F401RCT6 ARM Cortex-M4) @@ -696,6 +731,7 @@ upload_protocol = stlink extends = stm32_variant platform = ststm32@~14.1.0 platform_packages = framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/main.zip + toolchain-gccarmnoneeabi@1.100301.220327 board = marlin_STM32F401RC board_build.offset = 0x4000 board_upload.offset_address = 0x08004000 @@ -707,6 +743,20 @@ build_flags = ${stm32_variant.build_flags} upload_protocol = stlink debug_tool = stlink +# +# BigTreeTech SKR Mini E3 V3.0.1 (STM32F401RCT6 ARM Cortex-M0+) +# Custom upload to SD via Marlin with Binary Protocol +# Requires Marlin with BINARY_FILE_TRANSFER already installed on the target board. +# If CUSTOM_FIRMWARE_UPLOAD is also installed, Marlin will reboot the board to install the firmware. +# Currently CUSTOM_FIRMWARE_UPLOAD must also be enabled to use 'xfer' build envs. +# +[env:STM32F401RC_btt_xfer] +extends = env:STM32F401RC_btt +build_flags = ${env:STM32F401RC_btt.build_flags} -DXFER_BUILD +extra_scripts = ${env:STM32F401RC_btt.extra_scripts} + pre:buildroot/share/scripts/upload.py +upload_protocol = custom + # # MKS SKIPR v1.0 all-in-one board (STM32F407VE) # @@ -735,3 +785,24 @@ build_flags = ${stm32_variant.build_flags} -DSTM32F4xx build_unflags = ${stm32_variant.build_unflags} -fno-rtti -DUSBCON -DUSBD_USE_CDC + +# +# Blackpill +# +[env:STM32F401CD_blackpill_stlink] +platform = ${common_stm32.platform} +extends = common_stm32 +board = blackpill_f401cc +upload_protocol = stlink +monitor_speed = 115200 + +# +# I3Dbeez9 (STM32F407ZGT6 ARM Cortex-M4) +# +[env:I3DBEEZ9_V1] +extends = stm32_variant +board = marlin_I3DBEEZ9 +board_build.offset = 0x8000 +build_flags = ${stm32_variant.build_flags} -DSTM32F407_5ZX +debug_tool = stlink +upload_protocol = stlink diff --git a/ini/stm32g0.ini b/ini/stm32g0.ini index 2ffee09790..f67002fa5c 100644 --- a/ini/stm32g0.ini +++ b/ini/stm32g0.ini @@ -33,12 +33,14 @@ build_flags = -DPIN_WIRE_SCL=PB3 -DPIN_WIRE_SDA=PB4 extends = stm32_variant platform = ststm32@~14.1.0 platform_packages = framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/main.zip + toolchain-gccarmnoneeabi@1.100301.220327 board = marlin_BTT_EBB42_V1_1 board_build.offset = 0x0000 board_upload.offset_address = 0x08000000 -build_flags = ${stm32_variant.build_flags} ${stm32g0_I2C2.build_flags} -upload_protocol = stlink +build_flags = ${stm32_variant.build_flags} ${stm32g0_I2C2.build_flags} -flto debug_tool = stlink +upload_protocol = dfu +upload_command = dfu-util -a 0 -s 0x08000000:leave -D "$SOURCE" # # BigTreeTech SKR Mini E3 V3.0 (STM32G0B1RET6 ARM Cortex-M0+) @@ -47,14 +49,15 @@ debug_tool = stlink extends = stm32_variant platform = ststm32@~14.1.0 platform_packages = framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/main.zip + toolchain-gccarmnoneeabi@1.100301.220327 board = marlin_STM32G0B1RE board_build.offset = 0x2000 board_upload.offset_address = 0x08002000 build_flags = ${stm32_variant.build_flags} - -DPIN_SERIAL4_RX=PC_11 -DPIN_SERIAL4_TX=PC_10 - -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 - -DTIMER_SERVO=TIM3 -DTIMER_TONE=TIM4 - -DSTEP_TIMER_IRQ_PRIO=0 + -DPIN_SERIAL4_RX=PC_11 -DPIN_SERIAL4_TX=PC_10 + -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 + -DTIMER_SERVO=TIM3 -DTIMER_TONE=TIM4 + -DSTEP_TIMER_IRQ_PRIO=0 upload_protocol = stlink debug_tool = stlink @@ -101,15 +104,16 @@ upload_protocol = custom extends = stm32_variant platform = ststm32@~14.1.0 platform_packages = framework-arduinoststm32@https://github.com/stm32duino/Arduino_Core_STM32/archive/main.zip + toolchain-gccarmnoneeabi@1.100301.220327 board = marlin_STM32G0B1VE board_build.offset = 0x2000 board_upload.offset_address = 0x08002000 build_flags = ${stm32_variant.build_flags} - -DPIN_SERIAL4_RX=PE_9 -DPIN_SERIAL4_TX=PE_8 - -DPIN_SERIAL5_RX=PE_11 -DPIN_SERIAL5_TX=PE_10 - -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 - -DTIMER_SERVO=TIM3 -DTIMER_TONE=TIM4 - -DSTEP_TIMER_IRQ_PRIO=0 + -DPIN_SERIAL4_RX=PE_9 -DPIN_SERIAL4_TX=PE_8 + -DPIN_SERIAL5_RX=PE_11 -DPIN_SERIAL5_TX=PE_10 + -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 + -DTIMER_SERVO=TIM3 -DTIMER_TONE=TIM4 + -DSTEP_TIMER_IRQ_PRIO=0 upload_protocol = stlink debug_tool = stlink diff --git a/ini/stm32h7.ini b/ini/stm32h7.ini index 5733d35bf0..73d3b8779b 100644 --- a/ini/stm32h7.ini +++ b/ini/stm32h7.ini @@ -12,8 +12,8 @@ # H : High Performance # 7 : Cortex M7 core (0:M0, 1-2:M3, 3-4:M4, 7:M7) # 43 : Line/Features -# I : 176 pins -# I : 2048KB Flash-memory +# I : 176 pins (T:36, C:48 or 49, M:81, V:100, Z:144, I:176) +# I : 2048KB Flash-memory (C:256KB, D:384KB, E:512KB, G:1024KB, I:2048KB) # T : LQFP package # 6 : -40...85°C (7: ...105°C) # @@ -40,19 +40,18 @@ upload_protocol = cmsis-dap debug_tool = cmsis-dap # -# BigTreeTech SKR V3.0 / V3.0 EZ (STM32H743VIT6 ARM Cortex-M7) +# BigTreeTech STM32H743Vx ARM Cortex-M7 Common # -[env:STM32H743Vx_btt] +[STM32H743Vx_btt] extends = stm32_variant platform = ststm32@15.4.1 platform_packages = framework-arduinoststm32@~4.20200.220530 -board = marlin_STM32H743Vx board_build.offset = 0x20000 board_upload.offset_address = 0x08020000 build_flags = ${stm32_variant.build_flags} - -DPIN_SERIAL1_RX=PA_10 -DPIN_SERIAL1_TX=PA_9 - -DPIN_SERIAL3_RX=PD_9 -DPIN_SERIAL3_TX=PD_8 - -DPIN_SERIAL4_RX=PA_1 -DPIN_SERIAL4_TX=PA_0 + -DPIN_SERIAL1_TX=PA_9 -DPIN_SERIAL1_RX=PA_10 + -DPIN_SERIAL3_TX=PD_8 -DPIN_SERIAL3_RX=PD_9 + -DPIN_SERIAL4_TX=PA_0 -DPIN_SERIAL4_RX=PA_1 -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 -DTIMER_SERVO=TIM5 -DTIMER_TONE=TIM2 -DSTEP_TIMER_IRQ_PRIO=0 @@ -61,22 +60,59 @@ upload_protocol = cmsis-dap debug_tool = cmsis-dap # -# BigTreeTech SKR V3.0 / SKR V3.0 EZ (STM32H723VGT6 ARM Cortex-M7) -# BigTreeTech Octopus Max EZ V1.0 (STM32H723VET6 ARM Cortex-M7) +# BigTreeTech SKR V3.0 / V3.0 EZ (STM32H743VIT6 ARM Cortex-M7) # -[env:STM32H723Vx_btt] +[env:STM32H743VI_btt] +extends = STM32H743Vx_btt +board = marlin_STM32H743VI + +# +# BigTreeTech STM32H723Vx ARM Cortex-M7 Common +# +[STM32H723Vx_btt] extends = stm32_variant platform = ststm32@15.4.1 platform_packages = framework-arduinoststm32@~4.20200.220530 -board = marlin_STM32H723Vx board_build.offset = 0x20000 board_upload.offset_address = 0x08020000 build_flags = ${stm32_variant.build_flags} - -DPIN_SERIAL1_RX=PA_10 -DPIN_SERIAL1_TX=PA_9 - -DPIN_SERIAL2_RX=PD_6 -DPIN_SERIAL2_TX=PD_5 - -DPIN_SERIAL3_RX=PD_9 -DPIN_SERIAL3_TX=PD_8 - -DPIN_SERIAL4_RX=PA_1 -DPIN_SERIAL4_TX=PA_0 - -DPIN_SERIAL7_RX=PE_7 -DPIN_SERIAL7_TX=PE_8 + -DPIN_SERIAL1_TX=PA_9 -DPIN_SERIAL1_RX=PA_10 + -DPIN_SERIAL2_TX=PD_5 -DPIN_SERIAL2_RX=PD_6 + -DPIN_SERIAL3_TX=PD_8 -DPIN_SERIAL3_RX=PD_9 + -DPIN_SERIAL4_TX=PA_0 -DPIN_SERIAL4_RX=PA_1 + -DPIN_SERIAL7_TX=PE_8 -DPIN_SERIAL7_RX=PE_7 + -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 + -DTIMER_SERVO=TIM5 -DTIMER_TONE=TIM2 + -DSTEP_TIMER_IRQ_PRIO=0 + -DRCC_PERIPHCLK_I2C35=RCC_PERIPHCLK_I2C5 + -DUSE_USB_HS -DUSE_USB_HS_IN_FS + -DD_CACHE_DISABLED + -UI2C5_BASE +upload_protocol = cmsis-dap +debug_tool = cmsis-dap + +# +# BigTreeTech SKR V3.0 / SKR V3.0 EZ (STM32H723VGT6 ARM Cortex-M7) +# +[env:STM32H723VG_btt] +extends = STM32H723Vx_btt +board = marlin_STM32H723VG + +# +# BigTreeTech STM32H723Zx ARM Cortex-M7 Common +# +[STM32H723Zx_btt] +extends = stm32_variant +platform = ststm32@15.4.1 +platform_packages = framework-arduinoststm32@~4.20200.220530 +board_build.offset = 0x20000 +board_upload.offset_address = 0x08020000 +build_flags = ${stm32_variant.build_flags} + -DPIN_SERIAL1_TX=PA_9 -DPIN_SERIAL1_RX=PA_10 + -DPIN_SERIAL2_TX=PD_5 -DPIN_SERIAL2_RX=PD_6 + -DPIN_SERIAL3_TX=PD_8 -DPIN_SERIAL3_RX=PD_9 + -DPIN_SERIAL4_TX=PA_0 -DPIN_SERIAL4_RX=PA_1 + -DPIN_SERIAL7_TX=PE_8 -DPIN_SERIAL7_RX=PE_7 -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 -DTIMER_SERVO=TIM5 -DTIMER_TONE=TIM2 -DSTEP_TIMER_IRQ_PRIO=0 @@ -90,25 +126,6 @@ debug_tool = cmsis-dap # # BigTreeTech Octopus Pro V1.0 / Octopus Max EZ V1.0 (STM32H723ZET6 ARM Cortex-M7) # -[env:STM32H723Zx_btt] -extends = stm32_variant -platform = ststm32@15.4.1 -platform_packages = framework-arduinoststm32@~4.20200.220530 -board = marlin_STM32H723Zx -board_build.offset = 0x20000 -board_upload.offset_address = 0x08020000 -build_flags = ${stm32_variant.build_flags} - -DPIN_SERIAL1_RX=PA_10 -DPIN_SERIAL1_TX=PA_9 - -DPIN_SERIAL2_RX=PD_6 -DPIN_SERIAL2_TX=PD_5 - -DPIN_SERIAL3_RX=PD_9 -DPIN_SERIAL3_TX=PD_8 - -DPIN_SERIAL4_RX=PA_1 -DPIN_SERIAL4_TX=PA_0 - -DPIN_SERIAL7_RX=PE_7 -DPIN_SERIAL7_TX=PE_8 - -DSERIAL_RX_BUFFER_SIZE=1024 -DSERIAL_TX_BUFFER_SIZE=1024 - -DTIMER_SERVO=TIM5 -DTIMER_TONE=TIM2 - -DSTEP_TIMER_IRQ_PRIO=0 - -DRCC_PERIPHCLK_I2C35=RCC_PERIPHCLK_I2C5 - -DUSE_USB_HS -DUSE_USB_HS_IN_FS - -DD_CACHE_DISABLED - -UI2C5_BASE -upload_protocol = cmsis-dap -debug_tool = cmsis-dap +[env:STM32H723ZE_btt] +extends = STM32H723Zx_btt +board = marlin_STM32H723ZE diff --git a/platformio.ini b/platformio.ini index 885fdd87d6..e3bdb6f586 100644 --- a/platformio.ini +++ b/platformio.ini @@ -52,218 +52,79 @@ extra_scripts = pre:buildroot/share/PlatformIO/scripts/preflight-checks.py post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py lib_deps = -default_src_filter = + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +default_src_filter = + - - + ; LCDs and Controllers + - - - - - + - - - - - - - - - - - - - - - - - - - + ; Marlin HAL + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ; Features and G-Codes + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + - + - + ; Library Code + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + ; Modules + - + - + ; Media Support + - + ; + ; Minimal Requirements + ; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # # Default values apply to all 'env:' prefixed environments