Subversion Repositories HomeAutomation

Rev

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, ownerNotifier, cfg = None):
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.confg = cfg
74
            self.config = cfg
75
        self.pktHandler = pktHandler
75
        self.pktHandler = pktHandler
76
        self.ownerNotifier = ownerNotifier
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