From 7a4439c53eace8f25b2055f005f22da5522fac74 Mon Sep 17 00:00:00 2001 From: Pavulon87 Date: Mon, 12 Feb 2024 09:49:24 +0100 Subject: [PATCH] allow use of cache folder and custom g-gcode commands --- octoprint_bambu_printer/virtual.py | 63 +++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/octoprint_bambu_printer/virtual.py b/octoprint_bambu_printer/virtual.py index 6bdd8a7..0d35d6e 100644 --- a/octoprint_bambu_printer/virtual.py +++ b/octoprint_bambu_printer/virtual.py @@ -68,6 +68,7 @@ class BambuPrinter: self._sdCardReady = True self._sdPrinter = None self._sdPrinting = False + self._sdPrintStarting = False self._sdPrintingSemaphore = threading.Event() self._sdPrintingPausedSemaphore = threading.Event() self._selectedSdFile = None @@ -163,13 +164,14 @@ class BambuPrinter: self.bedTargetTemp = temperatures.get("target_bed_temp", 0.0) self.chamberTemp = temperatures.get("chamber_temp", 0.0) - if print_job.get("gcode_state") == "RUNNING": + if print_job.get("gcode_state") == "RUNNING" or print_job.get("gcode_state") == "PREPARE": if not self._sdPrintingSemaphore.is_set(): self._sdPrintingSemaphore.set() if self._sdPrintingPausedSemaphore.is_set(): self._sdPrintingPausedSemaphore.clear() + self._sdPrintStarting = False if not self._sdPrinting: - filename = print_job.get("subtask_name") + filename = print_job.get("gcode_file") # TODO: swap this out to use 8 dot 3 name based on long name/path self._selectSdFile(filename) self._startSdPrint(from_printer=True) @@ -185,9 +187,12 @@ class BambuPrinter: self._send("// action:paused") self._sendPaused() - if print_job.get("gcode_state") == "FINISH" and self._sdPrintingSemaphore.is_set(): - self._selectedSdFilePos = self._selectedSdFileSize - self._finishSdPrint() + if ( print_job.get("gcode_state") == "FINISH" or print_job.get("gcode_state") == "FAILED" ): + if self._sdPrintStarting is False: + self._sdPrinting = False + if self._sdPrintingSemaphore.is_set(): + self._selectedSdFilePos = self._selectedSdFileSize + self._finishSdPrint() def _create_connection(self): if (self._settings.get(["device_type"]) != "" and self._settings.get(["serial"]) != "" and @@ -241,6 +246,7 @@ class BambuPrinter: self._sdCardReady = True self._sdPrinting = False + self._sdPrintStarting = False if self._sdPrinter: self._sdPrinting = False self._sdPrintingSemaphore.clear() @@ -429,6 +435,14 @@ class BambuPrinter: else: self._sendOk() + if self.bambu.connected: + GCODE_COMMAND = commands.SEND_GCODE_TEMPLATE + GCODE_COMMAND['print']['param'] = data + "\n" + if self.bambu.publish(GCODE_COMMAND): + self._logger.info("command sent successfully") + self._sendOk() + continue + finally: self._logger.debug(f"{data}") @@ -478,9 +492,14 @@ class BambuPrinter: return False def _gcode_M26(self, data: str) -> bool: - self._logger.debug("ignoring M26 command.") - self._send("M26 disabled for Bambu") - return True + if data == "M26 S0": + if self._sdCardReady: + return self._cancelSdPrint() + return False + else: + self._logger.debug("ignoring M26 command.") + self._send("M26 disabled for Bambu") + return True def _gcode_M27(self, data: str) -> bool: def report(): @@ -643,8 +662,29 @@ class BambuPrinter: "size": filesize, "timestamp": unix_timestamp_to_m20_timestamp(int(filedate)) } - result[filename.lower()] = data result[dosname.lower()] = filename.lower() + result[filename.lower()] = data + + filelistcache = ftp.list_files("cache/", ".3mf") + + for entry in filelistcache: + if entry.startswith("/"): + filename = entry[1:] + else: + filename = entry + filesize = ftp.ftps_session.size("cache/"+entry) + date_str = ftp.ftps_session.sendcmd(f"MDTM cache/{entry}").replace("213 ", "") + filedate = datetime.datetime.strptime(date_str, "%Y%m%d%H%M%S").replace(tzinfo=datetime.timezone.utc).timestamp() + dosname = get_dos_filename(filename, existing_filenames=list(result.keys())).lower() + data = { + "dosname": dosname, + "name": filename, + "path": "cache/"+filename, + "size": filesize, + "timestamp": unix_timestamp_to_m20_timestamp(int(filedate)) + } + result[dosname.lower()] = filename.lower() + result[filename.lower()] = data return result @@ -680,6 +720,7 @@ class BambuPrinter: if self._selectedSdFile is not None: if self._sdPrinter is None: self._sdPrinting = True + self._sdPrintStarting = True self._sdPrinter = threading.Thread(target=self._sdPrintingWorker, kwargs={"from_printer": from_printer}) self._sdPrinter.start() # self._sdPrintingSemaphore.set() @@ -703,6 +744,7 @@ class BambuPrinter: if self.bambu.connected: if self.bambu.publish(commands.STOP): self._logger.info("print cancelled") + self._finishSdPrint() return True else: self._logger.info("print cancel failed") @@ -712,7 +754,7 @@ class BambuPrinter: self._newSdFilePos = pos def _reportSdStatus(self): - if self._sdPrinter is not None and (self._sdPrintingSemaphore.is_set() or self._sdPrintingPausedSemaphore.is_set()): + if ( self._sdPrinter is not None or self._sdPrintStarting is True ) and self._selectedSdFileSize > 0: self._send(f"SD printing byte {self._selectedSdFilePos}/{self._selectedSdFileSize}") else: self._send("Not SD printing") @@ -801,6 +843,7 @@ class BambuPrinter: self._selectedSdFilePos = 0 self._selectedSdFileSize = 0 self._sdPrinting = False + self._sdPrintStarting = False self._sdPrinter = None def _deleteSdFile(self, filename: str) -> None: