Merge pull request #4287 from thinkyhead/rc_long_print_times

Allow stopwatch and printcounter to go over 18:12:15
This commit is contained in:
Scott Lahteine 2016-07-14 12:14:15 -07:00 committed by GitHub
commit 75901b616c
12 changed files with 108 additions and 84 deletions

View file

@ -1169,14 +1169,6 @@ inline void get_serial_commands() {
) { ) {
if (card_eof) { if (card_eof) {
SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED); SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
print_job_timer.stop();
char time[30];
millis_t t = print_job_timer.duration();
int hours = t / 60 / 60, minutes = (t / 60) % 60;
sprintf_P(time, PSTR("%i " MSG_END_HOUR " %i " MSG_END_MINUTE), hours, minutes);
SERIAL_ECHO_START;
SERIAL_ECHOLN(time);
lcd_setstatus(time, true);
card.printingHasFinished(); card.printingHasFinished();
card.checkautostart(true); card.checkautostart(true);
} }
@ -3949,12 +3941,22 @@ inline void gcode_M17() {
*/ */
inline void gcode_M31() { inline void gcode_M31() {
millis_t t = print_job_timer.duration(); millis_t t = print_job_timer.duration();
int min = t / 60, sec = t % 60; int d = int(t / 60 / 60 / 24),
char time[30]; h = int(t / 60 / 60) % 60,
sprintf_P(time, PSTR("%i min, %i sec"), min, sec); m = int(t / 60) % 60,
SERIAL_ECHO_START; s = int(t % 60);
SERIAL_ECHOLN(time); char time[18]; // 123456789012345678
if (d)
sprintf_P(time, PSTR("%id %ih %im %is"), d, h, m, s); // 99d 23h 59m 59s
else
sprintf_P(time, PSTR("%ih %im %is"), h, m, s); // 23h 59m 59s
lcd_setstatus(time); lcd_setstatus(time);
SERIAL_ECHO_START;
SERIAL_ECHOPGM(MSG_PRINT_TIME " ");
SERIAL_ECHOLN(time);
thermalManager.autotempShutdown(); thermalManager.autotempShutdown();
} }

View file

@ -602,19 +602,19 @@ void CardReader::updir() {
void CardReader::printingHasFinished() { void CardReader::printingHasFinished() {
stepper.synchronize(); stepper.synchronize();
file.close();
if (file_subcall_ctr > 0) { // Heading up to a parent file that called current as a procedure. if (file_subcall_ctr > 0) { // Heading up to a parent file that called current as a procedure.
file.close();
file_subcall_ctr--; file_subcall_ctr--;
openFile(proc_filenames[file_subcall_ctr], true, true); openFile(proc_filenames[file_subcall_ctr], true, true);
setIndex(filespos[file_subcall_ctr]); setIndex(filespos[file_subcall_ctr]);
startFileprint(); startFileprint();
} }
else { else {
file.close();
sdprinting = false; sdprinting = false;
if (SD_FINISHED_STEPPERRELEASE) if (SD_FINISHED_STEPPERRELEASE)
enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND));
thermalManager.autotempShutdown(); print_job_timer.stop();
enqueue_and_echo_commands_P(PSTR("M31"));
} }
} }

View file

