UMOCheckupMachineAction.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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. class UMOCheckupMachineAction(MachineAction):
  6. def __init__(self):
  7. super().__init__("UMOCheckup", "Checkup")
  8. self._qml_url = "UMOCheckupMachineAction.qml"
  9. self._hotend_target_temp = 180
  10. self._bed_target_temp = 60
  11. self._output_device = None
  12. self._bed_test_completed = False
  13. self._hotend_test_completed = False
  14. # Endstop tests
  15. self._x_min_endstop_test_completed = False
  16. self._y_min_endstop_test_completed = False
  17. self._z_min_endstop_test_completed = False
  18. self._check_started = False
  19. Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged)
  20. onBedTestCompleted = pyqtSignal()
  21. onHotendTestCompleted = pyqtSignal()
  22. onXMinEndstopTestCompleted = pyqtSignal()
  23. onYMinEndstopTestCompleted = pyqtSignal()
  24. onZMinEndstopTestCompleted = pyqtSignal()
  25. bedTemperatureChanged = pyqtSignal()
  26. hotendTemperatureChanged = pyqtSignal()
  27. def _onOutputDevicesChanged(self):
  28. # Check if this action was started, but no output device was found the first time.
  29. # If so, re-try now that an output device has been added/removed.
  30. if self._output_device is None and self._check_started:
  31. self.startCheck()
  32. def _getPrinterOutputDevices(self):
  33. return [printer_output_device for printer_output_device in
  34. Application.getInstance().getOutputDeviceManager().getOutputDevices() if
  35. isinstance(printer_output_device, PrinterOutputDevice)]
  36. def _reset(self):
  37. if self._output_device:
  38. self._output_device.bedTemperatureChanged.disconnect(self.bedTemperatureChanged)
  39. self._output_device.hotendTemperaturesChanged.disconnect(self.hotendTemperatureChanged)
  40. self._output_device.bedTemperatureChanged.disconnect(self._onBedTemperatureChanged)
  41. self._output_device.hotendTemperaturesChanged.disconnect(self._onHotendTemperatureChanged)
  42. self._output_device.endstopStateChanged.disconnect(self._onEndstopStateChanged)
  43. try:
  44. self._output_device.stopPollEndstop()
  45. except AttributeError: # Connection is probably not a USB connection. Something went pretty wrong if this happens.
  46. pass
  47. self._output_device = None
  48. self._check_started = False
  49. # Ensure everything is reset (and right signals are emitted again)
  50. self._bed_test_completed = False
  51. self.onBedTestCompleted.emit()
  52. self._hotend_test_completed = False
  53. self.onHotendTestCompleted.emit()
  54. self._x_min_endstop_test_completed = False
  55. self.onXMinEndstopTestCompleted.emit()
  56. self._y_min_endstop_test_completed = False
  57. self.onYMinEndstopTestCompleted.emit()
  58. self._z_min_endstop_test_completed = False
  59. self.onZMinEndstopTestCompleted.emit()
  60. @pyqtProperty(bool, notify = onBedTestCompleted)
  61. def bedTestCompleted(self):
  62. return self._bed_test_completed
  63. @pyqtProperty(bool, notify = onHotendTestCompleted)
  64. def hotendTestCompleted(self):
  65. return self._hotend_test_completed
  66. @pyqtProperty(bool, notify = onXMinEndstopTestCompleted)
  67. def xMinEndstopTestCompleted(self):
  68. return self._x_min_endstop_test_completed
  69. @pyqtProperty(bool, notify=onYMinEndstopTestCompleted)
  70. def yMinEndstopTestCompleted(self):
  71. return self._y_min_endstop_test_completed
  72. @pyqtProperty(bool, notify=onZMinEndstopTestCompleted)
  73. def zMinEndstopTestCompleted(self):
  74. return self._z_min_endstop_test_completed
  75. @pyqtProperty(float, notify = bedTemperatureChanged)
  76. def bedTemperature(self):
  77. if not self._output_device:
  78. return 0
  79. return self._output_device.bedTemperature
  80. @pyqtProperty(float, notify=hotendTemperatureChanged)
  81. def hotendTemperature(self):
  82. if not self._output_device:
  83. return 0
  84. return self._output_device.hotendTemperatures[0]
  85. def _onHotendTemperatureChanged(self):
  86. if not self._output_device:
  87. return
  88. if not self._hotend_test_completed:
  89. if self._output_device.hotendTemperatures[0] + 10 > self._hotend_target_temp and self._output_device.hotendTemperatures[0] - 10 < self._hotend_target_temp:
  90. self._hotend_test_completed = True
  91. self.onHotendTestCompleted.emit()
  92. def _onBedTemperatureChanged(self):
  93. if not self._output_device:
  94. return
  95. if not self._bed_test_completed:
  96. if self._output_device.bedTemperature + 5 > self._bed_target_temp and self._output_device.bedTemperature - 5 < self._bed_target_temp:
  97. self._bed_test_completed = True
  98. self.onBedTestCompleted.emit()
  99. def _onEndstopStateChanged(self, switch_type, state):
  100. if state:
  101. if switch_type == "x_min":
  102. self._x_min_endstop_test_completed = True
  103. self.onXMinEndstopTestCompleted.emit()
  104. elif switch_type == "y_min":
  105. self._y_min_endstop_test_completed = True
  106. self.onYMinEndstopTestCompleted.emit()
  107. elif switch_type == "z_min":
  108. self._z_min_endstop_test_completed = True
  109. self.onZMinEndstopTestCompleted.emit()
  110. @pyqtSlot()
  111. def startCheck(self):
  112. self._check_started = True
  113. output_devices = self._getPrinterOutputDevices()
  114. if output_devices:
  115. self._output_device = output_devices[0]
  116. try:
  117. self._output_device.startPollEndstop()
  118. self._output_device.bedTemperatureChanged.connect(self.bedTemperatureChanged)
  119. self._output_device.hotendTemperaturesChanged.connect(self.hotendTemperatureChanged)
  120. self._output_device.bedTemperatureChanged.connect(self._onBedTemperatureChanged)
  121. self._output_device.hotendTemperaturesChanged.connect(self._onHotendTemperatureChanged)
  122. self._output_device.endstopStateChanged.connect(self._onEndstopStateChanged)
  123. except AttributeError: # Connection is probably not a USB connection. Something went pretty wrong if this happens.
  124. pass
  125. @pyqtSlot()
  126. def heatupHotend(self):
  127. if self._output_device is not None:
  128. self._output_device.setTargetHotendTemperature(0, self._hotend_target_temp)
  129. @pyqtSlot()
  130. def heatupBed(self):
  131. if self._output_device is not None:
  132. self._output_device.setTargetBedTemperature(self._bed_target_temp)