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

This commit is contained in:
PavelSindler 2018-06-07 20:50:30 +02:00
parent a8e8a30dee
commit 622c7051fa
4 changed files with 144 additions and 43 deletions

11
.gitignore vendored
View File

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

View File

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

View File

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

View File

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