diff --git a/octoprint_bambu_printer/printer/bambu_virtual_printer.py b/octoprint_bambu_printer/printer/bambu_virtual_printer.py index d24b0fa..6633920 100644 --- a/octoprint_bambu_printer/printer/bambu_virtual_printer.py +++ b/octoprint_bambu_printer/printer/bambu_virtual_printer.py @@ -272,12 +272,7 @@ class BambuVirtualPrinter: return self._serial_io.readline() def readlines(self) -> list[bytes]: - result = [] - next_line = self._serial_io.readline() - while next_line != b"": - result.append(next_line) - next_line = self._serial_io.readline() - return result + return self._serial_io.readlines() def sendIO(self, line: str): self._serial_io.send(line) @@ -504,24 +499,10 @@ class BambuVirtualPrinter: self._writingToSdFile = None self.sendIO("Done saving file") - def _setMainThreadBusy(self, reason="processing"): - def loop(): - while self._busy_reason is not None: - self.sendIO(f"echo:busy {self._busy_reason}") - time.sleep(self._busy_interval) - self._serial_io.sendOk() - - self._busy_reason = reason - self._busy_loop = threading.Thread(target=loop) - self._busy_loop.daemon = True - self._busy_loop.start() - - def _setMainThreadIdle(self): - self._busy_reason = None - def close(self): if self.bambu_client.connected: self.bambu_client.disconnect() + self.change_state(self._state_idle) self._serial_io.close() def _showPrompt(self, text, choices): diff --git a/octoprint_bambu_printer/printer/printer_serial_io.py b/octoprint_bambu_printer/printer/printer_serial_io.py index 0a9e877..7ce55d5 100644 --- a/octoprint_bambu_printer/printer/printer_serial_io.py +++ b/octoprint_bambu_printer/printer/printer_serial_io.py @@ -1,5 +1,6 @@ from __future__ import annotations +from io import BufferedIOBase import logging import queue import re @@ -13,7 +14,7 @@ from serial import SerialTimeoutException from .char_counting_queue import CharCountingQueue -class PrinterSerialIO(threading.Thread): +class PrinterSerialIO(threading.Thread, BufferedIOBase): command_regex = re.compile(r"^([GM])(\d+)") def __init__( @@ -90,8 +91,7 @@ class PrinterSerialIO(threading.Thread): self.join() def flush(self): - with self.input_bytes.all_tasks_done: - self.input_bytes.all_tasks_done.wait() + self.input_bytes.join() def write(self, data: bytes) -> int: data = to_bytes(data, errors="replace") @@ -126,6 +126,14 @@ class PrinterSerialIO(threading.Thread): # queue empty? return empty line return b"" + def readlines(self): + result = [] + next_line = self.readline() + while next_line != b"": + result.append(next_line) + next_line = self.readline() + return result + def send(self, line: str) -> None: if self.output_bytes is not None: self.output_bytes.put(line) diff --git a/octoprint_bambu_printer/printer/states/print_finished_state.py b/octoprint_bambu_printer/printer/states/print_finished_state.py index dce0684..d0acf5b 100644 --- a/octoprint_bambu_printer/printer/states/print_finished_state.py +++ b/octoprint_bambu_printer/printer/states/print_finished_state.py @@ -12,8 +12,5 @@ class PrintFinishedState(APrinterState): def _finishSdPrint(self): if self._printer.is_running: self._printer.sendIO("Done printing file") - self._selectedSdFilePos = 0 - self._selectedSdFileSize = 0 - self._sdPrinting = False - self._sdPrintStarting = False - self._sdPrinter = None + + self._printer.change_state(self._printer._state_idle) diff --git a/test/test_gcode_execution.py b/test/test_gcode_execution.py index c56affd..9fcbbfe 100644 --- a/test/test_gcode_execution.py +++ b/test/test_gcode_execution.py @@ -133,7 +133,8 @@ def printer(output_test_folder, settings, profile_manager, log_test, ftps_sessio faked_baudrate=115200, ) serial_obj._bambu_client = MagicMock() - return serial_obj + yield serial_obj + serial_obj.close() def test_initial_state(printer: BambuVirtualPrinter): @@ -142,7 +143,7 @@ def test_initial_state(printer: BambuVirtualPrinter): def test_list_sd_card(printer: BambuVirtualPrinter): printer.write(b"M20\n") # GCode for listing SD card - printer.close() + printer.flush() result = printer.readlines() assert result == "" # Replace with the actual expected result