From 45cb6024b10fc8b0fea1a719ac509eefacf689d4 Mon Sep 17 00:00:00 2001 From: vovodroid Date: Tue, 1 Apr 2025 17:04:19 +0300 Subject: [PATCH 1/3] Max fan menu --- Marlin/src/gcode/temp/M106_M107.cpp | 6 ++++++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_temperature.cpp | 1 + Marlin/src/lcd/menu/menu_tune.cpp | 1 + Marlin/src/module/temperature.cpp | 1 + Marlin/src/module/temperature.h | 1 + 6 files changed, 11 insertions(+) diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index afa2ebfc5669..3db6c0168936 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -44,6 +44,10 @@ #define _CNT_P FAN_COUNT #endif +#ifndef min + #define min std::min +#endif + /** * M106: Set Fan Speed * @@ -83,6 +87,8 @@ void GcodeSuite::M106() { if (!got_preset && parser.seenval('S')) speed = parser.value_ushort(); + speed = min(speed, (uint16_t) thermalManager.max_fan_speed); + TERN_(FOAMCUTTER_XYUV, speed *= 2.55f); // Get command in % of max heat // Set speed, with constraint diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 7ea17d5bb3e0..7f525309f3c8 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -380,6 +380,7 @@ namespace LanguageNarrow_en { LSTR MSG_CUTTER = _UxGT("Cutter"); LSTR MSG_LASER = _UxGT("Laser"); LSTR MSG_FAN_SPEED = _UxGT("Fan Speed"); + LSTR MSG_MAX_FAN_SPEED = _UxGT("Max Fan Speed"); LSTR MSG_FAN_SPEED_N = _UxGT("Fan Speed ~"); LSTR MSG_STORED_FAN_N = _UxGT("Stored Fan ~"); LSTR MSG_EXTRA_FAN_SPEED = _UxGT("Extra Fan Speed"); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index b43f906cc7e3..b19524a9e19f 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -241,6 +241,7 @@ void menu_temperature() { singlenozzle_item(7); #endif + EDIT_ITEM_FAST(percent, MSG_MAX_FAN_SPEED, &Temperature::max_fan_speed, 0, 255); #endif // HAS_FAN #if HAS_PREHEAT diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 51d877fc5cc5..35d2ac407df4 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -189,6 +189,7 @@ void menu_tune() { singlenozzle_item(7); #endif + EDIT_ITEM_FAST(percent, MSG_MAX_FAN_SPEED, &Temperature::max_fan_speed, 0, 255); #endif // HAS_FAN // diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 0ef0a2f961fb..4c145c3b34c6 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -432,6 +432,7 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); #if HAS_FAN uint8_t Temperature::fan_speed[FAN_COUNT] = ARRAY_N_1(FAN_COUNT, FAN_OFF_PWM); + uint8_t Temperature::max_fan_speed = 255; #if ENABLED(EXTRA_FAN_SPEED) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 77c16bba0a28..3dbe354ffb63 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -879,6 +879,7 @@ class Temperature { static uint8_t fan_speed[FAN_COUNT]; #define FANS_LOOP(I) for (uint8_t I = 0; I < FAN_COUNT; ++I) + static uint8_t max_fan_speed; static void set_fan_speed(const uint8_t fan, const uint16_t speed); From a744e9b993f4d19a42238823dedc2b23cbe66ef5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 29 Apr 2025 15:16:40 -0500 Subject: [PATCH 2/3] New features are optional --- Marlin/Configuration.h | 2 ++ Marlin/src/gcode/temp/M106_M107.cpp | 19 +++++++++++++------ Marlin/src/lcd/menu/menu_temperature.cpp | 4 +++- Marlin/src/lcd/menu/menu_tune.cpp | 4 +++- Marlin/src/module/temperature.cpp | 7 ++++++- Marlin/src/module/temperature.h | 10 +++++++++- 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 91a3b342b6de..260c30a575ea 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -3556,6 +3556,8 @@ // Set number of user-controlled fans. Disable to use all board-defined fans. // :[1,2,3,4,5,6,7,8] //#define NUM_M106_FANS 1 +//#define MAX_FAN_SPEED 255 // (0..255) Set a Maximum Fan Speed for 'M106 S' +//#define EDITABLE_MAX_FAN_SPEED // Add 'M106 F' and menu item to modify Maximum Fan Speed /** * Use software PWM to drive the fan, as for the heaters. This uses a very low frequency diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index 3db6c0168936..fa131745c028 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -44,10 +44,6 @@ #define _CNT_P FAN_COUNT #endif -#ifndef min - #define min std::min -#endif - /** * M106: Set Fan Speed * @@ -55,6 +51,9 @@ * S Speed between 0-255 * P Fan index, if more than one fan * + * With EDITABLE_MAX_FAN_SPEED enabled: + * F Max fan speed (128-255) + * * With EXTRA_FAN_SPEED enabled: * * T Restore/Use/Set Temporary Speed: @@ -67,6 +66,11 @@ void GcodeSuite::M106() { if (pfan >= _CNT_P) return; if (FAN_IS_REDUNDANT(pfan)) return; + #if ENABLED(EDITABLE_MAX_FAN_SPEED) + if (parser.seenval('F')) + thermalManager.max_fan_speed = _MAX(parser.value_byte(), 128); + #endif + #if ENABLED(EXTRA_FAN_SPEED) const uint16_t t = parser.intval('T'); if (t > 0) return thermalManager.set_temp_fan_speed(pfan, t); @@ -89,9 +93,12 @@ void GcodeSuite::M106() { speed = min(speed, (uint16_t) thermalManager.max_fan_speed); - TERN_(FOAMCUTTER_XYUV, speed *= 2.55f); // Get command in % of max heat + #if ENABLED(EDITABLE_MAX_FAN_SPEED) || MAX_FAN_SPEED < 255 + // Set speed, with constraint < max_fan_speed + NOMORE(speed, thermalManager.max_fan_speed); + #endif - // Set speed, with constraint + // Set speed, with constraint <= 255 thermalManager.set_fan_speed(pfan, speed); TERN_(LASER_SYNCHRONOUS_M106_M107, planner.buffer_sync_block(BLOCK_BIT_SYNC_FANS)); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index b19524a9e19f..6a5e067de037 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -241,7 +241,9 @@ void menu_temperature() { singlenozzle_item(7); #endif - EDIT_ITEM_FAST(percent, MSG_MAX_FAN_SPEED, &Temperature::max_fan_speed, 0, 255); + #if ENABLED(EDITABLE_MAX_FAN_SPEED) + EDIT_ITEM_FAST(percent, MSG_MAX_FAN_SPEED, &thermalManager.max_fan_speed, 0, 255); + #endif #endif // HAS_FAN #if HAS_PREHEAT diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 35d2ac407df4..e3e7dfca9090 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -189,7 +189,9 @@ void menu_tune() { singlenozzle_item(7); #endif - EDIT_ITEM_FAST(percent, MSG_MAX_FAN_SPEED, &Temperature::max_fan_speed, 0, 255); + #if ENABLED(EDITABLE_MAX_FAN_SPEED) + EDIT_ITEM_FAST(percent, MSG_MAX_FAN_SPEED, &thermalManager.max_fan_speed, 0, 255); + #endif #endif // HAS_FAN // diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 4c145c3b34c6..140d772e334a 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -431,8 +431,13 @@ PGMSTR(str_t_heating_failed, STR_T_HEATING_FAILED); // HAS_FAN does not include CONTROLLER_FAN #if HAS_FAN + #if ENABLED(EDITABLE_MAX_FAN_SPEED) + uint8_t Temperature::max_fan_speed = MAX_FAN_SPEED; + #else + constexpr uint8_t Temperature::max_fan_speed; + #endif + uint8_t Temperature::fan_speed[FAN_COUNT] = ARRAY_N_1(FAN_COUNT, FAN_OFF_PWM); - uint8_t Temperature::max_fan_speed = 255; #if ENABLED(EXTRA_FAN_SPEED) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 3dbe354ffb63..06825f16734a 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -877,9 +877,17 @@ class Temperature { #if HAS_FAN + #ifndef MAX_FAN_SPEED + #define MAX_FAN_SPEED 255 + #endif + #if ENABLED(EDITABLE_MAX_FAN_SPEED) + static uint8_t max_fan_speed; + #else + static constexpr uint8_t max_fan_speed = MAX_FAN_SPEED; + #endif + static uint8_t fan_speed[FAN_COUNT]; #define FANS_LOOP(I) for (uint8_t I = 0; I < FAN_COUNT; ++I) - static uint8_t max_fan_speed; static void set_fan_speed(const uint8_t fan, const uint16_t speed); From be54a68aee75da8048d6c0c5346836bc234d47dc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 29 Apr 2025 15:17:14 -0500 Subject: [PATCH 3/3] other tweaks --- Marlin/src/gcode/temp/M106_M107.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index fa131745c028..a9e632cfe8fa 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -76,7 +76,7 @@ void GcodeSuite::M106() { if (t > 0) return thermalManager.set_temp_fan_speed(pfan, t); #endif - const uint16_t dspeed = parser.seen_test('A') ? thermalManager.fan_speed[active_extruder] : 255; + const uint16_t dspeed = parser.seen_test('A') ? thermalManager.fan_speed[active_extruder] : 255U; uint16_t speed = dspeed; @@ -91,7 +91,7 @@ void GcodeSuite::M106() { if (!got_preset && parser.seenval('S')) speed = parser.value_ushort(); - speed = min(speed, (uint16_t) thermalManager.max_fan_speed); + TERN_(FOAMCUTTER_XYUV, speed = (speed * 255U) / 100U); // Get command in % of max heat #if ENABLED(EDITABLE_MAX_FAN_SPEED) || MAX_FAN_SPEED < 255 // Set speed, with constraint < max_fan_speed