Details | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 736 | olof | 1 | #!/bin/env python |
| 2 | |||
| 3 | import os |
||
| 4 | import sys |
||
| 5 | import logging as log |
||
| 6 | import getopt |
||
| 7 | import atexit |
||
| 8 | |||
| 9 | from CanPktHandlerBase import CanPktHandlerBase |
||
| 10 | from CanPktHandler1 import CanPktHandler1 |
||
| 11 | |||
| 12 | from NodeIfBase import NodeIfBase |
||
| 13 | from NodeIfCanStim import NodeIfCanStim |
||
| 14 | from NodeIfSerial import NodeIfSerial |
||
| 15 | |||
| 16 | from DaemonConfig import DaemonConfig |
||
| 17 | |||
| 18 | daemonApp = None |
||
| 19 | |||
| 20 | class CanDaemon(): |
||
| 21 | |||
| 22 | nodeIf = None |
||
| 23 | |||
| 24 | def __init__ (self): |
||
| 25 | pass |
||
| 26 | |||
| 27 | |||
| 28 | def usage(self): |
||
| 29 | pass |
||
| 30 | |||
| 31 | |||
| 32 | def helpCommands(self): |
||
| 33 | print 'quit, exit : shutdown CanDaemon' |
||
| 34 | print 'help : display help' |
||
| 35 | |||
| 36 | |||
| 37 | def exitHelper(self): |
||
| 38 | if self.nodeIf is not None: |
||
| 39 | self.nodeIf.stop() |
||
| 40 | |||
| 41 | |||
| 42 | def exceptHelper(self, type, value, tb): |
||
| 43 | if hasattr(sys, 'ps1') or not sys.stderr.isatty(): |
||
| 44 | # we are in interactive mode or we don't have a tty-like |
||
| 45 | # device, so we call the default hook |
||
| 46 | sys.__excepthook__(type, value, tb) |
||
| 47 | else: |
||
| 48 | import traceback, pdb |
||
| 49 | # we are NOT in interactive mode, print the exception... |
||
| 50 | traceback.print_exception(type, value, tb) |
||
| 51 | print 'ERROR ERROR ERROR' |
||
| 52 | self.exitHelper() |
||
| 53 | |||
| 54 | |||
| 55 | # def install_thread_excepthook(self): |
||
| 56 | # """Workaround for sys.excepthook thread bug |
||
| 57 | # (https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1230540&group_id=5470). |
||
| 58 | # Call once from __main__ before creating any threads. |
||
| 59 | # If using psyco, call psyco.cannotcompile(threading.Thread.run) |
||
| 60 | # since this replaces a new-style class method. |
||
| 61 | # """ |
||
| 62 | # import sys, threading |
||
| 63 | # run_old = threading.Thread.run |
||
| 64 | # def run(*args, **kwargs): |
||
| 65 | # try: |
||
| 66 | # run_old(*args, **kwargs) |
||
| 67 | # except (KeyboardInterrupt, SystemExit): |
||
| 68 | # raise |
||
| 69 | # except: |
||
| 70 | # sys.excepthook(*sys.exc_info()) |
||
| 71 | # threading.Thread.run = run |
||
| 72 | |||
| 73 | |||
| 74 | def run(self): |
||
| 75 | try: |
||
| 76 | demoPath = os.path.dirname(__file__) |
||
| 77 | os.chdir(demoPath) |
||
| 78 | except: |
||
| 79 | return |
||
| 80 | |||
| 81 | print 'Start logging' |
||
| 82 | log.basicConfig(level=log.DEBUG) |
||
| 83 | |||
| 84 | print 'Get config options from command line or config file' |
||
| 85 | cfg = DaemonConfig() |
||
| 86 | |||
| 87 | try: |
||
| 88 | opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="]) |
||
| 89 | except getopt.GetoptError: |
||
| 90 | print 'Invalid usage' |
||
| 91 | usage() |
||
| 92 | sys.exit(2) |
||
| 93 | # output = None |
||
| 94 | # verbose = False |
||
| 95 | for o, a in opts: |
||
| 96 | if o == "-v": |
||
| 97 | pass |
||
| 98 | # verbose = True |
||
| 99 | if o in ("-h", "--help"): |
||
| 100 | usage() |
||
| 101 | sys.exit() |
||
| 102 | if o in ("-o", "--output"): |
||
| 103 | pass |
||
| 104 | # output = a |
||
| 105 | |||
| 106 | print 'Init and load filters and spaces' |
||
| 107 | # cfg.filterCfg.importFilter('DefaultFilter') |
||
| 108 | # cfg.stateSpaceCfg.importSpace('DefaultStateSpace') |
||
| 109 | cfg.stateSpaceCfg.loadSpaces() |
||
| 110 | cfg.filterCfg.loadFilters() |
||
| 111 | cfg.setupFilterBindings() |
||
| 112 | cfg.setupFilterChain() |
||
| 113 | |||
| 114 | print 'Start selected can interface' |
||
| 115 | ''' nodeif thread launch ''' |
||
| 116 | pktHandler = CanPktHandler1(cfg) |
||
| 117 | |||
| 118 | # cfg = NodeIfCanStim.DEFAULT_CONFIG |
||
| 119 | # nodeif = NodeIfCanStim(cfg, pkthandler) |
||
| 120 | ifConfig = NodeIfSerial.DEFAULT_CONFIG |
||
| 121 | |||
| 122 | self.nodeIf = NodeIfSerial(pktHandler, self.exceptHelper, ifConfig) |
||
| 123 | |||
| 124 | if not self.nodeIf.start(): |
||
| 125 | print 'FATAL: Failed to initialize node interface' |
||
| 126 | sys.exit(-1) |
||
| 127 | else: |
||
| 128 | atexit.register(self.exitHelper) |
||
| 129 | sys.excepthook = self.exceptHelper |
||
| 130 | |||
| 131 | print 'Initialize/gather info on connected can nodes and load associated state' |
||
| 132 | print 'Start selected TCP and UDP server(s)' |
||
| 133 | # server threads launch |
||
| 134 | |||
| 135 | print 'CanDaemon v1 ready' |
||
| 136 | print 'Enter command or type \"help\" for a list of commands' |
||
| 137 | terminated = False |
||
| 138 | while not terminated: |
||
| 139 | input = raw_input('> ').strip().lower() |
||
| 140 | if input == 'quit' or input == 'exit': |
||
| 141 | terminated = True |
||
| 142 | elif input == 'help': |
||
| 143 | helpCommands() |
||
| 144 | |||
| 145 | print 'Shutdown' |
||
| 146 | self.nodeIf.stop() |
||
| 147 | cfg.stateSpaceCfg.saveSpaces() |
||
| 148 | cfg.filterCfg.saveFilters() |
||
| 149 | |||
| 150 | #--------------------------------------------------------------------------- |
||
| 151 | |||
| 152 | def main(): |
||
| 153 | daemonApp = CanDaemon() |
||
| 154 | # daemon.install_thread_excepthook() |
||
| 155 | daemonApp.run() |
||
| 156 | |||
| 157 | #--------------------------------------------------------------------------- |
||
| 158 | |||
| 159 | if __name__ == '__main__': |
||
| 160 | __name__ = 'Main' |
||
| 161 | main() |