1 from __future__ import absolute_import
4 import os, glob, sys, time, math
6 from serial import Serial
8 from avr_isp import stk500v2
9 from avr_isp import ispBase
10 from avr_isp import intelHex
12 from util import profile
23 key=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM")
26 baselist+=[_winreg.EnumValue(key,i)[1]]
30 return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.usb*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*")
33 return [250000, 230400, 115200, 57600, 38400, 19200, 9600]
35 class VirtualPrinter():
37 self.readList = ['start\n', 'Marlin: Virtual Marlin!\n', '\x80\n']
40 self.lastTempAt = time.time()
42 self.bedTargetTemp = 1.0
44 def write(self, data):
45 if self.readList == None:
47 print "Send: %s" % (data.rstrip())
48 if 'M104' in data or 'M109' in data:
50 self.targetTemp = float(data[data.find('S')+1:])
53 if 'M140' in data or 'M190' in data:
55 self.bedTargetTemp = float(data[data.find('S')+1:])
59 self.readList.append("ok T:%.2f /%.2f B:%.2f /%.2f @:64\n" % (self.temp, self.targetTemp, self.bedTemp, self.bedTargetTemp))
61 self.readList.append("ok\n")
64 if self.readList == None:
67 timeDiff = self.lastTempAt - time.time()
68 self.lastTempAt = time.time()
69 if abs(self.temp - self.targetTemp) > 1:
70 self.temp += math.copysign(timeDiff, self.targetTemp - self.temp)
71 if abs(self.bedTemp - self.bedTargetTemp) > 1:
72 self.bedTemp += math.copysign(timeDiff, self.bedTargetTemp - self.bedTemp)
73 while len(self.readList) < 1:
78 if self.readList == None:
81 print "Recv: %s" % (self.readList[0].rstrip())
82 return self.readList.pop(0)
88 def __init__(self, port = None, baudrate = None):
90 port = profile.getPreference('serial_port')
92 if profile.getPreference('serial_baud') == 'AUTO':
95 baudrate = int(profile.getPreference('serial_baud'))
98 programmer = stk500v2.Stk500v2()
99 for port in serialList():
101 print "Connecting to: %s" % (port)
102 programmer.connect(port)
105 self.serial = self._openPortWithBaudrate(port, baudrate)
107 except ispBase.IspError as (e):
108 print "Error while connecting to %s" % (port)
112 print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0]
114 elif port == 'VIRTUAL':
115 self.serial = VirtualPrinter()
118 self.serial = self._openPortWithBaudrate(port, baudrate)
120 print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0]
123 def _openPortWithBaudrate(self, port, baudrate):
125 return Serial(port, baudrate, timeout=2)
126 for baudrate in baudrateList():
128 ser = Serial(port, baudrate, timeout=2)
130 print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0]
136 starttime = time.time()
140 ser = Serial(port, baudrate, timeout=2)
146 if starttime - time.time() > 10:
152 if self.serial == None:
155 ret = self.serial.readline()
157 print "Unexpected error while reading serial port:", sys.exc_info()[0]
160 # print "Recv: " + ret.rstrip()
164 if self.serial != None:
172 return self.serial != None
174 def sendCommand(self, cmd):
175 if self.serial == None:
177 #print 'Send: ' + cmd
178 self.serial.write(cmd + '\n')