fix against too fast sending acycling display command

Anycubic 1.0 display ignores acyclic telegrams as J23 or J18 if they are sent too fast after last cyclic telegram.
This results for the user in sporadic not occuring mask "Lack of filament..." or no continue button at filament sensor or M600 G-Code command.
The last issue is catatrophic for the print job because interrupted at this point.
This commit fix the problem by integrating a minimum time delay which was seen at original anycubic i3 mega S fw.
This commit is contained in:
core.editor
2024-06-03 20:57:32 +02:00
parent 09e49ea1b3
commit a34fa2fae8
2 changed files with 73 additions and 18 deletions

View File

@@ -78,7 +78,8 @@ static void sendLine_P(PGM_P str) {
AnycubicMediaPrintState AnycubicTouchscreenClass::mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; AnycubicMediaPrintState AnycubicTouchscreenClass::mediaPrintingState = AMPRINTSTATE_NOT_PRINTING;
AnycubicMediaPauseState AnycubicTouchscreenClass::mediaPauseState = AMPAUSESTATE_NOT_PAUSED; AnycubicMediaPauseState AnycubicTouchscreenClass::mediaPauseState = AMPAUSESTATE_NOT_PAUSED;
uint32_t AnycubicTouchscreenClass::time_last_cyclic_tft_command = 0;
uint8_t AnycubicTouchscreenClass::delayed_tft_command = 0;
#if ENABLED(POWER_OUTAGE_TEST) #if ENABLED(POWER_OUTAGE_TEST)
int PowerInt = 6; int PowerInt = 6;
@@ -261,10 +262,13 @@ void AnycubicTouchscreenClass::ResumePrint() {
// trigger the user message box // trigger the user message box
DoFilamentRunoutCheck(); DoFilamentRunoutCheck();
if ( millis() - time_last_cyclic_tft_command >= WAIT_MS_UNTIL_ACYCLIC_SEND ) {
// re-enable the continue button // re-enable the continue button
SENDLINE_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still " SENDLINE_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still "
"tripped... J18"); "tripped... J18");
}
else
delayed_tft_command = 18;
return; return;
} }
#endif #endif
@@ -1011,8 +1015,12 @@ void AnycubicTouchscreenClass::DoFilamentRunoutCheck() {
// play tone to indicate filament is out // play tone to indicate filament is out
injectCommands(F("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 " injectCommands(F("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 "
"S1567\nM300 P200 S1174\nM300 P2000 S1567")); "S1567\nM300 P200 S1174\nM300 P2000 S1567"));
if ( millis() - time_last_cyclic_tft_command >= WAIT_MS_UNTIL_ACYCLIC_SEND ) {
// tell the user that the filament has run out and wait // tell the user that the filament has run out and wait
SENDLINE_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); SENDLINE_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23");
}
else
delayed_tft_command = 23;
} else { } else {
SENDLINE_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); SENDLINE_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15");
} }
@@ -1040,30 +1048,50 @@ void AnycubicTouchscreenClass::UserConfirmRequired(const char* const msg) {
if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) { if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) {
mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPrintingState = AMPRINTSTATE_PAUSED;
mediaPauseState = AMPAUSESTATE_PARKED; mediaPauseState = AMPAUSESTATE_PARKED;
if ( millis() - time_last_cyclic_tft_command >= WAIT_MS_UNTIL_ACYCLIC_SEND ) {
// enable continue button // enable continue button
SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18");
}
else
delayed_tft_command = 18;
} else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { } else if (strcmp_P(msg, PSTR("Load Filament")) == 0) {
mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPrintingState = AMPRINTSTATE_PAUSED;
mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; mediaPauseState = AMPAUSESTATE_FILAMENT_OUT;
if ( millis() - time_last_cyclic_tft_command >= WAIT_MS_UNTIL_ACYCLIC_SEND ) {
// enable continue button // enable continue button
SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18");
SENDLINE_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); SENDLINE_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23");
}
else
delayed_tft_command = 118;
} else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { } else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) {
mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPrintingState = AMPRINTSTATE_PAUSED;
mediaPauseState = AMPAUSESTATE_FILAMENT_PURGING; mediaPauseState = AMPAUSESTATE_FILAMENT_PURGING;
if ( millis() - time_last_cyclic_tft_command >= WAIT_MS_UNTIL_ACYCLIC_SEND ) {
// enable continue button // enable continue button
SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18");
}
else
delayed_tft_command = 18;
} else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { } else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) {
mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPrintingState = AMPRINTSTATE_PAUSED;
mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT;
if ( millis() - time_last_cyclic_tft_command >= WAIT_MS_UNTIL_ACYCLIC_SEND ) {
// enable continue button // enable continue button
SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18");
}
else
delayed_tft_command = 18;
} else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) { } else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) {
mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPrintingState = AMPRINTSTATE_PAUSED;
mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED; mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED;
if ( millis() - time_last_cyclic_tft_command >= WAIT_MS_UNTIL_ACYCLIC_SEND ) {
// enable continue button // enable continue button
SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); SENDLINE_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18");
} }
else
delayed_tft_command = 18;
}
#endif #endif
} }
@@ -1288,6 +1316,7 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
} else { } else {
SEND_PGM_VAL("A20V ", feedrate_percentage); SEND_PGM_VAL("A20V ", feedrate_percentage);
SENDLINE_PGM(""); SENDLINE_PGM("");
time_last_cyclic_tft_command = millis();
} }
} }
break; break;
@@ -2062,6 +2091,29 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
TFTbuflen = (TFTbuflen - 1); TFTbuflen = (TFTbuflen - 1);
TFTbufindr = (TFTbufindr + 1) % TFTBUFSIZE; TFTbufindr = (TFTbufindr + 1) % TFTBUFSIZE;
} }
// In case of too short time after last cyclic tft command it has to be
// wait to avoid missing action after acyclic command by the tft.
if ( (delayed_tft_command > 0) && ( millis() - time_last_cyclic_tft_command >= WAIT_MS_UNTIL_ACYCLIC_SEND ) ) {
switch (delayed_tft_command) {
case 23: {
SENDLINE_DBG_PGM("J23", "TFT Serial Debug: delayed J23");
delayed_tft_command = 0;
break;
}
case 18: {
SENDLINE_DBG_PGM("J18", "TFT Serial Debug: delayed J18");
delayed_tft_command = 0;
break;
}
case 118: {
SENDLINE_DBG_PGM("J23", "TFT Serial Debug: delayed J23");
SENDLINE_DBG_PGM("J18", "TFT Serial Debug: delayed J18");
delayed_tft_command = 0;
break;
}
}
}
} }
void AnycubicTouchscreenClass::OnPrintTimerStarted() { void AnycubicTouchscreenClass::OnPrintTimerStarted() {

View File

@@ -138,6 +138,7 @@ enum AnycubicMediaPauseState {
#define SM_BLTZ_EXIT_L "<SAVE and EXIT>" #define SM_BLTZ_EXIT_L "<SAVE and EXIT>"
#define SM_HS_DISABLE_L "<Disable HiSpeed Mode>" #define SM_HS_DISABLE_L "<Disable HiSpeed Mode>"
#define SM_HS_ENABLE_L "<Enable HiSpeed Mode>" #define SM_HS_ENABLE_L "<Enable HiSpeed Mode>"
#define WAIT_MS_UNTIL_ACYCLIC_SEND 500
#endif // !KNUTWURST_DGUS2_TFT #endif // !KNUTWURST_DGUS2_TFT
#if ENABLED(KNUTWURST_DGUS2_TFT) #if ENABLED(KNUTWURST_DGUS2_TFT)
@@ -228,6 +229,8 @@ class AnycubicTouchscreenClass {
static AnycubicMediaPrintState mediaPrintingState; static AnycubicMediaPrintState mediaPrintingState;
static AnycubicMediaPauseState mediaPauseState; static AnycubicMediaPauseState mediaPauseState;
static uint32_t time_last_cyclic_tft_command;
static uint8_t delayed_tft_command;
#if defined(POWER_OUTAGE_TEST) #if defined(POWER_OUTAGE_TEST)
struct OutageDataStruct { struct OutageDataStruct {