From 53e1f88e1a70323ed8beb8fb95cde8d6075defd2 Mon Sep 17 00:00:00 2001 From: Anton Skrypnyk Date: Wed, 24 Jul 2024 17:15:47 +0300 Subject: [PATCH] Fix serial io exception handling. Fix file system data fetch. --- .../printer/bambu_virtual_printer.py | 3 +-- .../printer/gcode_executor.py | 3 +-- .../printer/printer_serial_io.py | 2 ++ .../printer/remote_sd_card_file_list.py | 14 +++++++------- test/test_gcode_execution.py | 17 +++++++++++++++-- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/octoprint_bambu_printer/printer/bambu_virtual_printer.py b/octoprint_bambu_printer/printer/bambu_virtual_printer.py index 223dfb4..8943bd6 100644 --- a/octoprint_bambu_printer/printer/bambu_virtual_printer.py +++ b/octoprint_bambu_printer/printer/bambu_virtual_printer.py @@ -286,8 +286,7 @@ class BambuVirtualPrinter: @gcode_executor.register("M23") def _select_sd_file(self, data: str) -> bool: filename = data.split(maxsplit=1)[1].strip() - self.file_system.select_file(filename) - return True + return self.file_system.select_file(filename) @gcode_executor.register("M26") def _set_sd_position(self, data: str) -> bool: diff --git a/octoprint_bambu_printer/printer/gcode_executor.py b/octoprint_bambu_printer/printer/gcode_executor.py index 0f0b21f..d86d071 100644 --- a/octoprint_bambu_printer/printer/gcode_executor.py +++ b/octoprint_bambu_printer/printer/gcode_executor.py @@ -313,8 +313,7 @@ class GCodeExecutor: return True except Exception as e: self._log.error(f"Error during gcode {gcode_info}") - self._log.error(e, exc_info=True) - return False + raise def _gcode_with_info(self, gcode): return f"{gcode} ({GCODE_DOCUMENTATION.get(gcode, 'Info not specified')})" diff --git a/octoprint_bambu_printer/printer/printer_serial_io.py b/octoprint_bambu_printer/printer/printer_serial_io.py index 36c750c..dc0aeb7 100644 --- a/octoprint_bambu_printer/printer/printer_serial_io.py +++ b/octoprint_bambu_printer/printer/printer_serial_io.py @@ -76,6 +76,8 @@ class PrinterSerialIO(threading.Thread, BufferedIOBase): continue except Exception as e: self._error_detected = e + self.input_bytes.task_done() + self.input_bytes.clear() break self._log.debug("Closing IO read loop") diff --git a/octoprint_bambu_printer/printer/remote_sd_card_file_list.py b/octoprint_bambu_printer/printer/remote_sd_card_file_list.py index ab978f5..219b045 100644 --- a/octoprint_bambu_printer/printer/remote_sd_card_file_list.py +++ b/octoprint_bambu_printer/printer/remote_sd_card_file_list.py @@ -95,10 +95,12 @@ class RemoteSDCardFileList: def _get_file_data(self, file_path: str) -> FileInfo | None: self._logger.debug(f"_getSdFileData: {file_path}") + + # replace if name is an alias file_name = Path(file_path).name.lower() - full_file_name = self._file_alias_cache.get(file_name, None) - if full_file_name is not None: - data = self._file_data_cache.get(file_name, None) + file_name = self._file_alias_cache.get(file_name, file_name) + + data = self._file_data_cache.get(file_name, None) self._logger.debug(f"_getSdFileData: {data}") return data @@ -133,10 +135,8 @@ class RemoteSDCardFileList: file_name = Path(file_path).name file_info = self._get_file_data(file_name) if file_info is None: - file_info = self._get_file_data(file_name) - if file_info is None: - self._logger.error(f"{file_name} open failed") - return False + self._logger.error(f"{file_name} open failed") + return False if ( self._selected_file_info is not None diff --git a/test/test_gcode_execution.py b/test/test_gcode_execution.py index bd70e0c..ba79860 100644 --- a/test/test_gcode_execution.py +++ b/test/test_gcode_execution.py @@ -135,7 +135,7 @@ def printer(output_test_folder, settings, profile_manager, log_test, ftps_sessio profile_manager, data_folder=output_test_folder, serial_log_handler=log_test, - read_timeout=5.0, + read_timeout=0.01, faked_baudrate=115200, ) serial_obj._bambu_client = MagicMock() @@ -161,17 +161,30 @@ def test_list_sd_card(printer: BambuVirtualPrinter): def test_cannot_start_print_without_file(printer: BambuVirtualPrinter): printer.write(b"M24\n") printer.flush() - result = printer.readlines() assert result[0] == b"ok" assert isinstance(printer.current_state, IdleState) +def test_non_existing_file_not_ok(printer: BambuVirtualPrinter): + printer.write(b"M23 non_existing.3mf\n") + printer.flush() + result = printer.readlines() + assert result[0] == b"ok" + assert printer.file_system.selected_file is None + + def test_print_started_with_selected_file(printer: BambuVirtualPrinter): assert printer.file_system.selected_file is None + printer.write(b"M20\n") + printer.flush() + printer.readlines() + printer.write(b"M23 print.3mf\n") printer.flush() + result = printer.readlines() + assert result[0] == b"ok" assert printer.file_system.selected_file is not None assert printer.file_system.selected_file.file_name == "print.3mf"