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.

master
daid 2012-09-05 16:10:47 +02:00
parent e7dc86ed7c
commit 06fcf0dd07
3 changed files with 62 additions and 42 deletions

View File

@ -38,6 +38,17 @@ class Stk500v2(ispBase.IspBase):
self.serial.close() self.serial.close()
self.serial = None 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): def isConnected(self):
return self.serial != None return self.serial != None

View File

@ -85,7 +85,8 @@ class VirtualPrinter():
self.readList = None self.readList = None
class MachineCom(): class MachineCom():
def __init__(self, port = None, baudrate = None): def __init__(self, port = None, baudrate = None, logCallback = None):
self._logCallback = logCallback
if port == None: if port == None:
port = profile.getPreference('serial_port') port = profile.getPreference('serial_port')
if baudrate == None: if baudrate == None:
@ -93,86 +94,94 @@ class MachineCom():
baudrate = 0 baudrate = 0
else: else:
baudrate = int(profile.getPreference('serial_baud')) baudrate = int(profile.getPreference('serial_baud'))
self.serial = None self._serial = None
if port == 'AUTO': if port == 'AUTO':
programmer = stk500v2.Stk500v2() programmer = stk500v2.Stk500v2()
self._log("Serial port list: %s" % (str(serialList())))
for port in serialList(): for port in serialList():
try: try:
print "Connecting to: %s" % (port) self._log("Connecting to: %s" % (port))
programmer.connect(port) programmer.connect(port)
programmer.close() self._serial = programmer.leaveISP()
time.sleep(1) self._configureSerialWithBaudrate(baudrate)
self.serial = self._openPortWithBaudrate(port, baudrate)
break break
except ispBase.IspError as (e): except ispBase.IspError as (e):
print "Error while connecting to %s" % (port) self._log("Error while connecting to %s: %s" % (port, str(e)))
print e
pass pass
except: 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() programmer.close()
elif port == 'VIRTUAL': elif port == 'VIRTUAL':
self.serial = VirtualPrinter() self._serial = VirtualPrinter()
else: else:
try: try:
self.serial = self._openPortWithBaudrate(port, baudrate) self._serial = Serial(port, 115200, timeout=2)
self._configureSerialWithBaudrate(baudrate)
except: 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]))
print self.serial print self._serial
def _openPortWithBaudrate(self, port, baudrate): def _openPortWithBaudrate(self, port, baudrate):
if baudrate != 0: if baudrate != 0:
return Serial(port, baudrate, timeout=2) self._serial.baudrate = baudrate
return
for baudrate in baudrateList(): for baudrate in baudrateList():
try: try:
ser = Serial(port, baudrate, timeout=2) self._serial.baudrate = baudrate
except: 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 continue
ser.setDTR(1) time.sleep(0.5)
time.sleep(0.1)
ser.setDTR(0)
time.sleep(0.2)
starttime = time.time() starttime = time.time()
self.sendCommand("\nM105")
for line in ser: for line in ser:
if 'start' in line: if 'start' in line:
ser.close() return
ser = Serial(port, baudrate, timeout=2) if 'ok' in line:
ser.setDTR(1) return
time.sleep(0.1)
ser.setDTR(0)
time.sleep(0.2)
return ser
if starttime - time.time() > 10: if starttime - time.time() > 10:
break break
ser.close() self._serial.close()
return None return None
def _log(self, message):
if self._logCallback != None:
self._logCallback(message)
else:
print(message)
def readline(self): def readline(self):
if self.serial == None: if self._serial == None:
return None return None
try: try:
ret = self.serial.readline() ret = self._serial.readline()
except: except:
print "Unexpected error while reading serial port:", sys.exc_info()[0] self._log("Unexpected error while reading serial port: %s" % (sys.exc_info()[0]))
ret = '' return ''
#if ret != '': if ret != '':
# print "Recv: " + ret.rstrip() self._log("Recv: %s" (ret.rstrip()))
else:
self._log("Recv: NONE")
return ret return ret
def close(self): def close(self):
if self.serial != None: if self._serial != None:
self.serial.close() self._serial.close()
self.serial = None self._serial = None
def __del__(self): def __del__(self):
self.close() self.close()
def isOpen(self): def isOpen(self):
return self.serial != None return self._serial != None
def sendCommand(self, cmd): def sendCommand(self, cmd):
if self.serial == None: if self._serial == None:
return return
#print 'Send: ' + cmd self._log('Send: %s' % (cmd))
self.serial.write(cmd + '\n') try:
self._serial.write(cmd)
self._serial.write('\n')
except:
self._log("Unexpected error while writing serial port: %s" % (sys.exc_info()[0]))