🚸 Expose sub-options for E3V2 Enhanced (#23099)

This commit is contained in:
Miguel Risco-Castillo 2021-11-10 11:31:35 -05:00 committed by Scott Lahteine
parent 2a90d93b17
commit 7269990413
6 changed files with 105 additions and 39 deletions

View file

@ -1280,7 +1280,7 @@
#endif // HAS_LCD_MENU #endif // HAS_LCD_MENU
#if HAS_DISPLAY #if EITHER(HAS_DISPLAY, DWIN_CREALITY_LCD_ENHANCED)
// The timeout (in ms) to return to the status screen from sub-menus // The timeout (in ms) to return to the status screen from sub-menus
//#define LCD_TIMEOUT_TO_STATUS 15000 //#define LCD_TIMEOUT_TO_STATUS 15000

View file

@ -1565,7 +1565,6 @@ void setup() {
HMI_Init(); HMI_Init();
HMI_SetLanguageCache(); HMI_SetLanguageCache();
HMI_StartFrame(true); HMI_StartFrame(true);
DWIN_StatusChanged(GET_TEXT_F(WELCOME_MSG));
#endif #endif
#if HAS_SERVICE_INTERVALS && !HAS_DWIN_E3V2_BASIC #if HAS_SERVICE_INTERVALS && !HAS_DWIN_E3V2_BASIC

View file

@ -170,6 +170,7 @@ select_t select_page{0}, select_file{0}, select_print{0};
uint8_t index_file = MROWS; uint8_t index_file = MROWS;
bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home bool dwin_abort_flag = false; // Flag to reset feedrate, return to Home
bool hash_changed = true; // Flag to know if message status was changed
constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE; constexpr float default_max_feedrate[] = DEFAULT_MAX_FEEDRATE;
constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION; constexpr float default_max_acceleration[] = DEFAULT_MAX_ACCELERATION;
@ -610,6 +611,86 @@ void Popup_window_PauseOrStop() {
} }
#endif #endif
// Draw status line
void DWIN_DrawStatusLine(const uint16_t color, const uint16_t bgcolor, const char *text, const bool center = true) {
DWIN_Draw_Rectangle(1, bgcolor, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20);
if (text) {
if (center) DWINUI::Draw_CenteredString(color, STATUS_Y + 2, text);
else DWINUI::Draw_String(color, 0, STATUS_Y + 2, text);
}
DWIN_UpdateLCD();
}
void DWIN_DrawStatusLine(const char *text, const bool center = true) {
DWIN_DrawStatusLine(HMI_data.StatusTxt_Color, HMI_data.StatusBg_Color, text, center);
}
// Clear & reset status line
void DWIN_ResetStatusLine() {
ui.status_message[0] = 0;
DWIN_CheckStatusMessage();
}
// Djb2 hash algorithm
void DWIN_CheckStatusMessage() {
static uint32_t old_hash = 0;
char * str = &ui.status_message[0];
uint32_t hash = 5381;
char c;
while ((c = *str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
hash_changed = hash != old_hash;
old_hash = hash;
};
void DWIN_DrawStatusMessage() {
const uint8_t max_status_chars = DWIN_WIDTH / DWINUI::fontWidth(DWINUI::font);
#if ENABLED(STATUS_MESSAGE_SCROLLING)
// Get the UTF8 character count of the string
uint8_t slen = utf8_strlen(ui.status_message);
// If the string fits the status line do not scroll it
if (slen <= max_status_chars) {
if (hash_changed) {
DWIN_DrawStatusLine(HMI_data.StatusTxt_Color, HMI_data.StatusBg_Color, ui.status_message);
hash_changed = false;
}
}
else {
// String is larger than the available line space
// Get a pointer to the next valid UTF8 character
// and the string remaining length
uint8_t rlen;
const char *stat = MarlinUI::status_and_len(rlen);
DWIN_Draw_Rectangle(1, HMI_data.StatusBg_Color, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20);
DWINUI::MoveTo(0, STATUS_Y + 2);
DWINUI::Draw_String(stat, max_status_chars);
// If the string doesn't completely fill the line...
if (rlen < max_status_chars) {
DWINUI::Draw_Char('.'); // Always at 1+ spaces left, draw a dot
uint8_t chars = max_status_chars - rlen; // Amount of space left in characters
if (--chars) { // Draw a second dot if there's space
DWINUI::Draw_Char('.');
if (--chars)
DWINUI::Draw_String(ui.status_message, chars); // Print a second copy of the message
}
}
MarlinUI::advance_status_scroll();
}
#else
if (hash_changed) {
ui.status_message[max_status_chars] = 0;
DWIN_DrawStatusLine(HMI_data.StatusTxt_Color, HMI_data.StatusBg_Color, ui.status_message);
hash_changed = false;
}
#endif
}
void Draw_Print_Labels() { void Draw_Print_Labels() {
if (HMI_IsChinese()) { if (HMI_IsChinese()) {
Title.FrameCopy(30, 1, 42, 14); // "Printing" Title.FrameCopy(30, 1, 42, 14); // "Printing"
@ -715,7 +796,7 @@ void Draw_Main_Menu() {
void Goto_Main_Menu() { void Goto_Main_Menu() {
if (checkkey == MainMenu) return; if (checkkey == MainMenu) return;
checkkey = MainMenu; checkkey = MainMenu;
DWIN_StatusChanged(); ui.reset_status(true);
Draw_Main_Menu(); Draw_Main_Menu();
} }
@ -1079,6 +1160,7 @@ void Draw_Status_Area(const bool with_update) {
void HMI_StartFrame(const bool with_update) { void HMI_StartFrame(const bool with_update) {
Goto_Main_Menu(); Goto_Main_Menu();
DWIN_DrawStatusLine(nullptr);
Draw_Status_Area(with_update); Draw_Status_Area(with_update);
} }
@ -1475,7 +1557,7 @@ void DWIN_Update() {
} }
void EachMomentUpdate() { void EachMomentUpdate() {
static millis_t next_var_update_ms = 0, next_rts_update_ms = 0; static millis_t next_var_update_ms = 0, next_rts_update_ms = 0, next_status_update_ms = 0;
const millis_t ms = millis(); const millis_t ms = millis();
if (ELAPSED(ms, next_var_update_ms)) { if (ELAPSED(ms, next_var_update_ms)) {
@ -1483,6 +1565,11 @@ void EachMomentUpdate() {
update_variable(); update_variable();
} }
if (ELAPSED(ms, next_status_update_ms)) {
next_status_update_ms = ms + 500;
DWIN_DrawStatusMessage();
}
if (PENDING(ms, next_rts_update_ms)) return; if (PENDING(ms, next_rts_update_ms)) return;
next_rts_update_ms = ms + DWIN_SCROLL_UPDATE_INTERVAL; next_rts_update_ms = ms + DWIN_SCROLL_UPDATE_INTERVAL;
@ -1746,7 +1833,7 @@ void Draw_Title(TitleClass* title) {
void Draw_Menu(MenuClass* menu) { void Draw_Menu(MenuClass* menu) {
DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color); DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color);
DWIN_Draw_Rectangle(1, DWINUI::backcolor, 0, TITLE_HEIGHT, DWIN_WIDTH - 1, STATUS_Y - 1); DWIN_Draw_Rectangle(1, DWINUI::backcolor, 0, TITLE_HEIGHT, DWIN_WIDTH - 1, STATUS_Y - 1);
ui.set_status(""); DWIN_ResetStatusLine();
} }
// Startup routines // Startup routines
@ -1759,23 +1846,6 @@ void DWIN_Startup() {
HMI_SetLanguage(); HMI_SetLanguage();
} }
void DWIN_DrawStatusLine(const uint16_t color, const uint16_t bgcolor, const char * const text/*=nullptr*/) {
DWIN_Draw_Rectangle(1, bgcolor, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20);
if (text) DWINUI::Draw_CenteredString(color, STATUS_Y + 2, text);
DWIN_UpdateLCD();
}
// Update Status line
void DWIN_StatusChanged(const char * const cstr/*=nullptr*/) {
DWIN_DrawStatusLine(HMI_data.StatusTxt_Color, HMI_data.StatusBg_Color, cstr);
}
void DWIN_StatusChanged(FSTR_P const fstr) {
char str[strlen_P(FTOP(fstr)) + 1];
strcpy_P(str, FTOP(fstr));
DWIN_StatusChanged(str);
}
// Started a Print Job // Started a Print Job
void DWIN_Print_Started(const bool sd) { void DWIN_Print_Started(const bool sd) {
sdprint = card.isPrinting() || sd; sdprint = card.isPrinting() || sd;
@ -1867,7 +1937,6 @@ void DWIN_RebootScreen() {
void DWIN_Redraw_screen() { void DWIN_Redraw_screen() {
Draw_Main_Area(); Draw_Main_Area();
DWIN_StatusChanged(ui.status_message);
Draw_Status_Area(false); Draw_Status_Area(false);
} }

View file

@ -175,9 +175,7 @@ void EachMomentUpdate();
void update_variable(); void update_variable();
void DWIN_HandleScreen(); void DWIN_HandleScreen();
void DWIN_Update(); void DWIN_Update();
void DWIN_DrawStatusLine(const uint16_t color, const uint16_t bgcolor, const char *text=nullptr); void DWIN_CheckStatusMessage();
void DWIN_StatusChanged(const char * const cstr=nullptr);
void DWIN_StatusChanged(FSTR_P const fstr);
void DWIN_StartHoming(); void DWIN_StartHoming();
void DWIN_CompletedHoming(); void DWIN_CompletedHoming();
#if HAS_MESH #if HAS_MESH

View file

@ -49,6 +49,7 @@ MarlinUI ui;
#if ENABLED(DWIN_CREALITY_LCD) #if ENABLED(DWIN_CREALITY_LCD)
#include "e3v2/creality/dwin.h" #include "e3v2/creality/dwin.h"
#elif ENABLED(DWIN_CREALITY_LCD_ENHANCED) #elif ENABLED(DWIN_CREALITY_LCD_ENHANCED)
#include "fontutils.h"
#include "e3v2/enhanced/dwin.h" #include "e3v2/enhanced/dwin.h"
#elif ENABLED(DWIN_CREALITY_LCD_JYERSUI) #elif ENABLED(DWIN_CREALITY_LCD_JYERSUI)
#include "e3v2/jyersui/dwin.h" #include "e3v2/jyersui/dwin.h"
@ -69,7 +70,7 @@ MarlinUI ui;
constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
#if HAS_STATUS_MESSAGE #if HAS_STATUS_MESSAGE
#if BOTH(HAS_WIRED_LCD, STATUS_MESSAGE_SCROLLING) #if ENABLED(STATUS_MESSAGE_SCROLLING) && EITHER(HAS_WIRED_LCD, DWIN_CREALITY_LCD_ENHANCED)
uint8_t MarlinUI::status_scroll_offset; // = 0 uint8_t MarlinUI::status_scroll_offset; // = 0
#endif #endif
char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1]; char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1];
@ -1481,11 +1482,9 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
void MarlinUI::finish_status(const bool persist) { void MarlinUI::finish_status(const bool persist) {
#if HAS_WIRED_LCD UNUSED(persist);
#if !(BASIC_PROGRESS_BAR && (PROGRESS_MSG_EXPIRE) > 0) #if HAS_WIRED_LCD
UNUSED(persist);
#endif
#if BASIC_PROGRESS_BAR || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT) #if BASIC_PROGRESS_BAR || BOTH(FILAMENT_LCD_DISPLAY, SDSUPPORT)
const millis_t ms = millis(); const millis_t ms = millis();
@ -1502,13 +1501,15 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
next_filament_display = ms + 5000UL; // Show status message for 5s next_filament_display = ms + 5000UL; // Show status message for 5s
#endif #endif
TERN_(STATUS_MESSAGE_SCROLLING, status_scroll_offset = 0); #endif
#else // HAS_WIRED_LCD
UNUSED(persist); #if ENABLED(STATUS_MESSAGE_SCROLLING) && EITHER(HAS_WIRED_LCD, DWIN_CREALITY_LCD_ENHANCED)
status_scroll_offset = 0;
#endif #endif
TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message));
TERN_(HAS_DWIN_E3V2_BASIC, DWIN_StatusChanged(status_message)); TERN_(DWIN_CREALITY_LCD, DWIN_StatusChanged(status_message));
TERN_(DWIN_CREALITY_LCD_ENHANCED, DWIN_CheckStatusMessage());
TERN_(DWIN_CREALITY_LCD_JYERSUI, CrealityDWIN.Update_Status(status_message)); TERN_(DWIN_CREALITY_LCD_JYERSUI, CrealityDWIN.Update_Status(status_message));
} }

View file

@ -356,6 +356,9 @@ public:
#if EITHER(HAS_DISPLAY, DWIN_CREALITY_LCD_ENHANCED) #if EITHER(HAS_DISPLAY, DWIN_CREALITY_LCD_ENHANCED)
static void kill_screen(FSTR_P const lcd_error, FSTR_P const lcd_component); static void kill_screen(FSTR_P const lcd_error, FSTR_P const lcd_component);
#if DISABLED(LIGHTWEIGHT_UI)
static void draw_status_message(const bool blink);
#endif
#else #else
static inline void kill_screen(FSTR_P const, FSTR_P const) {} static inline void kill_screen(FSTR_P const, FSTR_P const) {}
#endif #endif
@ -444,10 +447,6 @@ public:
static inline void completion_feedback(const bool=true) { TERN_(HAS_TOUCH_SLEEP, wakeup_screen()); } static inline void completion_feedback(const bool=true) { TERN_(HAS_TOUCH_SLEEP, wakeup_screen()); }
#endif #endif
#if DISABLED(LIGHTWEIGHT_UI)
static void draw_status_message(const bool blink);
#endif
#if ENABLED(ADVANCED_PAUSE_FEATURE) #if ENABLED(ADVANCED_PAUSE_FEATURE)
static void draw_hotend_status(const uint8_t row, const uint8_t extruder); static void draw_hotend_status(const uint8_t row, const uint8_t extruder);
#endif #endif