Blame | Last modification | View Log | SVN | RSS feed
############################################################# Node interface through raw TCP socket (telnet)############################################################import logging as logfrom NodeIfBase import NodeIfBasefrom threading import Threadfrom TCPClient import TCPClientimport timeclass TCPThread(Thread):ownerNotifier = Noneterminated = FalsetcpClient = NonepktHandler = Nonehost = Noneport = Nonedef __init__ (self, pktHandler, ownerNotifier, host, port):Thread.__init__(self)self.pktHandler = pktHandlerself.ownerNotifier = ownerNotifierself.host = hostself.port = portdef cleanup(self):if self.tcpClient is not None:self.tcpClient.disconnect()self.ownerNotifier.notify(self.ownerNotifier.TERMINATE)def run(self):try:log.debug('TCPThread.run')self.tcpClient = TCPClient(self.host, self.port)if not self.tcpClient.connect(10):print 'Connection to host failed'self.terminated = Truewhile not self.terminated:data = self.tcpClient.read()if data is not None:data = data[1:-3] # remove leading ' and trailing \n'self.pktHandler.input(data)time.sleep(0.001)self.cleanup()except: # sys.excepthook does not work in threadsimport tracebacktraceback.print_exc()self.terminated = Trueself.cleanup()def terminate(self):log.debug('TCPThread.terminate')self.terminated = Trueclass NodeIfTCP:DEFAULT_CONFIG = {'host':'sra.eta.chalmers.se','port':8002,}config = {}pktHandler = NonetcpThread = NoneownerNotifier = Nonedef __init__(self, pktHandler, ownerNotifier, cfg = None):if cfg is None:self.config = self.DEFAULT_CONFIGelse:self.confg = cfgself.pktHandler = pktHandlerself.ownerNotifier = ownerNotifierdef setPktHandler(self, pktHandler):self.pktHandler = pktHandlerdef start(self):host = self.config['host']port = self.config['port']self.tcpThread = TCPThread(self.pktHandler, self.ownerNotifier, host, port)self.tcpThread.start()return Truedef stop(self):if self.running():self.tcpThread.terminate()else:log.debug('TCP interface not started, or already stopped')def running(self):if self.tcpThread is not None:return not self.tcpThread.terminatedelse:return False