allow use of cache folder and custom g-gcode commands

This commit is contained in:
Pavulon87 2024-02-12 09:49:24 +01:00
parent 9eb8b0da65
commit 7a4439c53e

View File

@ -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,7 +187,10 @@ class BambuPrinter:
self._send("// action:paused")
self._sendPaused()
if print_job.get("gcode_state") == "FINISH" and self._sdPrintingSemaphore.is_set():
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):
@ -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,6 +492,11 @@ class BambuPrinter:
return False
def _gcode_M26(self, data: str) -> bool:
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
@ -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: