Subversion Repositories HomeAutomation

Rev

Rev 739 | Blame | Last modification | View Log | SVN | RSS feed

  1. ###########################################################
  2. #
  3. # CanStim interface, used to emulate connected can nodes
  4. #
  5. # - Create fake node network
  6. # - Replay log
  7. #
  8. ###########################################################
  9. import logging as log
  10. from NodeIfBase import NodeIfBase
  11. from threading import Thread
  12. from CanPkt import CanPkt
  13. import time
  14.  
  15. ''' Generic dummy node '''
  16. class DummyNode():
  17.     def tick(self):
  18.         pass
  19.  
  20.  
  21. ''' Temperature sensor node '''
  22. class TempNode(DummyNode):
  23.    
  24.     frames = 0
  25.    
  26.     def __init__ (self):
  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
  34.  
  35. ''' Relay node, controls switches '''
  36. class RelayNode(DummyNode):
  37.     pass
  38.  
  39. ''' View node, controls an LCD or similar '''
  40. class ViewNode(DummyNode):
  41.     pass
  42.  
  43. ''' IO Node, a bridge to some other protocol over can '''
  44. class IONode(DummyNode):
  45.     pass
  46.  
  47. class CanStimThread(Thread):
  48.     dummyList = []
  49.     numDummies = 0
  50.     terminated = False
  51.     ownerNotifier = None
  52.     pktHandler = None
  53.    
  54.     def __init__ (self, pktHandler, ownerNotifier):
  55.         self.ownerNotifier = ownerNotifier
  56.         self.pktHandler = pktHandler
  57.         Thread.__init__(self)
  58.        
  59.        
  60.     def run(self):
  61.         log.debug('CanStimThread.run')
  62.         try:
  63.             readBuffer = None
  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)
  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.            
  78.     def terminate(self):
  79.         log.debug('CanStimThread.terminate')
  80.         self.terminated = True
  81.        
  82.  
  83. class NodeIfCanStim(NodeIfBase):
  84.    
  85.     DEFAULT_CONFIG = {'DummyNodes':[]}
  86.     config = None
  87.     stimThread = None
  88.     ownerNotifier = None
  89.     pktHandler = None
  90.    
  91.     def __init__ (self, pktHandler, cfg = None):
  92.         if cfg is None:
  93.             self.config = DEFAULT_CONFIG
  94.            
  95.         self.pktHandler = pktHandler
  96.         NodeIfBase.__init__(self, cfg, pktHandler)
  97.    
  98.     def setPktHandler(self, pktHandler):
  99.         self.pktHandler = pktHandler
  100.        
  101.     def setIfNotifier(ifNotifier):
  102.         self.ownerNotifier = ifNotifier
  103.        
  104.     def start(self):
  105.         self.stimThread = CanStimThread(self.pktHandler, self.ifNotifier)
  106.         tempDummy = TempNode()
  107.         self.stimThread.dummyList.append(tempDummy)
  108.         self.stimThread.start()
  109.         return True
  110.    
  111.     def stop(self):
  112.         if self.stimThread is not None and not self.stimThread.terminated:
  113.             self.stimThread.terminate()
  114.         else:
  115.             log.debug('CanStim interface not started, or already stopped')
  116.            
  117.     def running(self):
  118.         if self.stimThread is not None:
  119.             return not self.stimThread.terminated
  120.         else:
  121.             return False
  122.  
  123.     def removeDummy(self, DummyNode):
  124.         ''' if possible'''
  125.         self.stimThread.dummyList.remove(DummyNode)
  126.    
  127.     def addDummy(self, DummyNode):
  128.         '''if possible'''
  129.         self.stimThread.dummyList.add(DummyNode)
  130.  
  131.