show estimated time to end of the print if available in gcode: initial version
This commit is contained in:
parent
42cfcb2601
commit
a15f0138de
4 changed files with 128 additions and 43 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -4,3 +4,8 @@
|
|||
Debug
|
||||
Firmware/Configuration_prusa.h
|
||||
Firmware/Doc
|
||||
/Firmware/.vs/Firmware/v14/.suo
|
||||
/Firmware/Firmware.sln
|
||||
/Firmware/Firmware.vcxproj
|
||||
/Firmware/Firmware.vcxproj.filters
|
||||
/Firmware/__vm
|
||||
|
|
|
@ -350,6 +350,15 @@ extern char dir_names[3][9];
|
|||
// save/restore printing
|
||||
extern bool saved_printing;
|
||||
|
||||
//estimated time to end of the print
|
||||
extern uint8_t print_percent_done_normal;
|
||||
extern uint16_t print_time_remaining_normal;
|
||||
extern uint8_t print_percent_done_silent;
|
||||
extern uint16_t print_time_remaining_silent;
|
||||
#define PRINT_TIME_REMAINING_INIT 65535
|
||||
#define PRINT_PERCENT_DONE_INIT 255
|
||||
#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == 4) || saved_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL))
|
||||
|
||||
extern void calculate_extruder_multipliers();
|
||||
|
||||
// Similar to the default Arduino delay function,
|
||||
|
@ -402,6 +411,11 @@ extern void print_mesh_bed_leveling_table();
|
|||
extern void fsensor_init();
|
||||
#endif //PAT9125
|
||||
|
||||
//estimated time to end of the print
|
||||
extern uint16_t print_time_remaining();
|
||||
extern uint8_t print_percent_done();
|
||||
static void print_time_remaining_init();
|
||||
|
||||
#ifdef HOST_KEEPALIVE_FEATURE
|
||||
|
||||
// States for managing Marlin and host communication
|
||||
|
@ -444,4 +458,4 @@ void gcode_M701();
|
|||
|
||||
#define UVLO !(PINE & (1<<4))
|
||||
|
||||
void proc_commands();
|
||||
void proc_commands();
|
|
@ -185,6 +185,7 @@
|
|||
// Call gcode file : "M32 P !filename#" and return to caller file after finishing (similar to #include).
|
||||
// The '#' is necessary when calling from within sd files, as it stops buffer prereading
|
||||
// M42 - Change pin status via gcode Use M42 Px Sy to set pin x to value y, when omitting Px the onboard led will be used.
|
||||
// M73 - Show percent done and print time remaining
|
||||
// M80 - Turn on Power Supply
|
||||
// M81 - Turn off Power Supply
|
||||
// M82 - Set E codes absolute (default)
|
||||
|
@ -448,6 +449,11 @@ uint8_t saved_filament_type;
|
|||
// save/restore printing
|
||||
bool saved_printing = false;
|
||||
|
||||
// storing estimated time to end of print counted by slicer
|
||||
uint8_t print_percent_done_normal = PRINT_PERCENT_DONE_INIT;
|
||||
uint16_t print_time_remaining_normal = PRINT_TIME_REMAINING_INIT; //estimated remaining print time in minutes
|
||||
uint8_t print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
|
||||
uint16_t print_time_remaining_silent = PRINT_TIME_REMAINING_INIT; //estimated remaining print time in minutes
|
||||
|
||||
//===========================================================================
|
||||
//=============================Private Variables=============================
|
||||
|
@ -4465,7 +4471,7 @@ void process_commands()
|
|||
card.openFile(strchr_pointer + 4,true);
|
||||
break;
|
||||
case 24: //M24 - Start SD print
|
||||
if (!card.paused)
|
||||
if (!card.paused)
|
||||
failstats_reset_print();
|
||||
card.startFileprint();
|
||||
starttime=millis();
|
||||
|
@ -4947,6 +4953,22 @@ Sigma_Exit:
|
|||
}
|
||||
#endif // Z_PROBE_REPEATABILITY_TEST
|
||||
#endif // ENABLE_AUTO_BED_LEVELING
|
||||
case 73: //M73 show percent done and time remaining
|
||||
if(code_seen('P')) print_percent_done_normal = code_value();
|
||||
if(code_seen('R')) print_time_remaining_normal = code_value();
|
||||
if(code_seen('Q')) print_percent_done_silent = code_value();
|
||||
if(code_seen('S')) print_time_remaining_silent = code_value();
|
||||
|
||||
SERIAL_ECHOPGM("NORMAL MODE: Percent done: ");
|
||||
MYSERIAL.print(int(print_percent_done_normal));
|
||||
SERIAL_ECHOPGM("; print time remaining in mins: ");
|
||||
MYSERIAL.println(print_time_remaining_normal);
|
||||
SERIAL_ECHOPGM("SILENT MODE: Percent done: ");
|
||||
MYSERIAL.print(int(print_percent_done_silent));
|
||||
SERIAL_ECHOPGM("; print time remaining in mins: ");
|
||||
MYSERIAL.println(print_time_remaining_silent);
|
||||
|
||||
break;
|
||||
|
||||
case 104: // M104
|
||||
if(setTargetedHotend(104)){
|
||||
|
@ -5255,6 +5277,8 @@ Sigma_Exit:
|
|||
#endif
|
||||
}
|
||||
}
|
||||
//in the end of print set estimated time to end of print and extruders used during print to default values for next print
|
||||
print_time_remaining_init();
|
||||
snmm_filaments_used = 0;
|
||||
break;
|
||||
case 85: // M85
|
||||
|
@ -7264,8 +7288,7 @@ static void handleSafetyTimer()
|
|||
#if (EXTRUDERS > 1)
|
||||
#error Implemented only for one extruder.
|
||||
#endif //(EXTRUDERS > 1)
|
||||
if (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == 4) || saved_printing
|
||||
|| (lcd_commands_type == LCD_COMMAND_V2_CAL) || (!degTargetBed() && !degTargetHotend(0)))
|
||||
if ((PRINTER_ACTIVE) || (!degTargetBed() && !degTargetHotend(0)))
|
||||
{
|
||||
safetyTimer.stop();
|
||||
}
|
||||
|
@ -8773,5 +8796,34 @@ void print_mesh_bed_leveling_table()
|
|||
SERIAL_ECHOLNPGM("");
|
||||
}
|
||||
|
||||
uint16_t print_time_remaining() {
|
||||
uint16_t print_t = PRINT_TIME_REMAINING_INIT;
|
||||
if (SilentModeMenu == SILENT_MODE_OFF) print_t = print_time_remaining_normal;
|
||||
else print_t = print_time_remaining_silent;
|
||||
if ((print_t != PRINT_TIME_REMAINING_INIT) && (feedmultiply != 0)) print_t = 100 * print_t / feedmultiply;
|
||||
return print_t;
|
||||
}
|
||||
|
||||
uint8_t print_percent_done() {
|
||||
//in case that we have information from M73 gcode return percentage counted by slicer, else return percentage counted as byte_printed/filesize
|
||||
uint8_t percent_done = 0;
|
||||
if (SilentModeMenu == SILENT_MODE_OFF && print_percent_done_normal <= 100) {
|
||||
percent_done = print_percent_done_normal;
|
||||
}
|
||||
else if (print_percent_done_silent <= 100) {
|
||||
percent_done = print_percent_done_silent;
|
||||
}
|
||||
else {
|
||||
percent_done = card.percentDone();
|
||||
}
|
||||
return percent_done;
|
||||
}
|
||||
|
||||
static void print_time_remaining_init() {
|
||||
print_time_remaining_normal = PRINT_TIME_REMAINING_INIT;
|
||||
print_time_remaining_silent = PRINT_TIME_REMAINING_INIT;
|
||||
print_percent_done_normal = PRINT_PERCENT_DONE_INIT;
|
||||
print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
|
||||
}
|
||||
|
||||
#define FIL_LOAD_LENGTH 60
|
||||
|
|
|
@ -678,6 +678,53 @@ void lcd_implementation_print_at(uint8_t x, uint8_t y, const char *str)
|
|||
lcd.print(str);
|
||||
}
|
||||
|
||||
static inline void lcd_print_percent_done() {
|
||||
if (is_usb_printing)
|
||||
{
|
||||
lcd_printPGM(PSTR("USB"));
|
||||
}
|
||||
else if(IS_SD_PRINTING)
|
||||
{
|
||||
lcd_printPGM(PSTR("SD"));
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd_printPGM(PSTR(" "));
|
||||
}
|
||||
if (IS_SD_PRINTING || (PRINTER_ACTIVE && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)))
|
||||
{
|
||||
lcd.print(itostr3(print_percent_done()));
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd_printPGM(PSTR("---"));
|
||||
}
|
||||
lcd.print('%');
|
||||
}
|
||||
|
||||
static inline void lcd_print_time() {
|
||||
//if remaining print time estimation is available print it else print elapsed time
|
||||
//uses 8 characters
|
||||
uint16_t print_t = 0;
|
||||
if (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT){
|
||||
print_t = print_time_remaining();
|
||||
}
|
||||
else if(starttime != 0){
|
||||
print_t = millis() / 60000 - starttime / 60000;
|
||||
}
|
||||
lcd.print(LCD_STR_CLOCK[0]);
|
||||
if((PRINTER_ACTIVE) && ((print_time_remaining_normal != PRINT_TIME_REMAINING_INIT)||(starttime != 0)))
|
||||
{
|
||||
lcd.print(itostr2(print_t/60));
|
||||
lcd.print(':');
|
||||
lcd.print(itostr2(print_t%60));
|
||||
(print_time_remaining_normal != PRINT_TIME_REMAINING_INIT) ? lcd.print('R') : lcd.print(' ');
|
||||
(feedmultiply == 100) ? lcd.print(' ') : lcd.print('?');
|
||||
}else{
|
||||
lcd_printPGM(PSTR("--:-- "));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
20x4 |01234567890123456789|
|
||||
|
@ -774,36 +821,14 @@ if (print_sd_status)
|
|||
{
|
||||
//Print SD status
|
||||
lcd.setCursor(0, 2);
|
||||
if (is_usb_printing)
|
||||
{
|
||||
lcd_printPGM(PSTR("--"));
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd_printPGM(PSTR("SD"));
|
||||
}
|
||||
if (IS_SD_PRINTING)
|
||||
{
|
||||
lcd.print(itostr3(card.percentDone()));
|
||||
lcd.print('%');
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_usb_printing)
|
||||
{
|
||||
lcd_printPGM(PSTR(">USB"));
|
||||
}
|
||||
else
|
||||
{
|
||||
lcd_printPGM(PSTR("---"));
|
||||
lcd.print('%');
|
||||
}
|
||||
}
|
||||
lcd_print_percent_done();
|
||||
|
||||
}
|
||||
|
||||
// Farm number display
|
||||
if (farm_mode)
|
||||
{
|
||||
lcd.setCursor(0, 6);
|
||||
lcd_printPGM(PSTR(" F"));
|
||||
lcd.print(farm_no);
|
||||
lcd_printPGM(PSTR(" "));
|
||||
|
@ -836,20 +861,9 @@ if (print_sd_status)
|
|||
lcd.print(buflen); // number of commands in cmd buffer
|
||||
if (buflen < 9) lcd_printPGM(" ");
|
||||
#else
|
||||
//Print time elapsed
|
||||
lcd.setCursor(LCD_WIDTH - 8 -1, 2);
|
||||
lcd_printPGM(PSTR(" "));
|
||||
lcd.print(LCD_STR_CLOCK[0]);
|
||||
if(starttime != 0)
|
||||
{
|
||||
uint16_t time = millis() / 60000 - starttime / 60000;
|
||||
lcd.print(itostr2(time/60));
|
||||
lcd.print(':');
|
||||
lcd.print(itostr2(time%60));
|
||||
}else{
|
||||
lcd_printPGM(PSTR("--:--"));
|
||||
}
|
||||
lcd_printPGM(PSTR(" "));
|
||||
//Print time
|
||||
lcd.setCursor(LCD_WIDTH - 8, 2);
|
||||
lcd_print_time();
|
||||
#endif //CMD_DIAGNOSTICS
|
||||
|
||||
#ifdef DEBUG_DISABLE_LCD_STATUS_LINE
|
||||
|
|
Loading…
Reference in a new issue