Fix serial io read loop.

This commit is contained in:
Anton Skrypnyk 2024-07-24 17:15:46 +03:00
parent 06c9d68390
commit a13a5a1e2a
2 changed files with 10 additions and 8 deletions

View File

@ -64,24 +64,25 @@ class PrinterSerialIO(threading.Thread):
data = to_bytes(data, encoding="ascii", errors="replace") data = to_bytes(data, encoding="ascii", errors="replace")
self.input_bytes.task_done() self.input_bytes.task_done()
line, buffer = self._read_next_line_buffered(data, buffer) buffer += data
line, buffer = self._read_next_line(buffer)
while line is not None: while line is not None:
self._received_lines += 1 self._received_lines += 1
self._process_input_gcode_line(line) self._process_input_gcode_line(line)
line, buffer = self._read_next_line_buffered(data, buffer) line, buffer = self._read_next_line(buffer)
except queue.Empty: except queue.Empty:
continue continue
self._log.debug("Closing IO read loop") self._log.debug("Closing IO read loop")
def _read_next_line_buffered(self, additional: bytes, buffer: bytes): def _read_next_line(self, buffer: bytes):
buffer += additional
new_line_pos = buffer.find(b"\n") + 1 new_line_pos = buffer.find(b"\n") + 1
if new_line_pos > 0: if new_line_pos > 0:
additional = buffer[:new_line_pos] line = buffer[:new_line_pos]
buffer = buffer[new_line_pos:] buffer = buffer[new_line_pos:]
return line, buffer
return additional, buffer else:
return None, buffer
def close(self): def close(self):
self.flush() self.flush()

View File

@ -96,6 +96,7 @@ def ftps_session_mock(files_info_ftp):
ftps_session.size.side_effect = DictGetter( ftps_session.size.side_effect = DictGetter(
{file: info[0] for file, info in files_info_ftp.items()} {file: info[0] for file, info in files_info_ftp.items()}
) )
ftps_session.sendcmd.side_effect = DictGetter( ftps_session.sendcmd.side_effect = DictGetter(
{f"MDTM {file}": info[1] for file, info in files_info_ftp.items()} {f"MDTM {file}": info[1] for file, info in files_info_ftp.items()}
) )
@ -141,7 +142,7 @@ def test_initial_state(printer: BambuVirtualPrinter):
def test_list_sd_card(printer: BambuVirtualPrinter): def test_list_sd_card(printer: BambuVirtualPrinter):
printer.write(b"M20\n") # GCode for listing SD card printer.write(b"M20\n") # GCode for listing SD card
printer.flush() printer.close()
result = printer.readlines() result = printer.readlines()
assert result == "" # Replace with the actual expected result assert result == "" # Replace with the actual expected result