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