Fix sporadic display issues on Anycubic 1.0 display #536

Merged
uwetaz merged 3 commits from fix_sporadic_display_issues into master 2024-06-03 15:26:12 -05:00
2 changed files with 197 additions and 142 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
@@ -1000,7 +1004,6 @@ void AnycubicTouchscreenClass::FilamentRunout() {
DoFilamentRunoutCheck(); DoFilamentRunoutCheck();
} }
void AnycubicTouchscreenClass::DoFilamentRunoutCheck() { void AnycubicTouchscreenClass::DoFilamentRunoutCheck() {
#if ENABLED(FILAMENT_RUNOUT_SENSOR) #if ENABLED(FILAMENT_RUNOUT_SENSOR)
// NOTE: getFilamentRunoutState() only returns the runout state if the job is // NOTE: getFilamentRunoutState() only returns the runout state if the job is
@@ -1012,9 +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");
} }
@@ -1042,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
} }
@@ -1107,6 +1133,7 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
case 4: // A4 GET FAN SPEED case 4: // A4 GET FAN SPEED
SEND_PGM_VAL("A4V ", int(getActualFan_percent(FAN0))); SEND_PGM_VAL("A4V ", int(getActualFan_percent(FAN0)));
break; break;
case 5: // A5 GET CURRENT COORDINATE case 5: // A5 GET CURRENT COORDINATE
SEND_PGM("A5V X: "); SEND_PGM("A5V X: ");
LCD_SERIAL.print(current_position[X_AXIS]); LCD_SERIAL.print(current_position[X_AXIS]);
@@ -1289,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;
@@ -1654,7 +1682,7 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
} }
break; break;
#endif #endif // if ENABLED(KNUTWURST_CHIRON)
#if ENABLED(KNUTWURST_4MAXP2) #if ENABLED(KNUTWURST_4MAXP2)
@@ -1702,7 +1730,6 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
break; break;
#endif // #if ENABLED(KNUTWURST_4MAXP2) #endif // #if ENABLED(KNUTWURST_4MAXP2)
case 32: // a32 clean leveling beep flag case 32: // a32 clean leveling beep flag
break; break;
@@ -1840,7 +1867,9 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
} else { } else {
Laser_printer_st.pic_vector = 0; Laser_printer_st.pic_vector = 0;
} }
}
break; break;
case 37: case 37:
if (CodeSeen('S')) { if (CodeSeen('S')) {
int coorvalue; int coorvalue;
@@ -1961,11 +1990,11 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
default: default:
break; break;
} } // switch
} }
TFTbufindw = (TFTbufindw + 1) % TFTBUFSIZE; TFTbufindw = (TFTbufindw + 1) % TFTBUFSIZE;
TFTbuflen += 1; TFTbuflen += 1;
} } // if (!TFTcomment_mode)
serial3_count = 0; // clear buffer serial3_count = 0; // clear buffer
} else { } else {
if (serial3_char == ';') { if (serial3_char == ';') {
@@ -1975,8 +2004,8 @@ void AnycubicTouchscreenClass::GetCommandFromTFT() {
TFTcmdbuffer[TFTbufindw][serial3_count++] = serial3_char; TFTcmdbuffer[TFTbufindw][serial3_count++] = serial3_char;
} }
} }
} } // while
} }
#if ENABLED(KNUTWURST_MEGA_P_LASER) #if ENABLED(KNUTWURST_MEGA_P_LASER)
void prepare_laser_print() { void prepare_laser_print() {
@@ -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 {