From 69c6b0f81256cec112ded2d22a630be25759eab6 Mon Sep 17 00:00:00 2001 From: InsanityAutomation Date: Wed, 12 Apr 2023 20:09:46 -0400 Subject: [PATCH] Serial comms tweaks to improve responsiveness on screens that wont honor disabling x82 ack --- Marlin/Configuration.h | 1 + Marlin/src/HAL/AVR/HAL.h | 2 +- Marlin/src/HAL/AVR/MarlinSerial.cpp | 2 +- Marlin/src/HAL/AVR/MarlinSerial.h | 4 +- Marlin/src/HAL/LPC1768/HAL.h | 2 +- Marlin/src/HAL/STM32/HAL.h | 2 +- Marlin/src/HAL/STM32F1/HAL.h | 2 +- .../src/lcd/extui/ia_dwin/Creality_DWIN.cpp | 65 +++++++++++++++---- 8 files changed, 60 insertions(+), 20 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 0ebf13badb..527d377095 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2,6 +2,7 @@ #define INSANITYAUTOMATION_DWIN +#define DWINOS_4 #if ENABLED(VULCAN) #define VULCAN_OFFSET 4 diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index bbf64a0bd0..99d42a6a94 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -139,7 +139,7 @@ typedef Servo hal_servo_t; #error "LCD_SERIAL_PORT must be from 0 to 3." #endif #define LCD_SERIAL lcdSerial - #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) + #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) || ENABLED(DWINOS_4) #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.get_tx_buffer_free() #endif #endif diff --git a/Marlin/src/HAL/AVR/MarlinSerial.cpp b/Marlin/src/HAL/AVR/MarlinSerial.cpp index eedbeb2d5d..a320fb8adf 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.cpp +++ b/Marlin/src/HAL/AVR/MarlinSerial.cpp @@ -629,7 +629,7 @@ MSerialT1 customizedSerial1(MSerialT1::HasEmergencyParser); template class MarlinSerial< LCDSerialCfg >; MSerialLCD lcdSerial(MSerialLCD::HasEmergencyParser); - #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) + #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) || ENABLED(DWINOS_4) template typename MarlinSerial::ring_buffer_pos_t MarlinSerial::get_tx_buffer_free() { const ring_buffer_pos_t t = tx_buffer.tail, // next byte to send. diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 0b6ed9ded4..a28d478119 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -212,7 +212,7 @@ static ring_buffer_pos_t available(); static void write(const uint8_t c); static void flushTX(); - #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) + #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) || ENABLED(DWINOS_4) static ring_buffer_pos_t get_tx_buffer_free(); #endif @@ -283,7 +283,7 @@ static constexpr bool DROPPED_RX = false; static constexpr bool RX_FRAMING_ERRORS = false; static constexpr bool MAX_RX_QUEUED = false; - static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS); + static constexpr bool RX_OVERRUNS = (BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS) || ENABLED(DWINOS_4)); }; typedef Serial1Class< MarlinSerial< LCDSerialCfg > > MSerialLCD; diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index b0eeb983b4..6e417fa50d 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -100,7 +100,7 @@ extern DefaultSerial1 USBSerial; #else #error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB." #endif - #if HAS_DGUS_LCD + #if HAS_DGUS_LCD || ENABLED(DWINOS_4) #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.available() #endif #endif diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index 384c684497..3e5afa60d0 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -112,7 +112,7 @@ #else #error "LCD_SERIAL_PORT must be from 1 to 6, or -1 for Native USB." #endif - #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) + #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) || ENABLED(DWINOS_4) #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() #endif #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index c6eef8f4fd..43c286ca20 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -139,7 +139,7 @@ #define LCD_SERIAL MSERIAL(1) // dummy port static_assert(false, "LCD_SERIAL_PORT must be from 1 to " STRINGIFY(NUM_UARTS) ". You can also use -1 if the board supports Native USB.") #endif - #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) + #if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH) || ENABLED(DWINOS_4) #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() #endif #endif diff --git a/Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp b/Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp index cc5a4c643e..6b57971019 100644 --- a/Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp +++ b/Marlin/src/lcd/extui/ia_dwin/Creality_DWIN.cpp @@ -377,7 +377,6 @@ void onIdle() rtscheck.RTS_SndData(2, PowerLossToggle); /*Off*/ #endif - if (startprogress == 0) { startprogress += 25; @@ -385,10 +384,10 @@ void onIdle() } else if( startprogress < 250) { - if(isMediaInserted()) //Re init media as it happens too early on STM32 boards often - onMediaInserted(); - else - injectCommands_P(PSTR("M22\nM21")); + //if(isMediaInserted()) //Re init media as it happens too early on STM32 boards often + // onMediaInserted(); + //else + // injectCommands_P(PSTR("M22\nM21")); startprogress = 254; //SERIAL_ECHOLNPGM_P(PSTR(" startprogress ")); InforShowStatus = true; @@ -432,6 +431,7 @@ void onIdle() rtscheck.RTS_SndData(0, PrintscheduleIcon + 1); } rtscheck.RTS_SndData((unsigned int)getProgress_percent(), Percentage); + } else { // Not printing settings rtscheck.RTS_SndData(map(constrain(Settings.display_volume, 0, 255), 0, 255, 0, 100), VolumeDisplay); @@ -567,6 +567,11 @@ void onIdle() rtscheck.RTS_SndData(10 * getAxisPosition_mm((axis_t)Y), DisplayYaxis); rtscheck.RTS_SndData(10 * getAxisPosition_mm((axis_t)Z), DisplayZaxis); } + + #if ENABLED(DWINOS_4) + int dataRec2; + do { dataRec2 = rtscheck.RTS_RecData(); } while (dataRec2 > 0); // Since OS4 returns an ack on an 82 command, receive and purge it now + #endif reEntryPrevent = false; } @@ -662,10 +667,10 @@ int RTSSHOW::RTS_RecData() recdat.data[i/2]= (recdat.data[i/2] << 8 )| tmp[4+i]; } - SERIAL_ECHOLNPGM("VP received: ", vp , " - len ", tmp[2]); + //SERIAL_ECHOLNPGM("VP received: ", vp , " - len ", tmp[2]); - SERIAL_ECHOLNPGM("d1: ", tmp[3] , " - d2 ", tmp[4]); - SERIAL_ECHOLNPGM("d3: ", tmp[5] , " - d4 ", tmp[6]); + //SERIAL_ECHOLNPGM("d1: ", tmp[3] , " - d2 ", tmp[4]); + //SERIAL_ECHOLNPGM("d3: ", tmp[5] , " - d4 ", tmp[6]); rx_datagram_state = DGUS_IDLE; RTS_HandleData(); @@ -758,6 +763,23 @@ void RTSSHOW::RTS_SndData(const char *str, unsigned long addr, unsigned char cmd DWIN_SERIAL.write(databuf[i]); delay_us(1); } + + uint8_t expected_tx = 6 + len; // 6 bytes header + payload. + const millis_t try_until = ExtUI::safe_millis() + 1000; + + while (expected_tx > DWIN_SERIAL.get_tx_buffer_free()) { + if (ELAPSED(ExtUI::safe_millis(), try_until)) return false; // Stop trying after 1 second + + #ifdef ARDUINO_ARCH_STM32 + LCD_SERIAL.flush(); + #else + LCD_SERIAL.flushTX(); + #endif + delay(50); + } + + int dataRec2; + do { dataRec2 = rtscheck.RTS_RecData(); } while (dataRec2 > 0); // Since OS4 returns an ack on an 82 command, receive and purge it now memset(databuf, 0, sizeof(databuf)); } } @@ -871,6 +893,23 @@ void RTSSHOW::WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, } DWIN_SERIAL.write(x); } + + uint8_t expected_tx = 6 + valueslen; // 6 bytes header + payload. + const millis_t try_until = ExtUI::safe_millis() + 1000; + + while (expected_tx > DWIN_SERIAL.get_tx_buffer_free()) { + if (ELAPSED(ExtUI::safe_millis(), try_until)) return false; // Stop trying after 1 second + + #ifdef ARDUINO_ARCH_STM32 + LCD_SERIAL.flush(); + #else + LCD_SERIAL.flushTX(); + #endif + delay(50); + } + + int dataRec2; + do { dataRec2 = rtscheck.RTS_RecData(); } while (dataRec2 > 0); // Since OS4 returns an ack on an 82 command, receive and purge it now } void RTSSHOW::RTS_HandleData() @@ -885,8 +924,8 @@ void RTSSHOW::RTS_HandleData() recdat.head[1] = FHTWO; return; } - SERIAL_ECHOLNPGM("recdat.data[0] ==", recdat.data[0]); - SERIAL_ECHOLNPGM("recdat.addr ==", recdat.addr); + //SERIAL_ECHOLNPGM("recdat.data[0] ==", recdat.data[0]); + //SERIAL_ECHOLNPGM("recdat.addr ==", recdat.addr); for (int i = 0; Addrbuf[i] != 0; i++) { if (recdat.addr == Addrbuf[i]) @@ -972,8 +1011,8 @@ void RTSSHOW::RTS_HandleData() else if (recdat.addr >= SDFILE_ADDR && recdat.addr <= (SDFILE_ADDR + 10 * (FileNum + 1))) Checkkey = Filename; - SERIAL_ECHOLNPGM_P(PSTR("== Checkkey==")); - SERIAL_ECHOLN(Checkkey); + //SERIAL_ECHOLNPGM_P(PSTR("== Checkkey==")); + //SERIAL_ECHOLN(Checkkey); if (Checkkey < 0) { @@ -1137,7 +1176,7 @@ void RTSSHOW::RTS_HandleData() NozzleTempStatus[2] = 1; PrinterStatusKey[1] = 0; InforShowStatus = true; - RTS_SndData(ExchangePageBase + 82, ExchangepageAddr); + RTS_SndData(ExchangePageBase + 68, ExchangepageAddr); } break;