Beispiel #1
0
	def _connect(self):
		self.changeState(State.OPENING_CONNECTION)
		
		self._pipe = PipeReadWrite(self._readTimeout, self._writeTimeout)
		self.changeState(State.CONNECTED)
		self._transport_logger.debug("Connected to %s" % self._pipe)
		#eventManager().fire(Events.CONNECTED, {"port": self._port, "baudrate": self._baudrate})
		eventManager().fire(Events.CONNECTED, {"port": "pipe", "baudrate": "115200"})
		return True
Beispiel #2
0
class PipeTransport(Transport):

	__transportinfo__ = ("pipe", "Pipe", False)

	def __init__(self, messageReceiver, stateReceiver, logReceiver):
		Transport.__init__(self, messageReceiver, stateReceiver, logReceiver)

		self._pipe = None
		self._port = None
		self._baudrate = None
		self._connectionTimeout = None
		self._writeTimeout = None
		self._readTimeout = None

		self._timeoutCounter = 0
		self._maxTimeouts = 20

		self._thread = None

	def get_properties(self):
		return {
			TransportProperties.FLOWCONTROL: False
		}

	def get_connection_options(self):
		print("in pipeTransport.py, call get_connection_options")
		return {
			"port": 'PIPE',
			"baudrate": 115200
		}
		"""lkj	"port": self.__getPipeList(),
			"baudrate": self.__getBaudrateList()
		"""

	def connect(self, opt):
		Transport.connect(self, opt)

		#lkj self._port = opt["port"] if "port" in opt else None
		#lkj self._baudrate = opt["baudrate"] if "baudrate" in opt else None

		self._readTimeout = opt["timeout"]["read"] if "timeout" in opt and "read" in opt["timeout"] else 5.0
		self._writeTimeout = opt["timeout"]["write"] if "timeout" in opt and "write" in opt["timeout"] else 0.5

		if self._connect():
			self._thread = threading.Thread(target=self._monitor, name="PipeTransportMonitor")
			self._thread.daemon = True
			self._thread.start()

	def disconnect(self, onError=False):
		try:
			if self._pipe is not None:
				self._pipe.close()
		finally:
			self._pipe = None
		self._thread = None
		Transport.disconnect(self, onError)

	def send(self, command):
		commandToSend = command + "\n"
		try:
			self._pipe.write(commandToSend)
			self._transport_logger.info("Send: %s" % command)
			self.logTx(command)
#lkj		except serial.SerialTimeoutException:
#			self._transport_logger.warn("Timeout while sending: %s" % command)
#			self.logError("Pipe timeout while writing to pipe port, try again later.")
#			raise SendTimeout()
		except:
			exceptionString = getExceptionString()
			self.logError("Unexpected error while writing pipe port: %s" % exceptionString)
			self.onError(exceptionString)
			self.disconnect(True)
			raise TransportError()

	def receive(self):
		return self._readline()

	def _monitor(self):
		error = None
		while True:
			line = self._readline()
			if line is None:
				error = "Pipe connection closed unexpectedly"
				break
			if line == "":
				self._timeoutCounter += 1
				self.onTimeout()
				if self._maxTimeouts and self._timeoutCounter > self._maxTimeouts:
					error = "Printer did not respond at all over %d retries, considering it dead" % self._maxTimeouts
					break
			else:
				self._timeoutCounter = 0
			self.onMessageReceived(line.strip())

		if error is not None:
			self._transport_logger.error(error)
			self.logError(error)
			self.onError(error)
			# TODO further error handling

	def _connect(self):
		self.changeState(State.OPENING_CONNECTION)
		
		self._pipe = PipeReadWrite(self._readTimeout, self._writeTimeout)
		self.changeState(State.CONNECTED)
		self._transport_logger.debug("Connected to %s" % self._pipe)
		#eventManager().fire(Events.CONNECTED, {"port": self._port, "baudrate": self._baudrate})
		eventManager().fire(Events.CONNECTED, {"port": "pipe", "baudrate": "115200"})
		return True

	def _readline(self):
		if self._pipe is None:
			return None

		try:
			line = self._pipe.readline()
		except:
			exceptionString = getExceptionString()
			print("lkj Unexpected error while reading pipe port: %s" % exceptionString)
			self.logError("Unexpected error while reading pipe port: %s" % exceptionString)
			self.onError(exceptionString)
			self.disconnect()
			return None

		if line != "":
			loggable_line = unicode(line, "ascii", "replace").encode("ascii", "replace").rstrip()
			self._transport_logger.debug("Recv: %s" % loggable_line)
			self.logRx(loggable_line)
		return line

	def __getPipeList(self):
		baselist=[]
		if os.name == "nt":
			try:
				key=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM")
				i=0
				while(1):
					baselist+=[_winreg.EnumValue(key,i)[1]]
					i+=1
			except:
				pass
		baselist = baselist \
				   + glob.glob("/dev/ttyUSB*") \
				   + glob.glob("/dev/ttyACM*") \
				   + glob.glob("/dev/ttyAMA*") \
				   + glob.glob("/dev/tty.usb*") \
				   + glob.glob("/dev/cu.*") \
				   + glob.glob("/dev/rfcomm*")

		additionalPorts = settings().get(["serial", "additionalPorts"])
		for additional in additionalPorts:
			baselist += glob.glob(additional)

		prev = settings().get(["serial", "port"])
		if prev in baselist:
			baselist.remove(prev)
			baselist.insert(0, prev)
		if settings().getBoolean(["devel", "virtualPrinter", "enabled"]):
			baselist.append("VIRTUAL")
		return baselist

	def __getBaudrateList(self):
		ret = [250000, 230400, 115200, 57600, 38400, 19200, 9600]
		prev = settings().getInt(["serial", "baudrate"])
		if prev in ret:
			ret.remove(prev)
			ret.insert(0, prev)
		return ret