2024-07-24 17:15:46 +03:00
|
|
|
from __future__ import annotations
|
|
|
|
|
2024-07-24 17:15:46 +03:00
|
|
|
import time
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
from octoprint_bambu_printer.printer.bambu_virtual_printer import (
|
|
|
|
BambuVirtualPrinter,
|
|
|
|
)
|
|
|
|
|
2024-07-24 17:15:46 +03:00
|
|
|
import threading
|
|
|
|
|
|
|
|
import pybambu
|
|
|
|
import pybambu.models
|
|
|
|
import pybambu.commands
|
|
|
|
|
|
|
|
from octoprint_bambu_printer.printer.print_job import PrintJob
|
|
|
|
from octoprint_bambu_printer.printer.states.a_printer_state import APrinterState
|
|
|
|
|
|
|
|
|
|
|
|
class PrintingState(APrinterState):
|
|
|
|
|
|
|
|
def __init__(self, printer: BambuVirtualPrinter) -> None:
|
|
|
|
super().__init__(printer)
|
2024-07-24 17:15:47 +03:00
|
|
|
self._is_printing = False
|
2024-07-24 17:15:46 +03:00
|
|
|
self._print_job: PrintJob | None = None
|
|
|
|
self._sd_printing_thread = None
|
|
|
|
|
|
|
|
@property
|
|
|
|
def print_job(self):
|
|
|
|
return self._print_job
|
|
|
|
|
|
|
|
def init(self):
|
2024-07-24 17:15:47 +03:00
|
|
|
self._is_printing = True
|
|
|
|
self._printer.update_print_job_info()
|
2024-07-24 17:15:46 +03:00
|
|
|
self._start_worker_thread()
|
2024-07-24 17:15:46 +03:00
|
|
|
|
|
|
|
def finalize(self):
|
|
|
|
|
2024-07-24 17:15:46 +03:00
|
|
|
if self._sd_printing_thread is not None and self._sd_printing_thread.is_alive():
|
2024-07-24 17:15:47 +03:00
|
|
|
self._is_printing = False
|
2024-07-24 17:15:46 +03:00
|
|
|
self._sd_printing_thread.join()
|
|
|
|
self._sd_printing_thread = None
|
|
|
|
|
|
|
|
def _start_worker_thread(self):
|
2024-07-24 17:15:46 +03:00
|
|
|
if self._sd_printing_thread is None:
|
2024-07-24 17:15:47 +03:00
|
|
|
self._is_printing = True
|
2024-07-24 17:15:46 +03:00
|
|
|
self._sd_printing_thread = threading.Thread(target=self._printing_worker)
|
2024-07-24 17:15:46 +03:00
|
|
|
self._sd_printing_thread.start()
|
|
|
|
|
2024-07-24 17:15:47 +03:00
|
|
|
def _printing_worker(self):
|
|
|
|
while (
|
|
|
|
self._is_printing
|
|
|
|
and self._printer.current_print_job is not None
|
|
|
|
and self._printer.current_print_job.file_position
|
|
|
|
< self._printer.current_print_job.file_info.size
|
|
|
|
):
|
|
|
|
self._printer.update_print_job_info()
|
|
|
|
self._printer.report_print_job_status()
|
|
|
|
time.sleep(3)
|
|
|
|
|
|
|
|
if self._printer.current_print_job is None:
|
|
|
|
|
|
|
|
self._log.warn("Printing state was triggered with empty print job")
|
2024-07-24 17:15:46 +03:00
|
|
|
return
|
|
|
|
|
2024-07-24 17:15:47 +03:00
|
|
|
if (
|
|
|
|
self._printer.current_print_job.file_position
|
|
|
|
>= self._printer.current_print_job.file_info.size
|
|
|
|
):
|
|
|
|
self._finish_print()
|
2024-07-24 17:15:46 +03:00
|
|
|
|
2024-07-24 17:15:46 +03:00
|
|
|
def pause_print(self):
|
|
|
|
if self._printer.bambu_client.connected:
|
|
|
|
if self._printer.bambu_client.publish(pybambu.commands.PAUSE):
|
|
|
|
self._log.info("print paused")
|
2024-07-24 17:15:47 +03:00
|
|
|
self._printer.change_state(self._printer._state_paused)
|
2024-07-24 17:15:46 +03:00
|
|
|
else:
|
|
|
|
self._log.info("print pause failed")
|
|
|
|
|
|
|
|
def cancel_print(self):
|
2024-07-24 17:15:46 +03:00
|
|
|
if self._printer.bambu_client.connected:
|
|
|
|
if self._printer.bambu_client.publish(pybambu.commands.STOP):
|
|
|
|
self._log.info("print cancelled")
|
|
|
|
self._printer.change_state(self._printer._state_finished)
|
|
|
|
else:
|
|
|
|
self._log.info("print cancel failed")
|
2024-07-24 17:15:47 +03:00
|
|
|
|
|
|
|
def _finish_print(self):
|
|
|
|
if self._printer.current_print_job is not None:
|
|
|
|
self._log.debug(
|
|
|
|
f"SD File Print finishing: {self._printer.current_print_job.file_info.file_name}"
|
|
|
|
)
|
|
|
|
|
|
|
|
self._printer.change_state(self._printer._state_idle)
|