Skip to content

Commit 1f9fc66

Browse files
committed
🚸 MarlinUI:: clear_for_drawing
1 parent bf19951 commit 1f9fc66

21 files changed

+61
-24
lines changed

Marlin/src/inc/Conditionals_LCD.h

+3
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,9 @@
10991099
* - poweroff (for PSU_CONTROL and HAS_MARLINUI_MENU)
11001100
*
11011101
* ...and implements these MarlinUI methods:
1102+
* - init_lcd
1103+
* - clear_lcd
1104+
* - clear_for_drawing
11021105
* - zoffset_overlay (if BABYSTEP_GFX_OVERLAY or MESH_EDIT_GFX_OVERLAY are supported)
11031106
* - draw_kill_screen
11041107
* - kill_screen

Marlin/src/inc/Conditionals_post.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -557,8 +557,8 @@
557557
#endif
558558
#endif
559559

560-
#if HAS_SD_DETECT && NONE(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT, IS_DWIN_MARLINUI, EXTENSIBLE_UI, HAS_DWIN_E3V2, HAS_U8GLIB_I2C_OLED)
561-
#define REINIT_NOISY_SPI_LCD 1 // Have LCDs with shared SPI re-init on SD insertion
560+
#if HAS_SD_DETECT && NONE(HAS_GRAPHICAL_TFT, LCD_USE_DMA_FSMC, HAS_FSMC_GRAPHICAL_TFT, HAS_SPI_GRAPHICAL_TFT, IS_DWIN_MARLINUI, EXTENSIBLE_UI, HAS_DWIN_E3V2)
561+
#define REINIT_NOISY_LCD 1 // Have the LCD re-init on SD insertion
562562
#endif
563563

564564
#endif // HAS_MEDIA

