Subversion Repositories HomeAutomation

Rev

Rev 736 | Rev 739 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 736 Rev 738
Line 2... Line 2...
2
#
2
#
3
# CanStim interface, used to emulate connected can nodes
3
# CanStim interface, used to emulate connected can nodes
-
 
4
#
-
 
5
# - Create fake node network
-
 
6
# - Replay log
4
#
7
#
5
###########################################################
8
###########################################################
6
import logging as log
9
import logging as log
7
from NodeIfBase import NodeIfBase
10
from NodeIfBase import NodeIfBase
8
from threading import Thread
11
from threading import Thread
-
 
12
from CanPkt import CanPkt
9
import time
13
import time
10
 
14
 
11
''' Generic dummy node '''
15
''' Generic dummy node '''
12
class DummyNode():
16
class DummyNode():
-
 
17
    def tick(self):
13
    pass
18
        pass
-
 
19
 
14
 
20
 
15
''' Temperature sensor node '''
21
''' Temperature sensor node '''
16
class TempNode(DummyNode):
22
class TempNode(DummyNode):
-
 
23
   
-
 
24
    frames = 0
-
 
25
   
-
 
26
    def __init__ (self):
17
    pass
27
        pass
-
 
28
   
-
 
29
    def read(self):
-
 
30
        self.frames = self.frames + 1
-
 
31
        if self.frames % 100 == 0:
-
 
32
            pktstr = CanPkt(0x1f8f0100,[0x5f,0x3a,0x40,0x01]).toString()
-
 
33
            return pktstr
18
 
34
 
19
''' Relay node, controls switches '''
35
''' Relay node, controls switches '''
20
class RelayNode(DummyNode):
36
class RelayNode(DummyNode):
21
    pass
37
    pass
22
 
38
 
23
''' View node, controls an LCD or similar '''
39
''' View node, controls an LCD or similar '''
24
class ViewNode(DummyNode):
40
class ViewNode(DummyNode):
25
    pass
41
    pass
26
 
42
 
27
''' IO Node, a bridge to some other protocol over can '''
43
''' IO Node, a bridge to some other protocol over can '''
28
class IONode(DummyNode):
44
class IONode(DummyNode):
29
    pass
45
    pass
30
 
46
 
31
class CanStimThread(Thread):
47
class CanStimThread(Thread):
32
    dummyList = []
48
    dummyList = []
33
    numDummies = 0
49
    numDummies = 0
34
    terminated = False
50
    terminated = False
-
 
51
    ownerNotifier = None
-
 
52
    pktHandler = None
35
   
53
   
36
    def __init__ (self):
54
    def __init__ (self, pktHandler, ownerNotifier):
-
 
55
        self.ownerNotifier = ownerNotifier
-
 
56
        self.pktHandler = pktHandler
37
        Thread.__init__(self)
57
        Thread.__init__(self)
-
 
58
       
-
 
59
       
38
    def run(self):
60
    def run(self):
39
        log.debug('CanStimThread.run')
61
        log.debug('CanStimThread.run')
-
 
62
        try:
-
 
63
            readBuffer = None
40
        while not self.terminated:
64
            while not self.terminated:
-
 
65
                for dummy in self.dummyList:
-
 
66
                    readBuffer = dummy.read()
-
 
67
                    if readBuffer and len(readBuffer) > 0:
-
 
68
                        self.pktHandler.input(readBuffer)
41
            time.sleep(0.1)
69
                time.sleep(0.001)
-
 
70
               
-
 
71
            self.ownerNotifier.notify(self.ownerNotifier.TERMINATE)
-
 
72
           
-
 
73
        except: # sys.excepthook does not work in threads
-
 
74
            import traceback
-
 
75
            traceback.print_exc()
-
 
76
            self.terminate()
-
 
77
           
42
    def terminate(self):
78
    def terminate(self):
-
 
79
        log.debug('CanStimThread.terminate')
43
        self.terminated = True
80
        self.terminated = True
-
 
81
       
44
 
82
 
45
class NodeIfCanStim(NodeIfBase):
83
class NodeIfCanStim(NodeIfBase):
46
    DEFAULT_CONFIG = {'DummyNodes':[]}
-
 
47
   
84
   
-
 
85
    DEFAULT_CONFIG = {'DummyNodes':[]}
-
 
86
    config = None
48
    stimThread = None
87
    stimThread = None
-
 
88
    ifNotifier = None
-
 
89
    pktHandler = None
49
   
90
   
50
    def __init__ (self, cfg = None, pktHandler = None):
91
    def __init__ (self, cfg = None, pktHandler = None, ifNotifier = None):
51
        if cfg is None:
92
        if cfg is None:
52
            self.config = DEFAULT_CONFIG
93
            self.config = DEFAULT_CONFIG
-
 
94
        if ifNotifier:
-
 
95
            self.ifNotifier = ifNotifier
53
           
96
           
-
 
97
        self.pktHandler = pktHandler
54
        NodeIfBase.__init__(self, cfg, pktHandler)
98
        NodeIfBase.__init__(self, cfg, pktHandler)
55
       
99
       
56
    def start(self):
100
    def start(self):
-
 
101
        self.stimThread = CanStimThread(self.pktHandler, self.ifNotifier)
57
        stimThread = CanStimThread()
102
        tempDummy = TempNode()
-
 
103
        self.stimThread.dummyList.append(tempDummy)
58
        stimThread.start()
104
        self.stimThread.start()
-
 
105
        return True
59
       
106
   
60
    def stop(self):
107
    def stop(self):
-
 
108
        if self.stimThread is not None and not self.stimThread.terminated:
61
        stimThread.dummyList.clear()
109
            self.stimThread.terminate()
-
 
110
        else:
-
 
111
            log.debug('CanStim interface not started, or already stopped')
-
 
112
           
-
 
113
    def running(self):
-
 
114
        if self.stimThread is not None:
-
 
115
            return self.stimThread.terminated
-
 
116
        else:
-
 
117
            return False
62
 
118
 
63
    def removeDummy(self, DummyNode):
119
    def removeDummy(self, DummyNode):
64
        ''' if possible'''
120
        ''' if possible'''
65
        stimThread.dummyList.remove(DummyNode)
121
        self.stimThread.dummyList.remove(DummyNode)
66
        DummyNode.terminate()
-
 
67
   
122
   
68
    def addDummy(self, DummyNode):
123
    def addDummy(self, DummyNode):
69
        '''if possible'''
124
        '''if possible'''
70
        stimThread.dummyList.add(DummyNode)
125
        self.stimThread.dummyList.add(DummyNode)
71
        DummyNode.start()
-
 
72
 
126