123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- # Copyright (c) 2017 Ultimaker B.V.
- # Cura is released under the terms of the LGPLv3 or higher.
- from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
- from PyQt5.QtCore import QTimer
- from UM.Version import Version
- MYPY = False
- if MYPY:
- from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
- from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
- class LegacyUM3PrinterOutputController(PrinterOutputController):
- def __init__(self, output_device):
- super().__init__(output_device)
- self._preheat_bed_timer = QTimer()
- self._preheat_bed_timer.setSingleShot(True)
- self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished)
- self._preheat_printer = None
- self.can_control_manually = False
- self.can_send_raw_gcode = False
- # Are we still waiting for a response about preheat?
- # We need this so we can already update buttons, so it feels more snappy.
- self._preheat_request_in_progress = False
- def isPreheatRequestInProgress(self):
- return self._preheat_request_in_progress
- def setJobState(self, job: "PrintJobOutputModel", state: str):
- data = "{\"target\": \"%s\"}" % state
- self._output_device.put("print_job/state", data, onFinished=None)
- def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int):
- data = str(temperature)
- self._output_device.put("printer/bed/temperature/target", data, onFinished=self._onPutBedTemperatureCompleted)
- def _onPutBedTemperatureCompleted(self, reply):
- if Version(self._preheat_printer.firmwareVersion) < Version("3.5.92"):
- # If it was handling a preheat, it isn't anymore.
- self._preheat_request_in_progress = False
- def _onPutPreheatBedCompleted(self, reply):
- self._preheat_request_in_progress = False
- def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed):
- head_pos = printer._head_position
- new_x = head_pos.x + x
- new_y = head_pos.y + y
- new_z = head_pos.z + z
- data = "{\n\"x\":%s,\n\"y\":%s,\n\"z\":%s\n}" %(new_x, new_y, new_z)
- self._output_device.put("printer/heads/0/position", data, onFinished=None)
- def homeBed(self, printer):
- self._output_device.put("printer/heads/0/position/z", "0", onFinished=None)
- def _onPreheatBedTimerFinished(self):
- self.setTargetBedTemperature(self._preheat_printer, 0)
- self._preheat_printer.updateIsPreheating(False)
- self._preheat_request_in_progress = True
- def cancelPreheatBed(self, printer: "PrinterOutputModel"):
- self.preheatBed(printer, temperature=0, duration=0)
- self._preheat_bed_timer.stop()
- printer.updateIsPreheating(False)
- def preheatBed(self, printer: "PrinterOutputModel", temperature, duration):
- try:
- temperature = round(temperature) # The API doesn't allow floating point.
- duration = round(duration)
- except ValueError:
- return # Got invalid values, can't pre-heat.
- if duration > 0:
- data = """{"temperature": "%i", "timeout": "%i"}""" % (temperature, duration)
- else:
- data = """{"temperature": "%i"}""" % temperature
- # Real bed pre-heating support is implemented from 3.5.92 and up.
- if Version(printer.firmwareVersion) < Version("3.5.92"):
- # No firmware-side duration support then, so just set target bed temp and set a timer.
- self.setTargetBedTemperature(printer, temperature=temperature)
- self._preheat_bed_timer.setInterval(duration * 1000)
- self._preheat_bed_timer.start()
- self._preheat_printer = printer
- printer.updateIsPreheating(True)
- return
- self._output_device.put("printer/bed/pre_heat", data, onFinished = self._onPutPreheatBedCompleted)
- printer.updateIsPreheating(True)
- self._preheat_request_in_progress = True
|