From 06fcf0dd07803c4deb65fed80c15a504525183ce Mon Sep 17 00:00:00 2001 From: daid Date: Wed, 5 Sep 2012 16:10:47 +0200 Subject: [PATCH] Untested update to machine communication. This should improve auto detection as it no longer cycles trough a lot of resets. However, this will break the configuration wizard which will need an update. --- Cura/avr_isp/stk500v2.py | 11 +++++ Cura/gui/preview3d.py | 2 +- Cura/util/machineCom.py | 91 ++++++++++++++++++++++------------------ 3 files changed, 62 insertions(+), 42 deletions(-) diff --git a/Cura/avr_isp/stk500v2.py b/Cura/avr_isp/stk500v2.py index 3945fb9..bfdcb4e 100644 --- a/Cura/avr_isp/stk500v2.py +++ b/Cura/avr_isp/stk500v2.py @@ -37,6 +37,17 @@ class Stk500v2(ispBase.IspBase): if self.serial != None: self.serial.close() self.serial = None + + #Leave ISP does not reset the serial port, only resets the device, and returns the serial port after disconnecting it from the programming interface. + # This allows you to use the serial port without opening it again. + def leaveISP(self): + if self.serial != None: + if self.sendMessage([0x11]) != [0x11, 0x00]: + raise ispBase.IspError("Failed to leave programming mode") + ret = self.serial + self.serial = None + return ret + return None def isConnected(self): return self.serial != None diff --git a/Cura/gui/preview3d.py b/Cura/gui/preview3d.py index f1149ea..ec6dce2 100644 --- a/Cura/gui/preview3d.py +++ b/Cura/gui/preview3d.py @@ -615,7 +615,7 @@ class PreviewGLCanvas(glcanvas.GLCanvas): glLightfv(GL_LIGHT0, GL_AMBIENT, map(lambda x: x / 5, self.objColor[self.parent.objectList.index(obj)])) glEnable(GL_LIGHTING) self.drawModel(obj) - + if self.drawBorders and (self.viewMode == "Normal" or self.viewMode == "Transparent" or self.viewMode == "X-Ray"): glEnable(GL_DEPTH_TEST) glDisable(GL_LIGHTING) diff --git a/Cura/util/machineCom.py b/Cura/util/machineCom.py index 087b4eb..fa3cefa 100644 --- a/Cura/util/machineCom.py +++ b/Cura/util/machineCom.py @@ -85,7 +85,8 @@ class VirtualPrinter(): self.readList = None class MachineCom(): - def __init__(self, port = None, baudrate = None): + def __init__(self, port = None, baudrate = None, logCallback = None): + self._logCallback = logCallback if port == None: port = profile.getPreference('serial_port') if baudrate == None: @@ -93,86 +94,94 @@ class MachineCom(): baudrate = 0 else: baudrate = int(profile.getPreference('serial_baud')) - self.serial = None + self._serial = None if port == 'AUTO': programmer = stk500v2.Stk500v2() + self._log("Serial port list: %s" % (str(serialList()))) for port in serialList(): try: - print "Connecting to: %s" % (port) + self._log("Connecting to: %s" % (port)) programmer.connect(port) - programmer.close() - time.sleep(1) - self.serial = self._openPortWithBaudrate(port, baudrate) + self._serial = programmer.leaveISP() + self._configureSerialWithBaudrate(baudrate) break except ispBase.IspError as (e): - print "Error while connecting to %s" % (port) - print e + self._log("Error while connecting to %s: %s" % (port, str(e))) pass except: - print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0] + self._log("Unexpected error while connecting to serial port: %s %s" % (port, sys.exc_info()[0])) programmer.close() elif port == 'VIRTUAL': - self.serial = VirtualPrinter() + self._serial = VirtualPrinter() else: try: - self.serial = self._openPortWithBaudrate(port, baudrate) + self._serial = Serial(port, 115200, timeout=2) + self._configureSerialWithBaudrate(baudrate) except: - print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0] - print self.serial + self._log("Unexpected error while connecting to serial port: %s %s" % (port, sys.exc_info()[0])) + print self._serial def _openPortWithBaudrate(self, port, baudrate): if baudrate != 0: - return Serial(port, baudrate, timeout=2) + self._serial.baudrate = baudrate + return for baudrate in baudrateList(): try: - ser = Serial(port, baudrate, timeout=2) + self._serial.baudrate = baudrate except: - print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0] + self._log("Unexpected error while setting baudrate: %d %s" % (baudrate, sys.exc_info()[0])) continue - ser.setDTR(1) - time.sleep(0.1) - ser.setDTR(0) - time.sleep(0.2) + time.sleep(0.5) starttime = time.time() + self.sendCommand("\nM105") for line in ser: if 'start' in line: - ser.close() - ser = Serial(port, baudrate, timeout=2) - ser.setDTR(1) - time.sleep(0.1) - ser.setDTR(0) - time.sleep(0.2) - return ser + return + if 'ok' in line: + return if starttime - time.time() > 10: break - ser.close() + self._serial.close() return None + + def _log(self, message): + if self._logCallback != None: + self._logCallback(message) + else: + print(message) def readline(self): - if self.serial == None: + if self._serial == None: return None try: - ret = self.serial.readline() + ret = self._serial.readline() except: - print "Unexpected error while reading serial port:", sys.exc_info()[0] - ret = '' - #if ret != '': - # print "Recv: " + ret.rstrip() + self._log("Unexpected error while reading serial port: %s" % (sys.exc_info()[0])) + return '' + if ret != '': + self._log("Recv: %s" (ret.rstrip())) + else: + self._log("Recv: NONE") return ret def close(self): - if self.serial != None: - self.serial.close() - self.serial = None + if self._serial != None: + self._serial.close() + self._serial = None def __del__(self): self.close() def isOpen(self): - return self.serial != None + return self._serial != None def sendCommand(self, cmd): - if self.serial == None: + if self._serial == None: return - #print 'Send: ' + cmd - self.serial.write(cmd + '\n') + self._log('Send: %s' % (cmd)) + try: + self._serial.write(cmd) + self._serial.write('\n') + except: + self._log("Unexpected error while writing serial port: %s" % (sys.exc_info()[0])) +