Configure / disable PRINTCOUNTER save interval (#20856)

Co-authored-by: Scott Lahteine <github@thinkyhead.com>
This commit is contained in:
ConstantijnCrijnen 2021-01-26 09:30:31 +01:00 committed by GitHub
parent 8c0cb6cce8
commit b95f5c5bea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 50 additions and 26 deletions

View file

@ -1754,6 +1754,9 @@
* View the current statistics with M78. * View the current statistics with M78.
*/ */
//#define PRINTCOUNTER //#define PRINTCOUNTER
#if ENABLED(PRINTCOUNTER)
#define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print
#endif
/** /**
* Password * Password

View file

@ -26,3 +26,10 @@
#elif EITHER(I2C_EEPROM, SPI_EEPROM) #elif EITHER(I2C_EEPROM, SPI_EEPROM)
#define USE_SHARED_EEPROM 1 #define USE_SHARED_EEPROM 1
#endif #endif
// LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785)
// TODO: Which other boards are incompatible?
#if defined(MCU_LPC1768) && PRINTCOUNTER_SAVE_INTERVAL > 0
#warning "To prevent step loss, motion will pause for PRINTCOUNTER auto-save."
#define PRINTCOUNTER_SYNC 1
#endif

View file

@ -365,7 +365,8 @@ void startOrResumeJob() {
queue.clear(); queue.clear();
quickstop_stepper(); quickstop_stepper();
print_job_timer.stop();
print_job_timer.abort();
IF_DISABLED(SD_ABORT_NO_COOLDOWN, thermalManager.disable_all_heaters()); IF_DISABLED(SD_ABORT_NO_COOLDOWN, thermalManager.disable_all_heaters());

View file

@ -1495,8 +1495,8 @@ void MarlinUI::update() {
#ifdef ACTION_ON_CANCEL #ifdef ACTION_ON_CANCEL
host_action_cancel(); host_action_cancel();
#endif #endif
IF_DISABLED(SDSUPPORT, print_job_timer.stop());
TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("UI Aborted"), DISMISS_STR)); TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_INFO, PSTR("UI Aborted"), DISMISS_STR));
print_job_timer.stop();
LCD_MESSAGEPGM(MSG_PRINT_ABORTED); LCD_MESSAGEPGM(MSG_PRINT_ABORTED);
TERN_(HAS_LCD_MENU, return_to_status()); TERN_(HAS_LCD_MENU, return_to_status());
} }

View file

@ -56,6 +56,7 @@ class Stopwatch {
* @return true on success * @return true on success
*/ */
static bool stop(); static bool stop();
static inline bool abort() { return stop(); } // Alias by default
/** /**
* @brief Pause the stopwatch * @brief Pause the stopwatch

View file

@ -41,6 +41,10 @@ Stopwatch print_job_timer; // Global Print Job Timer instance
#include "../libs/buzzer.h" #include "../libs/buzzer.h"
#endif #endif
#if PRINTCOUNTER_SYNC
#include "../module/planner.h"
#endif
// Service intervals // Service intervals
#if HAS_SERVICE_INTERVALS #if HAS_SERVICE_INTERVALS
#if SERVICE_INTERVAL_1 > 0 #if SERVICE_INTERVAL_1 > 0
@ -160,6 +164,8 @@ void PrintCounter::saveStats() {
// Refuses to save data if object is not loaded // Refuses to save data if object is not loaded
if (!isLoaded()) return; if (!isLoaded()) return;
TERN_(PRINTCOUNTER_SYNC, planner.synchronize());
// Saves the struct to EEPROM // Saves the struct to EEPROM
persistentStore.access_start(); persistentStore.access_start();
persistentStore.write_data(address + sizeof(uint8_t), (uint8_t*)&data, sizeof(printStatistics)); persistentStore.write_data(address + sizeof(uint8_t), (uint8_t*)&data, sizeof(printStatistics));
@ -244,11 +250,13 @@ void PrintCounter::tick() {
#endif #endif
} }
static uint32_t eeprom_next; // = 0 #if PRINTCOUNTER_SAVE_INTERVAL > 0
if (ELAPSED(now, eeprom_next)) { static millis_t eeprom_next; // = 0
eeprom_next = now + saveInterval * 1000; if (ELAPSED(now, eeprom_next)) {
saveStats(); eeprom_next = now + saveInterval;
} saveStats();
}
#endif
} }
// @Override // @Override
@ -268,21 +276,20 @@ bool PrintCounter::start() {
return false; return false;
} }
// @Override bool PrintCounter::_stop(const bool completed) {
bool PrintCounter::stop() {
TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("stop"))); TERN_(DEBUG_PRINTCOUNTER, debug(PSTR("stop")));
if (super::stop()) { const bool did_stop = super::stop();
data.finishedPrints++; if (did_stop) {
data.printTime += deltaDuration(); data.printTime += deltaDuration();
if (completed) {
if (duration() > data.longestPrint) data.finishedPrints++;
data.longestPrint = duration(); if (duration() > data.longestPrint)
data.longestPrint = duration();
saveStats(); }
return true;
} }
else return false; saveStats();
return did_stop;
} }
// @Override // @Override

View file

@ -74,13 +74,15 @@ class PrintCounter: public Stopwatch {
*/ */
static constexpr millis_t updateInterval = SEC_TO_MS(10); static constexpr millis_t updateInterval = SEC_TO_MS(10);
/** #if PRINTCOUNTER_SAVE_INTERVAL > 0
* @brief Interval in seconds between EEPROM saves /**
* @details This const value defines what will be the time between each * @brief Interval in seconds between EEPROM saves
* EEPROM save cycle, the development team recommends to set this value * @details This const value defines what will be the time between each
* no lower than 3600 secs (1 hour). * EEPROM save cycle, the development team recommends to set this value
*/ * no lower than 3600 secs (1 hour).
static constexpr uint16_t saveInterval = 3600; */
static constexpr millis_t saveInterval = MIN_TO_MS(PRINTCOUNTER_SAVE_INTERVAL);
#endif
/** /**
* @brief Timestamp of the last call to deltaDuration() * @brief Timestamp of the last call to deltaDuration()
@ -173,7 +175,10 @@ class PrintCounter: public Stopwatch {
* The following functions are being overridden * The following functions are being overridden
*/ */
static bool start(); static bool start();
static bool stop(); static bool _stop(const bool completed);
static inline bool stop() { return _stop(true); }
static inline bool abort() { return _stop(false); }
static void reset(); static void reset();
#if HAS_SERVICE_INTERVALS #if HAS_SERVICE_INTERVALS