GenericOutputController.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. # Copyright (c) 2018 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
  4. from PyQt5.QtCore import QTimer
  5. MYPY = False
  6. if MYPY:
  7. from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
  8. from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
  9. class GenericOutputController(PrinterOutputController):
  10. def __init__(self, output_device):
  11. super().__init__(output_device)
  12. self._preheat_bed_timer = QTimer()
  13. self._preheat_bed_timer.setSingleShot(True)
  14. self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished)
  15. self._preheat_printer = None
  16. self._preheat_hotends_timer = QTimer()
  17. self._preheat_hotends_timer.setSingleShot(True)
  18. self._preheat_hotends_timer.timeout.connect(self._onPreheatHotendsTimerFinished)
  19. self._preheat_hotends = set()
  20. self._output_device.printersChanged.connect(self._onPrintersChanged)
  21. self._active_printer = None
  22. def _onPrintersChanged(self):
  23. if self._active_printer:
  24. self._active_printer.stateChanged.disconnect(self._onPrinterStateChanged)
  25. self._active_printer.targetBedTemperatureChanged.disconnect(self._onTargetBedTemperatureChanged)
  26. for extruder in self._active_printer.extruders:
  27. extruder.targetHotendTemperatureChanged.disconnect(self._onTargetHotendTemperatureChanged)
  28. self._active_printer = self._output_device.activePrinter
  29. if self._active_printer:
  30. self._active_printer.stateChanged.connect(self._onPrinterStateChanged)
  31. self._active_printer.targetBedTemperatureChanged.connect(self._onTargetBedTemperatureChanged)
  32. for extruder in self._active_printer.extruders:
  33. extruder.targetHotendTemperatureChanged.connect(self._onTargetHotendTemperatureChanged)
  34. def _onPrinterStateChanged(self):
  35. if self._active_printer.state != "idle":
  36. if self._preheat_bed_timer.isActive():
  37. self._preheat_bed_timer.stop()
  38. self._preheat_printer.updateIsPreheating(False)
  39. if self._preheat_hotends_timer.isActive():
  40. self._preheat_hotends_timer.stop()
  41. for extruder in self._preheat_hotends:
  42. extruder.updateIsPreheating(False)
  43. self._preheat_hotends = set()
  44. def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed):
  45. self._output_device.sendCommand("G91")
  46. self._output_device.sendCommand("G0 X%s Y%s Z%s F%s" % (x, y, z, speed))
  47. self._output_device.sendCommand("G90")
  48. def homeHead(self, printer):
  49. self._output_device.sendCommand("G28 X")
  50. self._output_device.sendCommand("G28 Y")
  51. def homeBed(self, printer):
  52. self._output_device.sendCommand("G28 Z")
  53. def setJobState(self, job: "PrintJobOutputModel", state: str):
  54. if state == "pause":
  55. self._output_device.pausePrint()
  56. job.updateState("paused")
  57. elif state == "print":
  58. self._output_device.resumePrint()
  59. job.updateState("printing")
  60. elif state == "abort":
  61. self._output_device.cancelPrint()
  62. pass
  63. def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int):
  64. self._output_device.sendCommand("M140 S%s" % temperature)
  65. def _onTargetBedTemperatureChanged(self):
  66. if self._preheat_bed_timer.isActive() and self._preheat_printer.targetBedTemperature == 0:
  67. self._preheat_bed_timer.stop()
  68. self._preheat_printer.updateIsPreheating(False)
  69. def preheatBed(self, printer: "PrinterOutputModel", temperature, duration):
  70. try:
  71. temperature = round(temperature) # The API doesn't allow floating point.
  72. duration = round(duration)
  73. except ValueError:
  74. return # Got invalid values, can't pre-heat.
  75. self.setTargetBedTemperature(printer, temperature=temperature)
  76. self._preheat_bed_timer.setInterval(duration * 1000)
  77. self._preheat_bed_timer.start()
  78. self._preheat_printer = printer
  79. printer.updateIsPreheating(True)
  80. def cancelPreheatBed(self, printer: "PrinterOutputModel"):
  81. self.setTargetBedTemperature(printer, temperature=0)
  82. self._preheat_bed_timer.stop()
  83. printer.updateIsPreheating(False)
  84. def _onPreheatBedTimerFinished(self):
  85. self.setTargetBedTemperature(self._preheat_printer, 0)
  86. self._preheat_printer.updateIsPreheating(False)
  87. def setTargetHotendTemperature(self, printer: "PrinterOutputModel", position: int, temperature: int):
  88. self._output_device.sendCommand("M104 S%s T%s" % (temperature, position))
  89. def _onTargetHotendTemperatureChanged(self):
  90. if not self._preheat_hotends_timer.isActive():
  91. return
  92. for extruder in self._active_printer.extruders:
  93. if extruder in self._preheat_hotends and extruder.targetHotendTemperature == 0:
  94. extruder.updateIsPreheating(False)
  95. self._preheat_hotends.remove(extruder)
  96. if not self._preheat_hotends:
  97. self._preheat_hotends_timer.stop()
  98. def preheatHotend(self, extruder: "ExtruderOutputModel", temperature, duration):
  99. position = extruder.getPosition()
  100. number_of_extruders = len(extruder.getPrinter().extruders)
  101. if position >= number_of_extruders:
  102. return # Got invalid extruder nr, can't pre-heat.
  103. try:
  104. temperature = round(temperature) # The API doesn't allow floating point.
  105. duration = round(duration)
  106. except ValueError:
  107. return # Got invalid values, can't pre-heat.
  108. self.setTargetHotendTemperature(extruder.getPrinter(), position, temperature=temperature)
  109. self._preheat_hotends_timer.setInterval(duration * 1000)
  110. self._preheat_hotends_timer.start()
  111. self._preheat_hotends.add(extruder)
  112. extruder.updateIsPreheating(True)
  113. def cancelPreheatHotend(self, extruder: "ExtruderOutputModel"):
  114. self.setTargetHotendTemperature(extruder.getPrinter(), extruder.getPosition(), temperature=0)
  115. if extruder in self._preheat_hotends:
  116. extruder.updateIsPreheating(False)
  117. self._preheat_hotends.remove(extruder)
  118. if not self._preheat_hotends and self._preheat_hotends_timer.isActive():
  119. self._preheat_hotends_timer.stop()
  120. def _onPreheatHotendsTimerFinished(self):
  121. for extruder in self._preheat_hotends:
  122. self.setTargetHotendTemperature(extruder.getPrinter(), extruder.getPosition(), 0)
  123. self._preheat_hotends = set()