More useful ENABLED / DISABLED macros (#17054)
This commit is contained in:
		| @@ -1047,7 +1047,7 @@ | ||||
|    */ | ||||
|   //#define POWER_LOSS_RECOVERY | ||||
|   #if ENABLED(POWER_LOSS_RECOVERY) | ||||
|     //#define PLR_ENABLED_DEFAULT  true // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) | ||||
|     #define PLR_ENABLED_DEFAULT   false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) | ||||
|     //#define BACKUP_POWER_SUPPLY       // Backup power / UPS to move the steppers on power loss | ||||
|     //#define POWER_LOSS_ZRAISE       2 // (mm) Z axis raise on resume (on power loss with UPS) | ||||
|     //#define POWER_LOSS_PIN         44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. | ||||
|   | ||||
| @@ -31,10 +31,10 @@ | ||||
|  * Templatized 01 October 2018 by Eduardo José Tagle to allow multiple instances | ||||
|  */ | ||||
|  | ||||
| #include "../shared/MarlinSerial.h" | ||||
|  | ||||
| #include <WString.h> | ||||
|  | ||||
| #include "../../inc/MarlinConfigPre.h" | ||||
|  | ||||
| #ifndef SERIAL_PORT | ||||
|   #define SERIAL_PORT 0 | ||||
| #endif | ||||
| @@ -261,12 +261,12 @@ | ||||
|     static constexpr int PORT               = serial; | ||||
|     static constexpr unsigned int RX_SIZE   = RX_BUFFER_SIZE; | ||||
|     static constexpr unsigned int TX_SIZE   = TX_BUFFER_SIZE; | ||||
|     static constexpr bool XONOFF            = bSERIAL_XON_XOFF; | ||||
|     static constexpr bool EMERGENCYPARSER   = bEMERGENCY_PARSER; | ||||
|     static constexpr bool DROPPED_RX        = bSERIAL_STATS_DROPPED_RX; | ||||
|     static constexpr bool RX_OVERRUNS       = bSERIAL_STATS_RX_BUFFER_OVERRUNS; | ||||
|     static constexpr bool RX_FRAMING_ERRORS = bSERIAL_STATS_RX_FRAMING_ERRORS; | ||||
|     static constexpr bool MAX_RX_QUEUED     = bSERIAL_STATS_MAX_RX_QUEUED; | ||||
|     static constexpr bool XONOFF            = ENABLED(SERIAL_XON_XOFF); | ||||
|     static constexpr bool EMERGENCYPARSER   = ENABLED(EMERGENCY_PARSER); | ||||
|     static constexpr bool DROPPED_RX        = ENABLED(SERIAL_STATS_DROPPED_RX); | ||||
|     static constexpr bool RX_OVERRUNS       = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); | ||||
|     static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS); | ||||
|     static constexpr bool MAX_RX_QUEUED     = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); | ||||
|   }; | ||||
|   extern MarlinSerial<MarlinSerialCfg<SERIAL_PORT>> customizedSerial1; | ||||
|  | ||||
| @@ -304,7 +304,7 @@ | ||||
|     static constexpr bool XONOFF            = false; | ||||
|     static constexpr bool EMERGENCYPARSER   = false; | ||||
|     static constexpr bool DROPPED_RX        = false; | ||||
|     static constexpr bool RX_OVERRUNS       = bDGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS; | ||||
|     static constexpr bool RX_OVERRUNS       = HAS_DGUS_LCD && ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS); | ||||
|     static constexpr bool RX_FRAMING_ERRORS = false; | ||||
|     static constexpr bool MAX_RX_QUEUED     = false; | ||||
|   }; | ||||
|   | ||||
| @@ -27,10 +27,10 @@ | ||||
|  * Based on MarlinSerial for AVR, copyright (c) 2006 Nicholas Zambetti.  All right reserved. | ||||
|  */ | ||||
|  | ||||
| #include "../shared/MarlinSerial.h" | ||||
|  | ||||
| #include <WString.h> | ||||
|  | ||||
| #include "../../inc/MarlinConfigPre.h" | ||||
|  | ||||
| #define DEC 10 | ||||
| #define HEX 16 | ||||
| #define OCT 8 | ||||
| @@ -163,12 +163,12 @@ struct MarlinSerialCfg { | ||||
|   static constexpr int PORT               = serial; | ||||
|   static constexpr unsigned int RX_SIZE   = RX_BUFFER_SIZE; | ||||
|   static constexpr unsigned int TX_SIZE   = TX_BUFFER_SIZE; | ||||
|   static constexpr bool XONOFF            = bSERIAL_XON_XOFF; | ||||
|   static constexpr bool EMERGENCYPARSER   = bEMERGENCY_PARSER; | ||||
|   static constexpr bool DROPPED_RX        = bSERIAL_STATS_DROPPED_RX; | ||||
|   static constexpr bool RX_OVERRUNS       = bSERIAL_STATS_RX_BUFFER_OVERRUNS; | ||||
|   static constexpr bool RX_FRAMING_ERRORS = bSERIAL_STATS_RX_FRAMING_ERRORS; | ||||
|   static constexpr bool MAX_RX_QUEUED     = bSERIAL_STATS_MAX_RX_QUEUED; | ||||
|   static constexpr bool XONOFF            = ENABLED(SERIAL_XON_XOFF); | ||||
|   static constexpr bool EMERGENCYPARSER   = ENABLED(EMERGENCY_PARSER); | ||||
|   static constexpr bool DROPPED_RX        = ENABLED(SERIAL_STATS_DROPPED_RX); | ||||
|   static constexpr bool RX_OVERRUNS       = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); | ||||
|   static constexpr bool RX_FRAMING_ERRORS = ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS); | ||||
|   static constexpr bool MAX_RX_QUEUED     = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); | ||||
| }; | ||||
|  | ||||
| #if SERIAL_PORT >= 0 | ||||
|   | ||||
| @@ -57,9 +57,7 @@ | ||||
|  * Because PWM hardware channels all share the same frequency, along with the | ||||
|  * fallback software channels, FAST_PWM_FAN is incompatible with Servos. | ||||
|  */ | ||||
| #if NUM_SERVOS > 0 && ENABLED(FAST_PWM_FAN) | ||||
|   #error "BLTOUCH and Servos are incompatible with FAST_PWM_FAN on LPC176x boards." | ||||
| #endif | ||||
| static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are incompatible with FAST_PWM_FAN on LPC176x boards."); | ||||
|  | ||||
| /** | ||||
|  * Test LPC176x-specific configuration values for errors at compile-time. | ||||
| @@ -69,13 +67,13 @@ | ||||
| //  #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector" | ||||
| //#endif | ||||
|  | ||||
| #if IS_RE_ARM_BOARD && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) | ||||
|   #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 require TMC_USE_SW_SPI" | ||||
| #if 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) | ||||
|   #if ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && HAS_DRIVER(TMC2130) && DISABLED(TMC_USE_SW_SPI) | ||||
|     #error "Re-ARM with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER and TMC2130 requires TMC_USE_SW_SPI." | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(BAUD_RATE_GCODE) | ||||
|   #error "BAUD_RATE_GCODE is not yet supported on LPC176x." | ||||
| #endif | ||||
| static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported on LPC176x."); | ||||
|  | ||||
| /** | ||||
|  * Flag any serial port conflicts | ||||
|   | ||||
| @@ -1,67 +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 <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
| #pragma once | ||||
|  | ||||
| /** | ||||
|  * HAL/shared/MarlinSerial.h | ||||
|  */ | ||||
|  | ||||
| #include "../../inc/MarlinConfigPre.h" | ||||
|  | ||||
| constexpr bool | ||||
|   #if HAS_DGUS_LCD | ||||
|     bDGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS = (false | ||||
|       #if ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|         || true | ||||
|       #endif | ||||
|     ), | ||||
|   #endif | ||||
|   bSERIAL_XON_XOFF = (false | ||||
|     #if ENABLED(SERIAL_XON_XOFF) | ||||
|       || true | ||||
|     #endif | ||||
|   ), | ||||
|   bEMERGENCY_PARSER = (false | ||||
|     #if ENABLED(EMERGENCY_PARSER) | ||||
|       || true | ||||
|     #endif | ||||
|   ), | ||||
|   bSERIAL_STATS_DROPPED_RX = (false | ||||
|     #if ENABLED(SERIAL_STATS_DROPPED_RX) | ||||
|       || true | ||||
|     #endif | ||||
|   ), | ||||
|   bSERIAL_STATS_RX_BUFFER_OVERRUNS = (false | ||||
|     #if ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS) | ||||
|       || true | ||||
|     #endif | ||||
|   ), | ||||
|   bSERIAL_STATS_RX_FRAMING_ERRORS = (false | ||||
|     #if ENABLED(SERIAL_STATS_RX_FRAMING_ERRORS) | ||||
|       || true | ||||
|     #endif | ||||
|   ), | ||||
|   bSERIAL_STATS_MAX_RX_QUEUED = (false | ||||
|     #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) | ||||
|       || true | ||||
|     #endif | ||||
|   ); | ||||
| @@ -241,11 +241,8 @@ void setup_powerhold() { | ||||
|     OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); | ||||
|   #endif | ||||
|   #if ENABLED(PSU_CONTROL) | ||||
|     #if ENABLED(PSU_DEFAULT_OFF) | ||||
|       powersupply_on = true;  PSU_OFF(); | ||||
|     #else | ||||
|       powersupply_on = false; PSU_ON(); | ||||
|     #endif | ||||
|     powersupply_on = ENABLED(PSU_DEFAULT_OFF); | ||||
|     if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
| @@ -425,14 +422,8 @@ void startOrResumeJob() { | ||||
|     switch (card.sdprinting_done_state) { | ||||
|  | ||||
|       #if HAS_RESUME_CONTINUE                   // Display "Click to Continue..." | ||||
|         case 1: | ||||
|           did_state = queue.enqueue_P(PSTR("M0Q1S" | ||||
|             #if HAS_LCD_MENU | ||||
|               "1800"                            // ...for 30 minutes with LCD | ||||
|             #else | ||||
|               "60"                              // ...for 1 minute with no LCD | ||||
|             #endif | ||||
|           )); | ||||
|         case 1:                                 // 30 min timeout with LCD, 1 min without | ||||
|           did_state = queue.enqueue_P(PSTR("M0Q1S" TERN(HAS_LCD_MENU, "1800", "60"))); | ||||
|           break; | ||||
|       #endif | ||||
|  | ||||
| @@ -501,31 +492,19 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { | ||||
|   } | ||||
|  | ||||
|   // Prevent steppers timing-out in the middle of M600 | ||||
|   #if BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) | ||||
|     #define MOVE_AWAY_TEST !did_pause_print | ||||
|   #else | ||||
|     #define MOVE_AWAY_TEST true | ||||
|   #endif | ||||
|   #define STAY_TEST (BOTH(ADVANCED_PAUSE_FEATURE, PAUSE_PARK_NO_STEPPER_TIMEOUT) && did_pause_print) | ||||
|  | ||||
|   if (stepper_inactive_time) { | ||||
|     static bool already_shutdown_steppers; // = false | ||||
|     if (planner.has_blocks_queued()) | ||||
|       gcode.reset_stepper_timeout(); | ||||
|     else if (MOVE_AWAY_TEST && !ignore_stepper_queue && ELAPSED(ms, gcode.previous_move_ms + stepper_inactive_time)) { | ||||
|     else if (!STAY_TEST && !ignore_stepper_queue && ELAPSED(ms, gcode.previous_move_ms + stepper_inactive_time)) { | ||||
|       if (!already_shutdown_steppers) { | ||||
|         already_shutdown_steppers = true;  // L6470 SPI will consume 99% of free time without this | ||||
|         #if ENABLED(DISABLE_INACTIVE_X) | ||||
|           DISABLE_AXIS_X(); | ||||
|         #endif | ||||
|         #if ENABLED(DISABLE_INACTIVE_Y) | ||||
|           DISABLE_AXIS_Y(); | ||||
|         #endif | ||||
|         #if ENABLED(DISABLE_INACTIVE_Z) | ||||
|           DISABLE_AXIS_Z(); | ||||
|         #endif | ||||
|         #if ENABLED(DISABLE_INACTIVE_E) | ||||
|           disable_e_steppers(); | ||||
|         #endif | ||||
|         if (ENABLED(DISABLE_INACTIVE_X)) DISABLE_AXIS_X(); | ||||
|         if (ENABLED(DISABLE_INACTIVE_Y)) DISABLE_AXIS_Y(); | ||||
|         if (ENABLED(DISABLE_INACTIVE_Z)) DISABLE_AXIS_Z(); | ||||
|         if (ENABLED(DISABLE_INACTIVE_E)) disable_e_steppers(); | ||||
|         #if HAS_LCD_MENU && ENABLED(AUTO_BED_LEVELING_UBL) | ||||
|           if (ubl.lcd_map_control) { | ||||
|             ubl.lcd_map_control = false; | ||||
| @@ -1191,7 +1170,6 @@ void setup() { | ||||
|  */ | ||||
| void loop() { | ||||
|   do { | ||||
|  | ||||
|     idle(); | ||||
|  | ||||
|     #if ENABLED(SDSUPPORT) | ||||
| @@ -1204,9 +1182,5 @@ void loop() { | ||||
|  | ||||
|     endstops.event_handler(); | ||||
|  | ||||
|   } while (false        // Return to caller for best compatibility | ||||
|     #ifdef __AVR__ | ||||
|       || true           // Loop forever on slower (AVR) boards | ||||
|     #endif | ||||
|   ); | ||||
|   } while (ENABLED(__AVR__)); // Loop forever on slower (AVR) boards | ||||
| } | ||||
|   | ||||
| @@ -82,101 +82,97 @@ | ||||
| #define _OR_ADTE(N,T)   || AXIS_DRIVER_TYPE_E(N,T) | ||||
| #define HAS_E_DRIVER(T) (0 RREPEAT2(E_STEPPERS, _OR_ADTE, T)) | ||||
|  | ||||
| #define HAS_DRIVER(T) (    AXIS_DRIVER_TYPE_X(T)  || AXIS_DRIVER_TYPE_X2(T) \ | ||||
|                         || AXIS_DRIVER_TYPE_Y(T)  || AXIS_DRIVER_TYPE_Y2(T) \ | ||||
|                         || AXIS_DRIVER_TYPE_Z(T)  || AXIS_DRIVER_TYPE_Z2(T) \ | ||||
|                         || AXIS_DRIVER_TYPE_Z3(T) || AXIS_DRIVER_TYPE_Z4(T) \ | ||||
|                         || HAS_E_DRIVER(T) ) | ||||
| #define HAS_DRIVER(T) (  AXIS_DRIVER_TYPE_X(T)  || AXIS_DRIVER_TYPE_Y(T)  || AXIS_DRIVER_TYPE_Z(T)  \ | ||||
|                       || AXIS_DRIVER_TYPE_X2(T) || AXIS_DRIVER_TYPE_Y2(T) || AXIS_DRIVER_TYPE_Z2(T) \ | ||||
|                       || AXIS_DRIVER_TYPE_Z3(T) || AXIS_DRIVER_TYPE_Z4(T) || HAS_E_DRIVER(T) ) | ||||
|  | ||||
| // Test for supported TMC drivers that require advanced configuration | ||||
| // Does not match standalone configurations | ||||
| #define HAS_TRINAMIC_CONFIG (    HAS_DRIVER(TMC2130) \ | ||||
|                               || HAS_DRIVER(TMC2160) \ | ||||
|                               || HAS_DRIVER(TMC2208) \ | ||||
|                               || HAS_DRIVER(TMC2209) \ | ||||
|                               || HAS_DRIVER(TMC2660) \ | ||||
|                               || HAS_DRIVER(TMC5130) \ | ||||
|                               || HAS_DRIVER(TMC5160) ) | ||||
| #if (    HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) \ | ||||
|       || HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) \ | ||||
|       || HAS_DRIVER(TMC2660) \ | ||||
|       || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) ) | ||||
|   #define HAS_TRINAMIC_CONFIG 1 | ||||
| #endif | ||||
|  | ||||
| #define HAS_TRINAMIC HAS_TRINAMIC_CONFIG | ||||
|  | ||||
| #define HAS_TRINAMIC_STANDALONE (    HAS_DRIVER(TMC2130_STANDALONE) \ | ||||
|                                   || HAS_DRIVER(TMC2208_STANDALONE) \ | ||||
|                                   || HAS_DRIVER(TMC2209_STANDALONE) \ | ||||
|                                   || HAS_DRIVER(TMC26X_STANDALONE)  \ | ||||
|                                   || HAS_DRIVER(TMC2660_STANDALONE) \ | ||||
|                                   || HAS_DRIVER(TMC5130_STANDALONE) \ | ||||
|                                   || HAS_DRIVER(TMC5160_STANDALONE) \ | ||||
|                                   || HAS_DRIVER(TMC2160_STANDALONE) ) | ||||
| #if (    HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \ | ||||
|       || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \ | ||||
|       || HAS_DRIVER(TMC26X_STANDALONE)  || HAS_DRIVER(TMC2660_STANDALONE) \ | ||||
|       || HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE) ) | ||||
|   #define HAS_TRINAMIC_STANDALONE 1 | ||||
| #endif | ||||
|  | ||||
| #define HAS_TMCX1X0 (    HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) \ | ||||
|                       || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160)) | ||||
| #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) | ||||
|   #define HAS_TMCX1X0 1 | ||||
| #endif | ||||
|  | ||||
| #define HAS_TMC220x (HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)) | ||||
| #if HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) | ||||
|   #define HAS_TMC220x 1 | ||||
| #endif | ||||
|  | ||||
| #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC2208) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC2209) \ | ||||
| #define AXIS_IS_TMC(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC2660) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC5130) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|  | ||||
| // Test for a driver that uses SPI - this allows checking whether a _CS_ pin | ||||
| // is considered sensitive | ||||
| #define AXIS_HAS_SPI(A)  (    AXIS_DRIVER_TYPE(A,TMC2130) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
| #define AXIS_HAS_SPI(A)  (    AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC2660) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC5130) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|  | ||||
| #define AXIS_HAS_UART(A) (    AXIS_DRIVER_TYPE(A,TMC2208) \ | ||||
|                            || AXIS_DRIVER_TYPE(A,TMC2209) ) | ||||
| #define AXIS_HAS_UART(A) ( AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) ) | ||||
|  | ||||
| #define AXIS_HAS_RXTX AXIS_HAS_UART | ||||
|  | ||||
| #define AXIS_HAS_SW_SERIAL(A) ((AXIS_HAS_UART(A) && !defined(A##_HARDWARE_SERIAL))) | ||||
| #define AXIS_HAS_SW_SERIAL(A) ( AXIS_HAS_UART(A) && !defined(A##_HARDWARE_SERIAL) ) | ||||
|  | ||||
| #define AXIS_HAS_STALLGUARD(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
| #define AXIS_HAS_STALLGUARD(A)   (    AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2209) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2660) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5130) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|  | ||||
| #define AXIS_HAS_STEALTHCHOP(A)  (    AXIS_DRIVER_TYPE(A,TMC2130) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2208) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2209) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5130) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
| #define AXIS_HAS_STEALTHCHOP(A)  (    AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|  | ||||
| #define AXIS_HAS_SG_RESULT(A)    (    AXIS_DRIVER_TYPE(A,TMC2130) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2208) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2209) ) | ||||
| #define AXIS_HAS_SG_RESULT(A)    (    AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) ) | ||||
|  | ||||
| #define AXIS_HAS_COOLSTEP(A)     (    AXIS_DRIVER_TYPE(A,TMC2130) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC2209) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5130) \ | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|                                    || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) ) | ||||
|  | ||||
| #define _OR_EAH(N,T)    || AXIS_HAS_##T(E##N) | ||||
| #define E_AXIS_HAS(T)   (0 _OR_EAH(0,T) _OR_EAH(1,T) _OR_EAH(2,T) _OR_EAH(3,T) _OR_EAH(4,T) _OR_EAH(5,T) _OR_EAH(6,T) _OR_EAH(7,T)) | ||||
|  | ||||
| #define ANY_AXIS_HAS(T) (    AXIS_HAS_##T(X)  || AXIS_HAS_##T(X2) \ | ||||
|                           || AXIS_HAS_##T(Y)  || AXIS_HAS_##T(Y2) \ | ||||
|                           || AXIS_HAS_##T(Z)  || AXIS_HAS_##T(Z2) \ | ||||
|                           || AXIS_HAS_##T(Z3) || AXIS_HAS_##T(Z4) \ | ||||
|                           || E_AXIS_HAS(T) ) | ||||
| #define ANY_AXIS_HAS(T) (    AXIS_HAS_##T(X)  || AXIS_HAS_##T(Y)  || AXIS_HAS_##T(Z)  \ | ||||
|                           || AXIS_HAS_##T(X2) || AXIS_HAS_##T(Y2) || AXIS_HAS_##T(Z2) \ | ||||
|                           || AXIS_HAS_##T(Z3) || AXIS_HAS_##T(Z4) || E_AXIS_HAS(T) ) | ||||
|  | ||||
| #define HAS_STEALTHCHOP    ANY_AXIS_HAS(STEALTHCHOP) | ||||
| #define HAS_STALLGUARD     ANY_AXIS_HAS(STALLGUARD) | ||||
| #define HAS_SG_RESULT      ANY_AXIS_HAS(SG_RESULT) | ||||
| #define HAS_COOLSTEP       ANY_AXIS_HAS(COOLSTEP) | ||||
| #define HAS_TMC_UART       ANY_AXIS_HAS(RXTX) | ||||
| #define HAS_TMC_SPI        ANY_AXIS_HAS(SPI) | ||||
| #define HAS_TMC_SW_SERIAL  ANY_AXIS_HAS(SW_SERIAL) | ||||
| #if ANY_AXIS_HAS(STEALTHCHOP) | ||||
|   #define HAS_STEALTHCHOP 1 | ||||
| #endif | ||||
| #if ANY_AXIS_HAS(STALLGUARD) | ||||
|   #define HAS_STALLGUARD 1 | ||||
| #endif | ||||
| #if ANY_AXIS_HAS(SG_RESULT) | ||||
|   #define HAS_SG_RESULT 1 | ||||
| #endif | ||||
| #if ANY_AXIS_HAS(COOLSTEP) | ||||
|   #define HAS_COOLSTEP 1 | ||||
| #endif | ||||
| #if ANY_AXIS_HAS(RXTX) | ||||
|   #define HAS_TMC_UART 1 | ||||
| #endif | ||||
| #if ANY_AXIS_HAS(SPI) | ||||
|   #define HAS_TMC_SPI 1 | ||||
| #endif | ||||
|  | ||||
| // Defines that can't be evaluated now | ||||
| #define HAS_TMC_SW_SERIAL ANY_AXIS_HAS(SW_SERIAL) | ||||
|  | ||||
| // | ||||
| // Stretching 'drivers.h' to include LPC/SAMD51 SD options | ||||
| @@ -187,7 +183,11 @@ | ||||
| #define _SDCARD_ID(V) _CAT(_SDCARD_, V) | ||||
| #define SD_CONNECTION_IS(V) (_SDCARD_ID(SDCARD_CONNECTION) == _SDCARD_ID(V)) | ||||
|  | ||||
| #define HAS_L64XX (HAS_DRIVER(L6470) || HAS_DRIVER(L6474) || HAS_DRIVER(L6480) || HAS_DRIVER(POWERSTEP01)) | ||||
| #define HAS_L64XX_NOT_L6474 (HAS_L64XX && !HAS_DRIVER(L6474)) | ||||
| #if HAS_DRIVER(L6470) || HAS_DRIVER(L6474) || HAS_DRIVER(L6480) || HAS_DRIVER(POWERSTEP01) | ||||
|   #define HAS_L64XX 1 | ||||
| #endif | ||||
| #if HAS_L64XX && !HAS_DRIVER(L6474) | ||||
|   #define HAS_L64XX_NOT_L6474 1 | ||||
| #endif | ||||
|  | ||||
| #define AXIS_IS_L64XX(A) (AXIS_DRIVER_TYPE_##A(L6470) || AXIS_DRIVER_TYPE_##A(L6474) ||  AXIS_DRIVER_TYPE_##A(L6480) || AXIS_DRIVER_TYPE_##A(POWERSTEP01)) | ||||
|   | ||||
| @@ -177,18 +177,23 @@ | ||||
| // Macros to support option testing | ||||
| #define _CAT(a,V...) a##V | ||||
| #define CAT(a,V...) _CAT(a,V) | ||||
| #define SWITCH_ENABLED_false 0 | ||||
| #define SWITCH_ENABLED_true  1 | ||||
| #define SWITCH_ENABLED_0     0 | ||||
| #define SWITCH_ENABLED_1     1 | ||||
| #define SWITCH_ENABLED_0x0   0 | ||||
| #define SWITCH_ENABLED_0x1   1 | ||||
| #define SWITCH_ENABLED_      1 | ||||
| #define _ENA_1(O)           _CAT(SWITCH_ENABLED_, O) | ||||
| #define _DIS_1(O)           !_ENA_1(O) | ||||
|  | ||||
| #define _ISENA_     ~,1 | ||||
| #define _ISENA_1    ~,1 | ||||
| #define _ISENA_0x1  ~,1 | ||||
| #define _ISENA_true ~,1 | ||||
| #define _ISENA(V...)        IS_PROBE(V) | ||||
|  | ||||
| #define _ENA_1(O)           _ISENA(CAT(_IS,CAT(ENA_, O))) | ||||
| #define _DIS_1(O)           NOT(_ENA_1(O)) | ||||
| #define ENABLED(V...)       DO(ENA,&&,V) | ||||
| #define DISABLED(V...)      DO(DIS,&&,V) | ||||
|  | ||||
| #define TERN(O,A,B)         _TERN(_ENA_1(O),B,A)    // OPTION converted to to '0' or '1' | ||||
| #define _TERN(E,V...)       __TERN(_CAT(T_,E),V)    // Prepend 'T_' to get 'T_0' or 'T_1' | ||||
| #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 ANY(V...)          !DISABLED(V) | ||||
| #define NONE(V...)          DISABLED(V) | ||||
| #define ALL(V...)           ENABLED(V) | ||||
| @@ -390,8 +395,9 @@ | ||||
| // | ||||
| // Primitives supporting precompiler REPEAT | ||||
| // | ||||
| #define FIRST(a,...)    a | ||||
| #define SECOND(a,b,...) b | ||||
| #define FIRST(a,...)     a | ||||
| #define SECOND(a,b,...)  b | ||||
| #define THIRD(a,b,c,...) c | ||||
|  | ||||
| // Defer expansion | ||||
| #define EMPTY() | ||||
|   | ||||
| @@ -57,39 +57,23 @@ void safe_delay(millis_t ms) { | ||||
|  | ||||
|   void log_machine_info() { | ||||
|     SERIAL_ECHOLNPGM("Machine Type: " | ||||
|       #if ENABLED(DELTA) | ||||
|         "Delta" | ||||
|       #elif IS_SCARA | ||||
|         "SCARA" | ||||
|       #elif IS_CORE | ||||
|         "Core" | ||||
|       #else | ||||
|         "Cartesian" | ||||
|       #endif | ||||
|       TERN(DELTA, "Delta", "") | ||||
|       TERN(IS_SCARA, "SCARA", "") | ||||
|       TERN(IS_CORE, "Core", "") | ||||
|       TERN(IS_CARTESIAN, "Cartesian", "") | ||||
|     ); | ||||
|  | ||||
|     SERIAL_ECHOLNPGM("Probe: " | ||||
|       #if ENABLED(PROBE_MANUALLY) | ||||
|         "PROBE_MANUALLY" | ||||
|       #elif ENABLED(NOZZLE_AS_PROBE) | ||||
|         "NOZZLE_AS_PROBE" | ||||
|       #elif ENABLED(FIX_MOUNTED_PROBE) | ||||
|         "FIX_MOUNTED_PROBE" | ||||
|       #elif ENABLED(BLTOUCH) | ||||
|         "BLTOUCH" | ||||
|       #elif HAS_Z_SERVO_PROBE | ||||
|         "SERVO PROBE" | ||||
|       #elif ENABLED(TOUCH_MI_PROBE) | ||||
|         "TOUCH_MI_PROBE" | ||||
|       #elif ENABLED(Z_PROBE_SLED) | ||||
|         "Z_PROBE_SLED" | ||||
|       #elif ENABLED(Z_PROBE_ALLEN_KEY) | ||||
|         "Z_PROBE_ALLEN_KEY" | ||||
|       #elif ENABLED(SOLENOID_PROBE) | ||||
|         "SOLENOID_PROBE" | ||||
|       #else | ||||
|         "NONE" | ||||
|       #endif | ||||
|       TERN(PROBE_MANUALLY, "PROBE_MANUALLY", "") | ||||
|       TERN(NOZZLE_AS_PROBE, "NOZZLE_AS_PROBE", "") | ||||
|       TERN(FIX_MOUNTED_PROBE, "FIX_MOUNTED_PROBE", "") | ||||
|       TERN(BLTOUCH, "BLTOUCH", "") | ||||
|       TERN(HAS_Z_SERVO_PROBE, TERN(BLTOUCH, "BLTOUCH", "SERVO PROBE"), "") | ||||
|       TERN(TOUCH_MI_PROBE, "TOUCH_MI_PROBE", "") | ||||
|       TERN(Z_PROBE_SLED, "Z_PROBE_SLED", "") | ||||
|       TERN(Z_PROBE_ALLEN_KEY, "Z_PROBE_ALLEN_KEY", "") | ||||
|       TERN(SOLENOID_PROBE, "SOLENOID_PROBE", "") | ||||
|       TERN(PROBE_SELECTED, "", "NONE") | ||||
|     ); | ||||
|  | ||||
|     #if HAS_BED_PROBE | ||||
| @@ -107,20 +91,10 @@ void safe_delay(millis_t ms) { | ||||
|         else | ||||
|           SERIAL_ECHOPGM(" (Aligned With"); | ||||
|  | ||||
|         if (probe.offset_xy.y > 0) { | ||||
|           #if IS_SCARA | ||||
|             SERIAL_ECHOPGM("-Distal"); | ||||
|           #else | ||||
|             SERIAL_ECHOPGM("-Back"); | ||||
|           #endif | ||||
|         } | ||||
|         else if (probe.offset_xy.y < 0) { | ||||
|           #if IS_SCARA | ||||
|             SERIAL_ECHOPGM("-Proximal"); | ||||
|           #else | ||||
|             SERIAL_ECHOPGM("-Front"); | ||||
|           #endif | ||||
|         } | ||||
|         if (probe.offset_xy.y > 0) | ||||
|           serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Distal") : PSTR("-Back")); | ||||
|         else if (probe.offset_xy.y < 0) | ||||
|           serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Proximal") : PSTR("-Front")); | ||||
|         else if (probe.offset_xy.x != 0) | ||||
|           SERIAL_ECHOPGM("-Center"); | ||||
|  | ||||
| @@ -128,27 +102,18 @@ void safe_delay(millis_t ms) { | ||||
|  | ||||
|       #endif | ||||
|  | ||||
|       if (probe.offset.z < 0) | ||||
|         SERIAL_ECHOPGM("Below"); | ||||
|       else if (probe.offset.z > 0) | ||||
|         SERIAL_ECHOPGM("Above"); | ||||
|       else | ||||
|         SERIAL_ECHOPGM("Same Z as"); | ||||
|       serialprintPGM(probe.offset.z < 0 ? PSTR("Below") : probe.offset.z > 0 ? PSTR("Above") : PSTR("Same Z as")); | ||||
|       SERIAL_ECHOLNPGM(" Nozzle)"); | ||||
|  | ||||
|     #endif | ||||
|  | ||||
|     #if HAS_ABL_OR_UBL | ||||
|       SERIAL_ECHOPGM("Auto Bed Leveling: "); | ||||
|       #if ENABLED(AUTO_BED_LEVELING_LINEAR) | ||||
|         SERIAL_ECHOLNPGM("LINEAR"); | ||||
|       #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) | ||||
|         SERIAL_ECHOLNPGM("BILINEAR"); | ||||
|       #elif ENABLED(AUTO_BED_LEVELING_3POINT) | ||||
|         SERIAL_ECHOLNPGM("3POINT"); | ||||
|       #elif ENABLED(AUTO_BED_LEVELING_UBL) | ||||
|         SERIAL_ECHOLNPGM("UBL"); | ||||
|       #endif | ||||
|       SERIAL_ECHOPGM("Auto Bed Leveling: " | ||||
|         TERN(AUTO_BED_LEVELING_LINEAR, "LINEAR", "") | ||||
|         TERN(AUTO_BED_LEVELING_BILINEAR, "BILINEAR", "") | ||||
|         TERN(AUTO_BED_LEVELING_3POINT, "3POINT", "") | ||||
|         TERN(AUTO_BED_LEVELING_UBL, "UBL", "") | ||||
|       ); | ||||
|  | ||||
|       if (planner.leveling_active) { | ||||
|         SERIAL_ECHOLNPGM(" (enabled)"); | ||||
|   | ||||
| @@ -48,24 +48,16 @@ | ||||
| #include "../MarlinCore.h" | ||||
| #include "../HAL/shared/Delay.h" | ||||
|  | ||||
| #define HAS_SIDE_BY_SIDE (ENABLED(MAX7219_SIDE_BY_SIDE) && MAX7219_NUMBER_UNITS > 1) | ||||
| #if ENABLED(MAX7219_SIDE_BY_SIDE) && MAX7219_NUMBER_UNITS > 1 | ||||
|   #define HAS_SIDE_BY_SIDE 1 | ||||
| #endif | ||||
|  | ||||
| #if _ROT == 0 || _ROT == 180 | ||||
|   #if HAS_SIDE_BY_SIDE | ||||
|     #define MAX7219_X_LEDS  8 | ||||
|     #define MAX7219_Y_LEDS  MAX7219_LINES | ||||
|   #else | ||||
|     #define MAX7219_Y_LEDS  8 | ||||
|     #define MAX7219_X_LEDS  MAX7219_LINES | ||||
|   #endif | ||||
|   #define MAX7219_X_LEDS TERN(HAS_SIDE_BY_SIDE, 8, MAX7219_LINES) | ||||
|   #define MAX7219_Y_LEDS TERN(HAS_SIDE_BY_SIDE, MAX7219_LINES, 8) | ||||
| #elif _ROT == 90 || _ROT == 270 | ||||
|   #if HAS_SIDE_BY_SIDE | ||||
|     #define MAX7219_Y_LEDS  8 | ||||
|     #define MAX7219_X_LEDS  MAX7219_LINES | ||||
|   #else | ||||
|     #define MAX7219_X_LEDS  8 | ||||
|     #define MAX7219_Y_LEDS  MAX7219_LINES | ||||
|   #endif | ||||
|   #define MAX7219_X_LEDS TERN(HAS_SIDE_BY_SIDE, MAX7219_LINES, 8) | ||||
|   #define MAX7219_Y_LEDS TERN(HAS_SIDE_BY_SIDE, 8, MAX7219_LINES) | ||||
| #else | ||||
|   #error "MAX7219_ROTATE must be a multiple of +/- 90°." | ||||
| #endif | ||||
|   | ||||
| @@ -55,14 +55,7 @@ void Babystep::add_mm(const AxisEnum axis, const float &mm) { | ||||
|  | ||||
| void Babystep::add_steps(const AxisEnum axis, const int16_t distance) { | ||||
|  | ||||
|   #if ENABLED(BABYSTEP_WITHOUT_HOMING) | ||||
|     #define CAN_BABYSTEP(AXIS) true | ||||
|   #else | ||||
|     extern uint8_t axis_known_position; | ||||
|     #define CAN_BABYSTEP(AXIS) TEST(axis_known_position, AXIS) | ||||
|   #endif | ||||
|  | ||||
|   if (!CAN_BABYSTEP(axis)) return; | ||||
|   if (DISABLED(BABYSTEP_WITHOUT_HOMING) && !TEST(axis_known_position, axis)) return; | ||||
|  | ||||
|   accum += distance; // Count up babysteps for the UI | ||||
|   #if ENABLED(BABYSTEP_DISPLAY_TOTAL) | ||||
|   | ||||
| @@ -73,20 +73,12 @@ void BLTouch::init(const bool set_voltage/*=false*/) { | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     const bool should_set = last_written_mode != (false | ||||
|       #if ENABLED(BLTOUCH_SET_5V_MODE) | ||||
|         || true | ||||
|       #endif | ||||
|     ); | ||||
|     const bool should_set = last_written_mode != ENABLED(BLTOUCH_SET_5V_MODE); | ||||
|  | ||||
|   #endif | ||||
|  | ||||
|   if (should_set && set_voltage) | ||||
|     mode_conv_proc((false | ||||
|       #if ENABLED(BLTOUCH_SET_5V_MODE) | ||||
|         || true | ||||
|       #endif | ||||
|     )); | ||||
|     mode_conv_proc(ENABLED(BLTOUCH_SET_5V_MODE)); | ||||
| } | ||||
|  | ||||
| void BLTouch::clear() { | ||||
|   | ||||
| @@ -159,11 +159,7 @@ class PrintJobRecovery { | ||||
|     static inline void cancel() { purge(); card.autostart_index = 0; } | ||||
|  | ||||
|     static void load(); | ||||
|     static void save(const bool force=false | ||||
|       #if ENABLED(SAVE_EACH_CMD_MODE) | ||||
|         || true | ||||
|       #endif | ||||
|     ); | ||||
|     static void save(const bool force=ENABLED(SAVE_EACH_CMD_MODE)); | ||||
|  | ||||
|   #if PIN_EXISTS(POWER_LOSS) | ||||
|     static inline void outage() { | ||||
|   | ||||
| @@ -62,13 +62,7 @@ | ||||
|     current_position.set(0.0, 0.0); | ||||
|     sync_plan_position(); | ||||
|  | ||||
|     const int x_axis_home_dir = | ||||
|       #if ENABLED(DUAL_X_CARRIAGE) | ||||
|         x_home_dir(active_extruder) | ||||
|       #else | ||||
|         home_dir(X_AXIS) | ||||
|       #endif | ||||
|     ; | ||||
|     const int x_axis_home_dir = x_home_dir(active_extruder); | ||||
|  | ||||
|     const float mlx = max_length(X_AXIS), | ||||
|                 mly = max_length(Y_AXIS), | ||||
| @@ -310,6 +304,8 @@ void GcodeSuite::G28() { | ||||
|  | ||||
|   #if ENABLED(DELTA) | ||||
|  | ||||
|     constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a DELTA | ||||
|  | ||||
|     home_delta(); | ||||
|  | ||||
|     #if ENABLED(IMPROVE_HOMING_RELIABILITY) | ||||
| @@ -330,12 +326,10 @@ void GcodeSuite::G28() { | ||||
|  | ||||
|     #endif | ||||
|  | ||||
|     const float z_homing_height = ( | ||||
|       #if ENABLED(UNKNOWN_Z_NO_RAISE) | ||||
|         !TEST(axis_known_position, Z_AXIS) ? 0 : | ||||
|       #endif | ||||
|           (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) | ||||
|     ); | ||||
|     const float z_homing_height = | ||||
|       (DISABLED(UNKNOWN_Z_NO_RAISE) || TEST(axis_known_position, Z_AXIS)) | ||||
|         ? (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) | ||||
|         : 0; | ||||
|  | ||||
|     if (z_homing_height && (doX || doY)) { | ||||
|       // Raise Z before homing any other axes and z is not already high enough (never lower z) | ||||
| @@ -355,20 +349,13 @@ void GcodeSuite::G28() { | ||||
|     // Home Y (before X) | ||||
|     #if ENABLED(HOME_Y_BEFORE_X) | ||||
|  | ||||
|       if (doY | ||||
|         #if ENABLED(CODEPENDENT_XY_HOMING) | ||||
|           || doX | ||||
|         #endif | ||||
|       ) homeaxis(Y_AXIS); | ||||
|       if (doY || (doX && ENABLED(CODEPENDENT_XY_HOMING))) | ||||
|         homeaxis(Y_AXIS); | ||||
|  | ||||
|     #endif | ||||
|  | ||||
|     // Home X | ||||
|     if (doX | ||||
|       #if ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X) | ||||
|         || doY | ||||
|       #endif | ||||
|     ) { | ||||
|     if (doX || (doY && ENABLED(CODEPENDENT_XY_HOMING) && DISABLED(HOME_Y_BEFORE_X))) { | ||||
|  | ||||
|       #if ENABLED(DUAL_X_CARRIAGE) | ||||
|  | ||||
| @@ -396,9 +383,8 @@ void GcodeSuite::G28() { | ||||
|     } | ||||
|  | ||||
|     // Home Y (after X) | ||||
|     #if DISABLED(HOME_Y_BEFORE_X) | ||||
|       if (doY) homeaxis(Y_AXIS); | ||||
|     #endif | ||||
|     if (DISABLED(HOME_Y_BEFORE_X) && doY) | ||||
|       homeaxis(Y_AXIS); | ||||
|  | ||||
|     #if ENABLED(IMPROVE_HOMING_RELIABILITY) | ||||
|       end_slow_homing(slow_homing); | ||||
| @@ -487,7 +473,7 @@ void GcodeSuite::G28() { | ||||
|     do_blocking_move_to_z(delta_clip_start_height); | ||||
|   #endif | ||||
|  | ||||
|   #if HAS_LEVELING && ENABLED(RESTORE_LEVELING_AFTER_G28) | ||||
|   #if ENABLED(RESTORE_LEVELING_AFTER_G28) | ||||
|     set_bed_leveling_enabled(leveling_was_active); | ||||
|   #endif | ||||
|  | ||||
| @@ -495,12 +481,7 @@ void GcodeSuite::G28() { | ||||
|  | ||||
|   // Restore the active tool after homing | ||||
|   #if HOTENDS > 1 && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)) | ||||
|     #if EITHER(PARKING_EXTRUDER, DUAL_X_CARRIAGE) | ||||
|       #define NO_FETCH false // fetch the previous toolhead | ||||
|     #else | ||||
|       #define NO_FETCH true | ||||
|     #endif | ||||
|     tool_change(old_tool_index, NO_FETCH); | ||||
|     tool_change(old_tool_index, NONE(PARKING_EXTRUDER, DUAL_X_CARRIAGE));   // Do move if one of these | ||||
|   #endif | ||||
|  | ||||
|   #if HAS_HOMING_CURRENT | ||||
| @@ -523,15 +504,8 @@ void GcodeSuite::G28() { | ||||
|  | ||||
|   report_current_position(); | ||||
|  | ||||
|   #if ENABLED(NANODLP_Z_SYNC) | ||||
|     #if ENABLED(NANODLP_ALL_AXIS) | ||||
|       #define _HOME_SYNC true       // For any axis, output sync text. | ||||
|     #else | ||||
|       #define _HOME_SYNC doZ        // Only for Z-axis | ||||
|     #endif | ||||
|     if (_HOME_SYNC) | ||||
|       SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); | ||||
|   #endif | ||||
|   if (ENABLED(NANODLP_Z_SYNC) && (doZ || ENABLED(NANODLP_ALL_AXIS))) | ||||
|     SERIAL_ECHOLNPGM(STR_Z_MOVE_COMP); | ||||
|  | ||||
|   if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("<<< G28"); | ||||
|  | ||||
|   | ||||
| @@ -56,8 +56,12 @@ | ||||
|   #define CALIBRATION_MEASUREMENT_CERTAIN   0.5 // mm | ||||
| #endif | ||||
|  | ||||
| #define HAS_X_CENTER BOTH(CALIBRATION_MEASURE_LEFT, CALIBRATION_MEASURE_RIGHT) | ||||
| #define HAS_Y_CENTER BOTH(CALIBRATION_MEASURE_FRONT, CALIBRATION_MEASURE_BACK) | ||||
| #if BOTH(CALIBRATION_MEASURE_LEFT, CALIBRATION_MEASURE_RIGHT) | ||||
|   #define HAS_X_CENTER 1 | ||||
| #endif | ||||
| #if BOTH(CALIBRATION_MEASURE_FRONT, CALIBRATION_MEASURE_BACK) | ||||
|   #define HAS_Y_CENTER 1 | ||||
| #endif | ||||
|  | ||||
| enum side_t : uint8_t { TOP, RIGHT, FRONT, LEFT, BACK, NUM_SIDES }; | ||||
|  | ||||
|   | ||||
| @@ -54,39 +54,19 @@ void GcodeSuite::M115() { | ||||
|     #endif | ||||
|  | ||||
|     // SERIAL_XON_XOFF | ||||
|     cap_line(PSTR("SERIAL_XON_XOFF") | ||||
|       #if ENABLED(SERIAL_XON_XOFF) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("SERIAL_XON_XOFF"), ENABLED(SERIAL_XON_XOFF)); | ||||
|  | ||||
|     // BINARY_FILE_TRANSFER (M28 B1) | ||||
|     cap_line(PSTR("BINARY_FILE_TRANSFER") | ||||
|       #if ENABLED(BINARY_FILE_TRANSFER) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("BINARY_FILE_TRANSFER"), ENABLED(BINARY_FILE_TRANSFER)); | ||||
|  | ||||
|     // EEPROM (M500, M501) | ||||
|     cap_line(PSTR("EEPROM") | ||||
|       #if ENABLED(EEPROM_SETTINGS) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); | ||||
|  | ||||
|     // Volumetric Extrusion (M200) | ||||
|     cap_line(PSTR("VOLUMETRIC") | ||||
|       #if DISABLED(NO_VOLUMETRICS) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("VOLUMETRIC"), DISABLED(NO_VOLUMETRICS)); | ||||
|  | ||||
|     // AUTOREPORT_TEMP (M155) | ||||
|     cap_line(PSTR("AUTOREPORT_TEMP") | ||||
|       #if ENABLED(AUTO_REPORT_TEMPERATURES) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("AUTOREPORT_TEMP"), ENABLED(AUTO_REPORT_TEMPERATURES)); | ||||
|  | ||||
|     // PROGRESS (M530 S L, M531 <file>, M532 X L) | ||||
|     cap_line(PSTR("PROGRESS")); | ||||
| @@ -95,93 +75,42 @@ void GcodeSuite::M115() { | ||||
|     cap_line(PSTR("PRINT_JOB"), true); | ||||
|  | ||||
|     // AUTOLEVEL (G29) | ||||
|     cap_line(PSTR("AUTOLEVEL") | ||||
|       #if HAS_AUTOLEVEL | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("AUTOLEVEL"), ENABLED(HAS_AUTOLEVEL)); | ||||
|  | ||||
|     // Z_PROBE (G30) | ||||
|     cap_line(PSTR("Z_PROBE") | ||||
|       #if HAS_BED_PROBE | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("Z_PROBE"), ENABLED(HAS_BED_PROBE)); | ||||
|  | ||||
|     // MESH_REPORT (M420 V) | ||||
|     cap_line(PSTR("LEVELING_DATA") | ||||
|       #if HAS_LEVELING | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("LEVELING_DATA"), ENABLED(HAS_LEVELING)); | ||||
|  | ||||
|     // BUILD_PERCENT (M73) | ||||
|     cap_line(PSTR("BUILD_PERCENT") | ||||
|       #if ENABLED(LCD_SET_PROGRESS_MANUALLY) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("BUILD_PERCENT"), ENABLED(LCD_SET_PROGRESS_MANUALLY)); | ||||
|  | ||||
|     // SOFTWARE_POWER (M80, M81) | ||||
|     cap_line(PSTR("SOFTWARE_POWER") | ||||
|       #if ENABLED(PSU_CONTROL) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("SOFTWARE_POWER"), ENABLED(PSU_CONTROL)); | ||||
|  | ||||
|     // CASE LIGHTS (M355) | ||||
|     cap_line(PSTR("TOGGLE_LIGHTS") | ||||
|       #if HAS_CASE_LIGHT | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("CASE_LIGHT_BRIGHTNESS") | ||||
|       #if HAS_CASE_LIGHT | ||||
|         , PWM_PIN(CASE_LIGHT_PIN) | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(HAS_CASE_LIGHT)); | ||||
|  | ||||
|     cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN(HAS_CASE_LIGHT, PWM_PIN(CASE_LIGHT_PIN), 0)); | ||||
|  | ||||
|     // EMERGENCY_PARSER (M108, M112, M410, M876) | ||||
|     cap_line(PSTR("EMERGENCY_PARSER") | ||||
|       #if ENABLED(EMERGENCY_PARSER) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("EMERGENCY_PARSER"), ENABLED(EMERGENCY_PARSER)); | ||||
|  | ||||
|     // PROMPT SUPPORT (M876) | ||||
|     cap_line(PSTR("PROMPT_SUPPORT") | ||||
|       #if ENABLED(HOST_PROMPT_SUPPORT) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("PROMPT_SUPPORT"), ENABLED(HOST_PROMPT_SUPPORT)); | ||||
|  | ||||
|     // AUTOREPORT_SD_STATUS (M27 extension) | ||||
|     cap_line(PSTR("AUTOREPORT_SD_STATUS") | ||||
|       #if ENABLED(AUTO_REPORT_SD_STATUS) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("AUTOREPORT_SD_STATUS"), ENABLED(AUTO_REPORT_SD_STATUS)); | ||||
|  | ||||
|     // THERMAL_PROTECTION | ||||
|     cap_line(PSTR("THERMAL_PROTECTION") | ||||
|       #if (ENABLED(THERMAL_PROTECTION_HOTENDS) || !EXTRUDERS) && (ENABLED(THERMAL_PROTECTION_BED) || !HAS_HEATED_BED) && (ENABLED(THERMAL_PROTECTION_CHAMBER) || !HAS_HEATED_CHAMBER) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("THERMAL_PROTECTION"), ENABLED(THERMALLY_SAFE)); | ||||
|  | ||||
|     // MOTION_MODES (M80-M89) | ||||
|     cap_line(PSTR("MOTION_MODES") | ||||
|       #if ENABLED(GCODE_MOTION_MODES) | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("MOTION_MODES"), ENABLED(GCODE_MOTION_MODES)); | ||||
|  | ||||
|     // CHAMBER_TEMPERATURE (M141, M191) | ||||
|     cap_line(PSTR("CHAMBER_TEMPERATURE") | ||||
|       #if HAS_HEATED_CHAMBER | ||||
|         , true | ||||
|       #endif | ||||
|     ); | ||||
|     cap_line(PSTR("CHAMBER_TEMPERATURE"), ENABLED(HAS_HEATED_CHAMBER)); | ||||
|  | ||||
|   #endif // EXTENDED_CAPABILITIES_REPORT | ||||
| } | ||||
|   | ||||
| @@ -26,6 +26,15 @@ | ||||
|  * Conditionals that need to be set before Configuration_adv.h or pins.h | ||||
|  */ | ||||
|  | ||||
| #if ENABLED(MORGAN_SCARA) | ||||
|   #define IS_SCARA 1 | ||||
|   #define IS_KINEMATIC 1 | ||||
| #elif ENABLED(DELTA) | ||||
|   #define IS_KINEMATIC 1 | ||||
| #else | ||||
|   #define IS_CARTESIAN 1 | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(CARTESIO_UI) | ||||
|  | ||||
|   #define DOGLCD | ||||
| @@ -193,7 +202,9 @@ | ||||
| #endif | ||||
|  | ||||
| // 128x64 I2C OLED LCDs - SSD1306/SSD1309/SH1106 | ||||
| #define HAS_SSD1306_OLED_I2C ANY(U8GLIB_SSD1306, U8GLIB_SSD1309, U8GLIB_SH1106) | ||||
| #if ANY(U8GLIB_SSD1306, U8GLIB_SSD1309, U8GLIB_SH1106) | ||||
|   #define HAS_SSD1306_OLED_I2C 1 | ||||
| #endif | ||||
| #if HAS_SSD1306_OLED_I2C | ||||
|   #define IS_ULTRA_LCD | ||||
|   #define DOGLCD | ||||
| @@ -347,19 +358,34 @@ | ||||
| #endif | ||||
|  | ||||
| // Extensible UI serial touch screens. (See src/lcd/extensible_ui) | ||||
| #if ANY(MALYAN_LCD, DGUS_LCD, TOUCH_UI_FTDI_EVE) | ||||
| #if ANY(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) | ||||
|   #define HAS_DGUS_LCD 1 | ||||
| #endif | ||||
|  | ||||
| #if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE) | ||||
|   #define IS_EXTUI | ||||
|   #define EXTENSIBLE_UI | ||||
| #endif | ||||
|  | ||||
| // Aliases for LCD features | ||||
| #define HAS_SPI_LCD          ENABLED(ULTRA_LCD) | ||||
| #define HAS_DISPLAY         (HAS_SPI_LCD || ENABLED(EXTENSIBLE_UI)) | ||||
| #define HAS_GRAPHICAL_LCD    ENABLED(DOGLCD) | ||||
| #define HAS_CHARACTER_LCD   (HAS_SPI_LCD && !HAS_GRAPHICAL_LCD) | ||||
| #define HAS_LCD_MENU        (ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS)) | ||||
| #define HAS_ADC_BUTTONS      ENABLED(ADC_KEYPAD) | ||||
| #define HAS_DGUS_LCD         ANY(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) | ||||
| #if EITHER(ULTRA_LCD, EXTENSIBLE_UI) | ||||
|   #define HAS_DISPLAY 1 | ||||
|   #if ENABLED(ULTRA_LCD) | ||||
|     #define HAS_SPI_LCD 1 | ||||
|     #if ENABLED(DOGLCD) | ||||
|       #define HAS_GRAPHICAL_LCD 1 | ||||
|     #else | ||||
|       #define HAS_CHARACTER_LCD 1 | ||||
|     #endif | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(ULTIPANEL) && DISABLED(NO_LCD_MENUS) | ||||
|   #define HAS_LCD_MENU 1 | ||||
| #endif | ||||
| #if ENABLED(ADC_KEYPAD) | ||||
|   #define HAS_ADC_BUTTONS 1 | ||||
| #endif | ||||
|  | ||||
| #if HAS_GRAPHICAL_LCD | ||||
|   #ifndef LCD_PIXEL_WIDTH | ||||
| @@ -447,12 +473,17 @@ | ||||
| #define ARRAY_BY_HOTENDS(V...) ARRAY_N(HOTENDS, V) | ||||
| #define ARRAY_BY_HOTENDS1(v1) ARRAY_BY_HOTENDS(v1, v1, v1, v1, v1, v1, v1, v1) | ||||
|  | ||||
| #define DO_SWITCH_EXTRUDER (ENABLED(SWITCHING_EXTRUDER) && (DISABLED(SWITCHING_NOZZLE) || SWITCHING_EXTRUDER_SERVO_NR != SWITCHING_NOZZLE_SERVO_NR)) | ||||
| #define SWITCHING_NOZZLE_TWO_SERVOS defined(SWITCHING_NOZZLE_E1_SERVO_NR) | ||||
| #if ENABLED(SWITCHING_EXTRUDER) && (DISABLED(SWITCHING_NOZZLE) || SWITCHING_EXTRUDER_SERVO_NR != SWITCHING_NOZZLE_SERVO_NR) | ||||
|   #define DO_SWITCH_EXTRUDER 1 | ||||
| #endif | ||||
|  | ||||
| #define HAS_DUPLICATION_MODE EITHER(DUAL_X_CARRIAGE, MULTI_NOZZLE_DUPLICATION) | ||||
| #ifdef SWITCHING_NOZZLE_E1_SERVO_NR | ||||
|   #define SWITCHING_NOZZLE_TWO_SERVOS 1 | ||||
| #endif | ||||
|  | ||||
| #define HAS_HOTEND_OFFSET (HOTENDS > 1) | ||||
| #if HOTENDS > 1 | ||||
|   #define HAS_HOTEND_OFFSET 1 | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * Default hotend offsets, if not defined | ||||
| @@ -509,6 +540,10 @@ | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #ifndef NUM_SERVOS | ||||
|   #define NUM_SERVOS 0 | ||||
| #endif | ||||
|  | ||||
| #ifndef PREHEAT_1_LABEL | ||||
|   #define PREHEAT_1_LABEL "PLA" | ||||
| #endif | ||||
| @@ -520,8 +555,12 @@ | ||||
| /** | ||||
|  * Set a flag for a servo probe (or BLTouch) | ||||
|  */ | ||||
| #define HAS_Z_SERVO_PROBE (defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0) | ||||
| #define HAS_SERVO_ANGLES (HAS_Z_SERVO_PROBE || EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE)) | ||||
| #if defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0 | ||||
|   #define HAS_Z_SERVO_PROBE 1 | ||||
| #endif | ||||
| #if HAS_Z_SERVO_PROBE || EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE) | ||||
|   #define HAS_SERVO_ANGLES 1 | ||||
| #endif | ||||
| #if !HAS_SERVO_ANGLES | ||||
|   #undef EDITABLE_SERVO_ANGLES | ||||
| #endif | ||||
| @@ -529,20 +568,31 @@ | ||||
| /** | ||||
|  * Set flags for enabled probes | ||||
|  */ | ||||
| #define HAS_BED_PROBE (HAS_Z_SERVO_PROBE || ANY(FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, SOLENOID_PROBE, SENSORLESS_PROBING, RACK_AND_PINION_PROBE)) | ||||
| #define PROBE_SELECTED (HAS_BED_PROBE || EITHER(PROBE_MANUALLY, MESH_BED_LEVELING)) | ||||
| #if ANY(HAS_Z_SERVO_PROBE, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, SOLENOID_PROBE, SENSORLESS_PROBING, RACK_AND_PINION_PROBE) | ||||
|   #define HAS_BED_PROBE 1 | ||||
| #endif | ||||
|  | ||||
| #if HAS_BED_PROBE || EITHER(PROBE_MANUALLY, MESH_BED_LEVELING) | ||||
|   #define PROBE_SELECTED 1 | ||||
| #endif | ||||
|  | ||||
| #if HAS_BED_PROBE | ||||
|   #define HAS_PROBE_XY_OFFSET   DISABLED(NOZZLE_AS_PROBE) | ||||
|   #define HAS_CUSTOM_PROBE_PIN  DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) | ||||
|   #define HOMING_Z_WITH_PROBE   (Z_HOME_DIR < 0 && !HAS_CUSTOM_PROBE_PIN) | ||||
|   #if DISABLED(NOZZLE_AS_PROBE) | ||||
|     #define HAS_PROBE_XY_OFFSET 1 | ||||
|   #endif | ||||
|   #if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) | ||||
|     #define HAS_CUSTOM_PROBE_PIN 1 | ||||
|   #endif | ||||
|   #if Z_HOME_DIR < 0 && !HAS_CUSTOM_PROBE_PIN | ||||
|     #define HOMING_Z_WITH_PROBE 1 | ||||
|   #endif | ||||
|   #ifndef Z_PROBE_LOW_POINT | ||||
|     #define Z_PROBE_LOW_POINT -5 | ||||
|   #endif | ||||
|   #if ENABLED(Z_PROBE_ALLEN_KEY) | ||||
|     #define PROBE_TRIGGERED_WHEN_STOWED_TEST // Extra test for Allen Key Probe | ||||
|     #define PROBE_TRIGGERED_WHEN_STOWED_TEST 1 // Extra test for Allen Key Probe | ||||
|   #endif | ||||
|   #ifdef MULTIPLE_PROBING | ||||
|   #if MULTIPLE_PROBING > 1 | ||||
|     #if EXTRA_PROBING | ||||
|       #define TOTAL_PROBING (MULTIPLE_PROBING + EXTRA_PROBING) | ||||
|     #else | ||||
| @@ -558,23 +608,6 @@ | ||||
|   #define GRID_MAX_POINTS ((GRID_MAX_POINTS_X) * (GRID_MAX_POINTS_Y)) | ||||
| #endif | ||||
|  | ||||
| #define HAS_EXTRA_ENDSTOPS           ANY(X_DUAL_ENDSTOPS, Y_DUAL_ENDSTOPS, Z_MULTI_ENDSTOPS) | ||||
| #define HAS_SOFTWARE_ENDSTOPS        EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) | ||||
| #define HAS_RESUME_CONTINUE          ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER) | ||||
| #define HAS_COLOR_LEDS               ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) | ||||
| #define HAS_LEDS_OFF_FLAG            (BOTH(PRINTER_EVENT_LEDS, SDSUPPORT) && HAS_RESUME_CONTINUE) | ||||
| #define HAS_PRINT_PROGRESS           EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) | ||||
| #define HAS_PRINT_PROGRESS_PERMYRIAD (HAS_PRINT_PROGRESS && EITHER(PRINT_PROGRESS_SHOW_DECIMALS, SHOW_REMAINING_TIME)) | ||||
| #define HAS_SERVICE_INTERVALS        (ENABLED(PRINTCOUNTER) && (SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0)) | ||||
| #define HAS_FILAMENT_SENSOR          ENABLED(FILAMENT_RUNOUT_SENSOR) | ||||
|  | ||||
| #define HAS_GAMES     ANY(MARLIN_BRICKOUT, MARLIN_INVADERS, MARLIN_SNAKE, MARLIN_MAZE) | ||||
| #define HAS_GAME_MENU (1 < ENABLED(MARLIN_BRICKOUT) + ENABLED(MARLIN_INVADERS) + ENABLED(MARLIN_SNAKE) + ENABLED(MARLIN_MAZE)) | ||||
|  | ||||
| #define IS_SCARA     ENABLED(MORGAN_SCARA) | ||||
| #define IS_KINEMATIC (ENABLED(DELTA) || IS_SCARA) | ||||
| #define IS_CARTESIAN !IS_KINEMATIC | ||||
|  | ||||
| #ifndef INVERT_X_DIR | ||||
|   #define INVERT_X_DIR false | ||||
| #endif | ||||
| @@ -592,16 +625,15 @@ | ||||
|   #define BOOT_MARLIN_LOGO_SMALL | ||||
| #endif | ||||
|  | ||||
| #define IS_RE_ARM_BOARD 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) | ||||
|  | ||||
| // Linear advance uses Jerk since E is an isolated axis | ||||
| #define HAS_LINEAR_E_JERK  (DISABLED(CLASSIC_JERK) && ENABLED(LIN_ADVANCE)) | ||||
|  | ||||
| // This flag indicates some kind of jerk storage is needed | ||||
| #define HAS_CLASSIC_JERK   (ENABLED(CLASSIC_JERK) || IS_KINEMATIC) | ||||
| #if ENABLED(CLASSIC_JERK) || IS_KINEMATIC | ||||
|   #define HAS_CLASSIC_JERK 1 | ||||
| #endif | ||||
|  | ||||
| // E jerk exists with JD disabled (of course) but also when Linear Advance is disabled on Delta/SCARA | ||||
| #define HAS_CLASSIC_E_JERK (ENABLED(CLASSIC_JERK) || (IS_KINEMATIC && DISABLED(LIN_ADVANCE))) | ||||
| #if ENABLED(CLASSIC_JERK) || (IS_KINEMATIC && DISABLED(LIN_ADVANCE)) | ||||
|   #define HAS_CLASSIC_E_JERK 1 | ||||
| #endif | ||||
|  | ||||
| #ifndef SPI_SPEED | ||||
|   #define SPI_SPEED SPI_FULL_SPEED | ||||
|   | ||||
| @@ -56,6 +56,50 @@ | ||||
|   #undef SHOW_TEMP_ADC_VALUES | ||||
| #endif | ||||
|  | ||||
| #if EITHER(DUAL_X_CARRIAGE, MULTI_NOZZLE_DUPLICATION) | ||||
|   #define HAS_DUPLICATION_MODE 1 | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(PRINTCOUNTER) && (SERVICE_INTERVAL_1 > 0 || SERVICE_INTERVAL_2 > 0 || SERVICE_INTERVAL_3 > 0) | ||||
|   #define HAS_SERVICE_INTERVALS 1 | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(FILAMENT_RUNOUT_SENSOR) | ||||
|   #define HAS_FILAMENT_SENSOR 1 | ||||
| #endif | ||||
|  | ||||
| #if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) | ||||
|   #define HAS_PRINT_PROGRESS 1 | ||||
| #endif | ||||
|  | ||||
| #if HAS_PRINT_PROGRESS && EITHER(PRINT_PROGRESS_SHOW_DECIMALS, SHOW_REMAINING_TIME) | ||||
|   #define HAS_PRINT_PROGRESS_PERMYRIAD 1 | ||||
| #endif | ||||
|  | ||||
| #if ANY(MARLIN_BRICKOUT, MARLIN_INVADERS, MARLIN_SNAKE, MARLIN_MAZE) | ||||
|   #define HAS_GAMES 1 | ||||
|   #if (1 < ENABLED(MARLIN_BRICKOUT) + ENABLED(MARLIN_INVADERS) + ENABLED(MARLIN_SNAKE) + ENABLED(MARLIN_MAZE)) | ||||
|     #define HAS_GAME_MENU 1 | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #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) | ||||
|   #define HAS_SOFTWARE_ENDSTOPS 1 | ||||
| #endif | ||||
| #if ANY(EXTENSIBLE_UI, NEWPANEL, EMERGENCY_PARSER) | ||||
|   #define HAS_RESUME_CONTINUE 1 | ||||
| #endif | ||||
|  | ||||
| #if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) | ||||
|   #define HAS_COLOR_LEDS 1 | ||||
| #endif | ||||
| #if ALL(HAS_RESUME_CONTINUE, PRINTER_EVENT_LEDS, SDSUPPORT) | ||||
|   #define HAS_LEDS_OFF_FLAG 1 | ||||
| #endif | ||||
|  | ||||
| #if !NUM_SERIAL | ||||
|   #undef BAUD_RATE_GCODE | ||||
| #endif | ||||
| @@ -65,10 +109,6 @@ | ||||
|   #define NUM_Z_STEPPER_DRIVERS 1 | ||||
| #endif | ||||
|  | ||||
| #ifndef PLR_ENABLED_DEFAULT | ||||
|   #define PLR_ENABLED_DEFAULT true | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) | ||||
|   #undef Z_STEPPER_ALIGN_AMP | ||||
| #endif | ||||
| @@ -171,10 +211,14 @@ | ||||
| #endif | ||||
|  | ||||
| // If platform requires early initialization of watchdog to properly boot | ||||
| #define EARLY_WATCHDOG (ENABLED(USE_WATCHDOG) && defined(ARDUINO_ARCH_SAM)) | ||||
| #if ENABLED(USE_WATCHDOG) && defined(ARDUINO_ARCH_SAM) | ||||
|   #define EARLY_WATCHDOG 1 | ||||
| #endif | ||||
|  | ||||
| // Extensible UI pin mapping for RepRapDiscount | ||||
| #define TOUCH_UI_ULTIPANEL ENABLED(TOUCH_UI_FTDI_EVE) && ANY(AO_EXP1_PINMAP, AO_EXP2_PINMAP, CR10_TFT_PINMAP) | ||||
| #if ENABLED(TOUCH_UI_FTDI_EVE) && ANY(AO_EXP1_PINMAP, AO_EXP2_PINMAP, CR10_TFT_PINMAP) | ||||
|   #define TOUCH_UI_ULTIPANEL 1 | ||||
| #endif | ||||
|  | ||||
| // Poll-based jogging for joystick and other devices | ||||
| #if ENABLED(JOYSTICK) | ||||
|   | ||||
| @@ -30,6 +30,11 @@ | ||||
|   // Extras for CI testing | ||||
| #endif | ||||
|  | ||||
| // Linear advance uses Jerk since E is an isolated axis | ||||
| #if DISABLED(CLASSIC_JERK) && ENABLED(LIN_ADVANCE) | ||||
|   #define HAS_LINEAR_E_JERK 1 | ||||
| #endif | ||||
|  | ||||
| #ifdef TEENSYDUINO | ||||
|   #undef max | ||||
|   #define max(a,b) ((a)>(b)?(a):(b)) | ||||
| @@ -63,13 +68,8 @@ | ||||
| // Define center values for future use | ||||
| #define _X_HALF_BED ((X_BED_SIZE) / 2) | ||||
| #define _Y_HALF_BED ((Y_BED_SIZE) / 2) | ||||
| #if ENABLED(BED_CENTER_AT_0_0) | ||||
|   #define X_CENTER 0 | ||||
|   #define Y_CENTER 0 | ||||
| #else | ||||
|   #define X_CENTER _X_HALF_BED | ||||
|   #define Y_CENTER _Y_HALF_BED | ||||
| #endif | ||||
| #define X_CENTER TERN(BED_CENTER_AT_0_0, 0, _X_HALF_BED) | ||||
| #define Y_CENTER TERN(BED_CENTER_AT_0_0, 0, _Y_HALF_BED) | ||||
|  | ||||
| // Get the linear boundaries of the bed | ||||
| #define X_MIN_BED (X_CENTER - _X_HALF_BED) | ||||
| @@ -92,10 +92,18 @@ | ||||
| /** | ||||
|  * CoreXY, CoreXZ, and CoreYZ - and their reverse | ||||
|  */ | ||||
| #define CORE_IS_XY EITHER(COREXY, COREYX) | ||||
| #define CORE_IS_XZ EITHER(COREXZ, COREZX) | ||||
| #define CORE_IS_YZ EITHER(COREYZ, COREZY) | ||||
| #define IS_CORE (CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ) | ||||
| #if EITHER(COREXY, COREYX) | ||||
|   #define CORE_IS_XY 1 | ||||
| #endif | ||||
| #if EITHER(COREXZ, COREZX) | ||||
|   #define CORE_IS_XZ 1 | ||||
| #endif | ||||
| #if EITHER(COREYZ, COREZY) | ||||
|   #define CORE_IS_YZ 1 | ||||
| #endif | ||||
| #if CORE_IS_XY || CORE_IS_XZ || CORE_IS_YZ | ||||
|   #define IS_CORE 1 | ||||
| #endif | ||||
| #if IS_CORE | ||||
|   #if CORE_IS_XY | ||||
|     #define CORE_AXIS_1 A_AXIS | ||||
| @@ -110,11 +118,7 @@ | ||||
|     #define CORE_AXIS_1 B_AXIS | ||||
|     #define CORE_AXIS_2 C_AXIS | ||||
|   #endif | ||||
|   #if ANY(COREYX, COREZX, COREZY) | ||||
|     #define CORESIGN(n) (-(n)) | ||||
|   #else | ||||
|     #define CORESIGN(n) (n) | ||||
|   #endif | ||||
|   #define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n)) | ||||
| #endif | ||||
|  | ||||
| /** | ||||
| @@ -139,33 +143,23 @@ | ||||
|  */ | ||||
| #ifdef MANUAL_X_HOME_POS | ||||
|   #define X_HOME_POS MANUAL_X_HOME_POS | ||||
| #elif ENABLED(BED_CENTER_AT_0_0) | ||||
|   #if ENABLED(DELTA) | ||||
|     #define X_HOME_POS 0 | ||||
|   #else | ||||
|     #define X_HOME_POS (X_HOME_DIR < 0 ? X_MIN_POS : X_MAX_POS) | ||||
|   #endif | ||||
| #else | ||||
|   #if ENABLED(DELTA) | ||||
|     #define X_HOME_POS (X_MIN_POS + (X_BED_SIZE) * 0.5) | ||||
|   #define X_END_POS (X_HOME_DIR < 0 ? 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 (X_HOME_DIR < 0 ? X_MIN_POS : X_MAX_POS) | ||||
|     #define X_HOME_POS TERN(DELTA, X_MIN_POS + (X_BED_SIZE) * 0.5, X_END_POS) | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| #ifdef MANUAL_Y_HOME_POS | ||||
|   #define Y_HOME_POS MANUAL_Y_HOME_POS | ||||
| #elif ENABLED(BED_CENTER_AT_0_0) | ||||
|   #if ENABLED(DELTA) | ||||
|     #define Y_HOME_POS 0 | ||||
|   #else | ||||
|     #define Y_HOME_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) | ||||
|   #endif | ||||
| #else | ||||
|   #if ENABLED(DELTA) | ||||
|     #define Y_HOME_POS (Y_MIN_POS + (Y_BED_SIZE) * 0.5) | ||||
|   #define Y_END_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) | ||||
|   #if ENABLED(BED_CENTER_AT_0_0) | ||||
|     #define Y_HOME_POS TERN(DELTA, 0, Y_END_POS) | ||||
|   #else | ||||
|     #define Y_HOME_POS (Y_HOME_DIR < 0 ? Y_MIN_POS : Y_MAX_POS) | ||||
|     #define Y_HOME_POS TERN(DELTA, Y_MIN_POS + (Y_BED_SIZE) * 0.5, Y_END_POS) | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| @@ -268,7 +262,10 @@ | ||||
|   #define _LCD_CONTRAST_INIT  17 | ||||
| #endif | ||||
|  | ||||
| #define HAS_LCD_CONTRAST defined(_LCD_CONTRAST_INIT) | ||||
| #ifdef _LCD_CONTRAST_INIT | ||||
|   #define HAS_LCD_CONTRAST 1 | ||||
| #endif | ||||
|  | ||||
| #if HAS_LCD_CONTRAST | ||||
|   #ifndef LCD_CONTRAST_MIN | ||||
|     #ifdef _LCD_CONTRAST_MIN | ||||
| @@ -1291,20 +1288,40 @@ | ||||
|  | ||||
| // Trinamic Stepper Drivers | ||||
| #if HAS_TRINAMIC_CONFIG | ||||
|   #define STEALTHCHOP_ENABLED ANY(STEALTHCHOP_XY, STEALTHCHOP_Z, STEALTHCHOP_E) | ||||
|   #define USE_SENSORLESS EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) | ||||
|   #if ANY(STEALTHCHOP_XY, STEALTHCHOP_Z, STEALTHCHOP_E) | ||||
|     #define STEALTHCHOP_ENABLED 1 | ||||
|   #endif | ||||
|   #if EITHER(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 | ||||
|   #endif | ||||
|   #define X_SENSORLESS  (AXIS_HAS_STALLGUARD(X)  && defined(X_STALL_SENSITIVITY)) | ||||
|   #define X2_SENSORLESS (AXIS_HAS_STALLGUARD(X2) && defined(X2_STALL_SENSITIVITY)) | ||||
|   #define Y_SENSORLESS  (AXIS_HAS_STALLGUARD(Y)  && defined(Y_STALL_SENSITIVITY)) | ||||
|   #define Y2_SENSORLESS (AXIS_HAS_STALLGUARD(Y2) && defined(Y2_STALL_SENSITIVITY)) | ||||
|   #define Z_SENSORLESS  (AXIS_HAS_STALLGUARD(Z)  && defined(Z_STALL_SENSITIVITY)) | ||||
|   #define Z2_SENSORLESS (AXIS_HAS_STALLGUARD(Z2) && defined(Z2_STALL_SENSITIVITY)) | ||||
|   #define Z3_SENSORLESS (AXIS_HAS_STALLGUARD(Z3) && defined(Z3_STALL_SENSITIVITY)) | ||||
|   #define Z4_SENSORLESS (AXIS_HAS_STALLGUARD(Z4) && defined(Z4_STALL_SENSITIVITY)) | ||||
|   #if defined(X_STALL_SENSITIVITY)  && AXIS_HAS_STALLGUARD(X) | ||||
|     #define X_SENSORLESS 1 | ||||
|   #endif | ||||
|   #if defined(X2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2) | ||||
|     #define X2_SENSORLESS 1 | ||||
|   #endif | ||||
|   #if defined(Y_STALL_SENSITIVITY)  && AXIS_HAS_STALLGUARD(Y) | ||||
|     #define Y_SENSORLESS 1 | ||||
|   #endif | ||||
|   #if defined(Y2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2) | ||||
|     #define Y2_SENSORLESS 1 | ||||
|   #endif | ||||
|   #if defined(Z_STALL_SENSITIVITY)  && AXIS_HAS_STALLGUARD(Z) | ||||
|     #define Z_SENSORLESS 1 | ||||
|   #endif | ||||
|   #if defined(Z2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2) | ||||
|     #define Z2_SENSORLESS 1 | ||||
|   #endif | ||||
|   #if defined(Z3_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3) | ||||
|     #define Z3_SENSORLESS 1 | ||||
|   #endif | ||||
|   #if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4) | ||||
|     #define Z4_SENSORLESS 1 | ||||
|   #endif | ||||
|   #if ENABLED(SPI_ENDSTOPS) | ||||
|     #define X_SPI_SENSORLESS X_SENSORLESS | ||||
|     #define Y_SPI_SENSORLESS Y_SENSORLESS | ||||
| @@ -1388,23 +1405,48 @@ | ||||
| #define HAS_HEATER_BED  (PIN_EXISTS(HEATER_BED)) | ||||
|  | ||||
| // Shorthand for common combinations | ||||
| #define HAS_HEATED_BED (HAS_TEMP_BED && HAS_HEATER_BED) | ||||
| #define BED_OR_CHAMBER (HAS_HEATED_BED || HAS_TEMP_CHAMBER) | ||||
| #define HAS_TEMP_SENSOR (HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE) | ||||
| #define HAS_HEATED_CHAMBER (HAS_TEMP_CHAMBER && PIN_EXISTS(HEATER_CHAMBER)) | ||||
| #if HAS_TEMP_BED && HAS_HEATER_BED | ||||
|   #define HAS_HEATED_BED 1 | ||||
| #endif | ||||
| #if HAS_HEATED_BED || HAS_TEMP_CHAMBER | ||||
|   #define BED_OR_CHAMBER 1 | ||||
| #endif | ||||
| #if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE | ||||
|   #define HAS_TEMP_SENSOR 1 | ||||
| #endif | ||||
| #if HAS_TEMP_CHAMBER && PIN_EXISTS(HEATER_CHAMBER) | ||||
|   #define HAS_HEATED_CHAMBER 1 | ||||
| #endif | ||||
|  | ||||
| // PID heating | ||||
| #if !HAS_HEATED_BED | ||||
|   #undef PIDTEMPBED | ||||
| #endif | ||||
| #define HAS_PID_HEATING EITHER(PIDTEMP, PIDTEMPBED) | ||||
| #define HAS_PID_FOR_BOTH BOTH(PIDTEMP, PIDTEMPBED) | ||||
| #if EITHER(PIDTEMP, PIDTEMPBED) | ||||
|   #define HAS_PID_HEATING 1 | ||||
| #endif | ||||
| #if BOTH(PIDTEMP, PIDTEMPBED) | ||||
|   #define HAS_PID_FOR_BOTH 1 | ||||
| #endif | ||||
|  | ||||
| // Thermal protection | ||||
| #define HAS_THERMALLY_PROTECTED_BED (HAS_HEATED_BED && ENABLED(THERMAL_PROTECTION_BED)) | ||||
| #define WATCH_HOTENDS (ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0) | ||||
| #define WATCH_BED (HAS_THERMALLY_PROTECTED_BED && WATCH_BED_TEMP_PERIOD > 0) | ||||
| #define WATCH_CHAMBER (HAS_HEATED_CHAMBER && ENABLED(THERMAL_PROTECTION_CHAMBER) && WATCH_CHAMBER_TEMP_PERIOD > 0) | ||||
| #if HAS_HEATED_BED && ENABLED(THERMAL_PROTECTION_BED) | ||||
|   #define HAS_THERMALLY_PROTECTED_BED 1 | ||||
| #endif | ||||
| #if ENABLED(THERMAL_PROTECTION_HOTENDS) && WATCH_TEMP_PERIOD > 0 | ||||
|   #define WATCH_HOTENDS 1 | ||||
| #endif | ||||
| #if HAS_THERMALLY_PROTECTED_BED && WATCH_BED_TEMP_PERIOD > 0 | ||||
|   #define WATCH_BED 1 | ||||
| #endif | ||||
| #if HAS_HEATED_CHAMBER && ENABLED(THERMAL_PROTECTION_CHAMBER) && WATCH_CHAMBER_TEMP_PERIOD > 0 | ||||
|   #define WATCH_CHAMBER 1 | ||||
| #endif | ||||
| #if  (ENABLED(THERMAL_PROTECTION_HOTENDS) || !EXTRUDERS) \ | ||||
|   && (ENABLED(THERMAL_PROTECTION_BED)     || !HAS_HEATED_BED) \ | ||||
|   && (ENABLED(THERMAL_PROTECTION_CHAMBER) || !HAS_HEATED_CHAMBER) | ||||
|   #define THERMALLY_SAFE 1 | ||||
| #endif | ||||
|  | ||||
| // Auto fans | ||||
| #define HAS_AUTO_FAN_0 (HOTENDS > 0 && PIN_EXISTS(E0_AUTO_FAN)) | ||||
| @@ -1455,22 +1497,48 @@ | ||||
| #define HAS_FILAMENT_WIDTH_SENSOR (PIN_EXISTS(FILWIDTH)) | ||||
|  | ||||
| // User Interface | ||||
| #define HAS_HOME        (PIN_EXISTS(HOME)) | ||||
| #define HAS_KILL        (PIN_EXISTS(KILL)) | ||||
| #define HAS_SUICIDE     (PIN_EXISTS(SUICIDE)) | ||||
| #define HAS_PHOTOGRAPH  (PIN_EXISTS(PHOTOGRAPH)) | ||||
| #define HAS_BUZZER      (PIN_EXISTS(BEEPER) || EITHER(LCD_USE_I2C_BUZZER, PCA9632_BUZZER)) | ||||
| #define USE_BEEPER      (HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER, PCA9632_BUZZER)) | ||||
| #define HAS_CASE_LIGHT  (PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE)) | ||||
| #if PIN_EXISTS(HOME) | ||||
|   #define HAS_HOME 1 | ||||
| #endif | ||||
| #if PIN_EXISTS(KILL) | ||||
|   #define HAS_KILL 1 | ||||
| #endif | ||||
| #if PIN_EXISTS(SUICIDE) | ||||
|   #define HAS_SUICIDE 1 | ||||
| #endif | ||||
| #if PIN_EXISTS(PHOTOGRAPH) | ||||
|   #define HAS_PHOTOGRAPH 1 | ||||
| #endif | ||||
| #if PIN_EXISTS(BEEPER) || EITHER(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) | ||||
|   #define HAS_BUZZER 1 | ||||
| #endif | ||||
| #if HAS_BUZZER && DISABLED(LCD_USE_I2C_BUZZER, PCA9632_BUZZER) | ||||
|   #define USE_BEEPER 1 | ||||
| #endif | ||||
| #if PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE) | ||||
|   #define HAS_CASE_LIGHT 1 | ||||
| #endif | ||||
|  | ||||
| // Digital control | ||||
| #define HAS_STEPPER_RESET     (PIN_EXISTS(STEPPER_RESET)) | ||||
| #define HAS_DIGIPOTSS         (PIN_EXISTS(DIGIPOTSS)) | ||||
| #define HAS_MOTOR_CURRENT_PWM ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_E) | ||||
| #if PIN_EXISTS(STEPPER_RESET) | ||||
|   #define HAS_STEPPER_RESET 1 | ||||
| #endif | ||||
| #if PIN_EXISTS(DIGIPOTSS) | ||||
|   #define HAS_DIGIPOTSS 1 | ||||
| #endif | ||||
| #if  ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_E) | ||||
|   #define HAS_MOTOR_CURRENT_PWM 1 | ||||
| #endif | ||||
|  | ||||
| #define HAS_SOME_Z_MICROSTEPS (HAS_Z_MICROSTEPS || HAS_Z2_MICROSTEPS || HAS_Z3_MICROSTEPS || HAS_Z4_MICROSTEPS) | ||||
| #define HAS_SOME_E_MICROSTEPS (HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS || HAS_E5_MICROSTEPS || HAS_E6_MICROSTEPS || HAS_E7_MICROSTEPS) | ||||
| #define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_X2_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Y2_MICROSTEPS || HAS_SOME_Z_MICROSTEPS || HAS_SOME_E_MICROSTEPS) | ||||
| #if HAS_Z_MICROSTEPS || HAS_Z2_MICROSTEPS || HAS_Z3_MICROSTEPS || HAS_Z4_MICROSTEPS | ||||
|   #define HAS_SOME_Z_MICROSTEPS 1 | ||||
| #endif | ||||
| #if HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS || HAS_E5_MICROSTEPS || HAS_E6_MICROSTEPS || HAS_E7_MICROSTEPS | ||||
|   #define HAS_SOME_E_MICROSTEPS 1 | ||||
| #endif | ||||
| #if HAS_X_MICROSTEPS || HAS_X2_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Y2_MICROSTEPS || HAS_SOME_Z_MICROSTEPS || HAS_SOME_E_MICROSTEPS | ||||
|   #define HAS_MICROSTEPS 1 | ||||
| #endif | ||||
|  | ||||
| #if HAS_MICROSTEPS | ||||
|  | ||||
| @@ -1764,21 +1832,48 @@ | ||||
| /** | ||||
|  * Set granular options based on the specific type of leveling | ||||
|  */ | ||||
| #define UBL_SEGMENTED   BOTH(AUTO_BED_LEVELING_UBL, DELTA) | ||||
| #define ABL_PLANAR      EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) | ||||
| #define ABL_GRID        EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) | ||||
| #define HAS_ABL_NOT_UBL (ABL_PLANAR || ABL_GRID) | ||||
| #define HAS_ABL_OR_UBL  (HAS_ABL_NOT_UBL || ENABLED(AUTO_BED_LEVELING_UBL)) | ||||
| #define HAS_LEVELING    (HAS_ABL_OR_UBL || ENABLED(MESH_BED_LEVELING)) | ||||
| #define HAS_AUTOLEVEL   (HAS_ABL_OR_UBL && DISABLED(PROBE_MANUALLY)) | ||||
| #define HAS_MESH        ANY(AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL, MESH_BED_LEVELING) | ||||
| #define PLANNER_LEVELING      (HAS_LEVELING && DISABLED(AUTO_BED_LEVELING_UBL)) | ||||
| #define HAS_PROBING_PROCEDURE (HAS_ABL_OR_UBL || ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST)) | ||||
| #define HAS_POSITION_MODIFIERS (ENABLED(FWRETRACT) || HAS_LEVELING || ENABLED(SKEW_CORRECTION)) | ||||
| #define NEEDS_THREE_PROBE_POINTS EITHER(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_3POINT) | ||||
|  | ||||
| #if ENABLED(AUTO_BED_LEVELING_UBL) | ||||
|   #undef LCD_BED_LEVELING | ||||
|   #if ENABLED(DELTA) | ||||
|     #define UBL_SEGMENTED 1 | ||||
|   #endif | ||||
| #endif | ||||
| #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) | ||||
|   #define ABL_PLANAR 1 | ||||
| #endif | ||||
| #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) | ||||
|   #define ABL_GRID 1 | ||||
| #endif | ||||
| #if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_3POINT) | ||||
|   #define HAS_ABL_NOT_UBL 1 | ||||
| #endif | ||||
| #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) | ||||
|   #define NEEDS_THREE_PROBE_POINTS 1 | ||||
| #endif | ||||
| #if EITHER(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) | ||||
|   #define HAS_LEVELING 1 | ||||
|   #if DISABLED(AUTO_BED_LEVELING_UBL) | ||||
|     #define PLANNER_LEVELING 1 | ||||
|   #endif | ||||
| #endif | ||||
| #if EITHER(HAS_ABL_OR_UBL, Z_MIN_PROBE_REPEATABILITY_TEST) | ||||
|   #define HAS_PROBING_PROCEDURE 1 | ||||
| #endif | ||||
| #if ANY(FWRETRACT, HAS_LEVELING, SKEW_CORRECTION) | ||||
|   #define HAS_POSITION_MODIFIERS 1 | ||||
| #endif | ||||
|  | ||||
| #if !HAS_LEVELING | ||||
|   #undef RESTORE_LEVELING_AFTER_G28 | ||||
| #endif | ||||
|  | ||||
| /** | ||||
| @@ -1905,8 +2000,8 @@ | ||||
|   #undef MESH_MAX_Y | ||||
| #endif | ||||
|  | ||||
| #if (defined(PROBE_PT_1_X) && defined(PROBE_PT_2_X) && defined(PROBE_PT_3_X) && defined(PROBE_PT_1_Y) && defined(PROBE_PT_2_Y) && defined(PROBE_PT_3_Y)) | ||||
|   #define HAS_FIXED_3POINT | ||||
| #if defined(PROBE_PT_1_X) && defined(PROBE_PT_2_X) && defined(PROBE_PT_3_X) && defined(PROBE_PT_1_Y) && defined(PROBE_PT_2_Y) && defined(PROBE_PT_3_Y) | ||||
|   #define HAS_FIXED_3POINT 1 | ||||
| #endif | ||||
|  | ||||
| /** | ||||
| @@ -1944,10 +2039,10 @@ | ||||
|  * Z_HOMING_HEIGHT / Z_CLEARANCE_BETWEEN_PROBES | ||||
|  */ | ||||
| #ifndef Z_HOMING_HEIGHT | ||||
|   #ifndef Z_CLEARANCE_BETWEEN_PROBES | ||||
|     #define Z_HOMING_HEIGHT 0 | ||||
|   #else | ||||
|   #ifdef Z_CLEARANCE_BETWEEN_PROBES | ||||
|     #define Z_HOMING_HEIGHT Z_CLEARANCE_BETWEEN_PROBES | ||||
|   #else | ||||
|     #define Z_HOMING_HEIGHT 0 | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| @@ -1975,15 +2070,16 @@ | ||||
| #endif | ||||
|  | ||||
| // Updated G92 behavior shifts the workspace | ||||
| #define HAS_POSITION_SHIFT DISABLED(NO_WORKSPACE_OFFSETS) | ||||
| // The home offset also shifts the coordinate space | ||||
| #define HAS_HOME_OFFSET (DISABLED(NO_WORKSPACE_OFFSETS) && IS_CARTESIAN) | ||||
| // The SCARA home offset applies only on G28 | ||||
| #define HAS_SCARA_OFFSET (DISABLED(NO_WORKSPACE_OFFSETS) && IS_SCARA) | ||||
| // Cumulative offset to workspace to save some calculation | ||||
| #define HAS_WORKSPACE_OFFSET (HAS_POSITION_SHIFT && HAS_HOME_OFFSET) | ||||
| // M206 sets the home offset for Cartesian machines | ||||
| #define HAS_M206_COMMAND (HAS_HOME_OFFSET && !IS_SCARA) | ||||
| #if DISABLED(NO_WORKSPACE_OFFSETS) | ||||
|   #define HAS_POSITION_SHIFT 1 | ||||
|   #if IS_CARTESIAN | ||||
|     #define HAS_HOME_OFFSET 1       // The home offset also shifts the coordinate space | ||||
|     #define HAS_WORKSPACE_OFFSET 1  // Cumulative offset to workspace to save some calculation | ||||
|     #define HAS_M206_COMMAND 1      // M206 sets the home offset for Cartesian machines | ||||
|   #elif IS_SCARA | ||||
|     #define HAS_SCARA_OFFSET 1      // The SCARA home offset applies only on G28 | ||||
|   #endif | ||||
| #endif | ||||
|  | ||||
| // LCD timeout to status screen default is 15s | ||||
| #ifndef LCD_TIMEOUT_TO_STATUS | ||||
| @@ -2006,11 +2102,7 @@ | ||||
| #endif | ||||
|  | ||||
| // Number of VFAT entries used. Each entry has 13 UTF-16 characters | ||||
| #if ENABLED(SCROLL_LONG_FILENAMES) | ||||
|   #define MAX_VFAT_ENTRIES (5) | ||||
| #else | ||||
|   #define MAX_VFAT_ENTRIES (2) | ||||
| #endif | ||||
| #define MAX_VFAT_ENTRIES TERN(SCROLL_LONG_FILENAMES, 5, 2) | ||||
|  | ||||
| // Nozzle park for Delta | ||||
| #if BOTH(NOZZLE_PARK_FEATURE, DELTA) | ||||
| @@ -2022,9 +2114,8 @@ | ||||
| // on boards where SD card and LCD display share the same SPI bus | ||||
| // because of a bug in the shared SPI implementation. (See #8122) | ||||
| #if defined(TARGET_LPC1768) && ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) && (SCK_PIN == LCD_PINS_D4) | ||||
|   #define SDCARD_SORT_ALPHA         // Keeps one directory level in RAM. Changing | ||||
|                                     // directory levels still glitches the screen, | ||||
|                                     // but the following LCD update cleans it up. | ||||
|   #define SDCARD_SORT_ALPHA         // Keep one directory level in RAM. Changing directory levels | ||||
|                                     // may still glitch the screen, but LCD updates clean it up. | ||||
|   #undef SDSORT_LIMIT | ||||
|   #undef SDSORT_USES_RAM | ||||
|   #undef SDSORT_USES_STACK | ||||
| @@ -2057,19 +2148,15 @@ | ||||
|   #ifndef LCD_WIDTH | ||||
|     #if HAS_GRAPHICAL_LCD | ||||
|       #define LCD_WIDTH 21 | ||||
|     #elif ENABLED(ULTIPANEL) | ||||
|       #define LCD_WIDTH 20 | ||||
|     #else | ||||
|       #define LCD_WIDTH 16 | ||||
|       #define LCD_WIDTH TERN(ULTIPANEL, 20, 16) | ||||
|     #endif | ||||
|   #endif | ||||
|   #ifndef LCD_HEIGHT | ||||
|     #if HAS_GRAPHICAL_LCD | ||||
|       #define LCD_HEIGHT 5 | ||||
|     #elif ENABLED(ULTIPANEL) | ||||
|       #define LCD_HEIGHT 4 | ||||
|     #else | ||||
|       #define LCD_HEIGHT 2 | ||||
|       #define LCD_HEIGHT TERN(ULTIPANEL, 4, 2) | ||||
|     #endif | ||||
|   #endif | ||||
| #endif | ||||
|   | ||||
| @@ -34,6 +34,37 @@ | ||||
|   #error "Marlin requires C++11 support (gcc >= 4.7, Arduino IDE >= 1.6.8). Please upgrade your toolchain." | ||||
| #endif | ||||
|  | ||||
| // Make sure macros aren't borked | ||||
| #define TEST1 | ||||
| #define TEST2 1 | ||||
| #define TEST3 0 | ||||
| #define TEST4 true | ||||
| #if ENABLED(TEST0) | ||||
|   #error "ENABLED is borked!" | ||||
| #endif | ||||
| #if DISABLED(TEST1) | ||||
|   #error "DISABLED is borked!" | ||||
| #endif | ||||
| #if !ENABLED(TEST2) | ||||
|   #error "ENABLED is borked!" | ||||
| #endif | ||||
| #if ENABLED(TEST3) | ||||
|   #error "ENABLED is borked!" | ||||
| #endif | ||||
| #if DISABLED(TEST4) | ||||
|   #error "DISABLED is borked!" | ||||
| #endif | ||||
| #if !ANY(TEST1, TEST2, TEST3, TEST4) || ANY(TEST0, TEST3) | ||||
|   #error "ANY is borked!" | ||||
| #endif | ||||
| #if DISABLED(TEST0, TEST1, TEST2, TEST4) | ||||
|   #error "DISABLED is borked!" | ||||
| #endif | ||||
| #undef TEST1 | ||||
| #undef TEST2 | ||||
| #undef TEST3 | ||||
| #undef TEST4 | ||||
|  | ||||
| /** | ||||
|  * We try our best to include sanity checks for all changed configuration | ||||
|  * directives because users have a tendency to use outdated config files with | ||||
| @@ -1237,7 +1268,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS | ||||
|    * Require some kind of probe for bed leveling and probe testing | ||||
|    */ | ||||
|   #if HAS_ABL_NOT_UBL && !PROBE_SELECTED | ||||
|     #error "Auto Bed Leveling requires one of these: PROBE_MANUALLY, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, BLTOUCH, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or a Z Servo." | ||||
|     #error "Auto Bed Leveling requires one of these: PROBE_MANUALLY, SENSORLESS_PROBING, BLTOUCH, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, or a Z Servo." | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) | ||||
|   | ||||
| @@ -27,10 +27,18 @@ | ||||
|   #include "../libs/buzzer.h" | ||||
| #endif | ||||
|  | ||||
| #define HAS_ENCODER_ACTION (HAS_LCD_MENU || ENABLED(ULTIPANEL_FEEDMULTIPLY)) | ||||
| #define HAS_ENCODER_WHEEL  ((!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTONS_EXIST(EN1, EN2)) | ||||
| #define HAS_DIGITAL_BUTTONS (HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT)) | ||||
| #define HAS_SHIFT_ENCODER   (!HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_SPI_LCD && DISABLED(NEWPANEL)))) | ||||
| #if HAS_LCD_MENU || ENABLED(ULTIPANEL_FEEDMULTIPLY) | ||||
|   #define HAS_ENCODER_ACTION 1 | ||||
| #endif | ||||
| #if (!HAS_ADC_BUTTONS && ENABLED(NEWPANEL)) || BUTTONS_EXIST(EN1, EN2) | ||||
|   #define HAS_ENCODER_WHEEL 1 | ||||
| #endif | ||||
| #if HAS_ENCODER_WHEEL || ANY_BUTTON(ENC, BACK, UP, DWN, LFT, RT) | ||||
|   #define HAS_DIGITAL_BUTTONS 1 | ||||
| #endif | ||||
| #if !HAS_ADC_BUTTONS && (ENABLED(REPRAPWORLD_KEYPAD) || (HAS_SPI_LCD && DISABLED(NEWPANEL))) | ||||
|   #define HAS_SHIFT_ENCODER 1 | ||||
| #endif | ||||
|  | ||||
| // I2C buttons must be read in the main thread | ||||
| #define HAS_SLOW_BUTTONS EITHER(LCD_I2C_VIKI, LCD_I2C_PANELOLU2) | ||||
|   | ||||
| @@ -181,11 +181,8 @@ typedef struct SettingsDataStruct { | ||||
|   // | ||||
|   float mbl_z_offset;                                   // mbl.z_offset | ||||
|   uint8_t mesh_num_x, mesh_num_y;                       // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y | ||||
|   #if ENABLED(MESH_BED_LEVELING) | ||||
|     float mbl_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; // mbl.z_values | ||||
|   #else | ||||
|     float mbl_z_values[3][3]; | ||||
|   #endif | ||||
|   float mbl_z_values[TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_X, 3)]   // mbl.z_values | ||||
|                     [TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_Y, 3)]; | ||||
|  | ||||
|   // | ||||
|   // HAS_BED_PROBE | ||||
| @@ -533,11 +530,10 @@ void MarlinSettings::postprocess() { | ||||
|     EEPROM_START(); | ||||
|  | ||||
|     eeprom_error = false; | ||||
|     #if ENABLED(FLASH_EEPROM_EMULATION) | ||||
|       EEPROM_SKIP(ver);   // Flash doesn't allow rewriting without erase | ||||
|     #else | ||||
|       EEPROM_WRITE(ver);  // invalidate data first | ||||
|     #endif | ||||
|  | ||||
|     // Write or Skip version. (Flash doesn't allow rewrite without erase.) | ||||
|     TERN(FLASH_EEPROM_EMULATION, EEPROM_SKIP, EEPROM_WRITE)(ver); | ||||
|  | ||||
|     EEPROM_SKIP(working_crc); // Skip the checksum slot | ||||
|  | ||||
|     working_crc = 0; // clear before first "real data" | ||||
| @@ -564,12 +560,10 @@ void MarlinSettings::postprocess() { | ||||
|         EEPROM_WRITE(planner_max_jerk); | ||||
|       #endif | ||||
|  | ||||
|       #if DISABLED(CLASSIC_JERK) | ||||
|         EEPROM_WRITE(planner.junction_deviation_mm); | ||||
|       #else | ||||
|       #if ENABLED(CLASSIC_JERK) | ||||
|         dummyf = 0.02f; | ||||
|         EEPROM_WRITE(dummyf); | ||||
|       #endif | ||||
|       EEPROM_WRITE(TERN(CLASSIC_JERK, dummyf, planner.junction_deviation_mm)); | ||||
|     } | ||||
|  | ||||
|     // | ||||
| @@ -617,13 +611,7 @@ void MarlinSettings::postprocess() { | ||||
|     // Global Leveling | ||||
|     // | ||||
|     { | ||||
|       const float zfh = ( | ||||
|         #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) | ||||
|           planner.z_fade_height | ||||
|         #else | ||||
|           10.0 | ||||
|         #endif | ||||
|       ); | ||||
|       const float zfh = TERN(ENABLE_LEVELING_FADE_HEIGHT, planner.z_fade_height, 10.0f); | ||||
|       EEPROM_WRITE(zfh); | ||||
|     } | ||||
|  | ||||
| @@ -632,22 +620,24 @@ void MarlinSettings::postprocess() { | ||||
|     // | ||||
|     { | ||||
|       #if ENABLED(MESH_BED_LEVELING) | ||||
|         // Compile time test that sizeof(mbl.z_values) is as expected | ||||
|         static_assert( | ||||
|           sizeof(mbl.z_values) == (GRID_MAX_POINTS) * sizeof(mbl.z_values[0][0]), | ||||
|           "MBL Z array is the wrong size." | ||||
|         ); | ||||
|         const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y; | ||||
|         EEPROM_WRITE(mbl.z_offset); | ||||
|         EEPROM_WRITE(mesh_num_x); | ||||
|         EEPROM_WRITE(mesh_num_y); | ||||
|         EEPROM_WRITE(mbl.z_values); | ||||
|       #else // For disabled MBL write a default mesh | ||||
|       #else | ||||
|         dummyf = 0; | ||||
|         const uint8_t mesh_num_x = 3, mesh_num_y = 3; | ||||
|         EEPROM_WRITE(dummyf); // z_offset | ||||
|         EEPROM_WRITE(mesh_num_x); | ||||
|         EEPROM_WRITE(mesh_num_y); | ||||
|       #endif | ||||
|  | ||||
|       const uint8_t mesh_num_x = TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_X, 3), | ||||
|                     mesh_num_y = TERN(MESH_BED_LEVELING, GRID_MAX_POINTS_Y, 3); | ||||
|  | ||||
|       EEPROM_WRITE(TERN(MESH_BED_LEVELING, mbl.z_offset, dummyf)); | ||||
|       EEPROM_WRITE(mesh_num_x); | ||||
|       EEPROM_WRITE(mesh_num_y); | ||||
|  | ||||
|       #if ENABLED(MESH_BED_LEVELING) | ||||
|         EEPROM_WRITE(mbl.z_values); | ||||
|       #else | ||||
|         for (uint8_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_WRITE(dummyf); | ||||
|       #endif | ||||
|     } | ||||
| @@ -682,26 +672,25 @@ void MarlinSettings::postprocess() { | ||||
|     // | ||||
|     { | ||||
|       #if ENABLED(AUTO_BED_LEVELING_BILINEAR) | ||||
|         // Compile time test that sizeof(z_values) is as expected | ||||
|         static_assert( | ||||
|           sizeof(z_values) == (GRID_MAX_POINTS) * sizeof(z_values[0][0]), | ||||
|           "Bilinear Z array is the wrong size." | ||||
|         ); | ||||
|         const uint8_t grid_max_x = GRID_MAX_POINTS_X, grid_max_y = GRID_MAX_POINTS_Y; | ||||
|         EEPROM_WRITE(grid_max_x);            // 1 byte | ||||
|         EEPROM_WRITE(grid_max_y);            // 1 byte | ||||
|         EEPROM_WRITE(bilinear_grid_spacing); // 2 ints | ||||
|         EEPROM_WRITE(bilinear_start);        // 2 ints | ||||
|       #else | ||||
|         const xy_pos_t bilinear_start{0}, bilinear_grid_spacing{0}; | ||||
|       #endif | ||||
|  | ||||
|       const uint8_t grid_max_x = TERN(AUTO_BED_LEVELING_BILINEAR, GRID_MAX_POINTS_X, 3), | ||||
|                     grid_max_y = TERN(AUTO_BED_LEVELING_BILINEAR, GRID_MAX_POINTS_Y, 3); | ||||
|       EEPROM_WRITE(grid_max_x); | ||||
|       EEPROM_WRITE(grid_max_y); | ||||
|       EEPROM_WRITE(bilinear_grid_spacing); | ||||
|       EEPROM_WRITE(bilinear_start); | ||||
|  | ||||
|       #if ENABLED(AUTO_BED_LEVELING_BILINEAR) | ||||
|         EEPROM_WRITE(z_values);              // 9-256 floats | ||||
|       #else | ||||
|         // For disabled Bilinear Grid write an empty 3x3 grid | ||||
|         const uint8_t grid_max_x = 3, grid_max_y = 3; | ||||
|         const xy_pos_t bilinear_start{0}, bilinear_grid_spacing{0}; | ||||
|         dummyf = 0; | ||||
|         EEPROM_WRITE(grid_max_x); | ||||
|         EEPROM_WRITE(grid_max_y); | ||||
|         EEPROM_WRITE(bilinear_grid_spacing); | ||||
|         EEPROM_WRITE(bilinear_start); | ||||
|         for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_WRITE(dummyf); | ||||
|       #endif | ||||
|     } | ||||
| @@ -711,16 +700,10 @@ void MarlinSettings::postprocess() { | ||||
|     // | ||||
|     { | ||||
|       _FIELD_TEST(planner_leveling_active); | ||||
|  | ||||
|       #if ENABLED(AUTO_BED_LEVELING_UBL) | ||||
|         EEPROM_WRITE(planner.leveling_active); | ||||
|         EEPROM_WRITE(ubl.storage_slot); | ||||
|       #else | ||||
|         const bool ubl_active = false; | ||||
|         const int8_t storage_slot = -1; | ||||
|         EEPROM_WRITE(ubl_active); | ||||
|         EEPROM_WRITE(storage_slot); | ||||
|       #endif // AUTO_BED_LEVELING_UBL | ||||
|       const bool ubl_active = TERN(AUTO_BED_LEVELING_UBL, planner.leveling_active, false); | ||||
|       const int8_t storage_slot = TERN(AUTO_BED_LEVELING_UBL, ubl.storage_slot, -1); | ||||
|       EEPROM_WRITE(ubl_active); | ||||
|       EEPROM_WRITE(storage_slot); | ||||
|     } | ||||
|  | ||||
|     // | ||||
| @@ -728,7 +711,6 @@ void MarlinSettings::postprocess() { | ||||
|     // | ||||
|     { | ||||
|       _FIELD_TEST(servo_angles); | ||||
|  | ||||
|       #if !HAS_SERVO_ANGLES | ||||
|         uint16_t servo_angles[EEPROM_NUM_SERVOS][2] = { { 0, 0 } }; | ||||
|       #endif | ||||
| @@ -753,11 +735,7 @@ void MarlinSettings::postprocess() { | ||||
|     // | ||||
|     { | ||||
|       _FIELD_TEST(bltouch_last_written_mode); | ||||
|       #if ENABLED(BLTOUCH) | ||||
|         const bool &bltouch_last_written_mode = bltouch.last_written_mode; | ||||
|       #else | ||||
|         constexpr bool bltouch_last_written_mode = false; | ||||
|       #endif | ||||
|       const bool bltouch_last_written_mode = TERN(BLTOUCH, bltouch.last_written_mode, false); | ||||
|       EEPROM_WRITE(bltouch_last_written_mode); | ||||
|     } | ||||
|  | ||||
| @@ -782,23 +760,9 @@ void MarlinSettings::postprocess() { | ||||
|  | ||||
|         // Write dual endstops in X, Y, Z order. Unused = 0.0 | ||||
|         dummyf = 0; | ||||
|         #if ENABLED(X_DUAL_ENDSTOPS) | ||||
|           EEPROM_WRITE(endstops.x2_endstop_adj);   // 1 float | ||||
|         #else | ||||
|           EEPROM_WRITE(dummyf); | ||||
|         #endif | ||||
|  | ||||
|         #if ENABLED(Y_DUAL_ENDSTOPS) | ||||
|           EEPROM_WRITE(endstops.y2_endstop_adj);   // 1 float | ||||
|         #else | ||||
|           EEPROM_WRITE(dummyf); | ||||
|         #endif | ||||
|  | ||||
|         #if ENABLED(Z_MULTI_ENDSTOPS) | ||||
|           EEPROM_WRITE(endstops.z2_endstop_adj);   // 1 float | ||||
|         #else | ||||
|           EEPROM_WRITE(dummyf); | ||||
|         #endif | ||||
|         EEPROM_WRITE(TERN(X_DUAL_ENDSTOPS, endstops.x2_endstop_adj, dummyf));   // 1 float | ||||
|         EEPROM_WRITE(TERN(Y_DUAL_ENDSTOPS, endstops.y2_endstop_adj, dummyf));   // 1 float | ||||
|         EEPROM_WRITE(TERN(Z_MULTI_ENDSTOPS, endstops.z2_endstop_adj, dummyf));  // 1 float | ||||
|  | ||||
|         #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 | ||||
|           EEPROM_WRITE(endstops.z3_endstop_adj);   // 1 float | ||||
| @@ -865,12 +829,10 @@ void MarlinSettings::postprocess() { | ||||
|       } | ||||
|  | ||||
|       _FIELD_TEST(lpq_len); | ||||
|       #if ENABLED(PID_EXTRUSION_SCALING) | ||||
|         EEPROM_WRITE(thermalManager.lpq_len); | ||||
|       #else | ||||
|       #if DISABLED(PID_EXTRUSION_SCALING) | ||||
|         const int16_t lpq_len = 20; | ||||
|         EEPROM_WRITE(lpq_len); | ||||
|       #endif | ||||
|       EEPROM_WRITE(TERN(PID_EXTRUSION_SCALING, thermalManager.lpq_len, lpq_len)); | ||||
|     } | ||||
|  | ||||
|     // | ||||
| @@ -911,8 +873,6 @@ void MarlinSettings::postprocess() { | ||||
|       const int16_t lcd_contrast = | ||||
|         #if HAS_LCD_CONTRAST | ||||
|           ui.contrast | ||||
|         #elif defined(DEFAULT_LCD_CONTRAST) | ||||
|           DEFAULT_LCD_CONTRAST | ||||
|         #else | ||||
|           127 | ||||
|         #endif | ||||
| @@ -925,14 +885,7 @@ void MarlinSettings::postprocess() { | ||||
|     // | ||||
|     { | ||||
|       _FIELD_TEST(recovery_enabled); | ||||
|  | ||||
|       const bool recovery_enabled = | ||||
|         #if ENABLED(POWER_LOSS_RECOVERY) | ||||
|           recovery.enabled | ||||
|         #else | ||||
|           PLR_ENABLED_DEFAULT | ||||
|         #endif | ||||
|       ; | ||||
|       const bool recovery_enabled = TERN(POWER_LOSS_RECOVERY, recovery.enabled, ENABLED(PLR_ENABLED_DEFAULT)); | ||||
|       EEPROM_WRITE(recovery_enabled); | ||||
|     } | ||||
|  | ||||
| @@ -941,19 +894,15 @@ void MarlinSettings::postprocess() { | ||||
|     // | ||||
|     { | ||||
|       _FIELD_TEST(fwretract_settings); | ||||
|  | ||||
|       #if ENABLED(FWRETRACT) | ||||
|         EEPROM_WRITE(fwretract.settings); | ||||
|       #else | ||||
|       #if DISABLED(FWRETRACT) | ||||
|         const fwretract_settings_t autoretract_defaults = { 3, 45, 0, 0, 0, 13, 0, 8 }; | ||||
|         EEPROM_WRITE(autoretract_defaults); | ||||
|       #endif | ||||
|       #if BOTH(FWRETRACT, FWRETRACT_AUTORETRACT) | ||||
|         EEPROM_WRITE(fwretract.autoretract_enabled); | ||||
|       #else | ||||
|       EEPROM_WRITE(TERN(FWRETRACT, fwretract.settings, autoretract_defaults)); | ||||
|  | ||||
|       #if DISABLED(FWRETRACT_AUTORETRACT) | ||||
|         const bool autoretract_enabled = false; | ||||
|         EEPROM_WRITE(autoretract_enabled); | ||||
|       #endif | ||||
|       EEPROM_WRITE(TERN(FWRETRACT_AUTORETRACT, fwretract.autoretract_enabled, autoretract_enabled)); | ||||
|     } | ||||
|  | ||||
|     // | ||||
| @@ -1270,12 +1219,10 @@ void MarlinSettings::postprocess() { | ||||
|  | ||||
|     _FIELD_TEST(coordinate_system); | ||||
|  | ||||
|     #if ENABLED(CNC_COORDINATE_SYSTEMS) | ||||
|       EEPROM_WRITE(gcode.coordinate_system); | ||||
|     #else | ||||
|     #if DISABLED(CNC_COORDINATE_SYSTEMS) | ||||
|       const xyz_pos_t coordinate_system[MAX_COORDINATE_SYSTEMS] = { { 0 } }; | ||||
|       EEPROM_WRITE(coordinate_system); | ||||
|     #endif | ||||
|     EEPROM_WRITE(TERN(CNC_COORDINATE_SYSTEMS, gcode.coordinate_system, coordinate_system)); | ||||
|  | ||||
|     // | ||||
|     // Skew correction factors | ||||
| @@ -1448,11 +1395,7 @@ void MarlinSettings::postprocess() { | ||||
|           for (uint8_t q = 4; q--;) EEPROM_READ(dummyf); | ||||
|         #endif | ||||
|  | ||||
|         #if DISABLED(CLASSIC_JERK) | ||||
|           EEPROM_READ(planner.junction_deviation_mm); | ||||
|         #else | ||||
|           EEPROM_READ(dummyf); | ||||
|         #endif | ||||
|         EEPROM_READ(TERN(CLASSIC_JERK, dummyf, planner.junction_deviation_mm)); | ||||
|       } | ||||
|  | ||||
|       // | ||||
| @@ -1504,13 +1447,7 @@ void MarlinSettings::postprocess() { | ||||
|       // | ||||
|       // Global Leveling | ||||
|       // | ||||
|       { | ||||
|         #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) | ||||
|           EEPROM_READ(new_z_fade_height); | ||||
|         #else | ||||
|           EEPROM_READ(dummyf); | ||||
|         #endif | ||||
|       } | ||||
|       EEPROM_READ(TERN(ENABLE_LEVELING_FADE_HEIGHT, new_z_fade_height, dummyf)); | ||||
|  | ||||
|       // | ||||
|       // Mesh (Manual) Bed Leveling | ||||
| @@ -1662,21 +1599,10 @@ void MarlinSettings::postprocess() { | ||||
|  | ||||
|           _FIELD_TEST(x2_endstop_adj); | ||||
|  | ||||
|           #if ENABLED(X_DUAL_ENDSTOPS) | ||||
|             EEPROM_READ(endstops.x2_endstop_adj);  // 1 float | ||||
|           #else | ||||
|             EEPROM_READ(dummyf); | ||||
|           #endif | ||||
|           #if ENABLED(Y_DUAL_ENDSTOPS) | ||||
|             EEPROM_READ(endstops.y2_endstop_adj);  // 1 float | ||||
|           #else | ||||
|             EEPROM_READ(dummyf); | ||||
|           #endif | ||||
|           #if ENABLED(Z_MULTI_ENDSTOPS) | ||||
|             EEPROM_READ(endstops.z2_endstop_adj); // 1 float | ||||
|           #else | ||||
|             EEPROM_READ(dummyf); | ||||
|           #endif | ||||
|           EEPROM_READ(TERN(X_DUAL_ENDSTOPS, endstops.x2_endstop_adj, dummyf));  // 1 float | ||||
|           EEPROM_READ(TERN(Y_DUAL_ENDSTOPS, endstops.y2_endstop_adj, dummyf));  // 1 float | ||||
|           EEPROM_READ(TERN(Z_MULTI_ENDSTOPS, endstops.z2_endstop_adj, dummyf)); // 1 float | ||||
|  | ||||
|           #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 | ||||
|             EEPROM_READ(endstops.z3_endstop_adj); // 1 float | ||||
|           #else | ||||
| @@ -2667,7 +2593,7 @@ void MarlinSettings::reset() { | ||||
|   // | ||||
|  | ||||
|   #if ENABLED(POWER_LOSS_RECOVERY) | ||||
|     recovery.enable(PLR_ENABLED_DEFAULT); | ||||
|     recovery.enable(ENABLED(PLR_ENABLED_DEFAULT)); | ||||
|   #endif | ||||
|  | ||||
|   // | ||||
|   | ||||
| @@ -1208,15 +1208,9 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { | ||||
|  | ||||
|     #if ENABLED(SPI_ENDSTOPS) | ||||
|       switch (axis) { | ||||
|         #if X_SPI_SENSORLESS | ||||
|           case X_AXIS: endstops.tmc_spi_homing.x = true; break; | ||||
|         #endif | ||||
|         #if Y_SPI_SENSORLESS | ||||
|           case Y_AXIS: endstops.tmc_spi_homing.y = true; break; | ||||
|         #endif | ||||
|         #if Z_SPI_SENSORLESS | ||||
|           case Z_AXIS: endstops.tmc_spi_homing.z = true; break; | ||||
|         #endif | ||||
|         case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; | ||||
|         case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = true; break; | ||||
|         case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = true; break; | ||||
|         default: break; | ||||
|       } | ||||
|     #endif | ||||
| @@ -1280,15 +1274,9 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { | ||||
|  | ||||
|     #if ENABLED(SPI_ENDSTOPS) | ||||
|       switch (axis) { | ||||
|         #if X_SPI_SENSORLESS | ||||
|           case X_AXIS: endstops.tmc_spi_homing.x = false; break; | ||||
|         #endif | ||||
|         #if Y_SPI_SENSORLESS | ||||
|           case Y_AXIS: endstops.tmc_spi_homing.y = false; break; | ||||
|         #endif | ||||
|         #if Z_SPI_SENSORLESS | ||||
|           case Z_AXIS: endstops.tmc_spi_homing.z = false; break; | ||||
|         #endif | ||||
|         case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; | ||||
|         case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = false; break; | ||||
|         case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = false; break; | ||||
|         default: break; | ||||
|       } | ||||
|     #endif | ||||
|   | ||||
| @@ -375,11 +375,13 @@ void homeaxis(const AxisEnum axis); | ||||
|  | ||||
|   FORCE_INLINE int x_home_dir(const uint8_t extruder) { return extruder ? X2_HOME_DIR : X_HOME_DIR; } | ||||
|  | ||||
| #elif ENABLED(MULTI_NOZZLE_DUPLICATION) | ||||
| #else | ||||
|  | ||||
|   enum DualXMode : char { | ||||
|     DXC_DUPLICATION_MODE = 2 | ||||
|   }; | ||||
|   #if ENABLED(MULTI_NOZZLE_DUPLICATION) | ||||
|     enum DualXMode : char { DXC_DUPLICATION_MODE = 2 }; | ||||
|   #endif | ||||
|  | ||||
|   FORCE_INLINE int x_home_dir(const uint8_t) { return home_dir(X_AXIS); } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -177,7 +177,7 @@ public: | ||||
|       // Retrieve three points to probe the bed. Any type exposing set(X,Y) may be used. | ||||
|       template <typename T> | ||||
|       static inline void get_three_points(T points[3]) { | ||||
|         #if ENABLED(HAS_FIXED_3POINT) | ||||
|         #if HAS_FIXED_3POINT | ||||
|           points[0].set(PROBE_PT_1_X, PROBE_PT_1_Y); | ||||
|           points[1].set(PROBE_PT_2_X, PROBE_PT_2_Y); | ||||
|           points[2].set(PROBE_PT_3_X, PROBE_PT_3_Y); | ||||
|   | ||||
| @@ -276,11 +276,7 @@ private: | ||||
| #if ENABLED(USB_FLASH_DRIVE_SUPPORT) | ||||
|   #define IS_SD_INSERTED() Sd2Card::isInserted() | ||||
| #elif PIN_EXISTS(SD_DETECT) | ||||
|   #if ENABLED(SD_DETECT_INVERTED) | ||||
|     #define IS_SD_INSERTED()  READ(SD_DETECT_PIN) | ||||
|   #else | ||||
|     #define IS_SD_INSERTED() !READ(SD_DETECT_PIN) | ||||
|   #endif | ||||
|   #define IS_SD_INSERTED() (READ(SD_DETECT_PIN) != ENABLED(SD_DETECT_INVERTED)) | ||||
| #else | ||||
|   // No card detect line? Assume the card is inserted. | ||||
|   #define IS_SD_INSERTED() true | ||||
|   | ||||
		Reference in New Issue
	
	Block a user