diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 94b3d2624..5e49b89a8 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1385,7 +1385,7 @@ void process_commands() st_synchronize(); codenum += millis(); // keep track of when we started waiting previous_millis_cmd = millis(); - while(millis() < codenum ){ + while(millis() < codenum) { manage_heater(); manage_inactivity(); lcd_update(); @@ -1413,7 +1413,6 @@ void process_commands() plan_bed_level_matrix.set_to_identity(); //Reset the plane ("erase" all leveling data) #endif //ENABLE_AUTO_BED_LEVELING - saved_feedrate = feedrate; saved_feedmultiply = feedmultiply; feedmultiply = 100; @@ -1863,20 +1862,39 @@ void process_commands() case 0: // M0 - Unconditional stop - Wait for user button press on LCD case 1: // M1 - Conditional stop - Wait for user button press on LCD { - LCD_MESSAGEPGM(MSG_USERWAIT); + char *src = strchr_pointer + 2; + codenum = 0; - if(code_seen('P')) codenum = code_value(); // milliseconds to wait - if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait + bool hasP = false, hasS = false; + if (code_seen('P')) { + codenum = code_value(); // milliseconds to wait + hasP = codenum > 0; + } + if (code_seen('S')) { + codenum = code_value() * 1000; // seconds to wait + hasS = codenum > 0; + } + if (!hasP && !hasS && *src != '\0') { + starpos = strchr(src, '*'); + if (starpos != NULL) *(starpos) = '\0'; + while (*src == ' ') ++src; + lcd_setstatus(src); + } else { + LCD_MESSAGEPGM(MSG_USERWAIT); + } + + lcd_ignore_click(); st_synchronize(); previous_millis_cmd = millis(); if (codenum > 0){ codenum += millis(); // keep track of when we started waiting - while(millis() < codenum && !lcd_clicked()){ + while(millis() < codenum && !lcd_clicked()){ manage_heater(); manage_inactivity(); lcd_update(); } + lcd_ignore_click(false); }else{ while(!lcd_clicked()){ manage_heater(); @@ -1884,7 +1902,10 @@ void process_commands() lcd_update(); } } - LCD_MESSAGEPGM(MSG_RESUMING); + if (IS_SD_PRINTING) + LCD_MESSAGEPGM(MSG_RESUMING); + else + LCD_MESSAGEPGM(WELCOME_MSG); } break; #endif diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 734c859d0..550b9cb0b 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -162,6 +162,8 @@ bool lcd_oldcardstatus; menuFunc_t currentMenu = lcd_status_screen; /* function pointer to the currently active menu */ uint32_t lcd_next_update_millis; uint8_t lcd_status_update_delay; +bool ignore_click = false; +bool wait_for_unclick; uint8_t lcdDrawUpdate = 2; /* Set to none-zero when the LCD needs to draw, decreased after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial) */ //prevMenu and prevEncoderPosition are used to store the previous menu location when editing settings. @@ -189,7 +191,26 @@ static void lcd_status_screen() lcd_status_update_delay = 10; /* redraw the main screen every second. This is easier then trying keep track of all things that change on the screen */ } #ifdef ULTIPANEL - if (LCD_CLICKED) + + bool current_click = LCD_CLICKED; + + if (ignore_click) { + if (wait_for_unclick) { + if (!current_click) { + ignore_click = wait_for_unclick = false; + } + else { + current_click = false; + } + } + else if (current_click) { + lcd_quick_feedback(); + wait_for_unclick = true; + current_click = false; + } + } + + if (current_click) { currentMenu = lcd_main_menu; encoderPosition = 0; @@ -1315,6 +1336,12 @@ void lcd_update() } } +void lcd_ignore_click(bool b) +{ + ignore_click = b; + wait_for_unclick = false; +} + void lcd_setstatus(const char* message) { if (lcd_status_message_level > 0) diff --git a/Marlin/ultralcd.h b/Marlin/ultralcd.h index 9bf685805..761cd5f01 100644 --- a/Marlin/ultralcd.h +++ b/Marlin/ultralcd.h @@ -48,6 +48,8 @@ void lcd_buzz(long duration,uint16_t freq); bool lcd_clicked(); + void lcd_ignore_click(bool b=true); + #ifdef NEWPANEL #define EN_C (1<