Subversion Repositories HomeAutomation

Rev

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

  1. #!/bin/env python
  2.  
  3. import os
  4. import sys
  5. import logging as log
  6. import getopt
  7. import atexit
  8. import time
  9.  
  10. from CanPktHandlerBase import CanPktHandlerBase
  11. from CanPktHandler1 import CanPktHandler1
  12.  
  13. from NodeIfBase import NodeIfBase
  14. from NodeIfCanStim import NodeIfCanStim
  15. from NodeIfSerial import NodeIfSerial
  16.  
  17. from DaemonConfig import DaemonConfig
  18.  
  19. daemonApp = None
  20.  
  21. class CanDaemon():
  22.    
  23.     nodeIf = None
  24.     ifNotifier = None
  25.     terminated = False
  26.    
  27.     class IfNotifier():
  28.    
  29.         UNDEFINED = 0
  30.         TERMINATE = 1
  31.    
  32.         def notify(self, msg):
  33.             if msg == self.TERMINATE:
  34.                 print 'Main terminate notify'
  35.                 self.terminated = True
  36.             else:
  37.                 print 'UNDEFINED NOTIFY'
  38.        
  39.     def __init__ (self):
  40.         pass
  41.    
  42.    
  43.     def usage(self):
  44.         pass
  45.    
  46.    
  47.     def helpCommands(self):
  48.         print 'quit, exit     : shutdown CanDaemon'
  49.         print 'help           : display help'
  50.    
  51.    
  52.     def exitHelper(self):
  53.         if self.nodeIf is not None and self.nodeIf.running():
  54.             self.nodeIf.stop()
  55.          
  56.    
  57.     def run(self):
  58.         try:
  59.             demoPath = os.path.dirname(__file__)
  60.             os.chdir(demoPath)
  61.         except:
  62.             return
  63.        
  64.         print 'INIT: Start logging'
  65.         log.basicConfig(level=log.DEBUG)
  66.        
  67.         print 'INIT: Get config options from command line / config file'
  68.         cfg = DaemonConfig()
  69.        
  70.         try:
  71.             opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
  72.         except getopt.GetoptError:
  73.             print 'Invalid usage'
  74.             usage()
  75.             sys.exit(2)
  76.      #   output = None
  77.      #   verbose = False
  78.         for o, a in opts:
  79.             if o == "-v":
  80.                 pass
  81.      #           verbose = True
  82.             if o in ("-h", "--help"):
  83.                 usage()
  84.                 sys.exit()
  85.             if o in ("-o", "--output"):
  86.                 pass
  87.     #            output = a
  88.    
  89.         print 'INIT: Loading filters and spaces'
  90.   #      cfg.filterCfg.importFilter('DefaultFilter')
  91.   #      cfg.stateSpaceCfg.importSpace('DefaultStateSpace')
  92.         cfg.stateSpaceCfg.loadSpaces()
  93.         cfg.filterCfg.loadFilters()
  94.         cfg.setupFilterBindings()
  95.         cfg.setupFilterChain()
  96.        
  97.         print 'INIT: Starting selected can interface'
  98.         ''' nodeif thread launch '''
  99.         self.ifNotifier = self.IfNotifier()
  100.         pktHandler = CanPktHandler1(cfg)
  101.        
  102.         ifConfig = NodeIfCanStim.DEFAULT_CONFIG
  103.         self.nodeIf = NodeIfCanStim(ifConfig, pktHandler, self.ifNotifier)
  104.  #       ifConfig = NodeIfSerial.DEFAULT_CONFIG
  105.    
  106.         atexit.register(self.exitHelper)
  107.  #       sys.excepthook = self.exceptHelper
  108.  #       self.nodeIf = NodeIfSerial(pktHandler, ifConfig)
  109.        
  110.         if not self.nodeIf.start():
  111.             print 'FATAL: Failed to initialize node interface.'
  112.             print 'This may indicate that the interface is unavailable, ' \
  113.                   'or that you do not have permission to access it.'
  114.             sys.exit(-1)
  115.  
  116.         print 'Initialize/gather info on connected can nodes and load associated state'
  117.         print 'Start selected TCP and UDP server(s)'
  118.         # server threads launch
  119.        
  120.         print 'CanDaemon v1 ready'
  121.         print 'Enter command or type \"help\" for a list of commands'
  122.  
  123.         while not self.terminated:
  124.             input = raw_input('> ').strip().lower()
  125.             if input == 'quit' or input == 'exit':
  126.                 self.terminated = True
  127.             elif input == 'help':
  128.                 self.helpCommands()
  129.             else:
  130.                 print 'Unknown command: ' + input
  131.        
  132.         print 'Shutdown'
  133.         if self.nodeIf.running():
  134.             self.nodeIf.stop()
  135.  
  136.         cfg.stateSpaceCfg.saveSpaces()
  137.         cfg.filterCfg.saveFilters()
  138.        
  139.         time.sleep(0.1) # wait for threads
  140.         sys.exit(0) # will except if there are threads remaining
  141.  
  142. #---------------------------------------------------------------------------
  143.  
  144. def main():
  145.     daemonApp = CanDaemon()
  146. #    install_thread_excepthook()
  147.     daemonApp.run()
  148.  
  149. #---------------------------------------------------------------------------
  150.  
  151. if __name__ == '__main__':
  152.     __name__ = 'Main'
  153.     main()
  154.