#!/usr//bin/env python # vim: ts=8 sts=4 sw=4 expandtab # Author: Douglas Clowes (dcl@ansto.gov.au) 2012-06-29 from twisted.internet.protocol import Protocol from twisted.internet.protocol import ServerFactory from galilcontroller import GalilController class GalilProtocol(Protocol): """Protocol object used by the Twisted Infrastructure to handle connections """ def __init__(self, thisDevice): print "GalilProtocol protocol ctor", thisDevice self.device = thisDevice self.term = "\r\n" def write(self, response): self.response = self.response + response def connectionMade(self): self.pdu = "" self.response = "" self.device.protocol = self self.factory.numProtocols = self.factory.numProtocols + 1 print "connectionMade: connection number", self.factory.numProtocols if self.factory.numProtocols > 2: print "Too many connections - rejecting" self.transport.write("Too many connections, try later\r\n") self.transport.loseConnection() '''else: self.transport.write("Welcome connection %d\r\n" % self.factory.numProtocols)''' def connectionLost(self, reason): self.factory.numProtocols = self.factory.numProtocols - 1 print "connectionLost: connections left", self.factory.numProtocols def dataReceived(self, data): #print "dataReceived - len:", len(data) last_was_cr = False for c in data: if c == "\r" or c == ";" or c == "\n": if c == "\n" and last_was_cr: continue last_was_cr = False if c == "\r": last_was_cr = True if len(self.pdu) > 0: #print "Request: ", self.pdu the_response = self.device.dataReceived(self.pdu) #print "Response:", the_response for item in the_response: self.write(item + self.term) self.pdu = "" if c == ";": if len(self.response) > 0 and self.response[-1] != ":": self.response = self.response + ":" else: if len(self.response) > 0: if self.response[-1] == ";": self.response = self.response[:-1] if len(self.response) > 0 and self.response[-1] != ":": self.response = self.response + ":" if len(self.response) == 0: self.response = self.response + ":" if len(self.response) > 0: #print "Protocol Response: %s" % self.response self.transport.write(self.response) self.response = "" else: self.pdu = self.pdu + c class GalilFactory(ServerFactory): """Factory object used by the Twisted Infrastructure to create a Protocol object for incomming connections""" protocol = GalilProtocol def __init__(self, thePort): print "GalilFactory ctor: " self.port = thePort self.device = GalilController(thePort) self.numProtocols = 0 def buildProtocol(self, addr): p = self.protocol(self.device) p.factory = self return p