From dcc660580942fac4872e85ce80b143e086662d36 Mon Sep 17 00:00:00 2001 From: "D.R.racer" Date: Mon, 11 Jan 2021 11:13:40 +0100 Subject: [PATCH] Workaround for skipping large comment blocks If there are large blocks of comments in the G-code, the printer may get shot down by its own watchdog. Watchdog is generally set to 4s and updated only in manage_heaters (and some other spots in some specific cases). So far, the code reading the file and feeding it into Marlin cycles indefinitely until it finds valid G-code lines and fills up the command queue. If the block is large enough, the printer cannot read it completely within those 4s. A simple workaround - bail out after some consecutive empty/comment lines to enable other parts of code do their job (especially manage_heaters). Tested on MK404, previous FW fails with 600KB of comment lines at the beginning, this patch survives. The printer even draws some update on its status screen before starting a real print. --- Firmware/cmdqueue.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Firmware/cmdqueue.cpp b/Firmware/cmdqueue.cpp index afdddfba..f0ac1b39 100755 --- a/Firmware/cmdqueue.cpp +++ b/Firmware/cmdqueue.cpp @@ -573,6 +573,7 @@ void get_command() // this character _can_ occur in serial com, due to checksums. however, no checksums are used in SD printing static bool stop_buffering=false; + static uint8_t consecutiveEmptyLines = 0; if(buflen==0) stop_buffering=false; union { struct { @@ -586,11 +587,12 @@ void get_command() while( !card.eof() && !stop_buffering) { int16_t n=card.get(); char serial_char = (char)n; - if(serial_char == '\n' || - serial_char == '\r' || - ((serial_char == '#' || serial_char == ':') && comment_mode == false) || - serial_count >= (MAX_CMD_SIZE - 1) || n==-1) - { + if( serial_char == '\n' + || serial_char == '\r' + || ((serial_char == '#' || serial_char == ':') && comment_mode == false) + || serial_count >= (MAX_CMD_SIZE - 1) + || n==-1 + ){ if(serial_char=='#') stop_buffering=true; @@ -602,6 +604,10 @@ void get_command() // so that the lenght of the already read empty lines and comments will be added // to the following non-empty line. comment_mode = false; + if( ++consecutiveEmptyLines > 250 ){ + consecutiveEmptyLines = 0; + return; // prevent cycling indefinitely - let manage_heaters do their job + } continue; //if empty line } // The new command buffer could be updated non-atomically, because it is not yet considered @@ -638,9 +644,10 @@ void get_command() comment_mode = false; //for new command serial_count = 0; //clear buffer + consecutiveEmptyLines = 0; // reached a non-empty line which shall be enqueued if(card.eof()) break; - + // The following line will reserve buffer space if available. if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1, true)) return;