From 7d751a20b1fc6ef920cbc56a68450302ac1eb973 Mon Sep 17 00:00:00 2001 From: German Borisov Date: Fri, 19 Jan 2024 22:17:36 +0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Status=20Screen=20flow=20adjustment?= =?UTF-8?q?=20(#26627)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 1 + Marlin/src/inc/Conditionals_LCD.h | 1 + Marlin/src/inc/SanityCheck.h | 4 ++++ Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 7 +++++- Marlin/src/lcd/marlinui.cpp | 28 ++++++++++++++++++++-- 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 1d7c1a7277..4a6882a209 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1474,6 +1474,7 @@ #if IS_ULTIPANEL #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen + //#define ULTIPANEL_FLOWPERCENT // Encoder sets the flow percentage on the Status Screen #endif #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 729f450147..8d468212ac 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -972,6 +972,7 @@ #define DETECT_I2C_LCD_DEVICE 1 #endif +// Encoder behavior #ifndef STD_ENCODER_PULSES_PER_STEP #if ENABLED(TOUCH_SCREEN) #define STD_ENCODER_PULSES_PER_STEP 2 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b54010f4de..3ac16bd4ea 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -4147,6 +4147,10 @@ static_assert(WITHIN(MULTISTEPPING_LIMIT, 1, 128) && IS_POWER_OF_2(MULTISTEPPING #endif #endif +#if ALL(ULTIPANEL_FEEDMULTIPLY, ULTIPANEL_FLOWPERCENT) + #error "Only enable ULTIPANEL_FEEDMULTIPLY or ULTIPANEL_FLOWPERCENT, but not both." +#endif + // Misc. Cleanup #undef _TEST_PWM #undef _NUM_AXES_STR diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index e294d9c3df..636d10bbe9 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -888,7 +888,12 @@ void MarlinUI::draw_status_screen() { lcd_put_lchar(3, EXTRAS_2_BASELINE, LCD_STR_FEEDRATE[0]); set_font(FONT_STATUSMENU); - lcd_put_u8str(12, EXTRAS_2_BASELINE, i16tostr3rj(feedrate_percentage)); + + #if ENABLED(ULTIPANEL_FLOWPERCENT) + lcd_put_u8str(12, EXTRAS_2_BASELINE, i16tostr3rj(planner.flow_percentage[active_extruder])); + #else + lcd_put_u8str(12, EXTRAS_2_BASELINE, i16tostr3rj(feedrate_percentage)); + #endif lcd_put_u8str(F("%")); // diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index dfb2a8d47c..97f15076fd 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -700,7 +700,7 @@ void MarlinUI::init() { else new_frm = old_frm; } - else if ((old_frm < 100 && new_frm > 100) || (old_frm > 100 && new_frm < 100)) + else if ((old_frm < 100) == (new_frm > 100)) // Crossing 100? Stick at 100. new_frm = 100; LIMIT(new_frm, SPEED_EDIT_MIN, SPEED_EDIT_MAX); @@ -720,7 +720,31 @@ void MarlinUI::init() { #endif } - #endif // ULTIPANEL_FEEDMULTIPLY + #elif ENABLED(ULTIPANEL_FLOWPERCENT) + + const int16_t old_fp = planner.flow_percentage[active_extruder]; + int16_t new_fp = old_fp + int16_t(encoderPosition); + + // Dead zone at 100% flow percentage + if (old_fp == 100) { + if (int16_t(encoderPosition) > ENCODER_FEEDRATE_DEADZONE) + new_fp -= ENCODER_FEEDRATE_DEADZONE; + else if (int16_t(encoderPosition) < -(ENCODER_FEEDRATE_DEADZONE)) + new_fp += ENCODER_FEEDRATE_DEADZONE; + else + new_fp = old_fp; + } + else if ((old_fp < 100) == (new_fp > 100)) // Crossing 100? Stick at 100. + new_fp = 100; + + LIMIT(new_fp, FLOW_EDIT_MIN, FLOW_EDIT_MAX); + + if (old_fp != new_fp) { + planner.set_flow(active_extruder, new_fp); + encoderPosition = 0; + } + + #endif // ULTIPANEL_FLOWPERCENT draw_status_screen(); }