Rev 747 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 747 | Rev 750 | ||
|---|---|---|---|
| 1 | ########################################################### |
1 | ########################################################### |
| 2 | # |
2 | # |
| 3 | # Node interface through raw TCP socket (telnet) |
3 | # Node interface through raw TCP socket (telnet) |
| 4 | # |
4 | # |
| 5 | ########################################################### |
5 | ########################################################### |
| 6 | import logging as log |
6 | import logging as log |
| 7 | from NodeIfBase import NodeIfBase |
7 | from NodeIfBase import NodeIfBase |
| 8 | from threading import Thread |
8 | from threading import Thread |
| 9 | from TCPClient import TCPClient |
9 | from TCPClient import TCPClient |
| 10 | import time |
10 | import time |
| 11 | 11 | ||
| 12 | class TCPThread(Thread): |
12 | class TCPThread(Thread): |
| 13 | ownerNotifier = None |
13 | ownerNotifier = None |
| 14 | terminated = False |
14 | terminated = False |
| 15 | tcpClient = None |
15 | tcpClient = None |
| 16 | pktHandler = None |
16 | pktHandler = None |
| 17 | host = None |
17 | host = None |
| 18 | port = None |
18 | port = None |
| 19 | 19 | ||
| 20 | def __init__ (self, pktHandler, ownerNotifier, host, port): |
20 | def __init__ (self, pktHandler, ownerNotifier, host, port): |
| 21 | Thread.__init__(self) |
21 | Thread.__init__(self) |
| 22 | self.pktHandler = pktHandler |
22 | self.pktHandler = pktHandler |
| 23 | self.ownerNotifier = ownerNotifier |
23 | self.ownerNotifier = ownerNotifier |
| 24 | self.host = host |
24 | self.host = host |
| 25 | self.port = port |
25 | self.port = port |
| 26 | 26 | ||
| 27 | def cleanup(self): |
27 | def cleanup(self): |
| 28 | if self.tcpClient is not None: |
28 | if self.tcpClient is not None: |
| 29 | self.tcpClient.disconnect() |
29 | self.tcpClient.disconnect() |
| 30 | self.ownerNotifier.notify(self.ownerNotifier.TERMINATE) |
30 | self.ownerNotifier.notify(self.ownerNotifier.TERMINATE) |
| 31 | 31 | ||
| 32 | def run(self): |
32 | def run(self): |
| 33 | try: |
33 | try: |
| 34 | log.debug('TCPThread.run') |
34 | log.debug('TCPThread.run') |
| 35 | 35 | ||
| 36 | self.tcpClient = TCPClient(self.host, self.port) |
36 | self.tcpClient = TCPClient(self.host, self.port) |
| 37 | if not self.tcpClient.connect(10): |
37 | if not self.tcpClient.connect(10): |
| 38 | print 'Connection to host failed' |
38 | print 'Connection to host failed' |
| 39 | self.terminated = True |
39 | self.terminated = True |
| 40 | 40 | ||
| 41 | while not self.terminated: |
41 | while not self.terminated: |
| 42 | data = self.tcpClient.read() |
42 | data = self.tcpClient.read() |
| 43 | if data is not None: |
43 | if data is not None: |
| 44 | data = data[1:-3] # remove leading ' and trailing \n' |
44 | data = data[1:-3] # remove leading ' and trailing \n' |
| 45 | self.pktHandler.input(data) |
45 | self.pktHandler.input(data) |
| 46 | 46 | ||
| 47 | time.sleep(0.001) |
47 | time.sleep(0.001) |
| 48 | self.cleanup() |
48 | self.cleanup() |
| 49 | except: # sys.excepthook does not work in threads |
49 | except: # sys.excepthook does not work in threads |
| 50 | import traceback |
50 | import traceback |
| 51 | traceback.print_exc() |
51 | traceback.print_exc() |
| 52 | self.terminated = True |
52 | self.terminated = True |
| 53 | self.cleanup() |
53 | self.cleanup() |
| 54 | 54 | ||
| 55 | def terminate(self): |
55 | def terminate(self): |
| 56 | log.debug('TCPThread.terminate') |
56 | log.debug('TCPThread.terminate') |
| 57 | self.terminated = True |
57 | self.terminated = True |
| 58 | 58 | ||
| 59 | class NodeIfTCP: |
59 | class NodeIfTCP: |
| 60 | 60 | ||
| 61 | DEFAULT_CONFIG = {'host':'sra.eta.chalmers.se', |
61 | DEFAULT_CONFIG = {'host':'sra.eta.chalmers.se', |
| 62 | 'port':8002, |
62 | 'port':8002, |
| 63 | } |
63 | } |
| 64 | 64 | ||
| 65 | config = {} |
65 | config = {} |
| 66 | pktHandler = None |
66 | pktHandler = None |
| 67 | tcpThread = None |
67 | tcpThread = None |
| 68 | ownerNotifier = None |
68 | ownerNotifier = None |
| 69 | 69 | ||
| 70 | def __init__(self, pktHandler |
70 | def __init__(self, pktHandler, cfg = None): |
| 71 | if cfg is None: |
71 | if cfg is None: |
| 72 | self.config = self.DEFAULT_CONFIG |
72 | self.config = self.DEFAULT_CONFIG |
| 73 | else: |
73 | else: |
| 74 | self. |
74 | self.config = cfg |
| 75 | self.pktHandler = pktHandler |
75 | self.pktHandler = pktHandler |
| 76 | self |
76 | log.debug('Creating iftcp interface, config: ' + str(self.config)) |
| 77 | 77 | ||
| 78 | def setPktHandler(self, pktHandler): |
78 | def setPktHandler(self, pktHandler): |
| 79 | self.pktHandler = pktHandler |
79 | self.pktHandler = pktHandler |
| - | 80 | ||
| - | 81 | def setIfNotifier(self, ifNotifier): |
|
| - | 82 | self.ownerNotifier = ifNotifier |
|
| 80 | 83 | ||
| 81 | def start(self): |
84 | def start(self): |
| 82 | host = self.config['host'] |
85 | host = self.config['host'] |
| 83 | port = self.config['port'] |
86 | port = self.config['port'] |
| 84 | self.tcpThread = TCPThread(self.pktHandler, self.ownerNotifier, host, port) |
87 | self.tcpThread = TCPThread(self.pktHandler, self.ownerNotifier, host, port) |
| 85 | self.tcpThread.start() |
88 | self.tcpThread.start() |
| 86 | return True |
89 | return True |
| 87 | 90 | ||
| 88 | def stop(self): |
91 | def stop(self): |
| 89 | if self.running(): |
92 | if self.running(): |
| 90 | self.tcpThread.terminate() |
93 | self.tcpThread.terminate() |
| 91 | else: |
94 | else: |
| 92 | log.debug('TCP interface not started, or already stopped') |
95 | log.debug('TCP interface not started, or already stopped') |
| 93 | 96 | ||
| 94 | def running(self): |
97 | def running(self): |
| 95 | if self.tcpThread is not None: |
98 | if self.tcpThread is not None: |
| 96 | return not self.tcpThread.terminated |
99 | return not self.tcpThread.terminated |
| 97 | else: |
100 | else: |
| 98 | return False |
101 | return False |
| 99 | 102 | ||