diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index 9a3f513ed2fae417221ec07c2642c96c3b25ba51..1c5108cc7fcec055cb4c50eb04fe28a2994280e6 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -4729,22 +4729,18 @@ void lcd_update() {
#endif
if ((lcdDrawUpdate || IS_DRAWING) && (!bbr2 || bbr2 > max_display_update_time)) {
- #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 (!IS_DRAWING) 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(ADC_KEYPAD)
buttons_reprapworld_keypad = 0;
@@ -4756,19 +4752,18 @@ void lcd_update() {
#define CURRENTSCREEN() lcd_status_screen()
#endif
- #if ENABLED(DOGLCD) // Changes due to different driver architecture of the DOGM display
- if (!drawing_screen) {
-#if defined(TARGET_LPC1768)
-digitalWrite(P1_4, !digitalRead(P1_4)); //re-arm (was 77 in the old system)
-#else
-digitalWrite(29, !digitalRead(29)); //2560
-#endif
- u8g.firstPage();
- drawing_screen = 1;
+ #if ENABLED(DOGLCD)
+ if (!drawing_screen) { // If not already drawing pages
+ u8g.firstPage(); // Start the first page
+ drawing_screen = 1; // Flag as drawing pages
}
- lcd_setFont(FONT_MENU);
- u8g.setColorIndex(1);
- CURRENTSCREEN();
+ lcd_setFont(FONT_MENU); // Setup font for every page draw
+ u8g.setColorIndex(1); // And reset the color
+ CURRENTSCREEN(); // Draw and process the current screen
+
+ // The screen handler can clear drawing_screen for an action that changes the screen.
+ // If still drawing and there's another page, update max-time and return now.
+ // The nextPage will already be set up on the next call.
if (drawing_screen && (drawing_screen = u8g.nextPage())) {
NOLESS(max_display_update_time, millis() - ms);
return;
@@ -4776,6 +4771,9 @@ digitalWrite(29, !digitalRead(29)); //2560
#else
CURRENTSCREEN();
#endif
+
+ // Keeping track of the longest time for an individual LCD update.
+ // Used to do screen throttling when the planner starts to fill up.
NOLESS(max_display_update_time, millis() - ms);
}
@@ -4789,23 +4787,19 @@ digitalWrite(29, !digitalRead(29)); //2560
#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
- }
+ if (!IS_DRAWING) 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)
}