Browse Source

Merge pull request #813 from PavelSindler/time_remaining

Show estimated time to end of the print (if available in gcode)
XPila 6 years ago
parent
commit
1600f54c1c
3 changed files with 123 additions and 43 deletions
  1. 15 1
      Firmware/Marlin.h
  2. 55 3
      Firmware/Marlin_main.cpp
  3. 53 39
      Firmware/ultralcd_implementation_hitachi_HD44780.h

+ 15 - 1
Firmware/Marlin.h

@@ -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();

+ 55 - 3
Firmware/Marlin_main.cpp

@@ -188,6 +188,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)
@@ -452,6 +453,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=============================
@@ -4542,7 +4548,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();
@@ -5024,6 +5030,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)){
@@ -5332,6 +5354,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
@@ -7341,8 +7365,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();
     }
@@ -8851,5 +8874,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

+ 53 - 39
Firmware/ultralcd_implementation_hitachi_HD44780.h

@@ -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