diff --git a/.github/workflows/check-pr.yml b/.github/workflows/check-pr.yml index 36367d4d9e..7d6e87843b 100644 --- a/.github/workflows/check-pr.yml +++ b/.github/workflows/check-pr.yml @@ -8,6 +8,8 @@ name: Bad PR Target on: pull_request_target: types: [opened] + branches: + - 2025-* jobs: bad_target: diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 53fc64edf0..62b5b12970 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -599,7 +599,8 @@ //#define CONTROLLER_FAN2_PIN -1 // Set a custom pin for second controller fan //#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered //#define CONTROLLER_FAN_IGNORE_Z // Ignore Z stepper. Useful when stepper timeout is disabled. - #define CONTROLLERFAN_SPEED_MIN 0 // (0-255) Minimum speed. (If set below this value the fan is turned off.) + #define CONTROLLERFAN_SPEED_MIN 40 // (0-255) Minimum speed. (If set below this value the fan is turned off.) + #define CONTROLLERFAN_SPEED_MAX 127 // (0-255) Maximum speed. (Use only for a specific hardware build, or with non default PWM Scale, needs testing with other builds.) #define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled #define CONTROLLERFAN_SPEED_IDLE 0 // (0-255) Idle speed, used when motors are disabled #define CONTROLLERFAN_IDLE_TIME 60 // (seconds) Extra time to keep the fan running after disabling motors @@ -628,6 +629,10 @@ //#define FAN_KICKSTART_POWER 180 // 64-255 //#define FAN_KICKSTART_LINEAR // Set kickstart time linearly based on the speed, e.g., for 20% (51) it will be FAN_KICKSTART_TIME * 0.2. // Useful for quick speed up to low speed. Kickstart power must be set to 255. +//#define FAN_KICKSTART_EDITABLE // Enable M711 configurable settings +#if ENABLED(FAN_KICKSTART_EDITABLE) + #define FAN_KICKSTART_MENU // Enable the Fan Kickstart submenu +#endif // Some coolers may require a non-zero "off" state. //#define FAN_OFF_PWM 1 @@ -694,16 +699,20 @@ #endif /** - * Extruder cooling fans + * Cooling fans * - * Extruder auto fans automatically turn on when their extruders' - * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * Fans automatically turn on when their extruders' + * temperatures go above threshold. * * Your board's pins file specifies the recommended pins. Override those here * or set to -1 to disable completely. * * Multiple extruders can be assigned to the same pin in which case * the fan will turn on when any selected extruder is above the threshold. + * + * EXAMPLE: When 'EXTRUDER_AUTO_FAN_TEMPERATURE' >= 50 + * Fan spins at full speed: + * 'EXTRUDER_AUTO_FAN_SPEED' 255 == full speed */ #define E0_AUTO_FAN_PIN -1 #define E1_AUTO_FAN_PIN -1 @@ -717,12 +726,20 @@ #define COOLER_AUTO_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 -#define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed +#define EXTRUDER_AUTO_FAN_SPEED 255 #define CHAMBER_AUTO_FAN_TEMPERATURE 30 #define CHAMBER_AUTO_FAN_SPEED 255 #define COOLER_AUTO_FAN_TEMPERATURE 18 #define COOLER_AUTO_FAN_SPEED 255 +/** + * Allow Auto Cooling Fans to be editable + */ +//#define AUTO_FAN_EDITABLE // Enable M712 configurable settings +#if ENABLED(AUTO_FAN_EDITABLE) + #define AUTO_FAN_MENU // Enable the Editable Auto Fans submenu +#endif + /** * Hotend Cooling Fans tachometers * diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 1d3dce6cd2..3267b6cdb3 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -216,7 +216,7 @@ #include "feature/fancheck.h" #endif -#if ENABLED(USE_CONTROLLER_FAN) +#if ANY(USE_CONTROLLER_FAN, FAN_KICKSTART_EDITABLE, AUTO_FAN_EDITABLE) #include "feature/controllerfan.h" #endif @@ -1345,6 +1345,14 @@ void setup() { SETUP_RUN(leds2.setup()); #endif + #if ENABLED(FAN_KICKSTART_EDITABLE) + SETUP_RUN(kickstart.setup()); + #endif + + #if ENABLED(AUTO_FAN_EDITABLE) + SETUP_RUN(autofans.setup()); + #endif + #if ENABLED(USE_CONTROLLER_FAN) // Set up fan controller to initialize also the default configurations. SETUP_RUN(controllerFan.setup()); #endif diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index a7bdefc8b6..fe30d875a4 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -320,6 +320,8 @@ #define STR_INPUT_SHAPING "Input Shaping" #define STR_HOTEND_TIMEOUT "Hotend Idle Timeout" #define STR_CONTROLLER_FAN "Controller Fan" +#define STR_FAN_KICKSTART "Fan Kickstart" +#define STR_AUTOFANS "Auto Fans" #define STR_STEPPER_MOTOR_CURRENTS "Stepper Motor Currents" #define STR_RETRACT_S_F_Z "Retract (S F Z)" #define STR_RECOVER_S_F "Recover (S F)" diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index 0636402136..4bf47e5e5b 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -22,9 +22,22 @@ #include "../inc/MarlinConfig.h" +#if ANY(USE_CONTROLLER_FAN, FAN_KICKSTART_EDITABLE, AUTO_FAN_EDITABLE) + #include "controllerfan.h" +#endif + +#if ENABLED(FAN_KICKSTART_EDITABLE) + Kickstart kickstart; + kickstart_settings_t Kickstart::settings; // {0} +#endif + +#if ENABLED(AUTO_FAN_EDITABLE) + Autofans autofans; + autofans_settings_t Autofans::settings; // {0} +#endif + #if ENABLED(USE_CONTROLLER_FAN) -#include "controllerfan.h" #include "../module/stepper.h" #include "../module/temperature.h" @@ -34,8 +47,8 @@ uint8_t ControllerFan::speed; #if ENABLED(CONTROLLER_FAN_EDITABLE) controllerFan_settings_t ControllerFan::settings; // {0} - #else - const controllerFan_settings_t &ControllerFan::settings = controllerFan_defaults; +#else + const controllerFan_settings_t &ControllerFan::settings = controllerFan_defaults; #endif #if ENABLED(FAN_SOFT_PWM) @@ -114,15 +127,33 @@ void ControllerFan::update() { speed = CALC_FAN_SPEED(speed); - #if FAN_KICKSTART_TIME + #if ENABLED(FAN_KICKSTART_EDITABLE) + static millis_t fan_kick_end = 0; + if (speed > FAN_OFF_PWM && kickstart.settings.enabled) { + if (!fan_kick_end) { + fan_kick_end = ms + kickstart.settings.duration; + speed = map(kickstart.settings.speed, 0, 255, 0, CONTROLLERFAN_SPEED_MAX); + nextFanCheck = ms + 20UL; // Reduce update interval for controller fn check while Kickstart is active. + } + else if (PENDING(ms, fan_kick_end)) { + speed = map(kickstart.settings.speed, 0, 255, 0, CONTROLLERFAN_SPEED_MAX); + nextFanCheck = ms + 20UL; // Reduce update interval for controller fn check while Kickstart is active. + } + } + else + fan_kick_end = 0; + #elif FAN_KICKSTART_TIME static millis_t fan_kick_end = 0; if (speed > FAN_OFF_PWM) { if (!fan_kick_end) { - fan_kick_end = ms + FAN_KICKSTART_TIME; // May be longer based on slow update interval for controller fn check. Sets minimum + fan_kick_end = ms + FAN_KICKSTART_TIME; speed = FAN_KICKSTART_POWER; + nextFanCheck = ms + 20UL; // Reduce update interval for controller fn check while Kickstart is active. } - else if (PENDING(ms, fan_kick_end)) + else if (PENDING(ms, fan_kick_end)) { speed = FAN_KICKSTART_POWER; + nextFanCheck = ms + 20UL; // Reduce update interval for controller fn check while Kickstart is active. + } } else fan_kick_end = 0; diff --git a/Marlin/src/feature/controllerfan.h b/Marlin/src/feature/controllerfan.h index 68502afa66..d1d09b91ec 100644 --- a/Marlin/src/feature/controllerfan.h +++ b/Marlin/src/feature/controllerfan.h @@ -24,10 +24,10 @@ #include "../inc/MarlinConfigPre.h" typedef struct { - uint8_t active_speed, // 0-255 (fullspeed); Speed with enabled stepper motors - idle_speed; // 0-255 (fullspeed); Speed after idle period with all motors are disabled - uint16_t duration; // Duration in seconds for the fan to run after all motors are disabled - bool auto_mode; // Default true + uint8_t active_speed, // 0-255 (fullspeed); Speed with enabled stepper motors + idle_speed; // 0-255 (fullspeed); Speed after idle period with all motors are disabled + uint16_t duration; // Duration in seconds for the fan to run after all motors are disabled + bool auto_mode; // Default true } controllerFan_settings_t; #ifndef CONTROLLERFAN_SPEED_ACTIVE @@ -73,3 +73,88 @@ class ControllerFan { extern ControllerFan controllerFan; #endif + +/** + * Fan Kickstart settings + * + */ +#if ENABLED(FAN_KICKSTART_EDITABLE) + + typedef struct { + uint8_t speed; // 0-255 (fullspeed); Fans first start speed + uint16_t duration; // Duration in milliseconds for the fan to run at kickstart speed + bool enabled; + } kickstart_settings_t; + +#ifndef FAN_KICKSTART_TIME + #define FAN_KICKSTART_TIME 100 +#endif +#ifndef FAN_KICKSTART_POWER + #define FAN_KICKSTART_POWER 180 +#endif + +static constexpr kickstart_settings_t kickstart_defaults = { + FAN_KICKSTART_TIME, + FAN_KICKSTART_POWER, + true +}; + +class Kickstart { + public: + static kickstart_settings_t settings; + + static void reset() { settings = kickstart_defaults; } + static void setup() { reset(); } +}; + +extern Kickstart kickstart; + +#endif + +/** + * Auto Fans settings + * + */ +#if ENABLED(AUTO_FAN_EDITABLE) + + typedef struct { + uint8_t extruder_temp, // Auto fans temperature thresholds + chamber_temp, + cooler_temp; + } autofans_settings_t; + +#ifndef EXTRUDER_AUTO_FAN_TEMPERATURE + #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#endif +#ifndef CHAMBER_AUTO_FAN_TEMPERATURE + #define CHAMBER_AUTO_FAN_TEMPERATURE 30 +#endif +#ifndef COOLER_AUTO_FAN_TEMPERATURE + #define COOLER_AUTO_FAN_TEMPERATURE 18 +#endif + +static constexpr autofans_settings_t autofans_defaults = { + EXTRUDER_AUTO_FAN_TEMPERATURE, + CHAMBER_AUTO_FAN_TEMPERATURE, + COOLER_AUTO_FAN_TEMPERATURE +}; + +class Autofans { + public: + static autofans_settings_t settings; + + static void reset() { settings = autofans_defaults; } + static void setup() { reset(); } +}; + +extern Autofans autofans; + +#undef EXTRUDER_AUTO_FAN_TEMPERATURE +#define EXTRUDER_AUTO_FAN_TEMPERATURE (autofans.settings.extruder_temp) +#undef CHAMBER_AUTO_FAN_TEMPERATURE +#define CHAMBER_AUTO_FAN_TEMPERATURE (autofans.settings.chamber_temp) +#undef COOLER_AUTO_FAN_TEMPERATURE +#define COOLER_AUTO_FAN_TEMPERATURE (autofans.settings.cooler_temp) + +#endif + diff --git a/Marlin/src/gcode/feature/controllerfan/M710.cpp b/Marlin/src/gcode/feature/controllerfan/M710.cpp index 6bdfcd9b32..ac1ad59c13 100644 --- a/Marlin/src/gcode/feature/controllerfan/M710.cpp +++ b/Marlin/src/gcode/feature/controllerfan/M710.cpp @@ -37,31 +37,28 @@ * D : Set auto mode idle duration * * Examples: - * M710 ; Report current Settings - * M710 R ; Reset SIAD to defaults - * M710 I64 ; Set controller fan Idle Speed to 25% - * M710 S255 ; Set controller fan Active Speed to 100% - * M710 S0 ; Set controller fan Active Speed to OFF - * M710 I255 A0 ; Set controller fan Idle Speed to 100% with Auto Mode OFF - * M710 I127 A1 S255 D160 ; Set controller fan idle speed 50%, AutoMode On, Fan speed 100%, duration to 160 Secs + * M710 : Report current Settings + * M710 R : Reset SIAD to defaults + * M710 S255 : Set controller fan Active Speed to 100% + * M710 S0 : Set controller fan Active Speed to OFF + * M710 I64 : Set controller fan Idle Speed to 25% + * M710 I255 A0 : Set controller fan Idle Speed to 100% with Auto Mode OFF + * M710 I127 A1 S255 D160 : Set controller fan idle speed 50%, AutoMode On, Fan speed 100%, duration to 160 Secs */ void GcodeSuite::M710() { if (!parser.seen("ADIRS")) return M710_report(); - if (parser.seen_test('R')) - controllerFan.reset(); + const bool seenR = parser.seen_test('R'); + const bool seenS = parser.seenval('S'); + const bool seenI = parser.seenval('I'); + const bool seenA = parser.seenval('A'); + const bool seenD = parser.seenval('D'); - if (parser.seenval('S')) - controllerFan.settings.active_speed = parser.value_byte(); - - if (parser.seenval('I')) - controllerFan.settings.idle_speed = parser.value_byte(); - - if (parser.seenval('A')) - controllerFan.settings.auto_mode = parser.value_bool(); - - if (parser.seenval('D')) - controllerFan.settings.duration = parser.value_ushort(); + if (seenR) controllerFan.reset(); + if (seenS) controllerFan.settings.active_speed = parser.value_byte(); + if (seenI) controllerFan.settings.idle_speed = parser.value_byte(); + if (seenA) controllerFan.settings.auto_mode = parser.value_bool(); + if (seenD) controllerFan.settings.duration = parser.value_ushort(); } void GcodeSuite::M710_report(const bool forReplay/*=true*/) { diff --git a/Marlin/src/gcode/feature/controllerfan/M711.cpp b/Marlin/src/gcode/feature/controllerfan/M711.cpp new file mode 100644 index 0000000000..b30e07252f --- /dev/null +++ b/Marlin/src/gcode/feature/controllerfan/M711.cpp @@ -0,0 +1,69 @@ +/** + * Fan Kickstart settings + * Author: wlkmanist + * Date: 2024/04/04 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 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 Lesser General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(FAN_KICKSTART_EDITABLE) + +#include "../../gcode.h" +#include "../../../feature/controllerfan.h" + +/** + * M711: Set Fan Kickstart settings + * + * R : Reset to defaults + * S[0-255] : Fan speed when fans first start + * D : Set Kickstart duration (ms) + * E[0|1] : Turn Kickstart feature on or off + * + * Examples: + * M711 : Report current Settings + * M711 R : Reset SDE to defaults + * M711 S255 : Set Kickstart fan speed to 100% + * M711 E1 S180 D100 : Set Kickstart to ON, Kickstart fan speed 70%, duration to 100 milliseconds + * M711 E0 : Set Kickstart to OFF + */ +void GcodeSuite::M711() { + if (!parser.seen("DERS")) return M711_report(); + + const bool seenR = parser.seen('R'); + const bool seenS = parser.seenval('S'); + const bool seenD = parser.seenval('D'); + const bool seenE = parser.seenval('E'); + + if (seenR) kickstart.reset(); + if (seenS) kickstart.settings.speed = parser.value_byte(); + if (seenD) kickstart.settings.duration = parser.value_ushort(); + if (seenE) kickstart.settings.enabled = parser.value_bool(); +} + +void GcodeSuite::M711_report(const bool forReplay/*=true*/) { + TERN_(MARLIN_SMALL_BUILD, return); + + report_heading_etc(forReplay, F(STR_FAN_KICKSTART)); + SERIAL_ECHOLNPGM(" M711" + " S", int(kickstart.settings.speed), + " D", int(kickstart.settings.duration), + " E", int(kickstart.settings.enabled), + " ; (", (int(kickstart.settings.speed) * 100) / 255, "%)" + ); +} + +#endif // FAN_KICKSTART_EDITABLE diff --git a/Marlin/src/gcode/feature/controllerfan/M712.cpp b/Marlin/src/gcode/feature/controllerfan/M712.cpp new file mode 100644 index 0000000000..b6f493d7b8 --- /dev/null +++ b/Marlin/src/gcode/feature/controllerfan/M712.cpp @@ -0,0 +1,67 @@ +/** + * Auto Fans settings (Extruder Cooling Fans) + * Author: wlkmanist + * Date: 2024/04/08 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 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 Lesser General Public License + * along with this program. If not, see . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(AUTO_FAN_EDITABLE) + +#include "../../gcode.h" +#include "../../../feature/controllerfan.h" + +/** + * M712: Set Extruder Auto Fans settings + * + * R : Reset to defaults + * E : Set Extruder fans temperature threshold + * H : Set Chamber fan temperature threshold + * C : Set Cooler fan temperature threshold + * + * Examples: + * M712 : Report current Settings + * M712 R : Reset EHC to defaults + * M712 E60 : Set Extruder temp to 60 + * M712 E50 H30 C18 : Set Extruder temp to 50, Chamber temp to 30, Cooler temp to 18 + */ +void GcodeSuite::M712() { + if (!parser.seen("CEHR")) return M712_report(); + + const bool seenR = parser.seen('R'); + const bool seenE = parser.seenval('E'); + const bool seenH = parser.seenval('H'); + const bool seenC = parser.seenval('C'); + + if (seenR) autofans.reset(); + if (seenE) autofans.settings.extruder_temp = parser.value_byte(); + if (seenH) autofans.settings.chamber_temp = parser.value_byte(); + if (seenC) autofans.settings.cooler_temp = parser.value_byte(); +} + +void GcodeSuite::M712_report(const bool forReplay/*=true*/) { + TERN_(MARLIN_SMALL_BUILD, return); + + report_heading_etc(forReplay, F(STR_AUTOFANS)); + SERIAL_ECHOLNPGM(" M712" + " E", int(autofans.settings.extruder_temp), + " H", int(autofans.settings.chamber_temp), + " C", int(autofans.settings.cooler_temp) + ); +} + +#endif // AUTO_FAN_EDITABLE diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index e7da3f5069..39ad2edd1b 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1043,6 +1043,14 @@ void GcodeSuite::process_parsed_command(bool no_ok/*=false*/) { case 710: M710(); break; // M710: Set Controller Fan settings #endif + #if ENABLED(FAN_KICKSTART_EDITABLE) + case 711: M711(); break; // M711: Set Fan Kickstart settings + #endif + + #if ENABLED(AUTO_FAN_EDITABLE) + case 712: M712(); break; // M712: Set Auto Fans settings + #endif + #if ENABLED(GCODE_MACROS) case 810: case 811: case 812: case 813: case 814: case 815: case 816: case 817: case 818: case 819: diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 644b1147ab..884bd89f27 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -1380,6 +1380,16 @@ class GcodeSuite { static void M710_report(const bool forReplay=true); #endif + #if ENABLED(FAN_KICKSTART_EDITABLE) + static void M711(); + static void M711_report(const bool forReplay=true); + #endif + + #if ENABLED(AUTO_FAN_EDITABLE) + static void M712(); + static void M712_report(const bool forReplay=true); + #endif + static void T(const int8_t tool_index) IF_DISABLED(HAS_TOOLCHANGE, { UNUSED(tool_index); }); }; diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index e7d0a68879..31af7bcf3a 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -2801,6 +2801,11 @@ #endif #endif +#if !HAS_AUTO_FAN + #undef AUTO_FAN_MENU + #undef AUTO_FAN_EDITABLE +#endif + // Fans check #if HAS_HOTEND && PIN_EXISTS(E0_FAN_TACHO) #define HAS_E0_FAN_TACHO 1 @@ -2879,6 +2884,9 @@ #else #undef CONTROLLER_FAN_TRIGGER_TEMP #endif +#else + #undef CONTROLLER_FAN_MENU + #undef CONTROLLER_FAN_EDITABLE #endif /** @@ -2995,14 +3003,18 @@ #define FAN_MAX_PWM 255 #endif #if FAN_MIN_PWM == 0 && FAN_MAX_PWM == 255 - #define CALC_FAN_SPEED(f) (f ?: FAN_OFF_PWM) + #define CALC_FAN_SPEED(f) ((f) ?: FAN_OFF_PWM) #else - #define CALC_FAN_SPEED(f) (f ? map(f, 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) + #define CALC_FAN_SPEED(f) ((f) ? map(f, 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) #endif #endif // Fan Kickstart -#if FAN_KICKSTART_TIME && !defined(FAN_KICKSTART_POWER) +#if defined(FAN_KICKSTART_TIME) && NONE(HAS_FAN, USE_CONTROLLER_FAN) + #undef FAN_KICKSTART_TIME +#endif + +#if defined(FAN_KICKSTART_TIME) && !defined(FAN_KICKSTART_POWER) #define FAN_KICKSTART_POWER TERN(FAN_KICKSTART_LINEAR, 255, 180) #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index cc8f68eefc..1d1cc3563f 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1061,7 +1061,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif // Fan Kickstart power -#if FAN_KICKSTART_TIME +#ifdef FAN_KICKSTART_TIME #if ENABLED(FAN_KICKSTART_LINEAR) && FAN_KICKSTART_POWER != 255 #error "FAN_KICKSTART_LINEAR requires a FAN_KICKSTART_POWER of 255." #elif !WITHIN(FAN_KICKSTART_POWER, 64, 255) @@ -1073,7 +1073,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i * Synchronous M106/M107 checks */ #if ENABLED(LASER_SYNCHRONOUS_M106_M107) - #if FAN_KICKSTART_TIME + #ifdef FAN_KICKSTART_TIME #error "FAN_KICKSTART_TIME must be 0 with LASER_SYNCHRONOUS_M106_M107 (because the laser will always come on at FULL power)." #elif FAN_MIN_PWM #error "FAN_MIN_PWM must be 0 with LASER_SYNCHRONOUS_M106_M107 (otherwise the laser will never turn OFF)." diff --git a/Marlin/src/lcd/dwin/proui/dwin.cpp b/Marlin/src/lcd/dwin/proui/dwin.cpp index 65fb1feb23..3b335c8826 100644 --- a/Marlin/src/lcd/dwin/proui/dwin.cpp +++ b/Marlin/src/lcd/dwin/proui/dwin.cpp @@ -88,6 +88,10 @@ #include "../../../feature/tmc_util.h" #endif +#if ANY(CONTROLLER_FAN_MENU, FAN_KICKSTART_MENU, AUTO_FAN_MENU) + #include "../../../feature/controllerfan.h" +#endif + #if ANY(HAS_GCODE_PREVIEW, CV_LASER_MODULE) #include "gcode_preview.h" #endif @@ -141,6 +145,9 @@ #define MAX_TMC_CURRENT 3000 #endif +#if ENABLED(CONTROLLER_FAN_MENU) + #define MAX_FAN_IDLE 4800 +#endif #if ANY(TJC_DISPLAY, DACAI_DISPLAY) #define HOME_AND_KILL_ICON ICON_BLTouch #else @@ -319,6 +326,18 @@ MenuClass *MaxAccelMenu = nullptr; #if HAS_TRINAMIC_CONFIG MenuClass *TrinamicConfigMenu = nullptr; #endif +#if ANY(CONTROLLER_FAN_MENU, AUTO_FAN_MENU, FAN_KICKSTART_MENU) + MenuClass *AdvancedFanMenu = nullptr; +#endif +#if ENABLED(CONTROLLER_FAN_MENU) + MenuClass *ControllerFanMenu = nullptr; +#endif +#if ENABLED(FAN_KICKSTART_MENU) + MenuClass *KickstartMenu = nullptr; +#endif +#if ENABLED(AUTO_FAN_MENU) + MenuClass *AutofanMenu = nullptr; +#endif #if ENABLED(CV_LASER_MODULE) MenuClass *LaserSettings = nullptr; MenuClass *LaserPrintMenu = nullptr; @@ -2738,6 +2757,25 @@ void SetFlow() { SetPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refres void SetFanSpeed() { SetIntOnClick(0, 255, thermalManager.fan_speed[EXT], ApplyFanSpeed); } #endif +#if ENABLED(CONTROLLER_FAN_MENU) + void SetControllerFanAutoOn() { FLIP(controllerFan.settings.auto_mode); PrepareRefreshMenu(); Draw_ControllerFan_menu(); } + void SetControllerFanIdleSpeed() { SetIntOnClick(0, 255, controllerFan.settings.idle_speed, []{ controllerFan.settings.idle_speed = MenuData.Value; }); } + void SetControllerFanSpeed() { SetIntOnClick(0, 255, controllerFan.settings.active_speed, []{ controllerFan.settings.active_speed = MenuData.Value; }); } + void SetControllerFanDuration() { SetIntOnClick(1, MAX_FAN_IDLE, controllerFan.settings.duration, []{ controllerFan.settings.duration = MenuData.Value; }); } +#endif + +#if ENABLED(FAN_KICKSTART_MENU) + void SetKickstartEnabled() { FLIP(kickstart.settings.enabled); PrepareRefreshMenu(); Draw_Kickstart_menu(); } + void SetKickstartSpeed() { SetIntOnClick((FAN_MIN_PWM > 96 ? FAN_MIN_PWM : 96), FAN_MAX_PWM, kickstart.settings.speed, []{ kickstart.settings.speed = MenuData.Value; }); } + void SetKickstartDuration() { SetIntOnClick(10, 1500, kickstart.settings.duration, []{ kickstart.settings.duration = MenuData.Value; }); } +#endif + +#if ENABLED(AUTO_FAN_MENU) + void SetExtruderFanThreshold() { SetIntOnClick(10, 120, autofans.settings.extruder_temp, []{ autofans.settings.extruder_temp = MenuData.Value; }); } + void SetChamberFanThreshold() { SetIntOnClick(10, 80, autofans.settings.chamber_temp, []{ autofans.settings.chamber_temp = MenuData.Value; }); } + void SetCoolerFanThreshold() { SetIntOnClick(10, 100, autofans.settings.cooler_temp, []{ autofans.settings.cooler_temp = MenuData.Value; }); } +#endif + #if ENABLED(SHOW_SPEED_IND) void SetSpdInd() { Toggle_Chkb_Line(HMI_data.SpdInd); @@ -3804,6 +3842,70 @@ void Draw_Tune_Menu() { #endif +#if ANY(CONTROLLER_FAN_MENU, AUTO_FAN_MENU, FAN_KICKSTART_MENU) + + void Draw_AdvancedFan_menu() { + checkkey = Menu; + if (SET_MENU(AdvancedFanMenu, MSG_FANS_SETTINGS, 1 PLUS_TERN0(FAN_KICKSTART_MENU, 1) PLUS_TERN0(CONTROLLER_FAN_MENU, 1) PLUS_TERN0(AUTO_FAN_MENU, 3))) { + #if NONE(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_BILINEAR, MESH_BED_LEVELING) + BACK_ITEM(Draw_AdvancedSettings_Menu); + #else + BACK_ITEM(Draw_Advanced_Menu); + #endif + #if ENABLED(CONTROLLER_FAN_MENU) + MENU_ITEM(ICON_FanSpeed, MSG_CONTROLLER_FAN, onDrawSubMenu, Draw_ControllerFan_menu); + #endif + #if ENABLED(FAN_KICKSTART_MENU) + MENU_ITEM(ICON_Motion, MSG_FAN_KICKSTART, onDrawSubMenu, Draw_Kickstart_menu); + #endif + #if (ENABLED(AUTO_FAN_MENU)) + #if HAS_E_AUTO_FAN + EDIT_ITEM(ICON_Temperature, MSG_FAN_EXTRUDER_TEMP, onDrawPInt8Menu, SetExtruderFanThreshold, &autofans.settings.extruder_temp); + #endif + #if HAS_AUTO_CHAMBER_FAN + EDIT_ITEM(ICON_Temperature, MSG_FAN_CHAMBER_TEMP, onDrawPInt8Menu, SetChamberFanThreshold, &autofans.settings.chamber_temp); + #endif + #if HAS_AUTO_COOLER_FAN + EDIT_ITEM(ICON_Temperature, MSG_FAN_COOLER_TEMP, onDrawPInt8Menu, SetCoolerFanThreshold, &autofans.settings.cooler_temp); + #endif + #endif + } + UpdateMenu(AdvancedFanMenu); + } + + #if ENABLED(CONTROLLER_FAN_MENU) + void Draw_ControllerFan_menu() { + checkkey = Menu; + if (SET_MENU(ControllerFanMenu, MSG_CONTROLLER_FAN, 5)) { + BACK_ITEM(Draw_AdvancedFan_menu); + EDIT_ITEM(ICON_FanSpeed, MSG_CONTROLLER_FAN_AUTO_ON, onDrawChkbMenu, SetControllerFanAutoOn, &controllerFan.settings.auto_mode); + EDIT_ITEM(ICON_FanSpeed, MSG_CONTROLLER_FAN_IDLE_SPEED, onDrawPInt8Menu, SetControllerFanIdleSpeed, &controllerFan.settings.idle_speed); + if (controllerFan.settings.auto_mode) { + EDIT_ITEM(ICON_FanSpeed, MSG_CONTROLLER_FAN_SPEED, onDrawPInt8Menu, SetControllerFanSpeed, &controllerFan.settings.active_speed); + EDIT_ITEM(ICON_RemainTime, MSG_CONTROLLER_FAN_DURATION, onDrawPIntMenu, SetControllerFanDuration, &controllerFan.settings.duration); + } + } + UpdateMenu(ControllerFanMenu); + } + #endif + + #if ENABLED(FAN_KICKSTART_MENU) + void Draw_Kickstart_menu() { + checkkey = Menu; + if (SET_MENU(KickstartMenu, MSG_FAN_KICKSTART, 4)) { + BACK_ITEM(Draw_AdvancedFan_menu); + EDIT_ITEM(ICON_Motion, MSG_FAN_KICKSTART_ENABLE, onDrawChkbMenu, SetKickstartEnabled, &kickstart.settings.enabled); + if (kickstart.settings.enabled) { + EDIT_ITEM(ICON_FanSpeed, MSG_FAN_KICKSTART_POWER, onDrawPInt8Menu, SetKickstartSpeed, &kickstart.settings.speed); + EDIT_ITEM(ICON_RemainTime, MSG_FAN_KICKSTART_DURATION, onDrawPIntMenu, SetKickstartDuration, &kickstart.settings.duration); + } + } + UpdateMenu(KickstartMenu); + } + #endif + +#endif + void Draw_Motion_Menu() { checkkey = Menu; if (SET_MENU(MotionMenu, MSG_MOTION, 11)) { @@ -4871,6 +4973,9 @@ void Draw_AdvancedSettings_Menu() { #if HAS_TRINAMIC_CONFIG MENU_ITEM(ICON_TMCSet, MSG_TMC_DRIVERS, onDrawSubMenu, Draw_TrinamicConfig_menu); #endif + #if ANY(CONTROLLER_FAN_MENU, AUTO_FAN_MENU, FAN_KICKSTART_MENU) + MENU_ITEM(ICON_FanSpeed, MSG_FANS_SETTINGS, onDrawSubMenu, Draw_AdvancedFan_menu); + #endif #if ENABLED(PRINTCOUNTER) MENU_ITEM(ICON_PrintStatsReset, MSG_INFO_PRINT_COUNT_RESET, onDrawSubMenu, printStatsReset); #endif @@ -4934,6 +5039,9 @@ void Draw_AdvancedSettings_Menu() { #if HAS_TRINAMIC_CONFIG MENU_ITEM(ICON_TMCSet, MSG_TMC_DRIVERS, onDrawSubMenu, Draw_TrinamicConfig_menu); #endif + #if ANY(CONTROLLER_FAN_MENU, AUTO_FAN_MENU, FAN_KICKSTART_MENU) + MENU_ITEM(ICON_FanSpeed, MSG_FANS_SETTINGS, onDrawSubMenu, Draw_AdvancedFan_menu); + #endif #if ENABLED(PRINTCOUNTER) MENU_ITEM(ICON_PrintStatsReset, MSG_INFO_PRINT_COUNT_RESET, onDrawSubMenu, printStatsReset); #endif diff --git a/Marlin/src/lcd/dwin/proui/dwin.h b/Marlin/src/lcd/dwin/proui/dwin.h index f159063cc4..de95675959 100644 --- a/Marlin/src/lcd/dwin/proui/dwin.h +++ b/Marlin/src/lcd/dwin/proui/dwin.h @@ -354,6 +354,14 @@ void Draw_MaxAccel_Menu(); void Draw_GetColor_Menu(); #endif +// Controller Fan / Kickstart Menu +#if ENABLED(CONTROLLER_FAN_MENU) + void Draw_ControllerFan_menu(); +#endif +#if ENABLED(FAN_KICKSTART_MENU) + void Draw_Kickstart_menu(); +#endif + // PID #if HAS_PID_HEATING #include "../../../module/temperature.h" diff --git a/Marlin/src/lcd/dwin/proui/menus.cpp b/Marlin/src/lcd/dwin/proui/menus.cpp index 3e9e0f9dda..333ba62965 100644 --- a/Marlin/src/lcd/dwin/proui/menus.cpp +++ b/Marlin/src/lcd/dwin/proui/menus.cpp @@ -470,6 +470,11 @@ void InvalidateMenu() { CurrentMenu = nullptr; } +void PrepareRefreshMenu() { + if (CurrentMenu) CurrentMenu->topline = 0; + CurrentMenu = nullptr; +} + void UpdateMenu(MenuClass* &menu) { if (!menu) return; if (CurrentMenu != menu) { diff --git a/Marlin/src/lcd/dwin/proui/menus.h b/Marlin/src/lcd/dwin/proui/menus.h index a81b87cd77..a420aa96d6 100644 --- a/Marlin/src/lcd/dwin/proui/menus.h +++ b/Marlin/src/lcd/dwin/proui/menus.h @@ -174,6 +174,9 @@ void ResetMenu(MenuClass* &menu); // Invalidate CurrentMenu to prepare for full menu drawing void InvalidateMenu(); +// Invalidate CurrentMenu without resetting current position +void PrepareRefreshMenu(); + // Update the Menu and Draw if it is valid void UpdateMenu(MenuClass* &menu); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 13d7c53a93..92c45f86d1 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -986,6 +986,15 @@ namespace LanguageNarrow_en { LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction"); LSTR MSG_BACKLASH_SMOOTHING = _UxGT("Smoothing"); + LSTR MSG_FANS_SETTINGS = _UxGT("Fans Settings"); + LSTR MSG_FAN_KICKSTART = _UxGT("Fan Kickstart"); + LSTR MSG_FAN_KICKSTART_ENABLE = _UxGT("Enable Kickstart"); + LSTR MSG_FAN_KICKSTART_DURATION = _UxGT("Kickstart Time"); + LSTR MSG_FAN_KICKSTART_POWER = _UxGT("Kickstart Power"); + LSTR MSG_FAN_EXTRUDER_TEMP = _UxGT("Extruder Fan Temp"); + LSTR MSG_FAN_CHAMBER_TEMP = _UxGT("Chamber Fan Temp"); + LSTR MSG_FAN_COOLER_TEMP = _UxGT("Cooler Fan Temp"); + LSTR MSG_FIXED_TIME_MOTION = _UxGT("Fixed-Time Motion"); LSTR MSG_FTM_CMPN_MODE = _UxGT("@ Comp. Mode: $"); LSTR MSG_FTM_ZV = _UxGT("ZV"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index e4822be615..5918f61135 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -648,6 +648,15 @@ namespace LanguageNarrow_ru { LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим драйвера"); LSTR MSG_TMC_STEALTHCHOP = _UxGT("Тихий режим вкл"); + LSTR MSG_FANS_SETTINGS = _UxGT("Настройки кулеров"); + LSTR MSG_FAN_KICKSTART = _UxGT("Кик-старт"); + LSTR MSG_FAN_KICKSTART_ENABLE = _UxGT("Кик-старт вкл"); + LSTR MSG_FAN_KICKSTART_DURATION = _UxGT("Длительность"); + LSTR MSG_FAN_KICKSTART_POWER = _UxGT("Мощность"); + LSTR MSG_FAN_EXTRUDER_TEMP = _UxGT("Порог кулера экстр."); + LSTR MSG_FAN_CHAMBER_TEMP = _UxGT("Порог кулера камеры"); + LSTR MSG_FAN_COOLER_TEMP = _UxGT("Порог кулера лазера"); + LSTR MSG_SERVICE_RESET = _UxGT("Сброс"); LSTR MSG_SERVICE_IN = _UxGT(" в:"); LSTR MSG_BACKLASH = _UxGT("Люфт"); diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 3263c0ded7..efe9aee912 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -113,6 +113,10 @@ #include "../feature/spindle_laser.h" #endif +#if ENABLED(FAN_KICKSTART_EDITABLE) + #include "../feature/controllerfan.h" +#endif + // Delay for delivery of first block to the stepper ISR, if the queue contains 2 or // fewer movements. The delay is measured in milliseconds, and must be less than 250ms #define BLOCK_DELAY_NONE 0U @@ -1211,7 +1215,7 @@ void Planner::recalculate(const float safe_exit_speed_sqr) { /** * Apply fan speeds */ -#if HAS_FAN +#if HAS_FAN || ENABLED(FAN_KICKSTART_EDITABLE) void Planner::sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]) { @@ -1233,22 +1237,36 @@ void Planner::recalculate(const float safe_exit_speed_sqr) { TERN_(HAS_FAN7, FAN_SET(7)); } - #if FAN_KICKSTART_TIME + #ifdef FAN_KICKSTART_TIME void Planner::kickstart_fan(uint8_t (&fan_speed)[FAN_COUNT], const millis_t &ms, const uint8_t f) { - static millis_t fan_kick_end[FAN_COUNT] = { 0 }; - #if ENABLED(FAN_KICKSTART_LINEAR) - static uint8_t set_fan_speed[FAN_COUNT] = { 0 }; - #endif - if (fan_speed[f] > FAN_OFF_PWM) { - const bool first_kick = fan_kick_end[f] == 0 && TERN1(FAN_KICKSTART_LINEAR, fan_speed[f] > set_fan_speed[f]); - if (first_kick) - fan_kick_end[f] = ms + MUL_TERN(FAN_KICKSTART_LINEAR, FAN_KICKSTART_TIME, (fan_speed[f] - set_fan_speed[f]) / 255); - if (first_kick || PENDING(ms, fan_kick_end[f])) { - fan_speed[f] = FAN_KICKSTART_POWER; - return; + #if ENABLED(FAN_KICKSTART_EDITABLE) + if (!kickstart.settings.enabled) return; + + static millis_t fan_kick_end[FAN_COUNT] = { 0 }; + if (fan_speed[f] > FAN_OFF_PWM) { + if (fan_kick_end[f] == 0) { + fan_kick_end[f] = ms + kickstart.settings.duration; + fan_speed[f] = kickstart.settings.speed; + } + else if (PENDING(ms, fan_kick_end[f])) + fan_speed[f] = kickstart.settings.speed; } - } + #else + static millis_t fan_kick_end[FAN_COUNT] = { 0 }; + #if ENABLED(FAN_KICKSTART_LINEAR) + static uint8_t set_fan_speed[FAN_COUNT] = { 0 }; + #endif + if (fan_speed[f] > FAN_OFF_PWM) { + const bool first_kick = fan_kick_end[f] == 0 && TERN1(FAN_KICKSTART_LINEAR, fan_speed[f] > set_fan_speed[f]); + if (first_kick) + fan_kick_end[f] = ms + (FAN_KICKSTART_TIME) TERN_(FAN_KICKSTART_LINEAR, * (fan_speed[f] - set_fan_speed[f]) / 255); + if (first_kick || PENDING(ms, fan_kick_end[f])) { + fan_speed[f] = FAN_KICKSTART_POWER; + return; + } + } + #endif fan_kick_end[f] = 0; TERN_(FAN_KICKSTART_LINEAR, set_fan_speed[f] = fan_speed[f]); } diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 2355c98552..554b32c1d7 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -687,7 +687,7 @@ class Planner { // Apply fan speeds #if HAS_FAN static void sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]); - #if FAN_KICKSTART_TIME + #if defined(FAN_KICKSTART_TIME) || ENABLED(FAN_KICKSTART_EDITABLE) static void kickstart_fan(uint8_t (&fan_speed)[FAN_COUNT], const millis_t &ms, const uint8_t f); #else FORCE_INLINE static void kickstart_fan(uint8_t (&)[FAN_COUNT], const millis_t &, const uint8_t) {} diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index fb901fa8b1..3f2e0410d8 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -144,7 +144,9 @@ #include "../feature/probe_temp_comp.h" #endif -#include "../feature/controllerfan.h" +#if ANY(USE_CONTROLLER_FAN, FAN_KICKSTART_EDITABLE, AUTO_FAN_EDITABLE) + #include "../feature/controllerfan.h" +#endif #if ENABLED(CASE_LIGHT_ENABLE) #include "../feature/caselight.h" @@ -459,7 +461,23 @@ typedef struct SettingsDataStruct { // // Controller fan // - controllerFan_settings_t controllerFan_settings; // M710 + #if ENABLED(USE_CONTROLLER_FAN) + controllerFan_settings_t controllerFan_settings; // M710 + #endif + + // + // Fan Kickstart + // + #if ENABLED(FAN_KICKSTART_EDITABLE) + kickstart_settings_t kickstart_settings; // M711 + #endif + + // + // Auto Fans + // + #if ENABLED(AUTO_FAN_EDITABLE) + autofans_settings_t autofans_settings; // M712 + #endif // // Power-Loss Recovery @@ -1436,17 +1454,39 @@ void MarlinSettings::postprocess() { // // Controller Fan // - //#if ENABLED(USE_CONTROLLER_FAN) + #if ENABLED(USE_CONTROLLER_FAN) { _FIELD_TEST(controllerFan_settings); - #if ENABLED(USE_CONTROLLER_FAN) + #if ENABLED(CONTROLLER_FAN_EDITABLE) const controllerFan_settings_t &cfs = controllerFan.settings; #else constexpr controllerFan_settings_t cfs = controllerFan_defaults; #endif EEPROM_WRITE(cfs); } - //#endif + #endif + + // + // Fan Kickstart + // + #if ENABLED(FAN_KICKSTART_EDITABLE) + { + _FIELD_TEST(kickstart_settings); + const kickstart_settings_t &fks = kickstart.settings; + EEPROM_WRITE(fks); + } + #endif + + // + // Auto Fans + // + #if ENABLED(AUTO_FAN_EDITABLE) + { + _FIELD_TEST(autofans_settings); + const autofans_settings_t &afs = autofans.settings; + EEPROM_WRITE(afs); + } + #endif // // Power-Loss Recovery @@ -2582,14 +2622,38 @@ void MarlinSettings::postprocess() { // // Controller Fan // - //#if ENABLED(USE_CONTROLLER_FAN) + #if ENABLED(USE_CONTROLLER_FAN) { controllerFan_settings_t cfs = { 0 }; _FIELD_TEST(controllerFan_settings); EEPROM_READ(cfs); TERN_(CONTROLLER_FAN_EDITABLE, if (!validating) controllerFan.settings = cfs); } - //#endif + #endif + + // + // Fan Kickstart + // + #if ENABLED(FAN_KICKSTART_EDITABLE) + { + kickstart_settings_t fks = { 0 }; + _FIELD_TEST(kickstart_settings); + EEPROM_READ(fks); + if (!validating) kickstart.settings = fks; + } + #endif + + // + // Auto Fans + // + #if ENABLED(AUTO_FAN_EDITABLE) + { + autofans_settings_t afs = { 0 }; + _FIELD_TEST(autofans_settings); + EEPROM_READ(afs); + if (!validating) autofans.settings = afs; + } + #endif // // Power-Loss Recovery @@ -3806,6 +3870,16 @@ void MarlinSettings::reset() { // TERN_(USE_CONTROLLER_FAN, controllerFan.reset()); + // + // Fan Kickstart + // + TERN_(FAN_KICKSTART_EDITABLE, kickstart.reset()); + + // + // Auto Fans + // + TERN_(AUTO_FAN_EDITABLE, autofans.reset()); + // // Power-Loss Recovery // @@ -4285,6 +4359,16 @@ void MarlinSettings::reset() { // TERN_(CONTROLLER_FAN_EDITABLE, gcode.M710_report(forReplay)); + // + // M711 Fan Kickstart + // + TERN_(FAN_KICKSTART_EDITABLE, gcode.M711_report(forReplay)); + + // + // M712 Auto Fans + // + TERN_(AUTO_FAN_EDITABLE, gcode.M712_report(forReplay)); + // // M413 Power-Loss Recovery // diff --git a/buildroot/tests/GD32F103RC_voxelab_maple b/buildroot/tests/GD32F103RC_voxelab_maple index 0054bbd649..c5d583aa05 100755 --- a/buildroot/tests/GD32F103RC_voxelab_maple +++ b/buildroot/tests/GD32F103RC_voxelab_maple @@ -43,3 +43,11 @@ use_example_configs "Voxelab Aquila/X3" # opt_enable # opt_add exec_test $1 $2 "Aquila GD32 - ProUI X3" "$3" + +use_example_configs "Voxelab Aquila/UBL" +opt_set CONTROLLERFAN_SPEED_MIN 40 CONTROLLERFAN_SPEED_MAX 127 \ + E0_AUTO_FAN_PIN UART5_TX_PIN CONTROLLER_FAN_PIN UART5_RX_PIN +# opt_disable +opt_enable USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE +opt_add FAN_KICKSTART_EDITABLE FAN_KICKSTART_MENU AUTO_FAN_EDITABLE AUTO_FAN_MENU +exec_test $1 $2 "Aquila GD32 - ProUI Unified (UBL) Adv Misc Fans" "$3" diff --git a/ini/features.ini b/ini/features.ini index 50a84c9d1c..d43ee579ab 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -315,8 +315,9 @@ FTM_SMOOTHING = build_src_filter=+ FTM_POLYS = build_src_filter=+ HAS_LIN_ADVANCE_K = build_src_filter=+ -PHOTO_GCODE = build_src_filter=+ -CONTROLLER_FAN_EDITABLE = build_src_filter=+ +CONTROLLER_FAN_EDITABLE = build_src_filter=+ +FAN_KICKSTART_EDITABLE = build_src_filter=+ + +AUTO_FAN_EDITABLE = build_src_filter=+ + HAS_ZV_SHAPING = build_src_filter=+ GCODE_MACROS = build_src_filter=+ GRADIENT_MIX = build_src_filter=+