From 64137be9a175b7c2a88cec28da74b445aefdd434 Mon Sep 17 00:00:00 2001 From: kliment Date: Tue, 10 May 2011 09:59:28 +0200 Subject: [PATCH] Initial commit, basic functionality (send gcode to printer, pause, resume, send intermediate command) --- README | 13 +++++ printcore.py | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 README create mode 100644 printcore.py diff --git a/README b/README new file mode 100644 index 0000000..d4b9999 --- /dev/null +++ b/README @@ -0,0 +1,13 @@ +This is the beginning of a python-based host software for reprap printers. + +Currently contains printcore.py, which requires pyserial to be installed. + +Using printcore: + +p=printcore('/dev/ttyUSB0',115200) +p.startprint(data) # data is an array of gcode lines +p.send_now("M105") # sends M105 as soon as possible +p.pause() +p.resume() +p.disconnect() + diff --git a/printcore.py b/printcore.py new file mode 100644 index 0000000..b1a0839 --- /dev/null +++ b/printcore.py @@ -0,0 +1,150 @@ +from serial import Serial +from threading import Thread +import time + +class printcore(): + def __init__(self,port=None,baud=None): + self.baud=None + self.port=None + self.printer=None + self.clear=0 + self.mainqueue=[] + self.priqueue=[] + if port is not None and baud is not None: + print port, baud + self.connect(port, baud) + print "connected\n" + self.readthread=None + self.queueindex=0 + self.lineno=0 + self.resendfrom=-1 + self.online=False + self.printing=False + self.sentlines={} + + def disconnect(self): + if(self.printer): + self.printer.close() + self.printer=None + self.online=False + self.printing=False + + def connect(self,port=None,baud=None): + if(self.printer): + self.disconnect() + if port is not None: + self.port=port + if baud is not None: + self.baud=baud + if self.port is not None and self.baud is not None: + self.printer=Serial(self.port,self.baud,timeout=5) + Thread(target=self._listen).start() + + def _listen(self): + """This function acts on messages from the firmware + """ + time.sleep(1) + print "listening:" + while(True): + if(not self.printer or not self.printer.isOpen): + print "port not open" + break + line=self.printer.readline() + print "RECV:",line + if(line.startswith('start')): + self.clear=True + self.online=True + elif(line.startswith('ok')): + self.clear=True + self.resendfrom=-1 + #put temp handling here + elif(line.startswith('Error')): + pass + if "Resend" in line or "rs" in line: + toresend=int(line.split(':')[1]) + self.resendfrom=toresend + self.clear=True + print "done listening" + + def checksum(self,command): + return reduce(lambda x,y:x^y, map(ord,command)) + + def startprint(self,data): + if(self.printing): + return False + self.printing=True + self.mainqueue=[]+data + self._send("M110",-1, True) + Thread(target=self._print).start() + return True + + def pause(self): + self.printing=False + + def resume(self): + self.printing=True + threading.Thread(target=self._print).start() + + def send_now(self,command): + if(self.printing): + self.priqueue+=[command] + else: + self._send(command) + + def _print(self): + while(self.printing and self.printer): + self.sendnext() + + def sendnext(self): + if(not self.printer): + return + if(self.resendfrom>-1): + while(self.resendfrom0): + while not self.clear: + time.sleep(0.001) + self.clear=False + self._send(tline,self.lineno,True) + self.lineno+=1 + self.queueindex+=1 + else: + self.printing=False + self.queueindex=0 + self.lineno=0 + self._send("M110",-1, True) + + def _send(self, command, lineno=0, calcchecksum=False): + if(calcchecksum): + prefix="N"+str(lineno)+" "+command + command=prefix+"*"+str(self.checksum(prefix)) + self.sentlines[lineno]=command + if(self.printer): + print "sending: "+command+"\n" + self.printer.write(command+"\n") + +if __name__ == '__main__': + p=printcore('/dev/ttyUSB0',115200) + time.sleep(5) + testdata="""G28 +G1 X0 Y0 +G1 X10 Y10 +G1 X0 Y0 +; +""" + p.startprint(testdata.split('\n')) + time.sleep(10) + p.disconnect()