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. |
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 |
|
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 |
|
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 | ||