Subversion Repositories HomeAutomation

Rev

Rev 736 | Show entire file | Ignore 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 '''
Line 30... Line 46...
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