Commit a50ebb02 authored by Guillaume Seguin's avatar Guillaume Seguin

Merge branch 'experimental' of github.com:kliment/Printrun into experimental

parents 5d559db6 89c0a242
...@@ -17,9 +17,11 @@ ...@@ -17,9 +17,11 @@
from serial import Serial, SerialException from serial import Serial, SerialException
from threading import Thread from threading import Thread
from select import error as SelectError from select import error as SelectError, select
import time, getopt, sys import time, getopt, sys
import platform, os import platform, os
import socket # Network
import re # Regex
from collections import deque from collections import deque
from printrun.GCodeAnalyzer import GCodeAnalyzer from printrun.GCodeAnalyzer import GCodeAnalyzer
from printrun import gcoder from printrun import gcoder
...@@ -38,6 +40,9 @@ def enable_hup(port): ...@@ -38,6 +40,9 @@ def enable_hup(port):
def disable_hup(port): def disable_hup(port):
control_ttyhup(port, True) control_ttyhup(port, True)
def is_socket(printer):
return (type(printer) == socket._socketobject)
class printcore(): class printcore():
def __init__(self, port = None, baud = None): def __init__(self, port = None, baud = None):
"""Initializes a printcore instance. Pass the port and baud rate to connect immediately """Initializes a printcore instance. Pass the port and baud rate to connect immediately
...@@ -102,8 +107,15 @@ class printcore(): ...@@ -102,8 +107,15 @@ class printcore():
if baud is not None: if baud is not None:
self.baud = baud self.baud = baud
if self.port is not None and self.baud is not None: if self.port is not None and self.baud is not None:
disable_hup(self.port) # Connect to socket if "port" is an IP, device if not
self.printer = Serial(port = self.port, baudrate = self.baud, timeout = 0.25) p = re.compile("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$")
if p.match(port):
self.printer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.timeout = 0.25
self.printer.connect((port, baud))
else:
disable_hup(self.port)
self.printer = Serial(port = self.port, baudrate = self.baud, timeout = 0.25)
self.stop_read_thread = False self.stop_read_thread = False
self.read_thread = Thread(target = self._listen) self.read_thread = Thread(target = self._listen)
self.read_thread.start() self.read_thread.start()
...@@ -111,14 +123,27 @@ class printcore(): ...@@ -111,14 +123,27 @@ class printcore():
def reset(self): def reset(self):
"""Reset the printer """Reset the printer
""" """
if self.printer: if self.printer and not is_socket(self.printer):
self.printer.setDTR(1) self.printer.setDTR(1)
time.sleep(0.2) time.sleep(0.2)
self.printer.setDTR(0) self.printer.setDTR(0)
def _readline(self): def _readline(self):
try: try:
line = self.printer.readline() # Read line if socket
if is_socket(self.printer):
line = ''
ready = select([self.printer], [], [], self.timeout)
if ready[0]:
while not "\n" in line:
chunk = self.printer.recv(1)
if chunk == '':
raise RuntimeError("socket connection broken")
line = line + chunk
# Read if tty
else:
line = self.printer.readline()
if len(line) > 1: if len(line) > 1:
self.log.append(line) self.log.append(line)
if self.recvcb: if self.recvcb:
...@@ -140,6 +165,8 @@ class printcore(): ...@@ -140,6 +165,8 @@ class printcore():
return None return None
def _listen_can_continue(self): def _listen_can_continue(self):
if is_socket(self.printer):
return not self.stop_read_thread and self.printer
return not self.stop_read_thread and self.printer and self.printer.isOpen() return not self.stop_read_thread and self.printer and self.printer.isOpen()
def _listen_until_online(self): def _listen_until_online(self):
...@@ -267,6 +294,8 @@ class printcore(): ...@@ -267,6 +294,8 @@ class printcore():
self.pauseE = self.analyzer.e-self.analyzer.eOffset; self.pauseE = self.analyzer.e-self.analyzer.eOffset;
self.pauseF = self.analyzer.f; self.pauseF = self.analyzer.f;
self.pauseRelative = self.analyzer.relative; self.pauseRelative = self.analyzer.relative;
def resume(self): def resume(self):
"""Resumes a paused print. """Resumes a paused print.
...@@ -428,9 +457,21 @@ class printcore(): ...@@ -428,9 +457,21 @@ class printcore():
try: self.sendcb(command) try: self.sendcb(command)
except: pass except: pass
try: try:
self.printer.write(str(command+"\n")) # If the printer is connected via Ethernet, use send
if is_socket(self.printer):
msg = str(command+"\n")
totalsent = 0
while totalsent < len(msg):
sent = self.printer.send(msg[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = totalsent + sent
else:
self.printer.write(str(command+"\n"))
except SerialException, e: except SerialException, e:
print "Can't write to printer (disconnected?)." print "Can't write to printer (disconnected?)."
except RuntimeError, e:
print "Socket connection broken, disconnected."
if __name__ == '__main__': if __name__ == '__main__':
baud = 115200 baud = 115200
......
...@@ -26,7 +26,6 @@ pyglet.options['debug_gl'] = True ...@@ -26,7 +26,6 @@ pyglet.options['debug_gl'] = True
from pyglet.gl import * from pyglet.gl import *
from pyglet import gl from pyglet import gl
from pyglet.graphics.vertexbuffer import create_buffer
from printrun import gcoder from printrun import gcoder
from printrun import stltool from printrun import stltool
......
...@@ -23,7 +23,7 @@ import sys ...@@ -23,7 +23,7 @@ import sys
from pyglet.gl import * from pyglet.gl import *
from pyglet import gl from pyglet import gl
from pyglet.graphics.vertexbuffer import create_buffer from pyglet.graphics.vertexbuffer import create_buffer, VertexBufferObject
from . import vector from . import vector
...@@ -339,7 +339,11 @@ class GcodeModel(Model): ...@@ -339,7 +339,11 @@ class GcodeModel(Model):
def _display_movements(self, mode_2d=False): def _display_movements(self, mode_2d=False):
self.vertex_buffer.bind() self.vertex_buffer.bind()
glVertexPointer(3, GL_FLOAT, 0, None) has_vbo = isinstance(self.vertex_buffer, VertexBufferObject)
if has_vbo:
glVertexPointer(3, GL_FLOAT, 0, None)
else:
glVertexPointer(3, GL_FLOAT, 0, self.vertex_buffer.ptr)
if mode_2d: if mode_2d:
glScale(1.0, 1.0, 0.0) # discard z coordinates glScale(1.0, 1.0, 0.0) # discard z coordinates
...@@ -360,7 +364,10 @@ class GcodeModel(Model): ...@@ -360,7 +364,10 @@ class GcodeModel(Model):
glEnableClientState(GL_COLOR_ARRAY) glEnableClientState(GL_COLOR_ARRAY)
self.vertex_color_buffer.bind() self.vertex_color_buffer.bind()
glColorPointer(4, GL_FLOAT, 0, None) if has_vbo:
glColorPointer(4, GL_FLOAT, 0, None)
else:
glColorPointer(4, GL_FLOAT, 0, self.vertex_color_buffer.ptr)
start = max(self.printed_until, 0) start = max(self.printed_until, 0)
end = end - start end = end - start
...@@ -372,10 +379,17 @@ class GcodeModel(Model): ...@@ -372,10 +379,17 @@ class GcodeModel(Model):
def _display_arrows(self): def _display_arrows(self):
self.arrow_buffer.bind() self.arrow_buffer.bind()
glVertexPointer(3, GL_FLOAT, 0, None) has_vbo = isinstance(self.arrow_buffer, VertexBufferObject)
if has_vbo:
glVertexPointer(3, GL_FLOAT, 0, None)
else:
glVertexPointer(3, GL_FLOAT, 0, self.arrow_buffer.ptr)
self.arrow_color_buffer.bind() self.arrow_color_buffer.bind()
glColorPointer(4, GL_FLOAT, 0, None) if has_vbo:
glColorPointer(4, GL_FLOAT, 0, None)
else:
glColorPointer(4, GL_FLOAT, 0, self.arrow_color_buffer.ptr)
start = (self.layer_stops[self.num_layers_to_draw - 1] // 2) * 3 start = (self.layer_stops[self.num_layers_to_draw - 1] // 2) * 3
end = (self.layer_stops[self.num_layers_to_draw] // 2) * 3 end = (self.layer_stops[self.num_layers_to_draw] // 2) * 3
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment