From d0e24e0876c845c764e921287afce521966ce6f0 Mon Sep 17 00:00:00 2001 From: AnHardt Date: Mon, 12 Dec 2016 14:35:02 +0100 Subject: [PATCH] Adaptive screen updates for all kinds of displays The target here is to update the screens of graphical and char base displays as fast as possible, without draining the planner buffer too much. For that measure the time it takes to draw and transfer one (partial) screen to the display. Build a max. value from that. Because ther can be large differences, depending on how much the display updates are interrupted, the max value is decreased by one ms/s. This way it can shrink again. On the other side we keep track on how much time it takes to empty the planner buffer. Now we draw the next (partial) display update only then, when we do not drain the planner buffer to much. We draw only when the time in the buffer is two times larger than a update takes, or the buffer is empty anyway. When we have begun to draw a screen we do not wait until the next 100ms time slot comes. We draw the next partial screen as fast as possible, but give the system a chance to refill the buffers a bit. When we see, during drawing a screen, the screen contend has changed, we stop the current draw and begin to draw the new content from the top. --- Marlin/Configuration_adv.h | 30 ---- Marlin/Marlin_main.cpp | 4 +- .../Cartesio/Configuration_adv.h | 30 ---- .../Felix/Configuration_adv.h | 30 ---- .../Hephestos/Configuration_adv.h | 30 ---- .../Hephestos_2/Configuration_adv.h | 30 ---- .../K8200/Configuration_adv.h | 30 ---- .../K8400/Configuration_adv.h | 30 ---- .../RigidBot/Configuration_adv.h | 30 ---- .../SCARA/Configuration_adv.h | 30 ---- .../TAZ4/Configuration_adv.h | 30 ---- .../WITBOX/Configuration_adv.h | 30 ---- .../delta/biv2.5/Configuration_adv.h | 30 ---- .../delta/generic/Configuration_adv.h | 30 ---- .../delta/kossel_mini/Configuration_adv.h | 30 ---- .../delta/kossel_pro/Configuration_adv.h | 30 ---- .../delta/kossel_xl/Configuration_adv.h | 30 ---- .../makibox/Configuration_adv.h | 30 ---- .../tvrrug/Round2/Configuration_adv.h | 30 ---- Marlin/planner.cpp | 19 +-- Marlin/planner.h | 22 +-- Marlin/stepper.cpp | 6 +- Marlin/ultralcd.cpp | 151 +++++++++--------- 23 files changed, 98 insertions(+), 644 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 41fd8b4c5fde..a904c2559e9a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 8736051c82b4..eaadb4debddb 100755 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -760,8 +760,8 @@ inline void sync_plan_position_e() { planner.set_e_position_mm(current_position[ int freeMemory() { return SdFatUtil::FreeRam(); } #else extern "C" { - extern unsigned int __bss_end; - extern unsigned int __heap_start; + extern char __bss_end; + extern char __heap_start; extern void* __brkval; int freeMemory() { diff --git a/Marlin/example_configurations/Cartesio/Configuration_adv.h b/Marlin/example_configurations/Cartesio/Configuration_adv.h index 6ca71feafad9..31799acd9ffc 100644 --- a/Marlin/example_configurations/Cartesio/Configuration_adv.h +++ b/Marlin/example_configurations/Cartesio/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/Felix/Configuration_adv.h b/Marlin/example_configurations/Felix/Configuration_adv.h index da00af9d19cb..e5abb7f6ed95 100644 --- a/Marlin/example_configurations/Felix/Configuration_adv.h +++ b/Marlin/example_configurations/Felix/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/Hephestos/Configuration_adv.h b/Marlin/example_configurations/Hephestos/Configuration_adv.h index c70126d8e07e..4a9e0db475cc 100644 --- a/Marlin/example_configurations/Hephestos/Configuration_adv.h +++ b/Marlin/example_configurations/Hephestos/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/Hephestos_2/Configuration_adv.h b/Marlin/example_configurations/Hephestos_2/Configuration_adv.h index 6f7c8359a29e..a7fab871b996 100644 --- a/Marlin/example_configurations/Hephestos_2/Configuration_adv.h +++ b/Marlin/example_configurations/Hephestos_2/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/K8200/Configuration_adv.h b/Marlin/example_configurations/K8200/Configuration_adv.h index 6bb601c37ecf..a19b75d0566f 100644 --- a/Marlin/example_configurations/K8200/Configuration_adv.h +++ b/Marlin/example_configurations/K8200/Configuration_adv.h @@ -520,36 +520,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/K8400/Configuration_adv.h b/Marlin/example_configurations/K8400/Configuration_adv.h index 5a35ec0033b1..ed384c76eb22 100644 --- a/Marlin/example_configurations/K8400/Configuration_adv.h +++ b/Marlin/example_configurations/K8400/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/RigidBot/Configuration_adv.h b/Marlin/example_configurations/RigidBot/Configuration_adv.h index 1d28e9c60ff0..489d9fc2d7a2 100644 --- a/Marlin/example_configurations/RigidBot/Configuration_adv.h +++ b/Marlin/example_configurations/RigidBot/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/SCARA/Configuration_adv.h b/Marlin/example_configurations/SCARA/Configuration_adv.h index 842a7ef59822..91435c38ce1d 100644 --- a/Marlin/example_configurations/SCARA/Configuration_adv.h +++ b/Marlin/example_configurations/SCARA/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/TAZ4/Configuration_adv.h b/Marlin/example_configurations/TAZ4/Configuration_adv.h index a9d1b60c09fb..2c46807ca0cb 100644 --- a/Marlin/example_configurations/TAZ4/Configuration_adv.h +++ b/Marlin/example_configurations/TAZ4/Configuration_adv.h @@ -515,36 +515,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/WITBOX/Configuration_adv.h b/Marlin/example_configurations/WITBOX/Configuration_adv.h index c70126d8e07e..4a9e0db475cc 100644 --- a/Marlin/example_configurations/WITBOX/Configuration_adv.h +++ b/Marlin/example_configurations/WITBOX/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h b/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h index f203817fb0eb..942f4568ea9f 100644 --- a/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h +++ b/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h @@ -509,36 +509,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/delta/generic/Configuration_adv.h b/Marlin/example_configurations/delta/generic/Configuration_adv.h index 447fe136a289..ef369367ca16 100644 --- a/Marlin/example_configurations/delta/generic/Configuration_adv.h +++ b/Marlin/example_configurations/delta/generic/Configuration_adv.h @@ -509,36 +509,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h index 447fe136a289..ef369367ca16 100644 --- a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h +++ b/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h @@ -509,36 +509,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h index 908d04885e5f..ca1f306e4968 100644 --- a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h +++ b/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h @@ -514,36 +514,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h index a501e1273e3b..54ca6a3cea25 100644 --- a/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h +++ b/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h @@ -509,36 +509,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/makibox/Configuration_adv.h b/Marlin/example_configurations/makibox/Configuration_adv.h index ec97b4a40930..22b2209812f9 100644 --- a/Marlin/example_configurations/makibox/Configuration_adv.h +++ b/Marlin/example_configurations/makibox/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h b/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h index 841ff0c26893..e7f99b5a7f2b 100644 --- a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h +++ b/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h @@ -507,36 +507,6 @@ #define BABYSTEP_MULTIPLICATOR 1 //faster movements #endif -// -// Ensure Smooth Moves -// -// Enable this option to prevent the machine from stuttering when printing multiple short segments. -// This feature uses two strategies to eliminate stuttering: -// -// 1. During short segments a Graphical LCD update may take so much time that the planner buffer gets -// completely drained. When this happens pauses are introduced between short segments, and print moves -// will become jerky until a longer segment provides enough time for the buffer to be filled again. -// This jerkiness negatively affects print quality. The ENSURE_SMOOTH_MOVES option addresses the issue -// by pausing the LCD until there's enough time to safely update. -// -// NOTE: This will cause the Info Screen to lag and controller buttons may become unresponsive. -// Enable ALWAYS_ALLOW_MENU to keep the controller responsive. -// -// 2. No block is allowed to take less time than MIN_BLOCK_TIME. That's the time it takes in the main -// loop to add a new block to the buffer, check temperatures, etc., including all blocked time due to -// interrupts (without LCD update). By enforcing a minimum time-per-move, the buffer is prevented from -// draining. -// -//#define ENSURE_SMOOTH_MOVES -#if ENABLED(ENSURE_SMOOTH_MOVES) - //#define ALWAYS_ALLOW_MENU // If enabled, the menu will always be responsive. - // WARNING: Menu navigation during short moves may cause stuttering! - #define LCD_UPDATE_THRESHOLD 135 // (ms) Minimum duration for the current segment to allow an LCD update. - // Default value is good for graphical LCDs (e.g., REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER). - // You may try to lower this value until you printer starts stuttering again as if ENSURE_SMOOTH_MOVES is disabled. - #define MIN_BLOCK_TIME 6 // (ms) Minimum duration of a single block. You shouldn't need to modify this. -#endif - // @section extruder // extruder advance constant (s2/mm3) diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index e810113b59a9..9f3a45772c31 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -145,7 +145,7 @@ float Planner::previous_speed[NUM_AXIS], Planner::position_float[NUM_AXIS] = { 0 }; #endif -#if ENABLED(ENSURE_SMOOTH_MOVES) +#if ENABLED(ULTRA_LCD) volatile uint32_t Planner::block_buffer_runtime_us = 0; #endif @@ -985,30 +985,21 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const const uint8_t moves_queued = movesplanned(); // Slow down when the buffer starts to empty, rather than wait at the corner for a buffer refill + unsigned long segment_time = lround(1000000.0 / inverse_mm_s); #if ENABLED(SLOWDOWN) // Segment time im micro seconds - unsigned long segment_time = lround(1000000.0 / inverse_mm_s); if (moves_queued > 1 && moves_queued < (BLOCK_BUFFER_SIZE) / 2) { if (segment_time < min_segment_time) { // buffer is draining, add extra time. The amount of time added increases if the buffer is still emptied more. inverse_mm_s = 1000000.0 / (segment_time + lround(2 * (min_segment_time - segment_time) / moves_queued)); - #if defined(XY_FREQUENCY_LIMIT) || ENABLED(ENSURE_SMOOTH_MOVES) + #if defined(XY_FREQUENCY_LIMIT) || ENABLED(ULTRA_LCD) segment_time = lround(1000000.0 / inverse_mm_s); #endif } } #endif - - #if ENABLED(ENSURE_SMOOTH_MOVES) - #if DISABLED(SLOWDOWN) - unsigned long segment_time = lround(1000000.0 / inverse_mm_s); - #endif - if (segment_time < (MIN_BLOCK_TIME) * 1000UL) { - // buffer will be draining, set to MIN_BLOCK_TIME. - inverse_mm_s = 1000000.0 / (1000.0 * (MIN_BLOCK_TIME)); - segment_time = (MIN_BLOCK_TIME) * 1000UL; - } - block->segment_time = segment_time; + + #if ENABLED(ULTRA_LCD) CRITICAL_SECTION_START block_buffer_runtime_us += segment_time; CRITICAL_SECTION_END diff --git a/Marlin/planner.h b/Marlin/planner.h index b0b58d821f6b..d9b87afc6348 100644 --- a/Marlin/planner.h +++ b/Marlin/planner.h @@ -124,9 +124,7 @@ typedef struct { uint32_t valve_pressure, e_to_p_pressure; #endif - #if ENABLED(ENSURE_SMOOTH_MOVES) - uint32_t segment_time; - #endif + uint32_t segment_time; } block_t; @@ -214,7 +212,7 @@ class Planner { static float extruder_advance_k; #endif - #if ENABLED(ENSURE_SMOOTH_MOVES) + #if ENABLED(ULTRA_LCD) volatile static uint32_t block_buffer_runtime_us; //Theoretical block buffer runtime in µs #endif @@ -381,33 +379,35 @@ class Planner { static block_t* get_current_block() { if (blocks_queued()) { block_t* block = &block_buffer[block_buffer_tail]; - #if ENABLED(ENSURE_SMOOTH_MOVES) + #if ENABLED(ULTRA_LCD) block_buffer_runtime_us -= block->segment_time; //We can't be sure how long an active block will take, so don't count it. #endif SBI(block->flag, BLOCK_BIT_BUSY); return block; } else { - #if ENABLED(ENSURE_SMOOTH_MOVES) + #if ENABLED(ULTRA_LCD) clear_block_buffer_runtime(); // paranoia. Buffer is empty now - so reset accumulated time to zero. #endif return NULL; } } - #if ENABLED(ENSURE_SMOOTH_MOVES) - static bool long_move() { + #if ENABLED(ULTRA_LCD) + + static millis_t block_buffer_runtime() { CRITICAL_SECTION_START - uint32_t bbru = block_buffer_runtime_us; + millis_t bbru = block_buffer_runtime_us; CRITICAL_SECTION_END - return !bbru || bbru > (LCD_UPDATE_THRESHOLD) * 1000UL + (MIN_BLOCK_TIME) * 3000UL; + return bbru; } - + static void clear_block_buffer_runtime(){ CRITICAL_SECTION_START block_buffer_runtime_us = 0; CRITICAL_SECTION_END } + #endif #if ENABLED(AUTOTEMP) diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index 82289a5d6c48..b0a7e2250b3a 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -1098,13 +1098,13 @@ void Stepper::finish_and_disable() { void Stepper::quick_stop() { cleaning_buffer_counter = 5000; - #if ENABLED(ENSURE_SMOOTH_MOVES) - planner.clear_block_buffer_runtime(); - #endif DISABLE_STEPPER_DRIVER_INTERRUPT(); while (planner.blocks_queued()) planner.discard_current_block(); current_block = NULL; ENABLE_STEPPER_DRIVER_INTERRUPT(); + #if ENABLED(ULTRA_LCD) + planner.clear_block_buffer_runtime(); + #endif } void Stepper::endstop_triggered(AxisEnum axis) { diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index c762ea898efa..11d63728e720 100755 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -64,6 +64,8 @@ void lcd_status_screen(); millis_t next_lcd_update_ms; uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW; // Set when the LCD needs to draw, decrements after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial) +millis_t max_display_update_time = 0; + #if ENABLED(DOGLCD) bool drawing_screen = false; #endif @@ -2893,7 +2895,11 @@ void lcd_update() { #endif //SDSUPPORT && SD_DETECT_PIN millis_t ms = millis(); - if (ELAPSED(ms, next_lcd_update_ms)) { + if (ELAPSED(ms, next_lcd_update_ms) + #if ENABLED(DOGLCD) + || drawing_screen + #endif + ) { next_lcd_update_ms = ms + LCD_UPDATE_INTERVAL; @@ -2954,101 +2960,98 @@ void lcd_update() { } #endif // ULTIPANEL - #if ENABLED(ENSURE_SMOOTH_MOVES) && ENABLED(ALWAYS_ALLOW_MENU) - #define STATUS_UPDATE_CONDITION planner.long_move() - #else - #define STATUS_UPDATE_CONDITION true - #endif - #if ENABLED(ENSURE_SMOOTH_MOVES) && DISABLED(ALWAYS_ALLOW_MENU) - #define LCD_HANDLER_CONDITION planner.long_move() - #else - #define LCD_HANDLER_CONDITION true - #endif - // We arrive here every ~100ms when idling often enough. // Instead of tracking the changes simply redraw the Info Screen ~1 time a second. static int8_t lcd_status_update_delay = 1; // first update one loop delayed - if (STATUS_UPDATE_CONDITION && + if ( #if ENABLED(ULTIPANEL) currentScreen == lcd_status_screen && #endif - !lcd_status_update_delay-- + !lcd_status_update_delay-- ) { - lcd_status_update_delay = 9; - lcdDrawUpdate = LCDVIEW_REDRAW_NOW; - } - - if (LCD_HANDLER_CONDITION) { - + lcd_status_update_delay = 9 #if ENABLED(DOGLCD) - if (lcdDrawUpdate || drawing_screen) - #else - if (lcdDrawUpdate) + + 3 #endif - { - #if ENABLED(DOGLCD) - if (!drawing_screen) - #endif - { - switch (lcdDrawUpdate) { - case LCDVIEW_CALL_NO_REDRAW: - lcdDrawUpdate = LCDVIEW_NONE; - break; - case LCDVIEW_CLEAR_CALL_REDRAW: // set by handlers, then altered after (rarely occurs here) - case LCDVIEW_CALL_REDRAW_NEXT: // set by handlers, then altered after (never occurs here?) - lcdDrawUpdate = LCDVIEW_REDRAW_NOW; - case LCDVIEW_REDRAW_NOW: // set above, or by a handler through LCDVIEW_CALL_REDRAW_NEXT - case LCDVIEW_NONE: - break; - } // switch - } - #if ENABLED(ULTIPANEL) - #define CURRENTSCREEN() (*currentScreen)(), lcd_clicked = false - #else - #define CURRENTSCREEN() lcd_status_screen() - #endif - - #if ENABLED(DOGLCD) // Changes due to different driver architecture of the DOGM display - if (!drawing_screen) { - u8g.firstPage(); - drawing_screen = 1; - } - lcd_setFont(FONT_MENU); - CURRENTSCREEN(); - if (drawing_screen && (drawing_screen = u8g.nextPage())) return; - #else - CURRENTSCREEN(); - #endif - } - - #if ENABLED(ULTIPANEL) - - // Return to Status Screen after a timeout - if (currentScreen == lcd_status_screen || defer_return_to_status) - return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; - else if (ELAPSED(ms, return_to_status_ms)) - lcd_return_to_status(); + ; + max_display_update_time--; + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + } - #endif // ULTIPANEL + millis_t bbr = planner.block_buffer_runtime(); + #if ENABLED(DOGLCD) + if ((lcdDrawUpdate || drawing_screen) && (!bbr || (bbr > max_display_update_time * 2000))) + #else + if (lcdDrawUpdate && (!bbr || (bbr > max_display_update_time * 2000))) + #endif + { #if ENABLED(DOGLCD) if (!drawing_screen) #endif { switch (lcdDrawUpdate) { - case LCDVIEW_CLEAR_CALL_REDRAW: - lcd_implementation_clear(); - case LCDVIEW_CALL_REDRAW_NEXT: - lcdDrawUpdate = LCDVIEW_REDRAW_NOW; - break; - case LCDVIEW_REDRAW_NOW: + case LCDVIEW_CALL_NO_REDRAW: lcdDrawUpdate = LCDVIEW_NONE; break; + case LCDVIEW_CLEAR_CALL_REDRAW: // set by handlers, then altered after (rarely occurs here) + case LCDVIEW_CALL_REDRAW_NEXT: // set by handlers, then altered after (never occurs here?) + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + case LCDVIEW_REDRAW_NOW: // set above, or by a handler through LCDVIEW_CALL_REDRAW_NEXT case LCDVIEW_NONE: break; } // switch } - } // LCD_HANDLER_CONDITION + #if ENABLED(ULTIPANEL) + #define CURRENTSCREEN() (*currentScreen)(), lcd_clicked = false + #else + #define CURRENTSCREEN() lcd_status_screen() + #endif + + #if ENABLED(DOGLCD) // Changes due to different driver architecture of the DOGM display + if (!drawing_screen) { + u8g.firstPage(); + drawing_screen = 1; + } + lcd_setFont(FONT_MENU); + CURRENTSCREEN(); + if (drawing_screen && (drawing_screen = u8g.nextPage())) { + max_display_update_time = max(max_display_update_time, millis() - ms); + return; + } + #else + CURRENTSCREEN(); + #endif + max_display_update_time = max(max_display_update_time, millis() - ms); + } + + #if ENABLED(ULTIPANEL) + + // Return to Status Screen after a timeout + if (currentScreen == lcd_status_screen || defer_return_to_status) + return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; + else if (ELAPSED(ms, return_to_status_ms)) + lcd_return_to_status(); + + #endif // ULTIPANEL + + #if ENABLED(DOGLCD) + if (!drawing_screen) + #endif + { + switch (lcdDrawUpdate) { + case LCDVIEW_CLEAR_CALL_REDRAW: + lcd_implementation_clear(); + case LCDVIEW_CALL_REDRAW_NEXT: + lcdDrawUpdate = LCDVIEW_REDRAW_NOW; + break; + case LCDVIEW_REDRAW_NOW: + lcdDrawUpdate = LCDVIEW_NONE; + break; + case LCDVIEW_NONE: + break; + } // switch + } } // ELAPSED(ms, next_lcd_update_ms) }