@ -386,7 +386,7 @@ static void lcd_implementation_status_screen() {
} }
u8g.setPrintPos(80,48); u8g.setPrintPos(80,48);
uint16_t time = print_job_timer.duration() / 60; millis_t time = print_job_timer.duration() / 60;
if (time != 0) { if (time != 0) {
lcd_print(itostr2(time/60)); lcd_print(itostr2(time/60));
lcd_print(':'); lcd_print(':');

View file

@ -209,13 +209,13 @@
#define MSG_INFO_BAUDRATE "Rychlost" #define MSG_INFO_BAUDRATE "Rychlost"
#define MSG_INFO_PROTOCOL "Protokol" #define MSG_INFO_PROTOCOL "Protokol"
#if LCD_WIDTH > 19 #if LCD_WIDTH > 19
#define MSG_INFO_PRINT_COUNT "Pocet tisku " #define MSG_INFO_PRINT_COUNT "Pocet tisku"
#define MSG_INFO_FINISHED_PRINTS "Dokonceno " #define MSG_INFO_COMPLETED_PRINTS "Dokonceno "
#define MSG_INFO_PRINT_TIME "Celkovy cas " #define MSG_INFO_PRINT_TIME "Celkovy cas"
#else #else
#define MSG_INFO_PRINT_COUNT "Tisky " #define MSG_INFO_PRINT_COUNT "Tisky "
#define MSG_INFO_FINISHED_PRINTS "Hotovo " #define MSG_INFO_COMPLETED_PRINTS "Hotovo"
#define MSG_INFO_PRINT_TIME "Cas " #define MSG_INFO_PRINT_TIME "Cas "
#endif #endif
#define MSG_INFO_MIN_TEMP "Teplota min" #define MSG_INFO_MIN_TEMP "Teplota min"
#define MSG_INFO_MAX_TEMP "Teplota max" #define MSG_INFO_MAX_TEMP "Teplota max"

View file

@ -179,9 +179,16 @@
#define MSG_INFO_EXTRUDERS "Extruders" #define MSG_INFO_EXTRUDERS "Extruders"
#define MSG_INFO_BAUDRATE "Baud" #define MSG_INFO_BAUDRATE "Baud"
#define MSG_INFO_PROTOCOL "Protokol" #define MSG_INFO_PROTOCOL "Protokol"
#define MSG_INFO_TOTAL_PRINTS "Gesamte Drucke"
#define MSG_INFO_FINISHED_PRINTS "Beendete Drucke" #if LCD_WIDTH > 19
#define MSG_INFO_PRINT_TIME "Gesamte Druckzeit" #define MSG_INFO_TOTAL_PRINTS "Gesamte Drucke "
#define MSG_INFO_COMPLETED_PRINTS "Beendete Drucke "
#define MSG_INFO_PRINT_TIME "Gesamte Druckzeit"
#else
#define MSG_INFO_PRINT_COUNT "Prints "
#define MSG_INFO_COMPLETED_PRINTS "Completed"
#define MSG_INFO_PRINT_TIME "Duration "
#endif
#define MSG_INFO_MIN_TEMP "Min Temp" #define MSG_INFO_MIN_TEMP "Min Temp"
#define MSG_INFO_MAX_TEMP "Max Temp" #define MSG_INFO_MAX_TEMP "Max Temp"
#define MSG_INFO_PSU "Stromversorgung" #define MSG_INFO_PSU "Stromversorgung"

View file

@ -198,6 +198,7 @@
#define MSG_DELTA_CALIBRATE_Y "Βαθμονόμηση Y" #define MSG_DELTA_CALIBRATE_Y "Βαθμονόμηση Y"
#define MSG_DELTA_CALIBRATE_Z "Βαθμονόμηση Z" #define MSG_DELTA_CALIBRATE_Z "Βαθμονόμηση Z"
#define MSG_DELTA_CALIBRATE_CENTER "Βαθμονόμηση κέντρου" #define MSG_DELTA_CALIBRATE_CENTER "Βαθμονόμηση κέντρου"
#define MSG_INFO_MENU "About Printer" #define MSG_INFO_MENU "About Printer"
#define MSG_INFO_PRINTER_MENU "Printer Info" #define MSG_INFO_PRINTER_MENU "Printer Info"
#define MSG_INFO_STATS_MENU "Printer Stats" #define MSG_INFO_STATS_MENU "Printer Stats"
@ -206,42 +207,50 @@
#define MSG_INFO_EXTRUDERS "Extruders" #define MSG_INFO_EXTRUDERS "Extruders"
#define MSG_INFO_BAUDRATE "Baud" #define MSG_INFO_BAUDRATE "Baud"
#define MSG_INFO_PROTOCOL "Protocol" #define MSG_INFO_PROTOCOL "Protocol"
#define MSG_INFO_TOTAL_PRINTS "Total Prints"
#define MSG_INFO_FINISHED_PRINTS "Finished Prints" #if LCD_WIDTH > 19
#define MSG_INFO_PRINT_TIME "Total Print Time" #define MSG_INFO_PRINT_COUNT "Print Count"
#define MSG_INFO_COMPLETED_PRINTS "Completed "
#define MSG_INFO_PRINT_TIME "Total Time "
#else
#define MSG_INFO_PRINT_COUNT "Prints "
#define MSG_INFO_COMPLETED_PRINTS "Completed"
#define MSG_INFO_PRINT_TIME "Duration "
#endif
#define MSG_INFO_MIN_TEMP "Min Temp" #define MSG_INFO_MIN_TEMP "Min Temp"
#define MSG_INFO_MAX_TEMP "Max Temp" #define MSG_INFO_MAX_TEMP "Max Temp"
#define MSG_INFO_PSU "Power Supply" #define MSG_INFO_PSU "Power Supply"
#define MSG_FILAMENT_CHANGE_HEADER "CHANGE FILAMENT" #define MSG_FILAMENT_CHANGE_HEADER "CHANGE FILAMENT"
#define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE "Extrude more" #define MSG_FILAMENT_CHANGE_OPTION_EXTRUDE "Extrude more"
#define MSG_FILAMENT_CHANGE_OPTION_RESUME "Resume print" #define MSG_FILAMENT_CHANGE_OPTION_RESUME "Resume print"
#if LCD_HEIGHT >= 4 #if LCD_HEIGHT >= 4
#define MSG_FILAMENT_CHANGE_INIT_1 "Wait for start" #define MSG_FILAMENT_CHANGE_INIT_1 "Wait for start"
#define MSG_FILAMENT_CHANGE_INIT_2 "of the filament" #define MSG_FILAMENT_CHANGE_INIT_2 "of the filament"
#define MSG_FILAMENT_CHANGE_INIT_3 "change" #define MSG_FILAMENT_CHANGE_INIT_3 "change"
#define MSG_FILAMENT_CHANGE_UNLOAD_1 "Wait for" #define MSG_FILAMENT_CHANGE_UNLOAD_1 "Wait for"
#define MSG_FILAMENT_CHANGE_UNLOAD_2 "filament unload" #define MSG_FILAMENT_CHANGE_UNLOAD_2 "filament unload"
#define MSG_FILAMENT_CHANGE_UNLOAD_3 "" #define MSG_FILAMENT_CHANGE_UNLOAD_3 ""
#define MSG_FILAMENT_CHANGE_INSERT_1 "Insert filament" #define MSG_FILAMENT_CHANGE_INSERT_1 "Insert filament"
#define MSG_FILAMENT_CHANGE_INSERT_2 "and press button" #define MSG_FILAMENT_CHANGE_INSERT_2 "and press button"
#define MSG_FILAMENT_CHANGE_INSERT_3 "to continue..." #define MSG_FILAMENT_CHANGE_INSERT_3 "to continue..."
#define MSG_FILAMENT_CHANGE_LOAD_1 "Wait for" #define MSG_FILAMENT_CHANGE_LOAD_1 "Wait for"
#define MSG_FILAMENT_CHANGE_LOAD_2 "filament load" #define MSG_FILAMENT_CHANGE_LOAD_2 "filament load"
#define MSG_FILAMENT_CHANGE_LOAD_3 "" #define MSG_FILAMENT_CHANGE_LOAD_3 ""
#define MSG_FILAMENT_CHANGE_EXTRUDE_1 "Wait for" #define MSG_FILAMENT_CHANGE_EXTRUDE_1 "Wait for"
#define MSG_FILAMENT_CHANGE_EXTRUDE_2 "filament extrude" #define MSG_FILAMENT_CHANGE_EXTRUDE_2 "filament extrude"
#define MSG_FILAMENT_CHANGE_EXTRUDE_3 "" #define MSG_FILAMENT_CHANGE_EXTRUDE_3 ""
#define MSG_FILAMENT_CHANGE_RESUME_1 "Wait for print" #define MSG_FILAMENT_CHANGE_RESUME_1 "Wait for print"
#define MSG_FILAMENT_CHANGE_RESUME_2 "to resume" #define MSG_FILAMENT_CHANGE_RESUME_2 "to resume"
#define MSG_FILAMENT_CHANGE_RESUME_3 "" #define MSG_FILAMENT_CHANGE_RESUME_3 ""
#else // LCD_HEIGHT < 4 #else // LCD_HEIGHT < 4
#define MSG_FILAMENT_CHANGE_INIT_1 "Please wait..." #define MSG_FILAMENT_CHANGE_INIT_1 "Please wait..."
#define MSG_FILAMENT_CHANGE_UNLOAD_1 "Ejecting..." #define MSG_FILAMENT_CHANGE_UNLOAD_1 "Ejecting..."
#define MSG_FILAMENT_CHANGE_INSERT_1 "Insert and Click" #define MSG_FILAMENT_CHANGE_INSERT_1 "Insert and Click"
#define MSG_FILAMENT_CHANGE_LOAD_1 "Loading..." #define MSG_FILAMENT_CHANGE_LOAD_1 "Loading..."
#define MSG_FILAMENT_CHANGE_EXTRUDE_1 "Extruding..." #define MSG_FILAMENT_CHANGE_EXTRUDE_1 "Extruding..."
#define MSG_FILAMENT_CHANGE_RESUME_1 "Resuming..." #define MSG_FILAMENT_CHANGE_RESUME_1 "Resuming..."
#endif #endif
#endif // LANGUAGE_EL_H #endif // LANGUAGE_EL_H

View file

@ -488,12 +488,18 @@
#ifndef MSG_PLEASE_RESET #ifndef MSG_PLEASE_RESET
#define MSG_PLEASE_RESET "Please reset" #define MSG_PLEASE_RESET "Please reset"
#endif #endif
#ifndef MSG_END_DAY
#define MSG_END_DAY "days"
#endif
#ifndef MSG_END_HOUR #ifndef MSG_END_HOUR
#define MSG_END_HOUR "hours" #define MSG_END_HOUR "hours"
#endif #endif
#ifndef MSG_END_MINUTE #ifndef MSG_END_MINUTE
#define MSG_END_MINUTE "minutes" #define MSG_END_MINUTE "minutes"
#endif #endif
#ifndef MSG_PRINT_TIME
#define MSG_PRINT_TIME "Print time"
#endif
#ifndef MSG_HEATING #ifndef MSG_HEATING
#define MSG_HEATING "Heating..." #define MSG_HEATING "Heating..."
#endif #endif
@ -521,6 +527,7 @@
#ifndef MSG_DELTA_CALIBRATE_CENTER #ifndef MSG_DELTA_CALIBRATE_CENTER
#define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center" #define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center"
#endif #endif
#ifndef MSG_INFO_MENU #ifndef MSG_INFO_MENU
#define MSG_INFO_MENU "About Printer" #define MSG_INFO_MENU "About Printer"
#endif #endif
@ -548,20 +555,20 @@
#if LCD_WIDTH > 19 #if LCD_WIDTH > 19
#ifndef MSG_INFO_PRINT_COUNT #ifndef MSG_INFO_PRINT_COUNT
#define MSG_INFO_PRINT_COUNT "Print Count " #define MSG_INFO_PRINT_COUNT "Print Count"
#endif #endif
#ifndef MSG_INFO_FINISHED_PRINTS #ifndef MSG_INFO_COMPLETED_PRINTS
#define MSG_INFO_FINISHED_PRINTS "Finished " #define MSG_INFO_COMPLETED_PRINTS "Completed "
#endif #endif
#ifndef MSG_INFO_PRINT_TIME #ifndef MSG_INFO_PRINT_TIME
#define MSG_INFO_PRINT_TIME "Total Time " #define MSG_INFO_PRINT_TIME "Total Time "
#endif #endif
#else #else
#ifndef MSG_INFO_PRINT_COUNT #ifndef MSG_INFO_PRINT_COUNT
#define MSG_INFO_PRINT_COUNT "Prints " #define MSG_INFO_PRINT_COUNT "Prints "
#endif #endif
#ifndef MSG_INFO_FINISHED_PRINTS #ifndef MSG_INFO_COMPLETED_PRINTS
#define MSG_INFO_FINISHED_PRINTS "Finished " #define MSG_INFO_COMPLETED_PRINTS "Completed"
#endif #endif
#ifndef MSG_INFO_PRINT_TIME #ifndef MSG_INFO_PRINT_TIME
#define MSG_INFO_PRINT_TIME "Duration " #define MSG_INFO_PRINT_TIME "Duration "

View file

@ -27,12 +27,12 @@ PrintCounter::PrintCounter(): super() {
this->loadStats(); this->loadStats();
} }
uint16_t PrintCounter::deltaDuration() { millis_t PrintCounter::deltaDuration() {
#if ENABLED(DEBUG_PRINTCOUNTER) #if ENABLED(DEBUG_PRINTCOUNTER)
PrintCounter::debug(PSTR("deltaDuration")); PrintCounter::debug(PSTR("deltaDuration"));
#endif #endif
uint16_t tmp = this->lastDuration; millis_t tmp = this->lastDuration;
this->lastDuration = this->duration(); this->lastDuration = this->duration();
return this->lastDuration - tmp; return this->lastDuration - tmp;
} }
@ -88,12 +88,12 @@ void PrintCounter::showStats() {
SERIAL_ECHO(this->data.totalPrints - this->data.finishedPrints SERIAL_ECHO(this->data.totalPrints - this->data.finishedPrints
- ((this->isRunning() || this->isPaused()) ? 1 : 0)); // Removes 1 from failures with an active counter - ((this->isRunning() || this->isPaused()) ? 1 : 0)); // Removes 1 from failures with an active counter
uint32_t t = this->data.printTime / 60; millis_t t = this->data.printTime / 60; // minutes from seconds
SERIAL_ECHOPGM(", Total print time: "); SERIAL_ECHOPGM(", Total print time: ");
SERIAL_ECHO(t / 60); SERIAL_ECHO(t / 60); // hours
SERIAL_ECHOPGM("h "); SERIAL_ECHOPGM("h ");
SERIAL_ECHO(t % 60); SERIAL_ECHO(t % 60); // minutes
SERIAL_ECHOPGM("min"); SERIAL_ECHOPGM("min");
@ -110,10 +110,10 @@ void PrintCounter::showStats() {
void PrintCounter::tick() { void PrintCounter::tick() {
if (!this->isRunning()) return; if (!this->isRunning()) return;
static uint32_t update_before = millis(), static millis_t update_before = millis(),
eeprom_before = millis(); eeprom_before = millis();
uint32_t now = millis(); millis_t now = millis();
// Trying to get the amount of calculations down to the bare min // Trying to get the amount of calculations down to the bare min
const static uint16_t i = this->updateInterval * 1000; const static uint16_t i = this->updateInterval * 1000;
@ -128,8 +128,7 @@ void PrintCounter::tick() {
} }
// Trying to get the amount of calculations down to the bare min // Trying to get the amount of calculations down to the bare min
const static uint32_t j = this->saveInterval * 1000; const static millis_t j = this->saveInterval * 1000;
if (now - eeprom_before >= j) { if (now - eeprom_before >= j) {
eeprom_before = now; eeprom_before = now;
this->saveStats(); this->saveStats();

View file

@ -35,8 +35,8 @@ struct printStatistics { // 13 bytes
//const uint8_t magic; // Magic header, it will always be 0x16 //const uint8_t magic; // Magic header, it will always be 0x16
uint16_t totalPrints; // Number of prints uint16_t totalPrints; // Number of prints
uint16_t finishedPrints; // Number of complete prints uint16_t finishedPrints; // Number of complete prints
uint32_t printTime; // Total printing time millis_t printTime; // Total printing time
uint32_t longestPrint; // Longest print job - not in use millis_t longestPrint; // Longest print job - not in use
}; };
class PrintCounter: public Stopwatch { class PrintCounter: public Stopwatch {
@ -74,7 +74,7 @@ class PrintCounter: public Stopwatch {
* @details Stores the timestamp of the last deltaDuration(), this is * @details Stores the timestamp of the last deltaDuration(), this is
* required due to the updateInterval cycle. * required due to the updateInterval cycle.
*/ */
uint16_t lastDuration; millis_t lastDuration;
/** /**
* @brief Stats were loaded from EERPROM * @brief Stats were loaded from EERPROM
@ -90,7 +90,7 @@ class PrintCounter: public Stopwatch {
* used internally for print statistics accounting is not intended to be a * used internally for print statistics accounting is not intended to be a
* user callable function. * user callable function.
*/ */
uint16_t deltaDuration(); millis_t deltaDuration();
public: public:
/** /**

View file

@ -88,9 +88,9 @@ bool Stopwatch::isPaused() {
return (this->state == STOPWATCH_PAUSED) ? true : false; return (this->state == STOPWATCH_PAUSED) ? true : false;
} }
uint16_t Stopwatch::duration() { millis_t Stopwatch::duration() {
return (((this->isRunning()) ? millis() : this->stopTimestamp) return (((this->isRunning()) ? millis() : this->stopTimestamp)
- this->startTimestamp) / 1000 + this->accumulator; - this->startTimestamp) / 1000UL + this->accumulator;
} }
#if ENABLED(DEBUG_STOPWATCH) #if ENABLED(DEBUG_STOPWATCH)

View file

@ -42,9 +42,9 @@ enum StopwatchState {
class Stopwatch { class Stopwatch {
private: private:
StopwatchState state; StopwatchState state;
uint16_t accumulator; millis_t accumulator;
uint32_t startTimestamp; millis_t startTimestamp;
uint32_t stopTimestamp; millis_t stopTimestamp;
public: public:
/** /**
@ -101,7 +101,7 @@ class Stopwatch {
* @details Returns the total number of seconds the timer has been running. * @details Returns the total number of seconds the timer has been running.
* @return the delta since starting the stopwatch * @return the delta since starting the stopwatch
*/ */
uint16_t duration(); millis_t duration();
#if ENABLED(DEBUG_STOPWATCH) #if ENABLED(DEBUG_STOPWATCH)

View file

@ -1967,13 +1967,13 @@ void kill_screen(const char* lcd_msg) {
print_job_counter.loadStats(); print_job_counter.loadStats();
printStatistics stats = print_job_counter.getStats(); printStatistics stats = print_job_counter.getStats();
char printTime[6]; char timeString[8];
sprintf(printTime, "%02d:%02d", int(stats.printTime / 3600), int(stats.printTime / 60) % 60); sprintf_P(timeString, PSTR("%i:%02i"), int(stats.printTime / 60 / 60), int(stats.printTime / 60) % 60);
START_SCREEN(); START_SCREEN(); // 12345678901234567890
STATIC_ITEM(MSG_INFO_PRINT_COUNT ": ", false, false, itostr3left(stats.totalPrints)); // Print Count : 999 STATIC_ITEM(MSG_INFO_PRINT_COUNT ": ", false, false, itostr3left(stats.totalPrints)); // Print Count: 999
STATIC_ITEM(MSG_INFO_FINISHED_PRINTS ": ", false, false, itostr3left(stats.finishedPrints)); // Finished : 666 STATIC_ITEM(MSG_INFO_COMPLETED_PRINTS": ", false, false, itostr3left(stats.finishedPrints)); // Completed : 666
STATIC_ITEM(MSG_INFO_PRINT_TIME ": ", false, false, printTime); // Total Time : 12:34 STATIC_ITEM(MSG_INFO_PRINT_TIME ": ", false, false, timeString); // Total Time : 123:45
END_SCREEN(); END_SCREEN();
} }
#endif // PRINTCOUNTER #endif // PRINTCOUNTER