Implement nozzle reheating on timeout via display
- Raise nozzle timeout to 10 minutes - Use continue button as reheat trigger - Manage nozzle_timed_out variable via display - Add PausedByNozzleTimeout flag to enter correct routine on display - Bump version to 1.4.3
This commit is contained in:
@@ -138,7 +138,7 @@ void AnycubicTFTClass::KillTFT()
|
||||
|
||||
void AnycubicTFTClass::StartPrint(){
|
||||
if (TFTstate==ANYCUBIC_TFT_STATE_SDPAUSE) { // resuming from SD pause
|
||||
if((!PausedByRunout) && (!PausedByFilamentChange)) // was that a regular pause?
|
||||
if((!PausedByRunout) && (!PausedByFilamentChange) && (!PausedByNozzleTimeout)) // was that a regular pause?
|
||||
{
|
||||
enqueue_and_echo_commands_P(PSTR("G91")); // relative mode
|
||||
enqueue_and_echo_commands_P(PSTR("G1 Z-10 F240")); // lower nozzle again
|
||||
@@ -148,11 +148,11 @@ void AnycubicTFTClass::StartPrint(){
|
||||
}
|
||||
starttime=millis();
|
||||
#ifdef SDSUPPORT
|
||||
if((!PausedByRunout) && (!PausedByFilamentChange)) // was that a regular pause?
|
||||
if((!PausedByRunout) && (!PausedByFilamentChange) && (!PausedByNozzleTimeout)) // was that a regular pause?
|
||||
{
|
||||
card.startFileprint(); // start or resume regularly
|
||||
}
|
||||
else if((PausedByRunout) && (!PausedByFilamentChange)) // resuming from a pause that was caused by filament runout
|
||||
else if((PausedByRunout) && (!PausedByFilamentChange) && (!PausedByNozzleTimeout)) // resuming from a pause that was caused by filament runout
|
||||
{
|
||||
enqueue_and_echo_commands_P(PSTR("M24")); // unpark nozzle and resume
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
@@ -163,19 +163,30 @@ void AnycubicTFTClass::StartPrint(){
|
||||
SERIAL_ECHOLNPGM("DEBUG: Filament Pause Flag cleared");
|
||||
#endif
|
||||
}
|
||||
else if((!PausedByRunout) && (PausedByFilamentChange)) // was M600 called?
|
||||
else if((!PausedByRunout) && (PausedByFilamentChange) && (!PausedByNozzleTimeout)) // was M600 called and the nozzle is not timed out?
|
||||
{
|
||||
FilamentChangeResume(); // enter M108 routine
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Start M108 routine");
|
||||
#endif
|
||||
PausedByFilamentChange=false; // clear flag
|
||||
FilamentChangeResume(); // enter M108 routine
|
||||
PausedByFilamentChange=false; // clear flag
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Filament Change Flag cleared");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
TFTstate=ANYCUBIC_TFT_STATE_SDPRINT;
|
||||
if (!PausedByNozzleTimeout) {
|
||||
TFTstate=ANYCUBIC_TFT_STATE_SDPRINT;
|
||||
} else {
|
||||
TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ;
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Set Pause again because of timeout");
|
||||
#endif
|
||||
PausedByNozzleTimeout=false;
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Nozzle timeout flag cleared");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void AnycubicTFTClass::PausePrint(){
|
||||
@@ -192,7 +203,7 @@ void AnycubicTFTClass::PausePrint(){
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Filament Runout Pause");
|
||||
#endif
|
||||
enqueue_and_echo_commands_P(PSTR("M25")); // pause print and park nozzle
|
||||
enqueue_and_echo_commands_P(PSTR("M25")); // pause print and park nozzle
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: M25 sent, parking nozzle");
|
||||
#endif
|
||||
@@ -251,16 +262,19 @@ void AnycubicTFTClass::StopPrint(){
|
||||
for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0;
|
||||
#endif
|
||||
TFTstate=ANYCUBIC_TFT_STATE_SDSTOP_REQ;
|
||||
enqueue_and_echo_commands_P(PSTR("M27")); // force report of SD status
|
||||
}
|
||||
|
||||
void AnycubicTFTClass::FilamentChangeResume(){
|
||||
enqueue_and_echo_commands_P(PSTR("M108")); // call M108 to break out of M600 pause
|
||||
HOTEND_LOOP() thermalManager.reset_heater_idle_timer(e); // resume heating if timed out
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: M108 called");
|
||||
#endif
|
||||
wait_for_heatup = false;
|
||||
wait_for_user = false; // remove waiting flags
|
||||
card.startFileprint(); // resume with proper progress state
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: M108 Resume called");
|
||||
SERIAL_ECHOLNPGM("DEBUG: M108 Resume done");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -273,6 +287,24 @@ void AnycubicTFTClass::FilamentChangePause(){
|
||||
#endif
|
||||
}
|
||||
|
||||
void AnycubicTFTClass::ReheatNozzle(){
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Send reheat M108");
|
||||
#endif
|
||||
enqueue_and_echo_commands_P(PSTR("M108"));
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Resume heating");
|
||||
#endif
|
||||
HOTEND_LOOP() thermalManager.reset_heater_idle_timer(e); // resume heating if timed out
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Clear flags");
|
||||
#endif
|
||||
nozzle_timed_out = false;
|
||||
wait_for_user = false;
|
||||
wait_for_heatup = false;
|
||||
TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ;
|
||||
}
|
||||
|
||||
|
||||
float AnycubicTFTClass::CodeValue()
|
||||
{
|
||||
@@ -538,7 +570,7 @@ void AnycubicTFTClass::StateHandler()
|
||||
#ifdef SDSUPPORT
|
||||
if((!card.sdprinting) && (!planner.movesplanned())) {
|
||||
// We have to wait until the sd card printing has been settled
|
||||
if((!PausedByRunout) && (!PausedByFilamentChange))
|
||||
if((!PausedByRunout) && (!PausedByFilamentChange) && (!PausedByNozzleTimeout))
|
||||
{
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Regular Pause requested");
|
||||
@@ -602,7 +634,7 @@ void AnycubicTFTClass::FilamentRunout()
|
||||
// something changed! save current timestamp.
|
||||
const millis_t fil_ms = millis();
|
||||
static millis_t fil_delay;
|
||||
|
||||
|
||||
// since this is inside a loop, only set delay time once
|
||||
if (FilamentSetMillis){
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
@@ -814,7 +846,10 @@ void AnycubicTFTClass::GetCommandFromTFT()
|
||||
SERIAL_ECHOLNPGM("TFT Serial Debug: SD print started... J04");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
if (nozzle_timed_out) {
|
||||
ReheatNozzle();
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case 11: // A11 STOP SD PRINT
|
||||
#ifdef SDSUPPORT
|
||||
|
@@ -58,6 +58,7 @@ public:
|
||||
char TFTstate=ANYCUBIC_TFT_STATE_IDLE;
|
||||
bool PausedByRunout=false;
|
||||
bool PausedByFilamentChange=false;
|
||||
bool PausedByNozzleTimeout=false;
|
||||
|
||||
private:
|
||||
char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE];
|
||||
@@ -100,6 +101,7 @@ private:
|
||||
void HandleSpecialMenu();
|
||||
void FilamentChangePause();
|
||||
void FilamentChangeResume();
|
||||
void ReheatNozzle();
|
||||
|
||||
char SelectedDirectory[30];
|
||||
uint8_t SpecialMenu=false;
|
||||
|
@@ -1009,7 +1009,7 @@
|
||||
#define FILAMENT_UNLOAD_DELAY 5000 // (ms) Delay for the filament to cool after retract.
|
||||
#define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged.
|
||||
|
||||
#define PAUSE_PARK_NOZZLE_TIMEOUT 300 // (seconds) Time limit before the nozzle is turned off for safety.
|
||||
#define PAUSE_PARK_NOZZLE_TIMEOUT 600 // (seconds) Time limit before the nozzle is turned off for safety.
|
||||
#define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed.
|
||||
#define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change.
|
||||
|
||||
|
@@ -271,6 +271,9 @@ FORCE_INLINE bool all_axes_known() { return (axis_known_position & xyz_bits) ==
|
||||
|
||||
extern volatile bool wait_for_heatup;
|
||||
|
||||
// Making sure this flag can be cleared by the Anycubic display
|
||||
extern volatile bool nozzle_timed_out;
|
||||
|
||||
#if HAS_RESUME_CONTINUE
|
||||
extern volatile bool wait_for_user;
|
||||
#endif
|
||||
|
@@ -519,6 +519,9 @@ static bool relative_mode; // = false;
|
||||
// For M109 and M190, this flag may be cleared (by M108) to exit the wait loop
|
||||
volatile bool wait_for_heatup = true;
|
||||
|
||||
// Making sure this flag can be cleared by the Anycubic display
|
||||
volatile bool nozzle_timed_out = false;
|
||||
|
||||
// For M0/M1, this flag may be cleared (by M108) to exit the wait-for-user loop
|
||||
#if HAS_RESUME_CONTINUE
|
||||
volatile bool wait_for_user; // = false;
|
||||
@@ -7213,7 +7216,11 @@ inline void gcode_M17() {
|
||||
* Used by M125 and M600
|
||||
*/
|
||||
static void wait_for_filament_reload(const int8_t max_beep_count=0) {
|
||||
bool nozzle_timed_out = false;
|
||||
nozzle_timed_out = false;
|
||||
nozzle_timed_out = false;
|
||||
#ifdef ANYCUBIC_TFT_MODEL
|
||||
AnycubicTFT.PausedByNozzleTimeout = false;
|
||||
#endif
|
||||
|
||||
#if ENABLED(ULTIPANEL)
|
||||
lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT);
|
||||
@@ -7246,6 +7253,14 @@ inline void gcode_M17() {
|
||||
nozzle_timed_out |= thermalManager.is_heater_idle(e);
|
||||
|
||||
if (nozzle_timed_out) {
|
||||
|
||||
#ifdef ANYCUBIC_TFT_MODEL
|
||||
AnycubicTFT.PausedByNozzleTimeout=true;
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
SERIAL_ECHOLNPGM("DEBUG: Nozzle timeout flag set");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLED(ULTIPANEL)
|
||||
lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_CLICK_TO_HEAT_NOZZLE);
|
||||
#endif
|
||||
@@ -7287,6 +7302,9 @@ inline void gcode_M17() {
|
||||
|
||||
wait_for_user = true; // Wait for user to load filament
|
||||
nozzle_timed_out = false;
|
||||
#ifdef ANYCUBIC_TFT_DEBUG
|
||||
AnycubicTFT.PausedByNozzleTimeout = false;
|
||||
#endif
|
||||
|
||||
#if HAS_BUZZER
|
||||
filament_change_beep(max_beep_count, true);
|
||||
@@ -7320,7 +7338,11 @@ inline void gcode_M17() {
|
||||
if (!did_pause_print) return;
|
||||
|
||||
// Re-enable the heaters if they timed out
|
||||
bool nozzle_timed_out = false;
|
||||
nozzle_timed_out = false;
|
||||
#ifdef ANYCUBIC_TFT_MODEL
|
||||
AnycubicTFT.PausedByNozzleTimeout = false;
|
||||
#endif
|
||||
|
||||
HOTEND_LOOP() {
|
||||
nozzle_timed_out |= thermalManager.is_heater_idle(e);
|
||||
thermalManager.reset_heater_idle_timer(e);
|
||||
|
@@ -41,7 +41,7 @@
|
||||
* Defines the version of the Marlin-AI3M build. Not to be confused with
|
||||
* Marlin's own build number, e.g. 1.1.9.
|
||||
*/
|
||||
#define CUSTOM_BUILD_VERSION "v1.4.2"
|
||||
#define CUSTOM_BUILD_VERSION "v1.4.3"
|
||||
|
||||
/**
|
||||
* Verbose version identifier which should contain a reference to the location
|
||||
@@ -54,7 +54,7 @@
|
||||
* here we define this default string as the date where the latest release
|
||||
* version was tagged.
|
||||
*/
|
||||
#define STRING_DISTRIBUTION_DATE "2019-02-24"
|
||||
#define STRING_DISTRIBUTION_DATE "2019-03-06"
|
||||
|
||||
/**
|
||||
* Required minimum Configuration.h and Configuration_adv.h file versions.
|
||||
|
@@ -137,7 +137,7 @@
|
||||
#define MSG_INVALID_EXTRUDER "Invalid extruder"
|
||||
#define MSG_INVALID_SOLENOID "Invalid solenoid"
|
||||
#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature"
|
||||
#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID " MARLIN-AI3M_VERSION:" CUSTOM_BUILD_VERSION
|
||||
#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin " DETAILED_BUILD_VERSION " MARLIN-AI3M_VERSION:" CUSTOM_BUILD_VERSION " SOURCE_CODE_URL:" SOURCE_CODE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" MACHINE_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID
|
||||
#define MSG_MARLIN_AI3M "Marlin-AI3M"
|
||||
#define MSG_COUNT_X " Count X:"
|
||||
#define MSG_COUNT_A " Count A:"
|
||||
|
Reference in New Issue
Block a user