diff --git a/USBPrinterManager.py b/USBPrinterManager.py index 8f2ba5e90a..e2344078fd 100644 --- a/USBPrinterManager.py +++ b/USBPrinterManager.py @@ -24,58 +24,63 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): super().__init__(parent) self._serial_port_list = [] self._printer_connections = [] - self._check_ports_thread = threading.Thread(target=self._updateConnectionList) + self._check_ports_thread = threading.Thread(target = self._updateConnectionList) self._check_ports_thread.daemon = True self._check_ports_thread.start() self._progress = 0 - - + self._control_view = None self._firmware_view = None self._extruder_temp = 0 self._bed_temp = 0 self._error_message = "" - ## Add menu item to top menu. + ## Add menu item to top menu of the application. self.addMenuItem(i18n_catalog.i18n("Update firmware"), self.updateAllFirmware) + ## Show firmware interface. + # This will create the view if its not already created. def spawnFirmwareInterface(self, serial_port): if self._firmware_view is None: self._firmware_view = QQuickView() self._firmware_view.engine().rootContext().setContextProperty('manager',self) self._firmware_view.setSource(QUrl("plugins/USBPrinting/FirmwareUpdateWindow.qml")) - self._firmware_view.show() - + self._firmware_view.show() + ## Show control interface. + # This will create the view if its not already created. def spawnControlInterface(self,serial_port): if self._control_view is None: self._control_view = QQuickView() self._control_view.engine().rootContext().setContextProperty('manager',self) self._control_view.setSource(QUrl("plugins/USBPrinting/ControlWindow.qml")) - self._control_view.show() - - - processingProgress = pyqtSignal(float, arguments = ['amount']) + self._control_view.show() + @pyqtProperty(float,notify = processingProgress) def progress(self): return self._progress - pyqtExtruderTemperature = pyqtSignal(float, arguments = ['amount']) + processingProgress = pyqtSignal(float, arguments = ['amount']) + @pyqtProperty(float,notify = pyqtExtruderTemperature) def extruderTemperature(self): return self._extruder_temp - pyqtBedTemperature = pyqtSignal(float, arguments = ['amount']) + pyqtExtruderTemperature = pyqtSignal(float, arguments = ['amount']) + @pyqtProperty(float,notify = pyqtBedTemperature) def bedTemperature(self): return self._bed_temp - pyqtError = pyqtSignal(str, arguments = ['amount']) + pyqtBedTemperature = pyqtSignal(float, arguments = ['amount']) + @pyqtProperty(str,notify = pyqtError) def error(self): return self._error_message + pyqtError = pyqtSignal(str, arguments = ['amount']) + ## Check all serial ports and create a PrinterConnection object for them. # Note that this does not validate if the serial ports are actually usable! # This (the validation) is only done when the connect function is called. @@ -86,8 +91,8 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): disconnected_ports = [port for port in self._serial_port_list if port not in temp_serial_port_list ] self._serial_port_list = temp_serial_port_list for serial_port in self._serial_port_list: - if self.getConnectionByPort(serial_port) is None: #If it doesn't already exist, add it - if not os.path.islink(serial_port): #Only add the connection if it's a non symbolic link + if self.getConnectionByPort(serial_port) is None: # If it doesn't already exist, add it + if not os.path.islink(serial_port): # Only add the connection if it's a non symbolic link connection = PrinterConnection.PrinterConnection(serial_port) connection.connect() connection.connectionStateChanged.connect(self.serialConectionStateCallback) @@ -102,14 +107,7 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): if connection != None: self._printer_connections.remove(connection) connection.close() - time.sleep(5) #Throttle, as we don't need this information to be updated every single second. - - def onExtruderTemperature(self, serial_port, index,temperature): - #print("ExtruderTemperature " , serial_port, " " , index, " " , temperature) - self._extruder_temp = temperature - self.pyqtExtruderTemperature.emit(temperature) - - pass + time.sleep(5) # Throttle, as we don't need this information to be updated every single second. def updateAllFirmware(self): self.spawnFirmwareInterface("") @@ -142,35 +140,38 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): elif machine_type == "ultimaker2": return "MarlinUltimaker2.hex" - ##TODO: Add check for multiple extruders if firmware_name != "": firmware_name += ".hex" return firmware_name + ## Callback for extruder temperature change + def onExtruderTemperature(self, serial_port, index, temperature): + self._extruder_temp = temperature + self.pyqtExtruderTemperature.emit(temperature) + + ## Callback for bed temperature change def onBedTemperature(self, serial_port,temperature): self._bed_temperature = temperature self.pyqtBedTemperature.emit(temperature) - #print("bedTemperature " , serial_port, " " , temperature) - pass + ## Callback for error def onError(self, error): self._error_message = error self.pyqtError.emit(error) - pass - + + ## Callback for progress change def onProgress(self, progress, serial_port): self._progress = progress self.processingProgress.emit(progress) - pass - + ## Attempt to connect with all possible connections. def connectAllConnections(self): for connection in self._printer_connections: connection.connect() - ## send gcode to printer and start printing + ## Send gcode to printer and start printing def sendGCodeByPort(self, serial_port, gcode_list): printer_connection = self.getConnectionByPort(serial_port) if printer_connection is not None: @@ -214,9 +215,10 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): return True else: return False - - - def serialConectionStateCallback(self,serial_port): + + ## Callback if the connection state of a connection is changed. + # This adds or removes the connection as a possible output device. + def serialConectionStateCallback(self, serial_port): connection = self.getConnectionByPort(serial_port) if connection.isConnected(): Application.getInstance().addOutputDevice(serial_port, { @@ -229,13 +231,6 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): else: Application.getInstance().removeOutputDevice(serial_port) - '''def _writeToSerial(self, serial_port): - gcode_list = getattr(Application.getInstance().getController().getScene(), 'gcode_list', None) - if gcode_list: - final_list = [] - for gcode in gcode_list: - final_list += gcode.split('\n') - self.sendGCodeByPort(serial_port, gcode_list)''' @pyqtSlot() def startPrint(self): gcode_list = getattr(Application.getInstance().getController().getScene(), 'gcode_list', None) @@ -245,12 +240,11 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): final_list += gcode.split('\n') self.sendGCodeToAllActive(gcode_list) - - ## Get a list of printer connection objects that are connected. + ## Get a list of printer connection objects that are connected. def getActiveConnections(self): return [connection for connection in self._printer_connections if connection.isConnected()] - ## get a printer connection object by serial port + ## Get a printer connection object by serial port def getConnectionByPort(self, serial_port): for printer_connection in self._printer_connections: if serial_port == printer_connection.getSerialPort(): @@ -260,29 +254,23 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): ## Create a list of serial ports on the system. # \param only_list_usb If true, only usb ports are listed def getSerialPortList(self,only_list_usb=False): - base_list=[] + base_list = [] if platform.system() == "Windows": import winreg try: - key=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM") - i=0 + key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM") + i = 0 while True: values = winreg.EnumValue(key, i) if not base_list or 'USBSER' in values[0]: - base_list+=[values[1]] - i+=1 - except: + base_list + =[values[1]] + i += 1 + except Exception as e: pass if base_list: base_list = base_list + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') + glob.glob("/dev/cu.usb*") - base_list = filter(lambda s: not 'Bluetooth' in s, base_list) #Filter because mac sometimes puts them in the list - #prev = profile.getMachineSetting('serial_port_auto') - #if prev in base_list: - # base_list.remove(prev) - # base_list.insert(0, prev) + base_list = filter(lambda s: not 'Bluetooth' in s, base_list) # Filter because mac sometimes puts them in the list else: base_list = base_list + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') + glob.glob("/dev/cu.*") + glob.glob("/dev/tty.usb*") + glob.glob("/dev/rfcomm*") + glob.glob('/dev/serial/by-id/*') - #if version.isDevVersion() and not base_list: - #base_list.append('VIRTUAL') return base_list \ No newline at end of file