UMOCheckupMachineAction.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. from cura.MachineAction import MachineAction
  2. from cura.PrinterOutputDevice import PrinterOutputDevice
  3. from UM.Application import Application
  4. from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty
  5. from UM.Logger import Logger
  6. from UM.i18n import i18nCatalog
  7. catalog = i18nCatalog("cura")
  8. class UMOCheckupMachineAction(MachineAction):
  9. def __init__(self):
  10. super().__init__("UMOCheckup", catalog.i18nc("@action", "Checkup"))
  11. self._qml_url = "UMOCheckupMachineAction.qml"
  12. self._hotend_target_temp = 180
  13. self._bed_target_temp = 60
  14. self._output_device = None
  15. self._bed_test_completed = False
  16. self._hotend_test_completed = False
  17. # Endstop tests
  18. self._x_min_endstop_test_completed = False
  19. self._y_min_endstop_test_completed = False
  20. self._z_min_endstop_test_completed = False
  21. self._check_started = False
  22. Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged)
  23. onBedTestCompleted = pyqtSignal()
  24. onHotendTestCompleted = pyqtSignal()
  25. onXMinEndstopTestCompleted = pyqtSignal()
  26. onYMinEndstopTestCompleted = pyqtSignal()
  27. onZMinEndstopTestCompleted = pyqtSignal()
  28. bedTemperatureChanged = pyqtSignal()
  29. hotendTemperatureChanged = pyqtSignal()
  30. def _onOutputDevicesChanged(self):
  31. # Check if this action was started, but no output device was found the first time.
  32. # If so, re-try now that an output device has been added/removed.
  33. if self._output_device is None and self._check_started:
  34. self.startCheck()
  35. def _getPrinterOutputDevices(self):
  36. return [printer_output_device for printer_output_device in
  37. Application.getInstance().getOutputDeviceManager().getOutputDevices() if
  38. isinstance(printer_output_device, PrinterOutputDevice)]
  39. def _reset(self):
  40. if self._output_device:
  41. self._output_device.bedTemperatureChanged.disconnect(self.bedTemperatureChanged)
  42. self._output_device.hotendTemperaturesChanged.disconnect(self.hotendTemperatureChanged)
  43. self._output_device.bedTemperatureChanged.disconnect(self._onBedTemperatureChanged)
  44. self._output_device.hotendTemperaturesChanged.disconnect(self._onHotendTemperatureChanged)
  45. self._output_device.endstopStateChanged.disconnect(self._onEndstopStateChanged)
  46. try:
  47. self._output_device.stopPollEndstop()
  48. except AttributeError as e: # Connection is probably not a USB connection. Something went pretty wrong if this happens.
  49. Logger.log("e", "An exception occurred while stopping end stop polling: %s" % str(e))
  50. self._output_device = None
  51. self._check_started = False
  52. self.checkStartedChanged.emit()
  53. # Ensure everything is reset (and right signals are emitted again)
  54. self._bed_test_completed = False
  55. self.onBedTestCompleted.emit()
  56. self._hotend_test_completed = False
  57. self.onHotendTestCompleted.emit()
  58. self._x_min_endstop_test_completed = False
  59. self.onXMinEndstopTestCompleted.emit()
  60. self._y_min_endstop_test_completed = False
  61. self.onYMinEndstopTestCompleted.emit()
  62. self._z_min_endstop_test_completed = False
  63. self.onZMinEndstopTestCompleted.emit()
  64. self.heatedBedChanged.emit()
  65. @pyqtProperty(bool, notify = onBedTestCompleted)
  66. def bedTestCompleted(self):
  67. return self._bed_test_completed
  68. @pyqtProperty(bool, notify = onHotendTestCompleted)
  69. def hotendTestCompleted(self):
  70. return self._hotend_test_completed
  71. @pyqtProperty(bool, notify = onXMinEndstopTestCompleted)
  72. def xMinEndstopTestCompleted(self):
  73. return self._x_min_endstop_test_completed
  74. @pyqtProperty(bool, notify=onYMinEndstopTestCompleted)
  75. def yMinEndstopTestCompleted(self):
  76. return self._y_min_endstop_test_completed
  77. @pyqtProperty(bool, notify=onZMinEndstopTestCompleted)
  78. def zMinEndstopTestCompleted(self):
  79. return self._z_min_endstop_test_completed
  80. @pyqtProperty(float, notify = bedTemperatureChanged)
  81. def bedTemperature(self):
  82. if not self._output_device:
  83. return 0
  84. return self._output_device.bedTemperature
  85. @pyqtProperty(float, notify=hotendTemperatureChanged)
  86. def hotendTemperature(self):
  87. if not self._output_device:
  88. return 0
  89. return self._output_device.hotendTemperatures[0]
  90. def _onHotendTemperatureChanged(self):
  91. if not self._output_device:
  92. return
  93. if not self._hotend_test_completed:
  94. if self._output_device.hotendTemperatures[0] + 10 > self._hotend_target_temp and self._output_device.hotendTemperatures[0] - 10 < self._hotend_target_temp:
  95. self._hotend_test_completed = True
  96. self.onHotendTestCompleted.emit()
  97. def _onBedTemperatureChanged(self):
  98. if not self._output_device:
  99. return
  100. if not self._bed_test_completed:
  101. if self._output_device.bedTemperature + 5 > self._bed_target_temp and self._output_device.bedTemperature - 5 < self._bed_target_temp:
  102. self._bed_test_completed = True
  103. self.onBedTestCompleted.emit()
  104. def _onEndstopStateChanged(self, switch_type, state):
  105. if state:
  106. if switch_type == "x_min":
  107. self._x_min_endstop_test_completed = True
  108. self.onXMinEndstopTestCompleted.emit()
  109. elif switch_type == "y_min":
  110. self._y_min_endstop_test_completed = True
  111. self.onYMinEndstopTestCompleted.emit()
  112. elif switch_type == "z_min":
  113. self._z_min_endstop_test_completed = True
  114. self.onZMinEndstopTestCompleted.emit()
  115. checkStartedChanged = pyqtSignal()
  116. @pyqtProperty(bool, notify = checkStartedChanged)
  117. def checkStarted(self):
  118. return self._check_started
  119. @pyqtSlot()
  120. def startCheck(self):
  121. self._check_started = True
  122. self.checkStartedChanged.emit()
  123. output_devices = self._getPrinterOutputDevices()
  124. if output_devices:
  125. self._output_device = output_devices[0]
  126. try:
  127. self._output_device.startPollEndstop()
  128. self._output_device.bedTemperatureChanged.connect(self.bedTemperatureChanged)
  129. self._output_device.hotendTemperaturesChanged.connect(self.hotendTemperatureChanged)
  130. self._output_device.bedTemperatureChanged.connect(self._onBedTemperatureChanged)
  131. self._output_device.hotendTemperaturesChanged.connect(self._onHotendTemperatureChanged)
  132. self._output_device.endstopStateChanged.connect(self._onEndstopStateChanged)
  133. except AttributeError as e: # Connection is probably not a USB connection. Something went pretty wrong if this happens.
  134. Logger.log("e", "An exception occurred while starting end stop polling: %s" % str(e))
  135. @pyqtSlot()
  136. def cooldownHotend(self):
  137. if self._output_device is not None:
  138. self._output_device.setTargetHotendTemperature(0, 0)
  139. @pyqtSlot()
  140. def cooldownBed(self):
  141. if self._output_device is not None:
  142. self._output_device.setTargetBedTemperature(0)
  143. @pyqtSlot()
  144. def heatupHotend(self):
  145. if self._output_device is not None:
  146. self._output_device.setTargetHotendTemperature(0, self._hotend_target_temp)
  147. @pyqtSlot()
  148. def heatupBed(self):
  149. if self._output_device is not None:
  150. self._output_device.setTargetBedTemperature(self._bed_target_temp)
  151. heatedBedChanged = pyqtSignal()
  152. @pyqtProperty(bool, notify = heatedBedChanged)
  153. def hasHeatedBed(self):
  154. global_container_stack = Application.getInstance().getGlobalContainerStack()
  155. return global_container_stack.getProperty("machine_heated_bed", "value")