Marlin/src/lcd/HD44780/marlinui_HD44780.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ bool MarlinUI::detected() {
467467
#endif
468468

469469
void MarlinUI::clear_lcd() { lcd.clear(); }
470+
void MarlinUI::clear_for_drawing() { clear_lcd(); }
470471

471472
#if ENABLED(SHOW_BOOTSCREEN)
472473

@@ -1515,7 +1516,7 @@ void MarlinUI::draw_status_screen() {
15151516
lower_right.column = 0;
15161517
lower_right.row = 0;
15171518

1518-
clear_lcd();
1519+
clear_for_drawing();
15191520

15201521
x_map_pixels = (HD44780_CHAR_WIDTH) * (MESH_MAP_COLS) - 2; // Minus 2 because we are drawing a box around the map
15211522
y_map_pixels = (HD44780_CHAR_HEIGHT) * (MESH_MAP_ROWS) - 2;

Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ void MarlinUI::clear_lcd() {
376376
lcd.clear_buffer();
377377
}
378378

379+
void MarlinUI::clear_for_drawing() { clear_lcd(); }
380+
379381
#if HAS_LCD_CONTRAST
380382
void MarlinUI::_set_contrast() { lcd.setContrast(contrast); }
381383
#endif

Marlin/src/lcd/dogm/marlinui_DOGM.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,19 @@ void MarlinUI::draw_kill_screen() {
374374
} while (u8g.nextPage());
375375
}
376376

377-
void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop
377+
// Erase the LCD contents by drawing an empty box.
378+
void MarlinUI::clear_lcd() {
379+
u8g.setColorIndex(0);
380+
u8g.firstPage();
381+
do {
382+
u8g.drawBox(0, 0, u8g.getWidth(), u8g.getHeight());
383+
} while (u8g.nextPage());
384+
}
385+
386+
// U8G displays are drawn over multiple loops so must do their own clearing.
387+
void MarlinUI::clear_for_drawing() {
388+
// Automatically cleared by Picture Loop
389+
}
378390

379391
#if HAS_DISPLAY_SLEEP
380392
void MarlinUI::sleep_display(const bool sleep/*=true*/) {

Marlin/src/lcd/e3v2/creality/dwin.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1816,6 +1816,8 @@ void hmiSDCardInit() { card.cdroot(); }
18161816
// Initialize or re-initialize the LCD
18171817
void MarlinUI::init_lcd() { dwinStartup(); }
18181818

1819+
void MarlinUI::clear_lcd() {}
1820+
18191821
void MarlinUI::update() {
18201822
eachMomentUpdate(); // Status update
18211823
hmiSDCardUpdate(); // SD card update

Marlin/src/lcd/e3v2/jyersui/dwin.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -5155,6 +5155,8 @@ void MarlinUI::init_lcd() {
51555155
jyersDWIN.redrawScreen();
51565156
}
51575157

5158+
void MarlinUI::clear_lcd() {}
5159+
51585160
#if ENABLED(ADVANCED_PAUSE_FEATURE)
51595161
void MarlinUI::pause_show_message(const PauseMessage message, const PauseMode mode/*=PAUSE_MODE_SAME*/, const uint8_t extruder/*=active_extruder*/) {
51605162
if (mode != PAUSE_MODE_SAME) pause_mode = mode;

Marlin/src/lcd/e3v2/marlinui/ui_common.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ void MarlinUI::clear_lcd() {
9090
did_first_redraw = false;
9191
}
9292

93+
void MarlinUI::clear_for_drawing() { clear_lcd(); }
94+
9395
#if ENABLED(SHOW_BOOTSCREEN)
9496

9597
void MarlinUI::show_bootscreen() {
@@ -111,7 +113,7 @@ void MarlinUI::clear_lcd() {
111113

112114
dwinDrawString(false, font10x20, COLOR_YELLOW, COLOR_BG_BLACK, INFO_CENTER - (dwin_string.length * 10) / 2, VERSION_Y, S(dwin_string.string()));
113115
TERN_(SHOW_CUSTOM_BOOTSCREEN, safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT));
114-
clear_lcd();
116+
clear_for_drawing();
115117

116118
dwinIconShow(BOOT_ICON, ICON_MarlinBoot, LOGO_CENTER - 266 / 2, 15);
117119
#if ENABLED(DWIN_MARLINUI_PORTRAIT)
@@ -132,7 +134,7 @@ void MarlinUI::clear_lcd() {
132134

133135
void MarlinUI::bootscreen_completion(const millis_t sofar) {
134136
if ((BOOTSCREEN_TIMEOUT) > sofar) safe_delay((BOOTSCREEN_TIMEOUT) - sofar);
135-
clear_lcd();
137+
clear_for_drawing();
136138
}
137139

138140
#endif

Marlin/src/lcd/e3v2/proui/dwin.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1913,6 +1913,8 @@ void MarlinUI::init_lcd() {
19131913
dwinJPGCacheTo1(Language_English);
19141914
}
19151915

1916+
void MarlinUI::clear_lcd() {}
1917+
19161918
void dwinInitScreen() {
19171919
dwinSetColorDefaults();
19181920
hmiInit(); // Draws boot screen

Marlin/src/lcd/e3v2/proui/proui_extui.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ namespace ExtUI {
195195
void onPIDTuning(const pidresult_t rst) {
196196
// Called for temperature PID tuning result
197197
switch (rst) {
198+
default: break;
198199
#if ENABLED(PIDTEMP)
199200
case PID_STARTED: dwinPIDTuning(PIDTEMP_START); break;
200201
#endif

Marlin/src/lcd/extui/ui_api.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,9 @@ namespace ExtUI {
12791279
#if DISABLED(HAS_DWIN_E3V2)
12801280
void MarlinUI::init_lcd() { ExtUI::onStartup(); }
12811281

1282+
void MarlinUI::clear_lcd() {}
1283+
void MarlinUI::clear_for_drawing() {}
1284+
12821285
void MarlinUI::update() { ExtUI::onIdle(); }
12831286

12841287
void MarlinUI::kill_screen(FSTR_P const error, FSTR_P const component) {

Marlin/src/lcd/marlinui.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ void MarlinUI::init() {
226226
#endif
227227

228228
init_lcd();
229+
clear_lcd();
229230

230231
#if BUTTON_EXISTS(EN1)
231232
SET_INPUT_PULLUP(BTN_EN1);
@@ -1204,7 +1205,7 @@ void MarlinUI::init() {
12041205
// Change state of drawing flag between screen updates
12051206
if (!drawing_screen) switch (lcdDrawUpdate) {
12061207
case LCDVIEW_CLEAR_CALL_REDRAW:
1207-
clear_lcd(); break;
1208+
clear_for_drawing(); break;
12081209
case LCDVIEW_REDRAW_NOW:
12091210
refresh(LCDVIEW_NONE);
12101211
case LCDVIEW_NONE:

Marlin/src/lcd/marlinui.h

+8-4
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,14 @@ class MarlinUI {
207207

208208
#if HAS_DISPLAY || HAS_DWIN_E3V2
209209
static void init_lcd();
210+
// Erase the LCD contents. Do the lowest-level thing required to clear the LCD.
211+
static void clear_lcd();
210212
#else
211213
static void init_lcd() {}
214+
static void clear_lcd() {}
212215
#endif
213216

214-
static void reinit_lcd() { TERN_(REINIT_NOISY_SPI_LCD, init_lcd()); }
217+
static void reinit_lcd() { TERN_(REINIT_NOISY_LCD, init_lcd()); }
215218

216219
#if HAS_WIRED_LCD
217220
static bool detected();
@@ -246,9 +249,6 @@ class MarlinUI {
246249
static void update_indicators();
247250
#endif
248251

249-
// LCD implementations
250-
static void clear_lcd();
251-
252252
#if ALL(HAS_MARLINUI_MENU, TOUCH_SCREEN_CALIBRATION)
253253
static void check_touch_calibration() {
254254
if (touch_calibration.need_calibration()) currentScreen = touch_calibration_screen;
@@ -520,6 +520,9 @@ class MarlinUI {
520520

521521
#if HAS_DISPLAY
522522

523+
// Clear the LCD before new drawing. Some LCDs do nothing because they redraw frequently.
524+
static void clear_for_drawing();
525+
523526
static void abort_print();
524527
static void pause_print();
525528
static void resume_print();
@@ -630,6 +633,7 @@ class MarlinUI {
630633

631634
#else // No LCD
632635

636+
static void clear_for_drawing() {}
633637
static void kill_screen(FSTR_P const, FSTR_P const) {}
634638

635639
#endif

Marlin/src/lcd/menu/menu.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ void MarlinUI::goto_screen(screenFunc_t screen, const uint16_t encoder/*=0*/, co
209209
TERN_(AUTO_BED_LEVELING_UBL, bedlevel.lcd_map_control = false);
210210
}
211211

212-
clear_lcd();
212+
clear_for_drawing();
213213

214214
// Re-initialize custom characters that may be re-used
215215
#if HAS_MARLINUI_HD44780

Marlin/src/lcd/menu/menu_ubl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ void _lcd_mesh_fine_tune(FSTR_P const fmsg) {
9696
// To capture encoder events UBL will also call ui.capture and ui.release.
9797
//
9898
void MarlinUI::ubl_mesh_edit_start(const_float_t initial) {
99-
TERN_(HAS_GRAPHICAL_TFT, clear_lcd());
99+
TERN_(HAS_GRAPHICAL_TFT, clear_for_drawing());
100100
mesh_edit_accumulator = initial;
101101
goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT_F(MSG_MESH_EDIT_Z)); });
102102
}

Marlin/src/lcd/tft/touch.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ void Touch::touch(touch_control_t *control) {
184184
case HEATER:
185185
int8_t heater;
186186
heater = control->data;
187-
ui.clear_lcd();
187+
ui.clear_for_drawing();
188188
#if HAS_HOTEND
189189
if (heater >= 0) { // HotEnd
190190
#if HOTENDS == 1
@@ -213,20 +213,20 @@ void Touch::touch(touch_control_t *control) {
213213

214214
break;
215215
case FAN:
216-
ui.clear_lcd();
216+
ui.clear_for_drawing();
217217
static uint8_t fan, fan_speed;
218218
fan = 0;
219219
fan_speed = thermalManager.fan_speed[fan];
220220
MenuItem_percent::action(GET_TEXT_F(MSG_FIRST_FAN_SPEED), &fan_speed, 0, 255, []{ thermalManager.set_fan_speed(fan, fan_speed); TERN_(LASER_SYNCHRONOUS_M106_M107, planner.buffer_sync_block(BLOCK_BIT_SYNC_FANS));});
221221
break;
222222
case FEEDRATE:
223-
ui.clear_lcd();
223+
ui.clear_for_drawing();
224224
MenuItem_int3::action(GET_TEXT_F(MSG_SPEED), &feedrate_percentage, SPEED_EDIT_MIN, SPEED_EDIT_MAX);
225225
break;
226226

227227
#if HAS_EXTRUDERS
228228
case FLOWRATE:
229-
ui.clear_lcd();
229+
ui.clear_for_drawing();
230230
MenuItemBase::itemIndex = control->data;
231231
#if EXTRUDERS == 1
232232
MenuItem_int3::action(GET_TEXT_F(MSG_FLOW), &planner.flow_percentage[MenuItemBase::itemIndex], FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); });

Marlin/src/lcd/tft/ui_color_ui.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ void MarlinUI::tft_idle() {
7979

8080
void MarlinUI::bootscreen_completion(const millis_t sofar) {
8181
if ((BOOTSCREEN_TIMEOUT) > sofar) safe_delay((BOOTSCREEN_TIMEOUT) - sofar);
82-
clear_lcd();
82+
clear_for_drawing();
8383
}
8484
#endif
8585

Marlin/src/lcd/tft/ui_common.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ void moveAxis(const AxisEnum axis, const int8_t direction) {
199199
tft.queue.reset();
200200
if (!sleepCleared) {
201201
sleepCleared = true;
202-
ui.clear_lcd();
202+
ui.clear_for_drawing();
203203
tft.queue.async();
204204
}
205205
touch.idle();
@@ -407,7 +407,7 @@ void MarlinUI::init_lcd() {
407407
tft.add_glyphs(EXTRA_FONT_NAME);
408408
#endif
409409
TERN_(TOUCH_SCREEN, touch.init());
410-
clear_lcd();
410+
clear_for_drawing();
411411
}
412412

413413
void MarlinUI::clear_lcd() {
@@ -421,6 +421,8 @@ void MarlinUI::clear_lcd() {
421421
cursor.set(0, 0);
422422
}
423423

424+
void MarlinUI::clear_for_drawing() { clear_lcd(); }
425+
424426
#if HAS_LCD_BRIGHTNESS
425427

426428
void MarlinUI::_set_brightness() {
@@ -441,7 +443,7 @@ void MarlinUI::clear_lcd() {
441443

442444
if (stage == CALIBRATION_NONE) {
443445
defer_status_screen(true);
444-
clear_lcd();
446+
clear_for_drawing();
445447
stage = touch_calibration.calibration_start();
446448
}
447449
else {

Marlin/src/lcd/tft/ui_move_axis_screen_1024.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void MarlinUI::move_axis_screen() {
133133
motionAxisState.blocked = false;
134134
TERN_(TOUCH_SCREEN, touch.enable());
135135

136-
ui.clear_lcd();
136+
ui.clear_for_drawing();
137137

138138
TERN_(TOUCH_SCREEN, touch.clear());
139139

Marlin/src/lcd/tft/ui_move_axis_screen_320.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ void MarlinUI::move_axis_screen() {
146146
motionAxisState.blocked = false;
147147
TERN_(TOUCH_SCREEN, touch.enable());
148148

149-
ui.clear_lcd();
149+
ui.clear_for_drawing();
150150

151151
TERN_(TOUCH_SCREEN, touch.clear());
152152

Marlin/src/lcd/tft/ui_move_axis_screen_480.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ void MarlinUI::move_axis_screen() {
146146
motionAxisState.blocked = false;
147147
TERN_(TOUCH_SCREEN, touch.enable());
148148

149-
ui.clear_lcd();
149+
ui.clear_for_drawing();
150150

151151
TERN_(TOUCH_SCREEN, touch.clear());
152152

0 commit comments

Comments
 (0)