Browse Source

show estimated time to end of the print if available in gcode: initial version

PavelSindler 5 years ago
parent
commit
622c7051fa
4 changed files with 144 additions and 43 deletions
  1. 11 0
      .gitignore
  2. 15 0
      Firmware/Marlin.h
  3. 56 0
      Firmware/Marlin_main.cpp
  4. 62 43
      Firmware/ultralcd_implementation_hitachi_HD44780.h

+ 11 - 0
.gitignore

@@ -16,3 +16,14 @@
 /Firmware/Firmware.vcxproj
 /Firmware/Firmware.sln
 /Firmware/Firmware - Shortcut.lnk
+.settings
+.project
+.cproject
+Debug
+Firmware/Configuration_prusa.h
+Firmware/Doc
+/Firmware/.vs/Firmware/v14/.suo
+/Firmware/Firmware.sln
+/Firmware/Firmware.vcxproj
+/Firmware/Firmware.vcxproj.filters
+/Firmware/__vm

+ 15 - 0
Firmware/Marlin.h

@@ -340,6 +340,16 @@ extern bool sortAlpha;
 
 extern void calculate_volumetric_multipliers();
 
+
+//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) || (lcd_commands_type == LCD_COMMAND_V2_CAL))
+
 // Similar to the default Arduino delay function, 
 // but it keeps the background tasks running.
 extern void delay_keep_alive(unsigned int ms);
@@ -364,6 +374,11 @@ void serialecho_temperatures();
 void proc_commands();
 bool check_commands();
 
+//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

+ 56 - 0
Firmware/Marlin_main.cpp

@@ -134,6 +134,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)
@@ -401,6 +402,13 @@ bool no_response = false;
 uint8_t important_status;
 uint8_t saved_filament_type;
 
+
+// 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=============================
 //===========================================================================
@@ -4305,6 +4313,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)){
@@ -4602,6 +4626,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
@@ -6997,3 +7023,33 @@ void serialecho_temperatures() {
 	SERIAL_PROTOCOL_F(degBed(), 1);
 	SERIAL_PROTOCOLLN("");
 }
+
+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;
+}

+ 62 - 43
Firmware/ultralcd_implementation_hitachi_HD44780.h

@@ -679,6 +679,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|
@@ -758,35 +805,14 @@ static void lcd_implementation_status_screen()
 	
     //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("  "));
@@ -813,23 +839,16 @@ static void lcd_implementation_status_screen()
 #endif
 	}
 
-
-
-    //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("  "));
-
+#ifdef CMD_DIAGNOSTICS
+	lcd.setCursor(LCD_WIDTH - 8 -1, 2);
+	lcd_printPGM(PSTR("      C"));
+	lcd.print(buflen);	// number of commands in cmd buffer
+	if (buflen < 9) lcd_printPGM(" ");
+#else
+    //Print time
+	lcd.setCursor(LCD_WIDTH - 8, 2);
+	lcd_print_time();
+#endif //CMD_DIAGNOSTICS
 
 #ifdef DEBUG_DISABLE_LCD_STATUS_LINE
 	return;