eventgen.py

00001 #!/usr/bin/env python
00002 import sys
00003 import os
00004 
00005 try:
00006     output_file_name = sys.argv[1]
00007 except:
00008     sys.stderr.write("Output file name is not specified\n");
00009     sys.exit(1)
00010 
00011 sys.path.insert(0, os.getcwd())
00012 definition = __import__(output_file_name)
00013 
00014 header_file = []
00015 c_file = []
00016 
00017 def addtoh(line):
00018     header_file.append(line)
00019 
00020 def addtoc(line):
00021     c_file.append(line)
00022 
00023 common_events = [
00024     #"EV_NOEVENT",
00025     "EV_INIT",
00026     "EV_EXIT",
00027     "EV_STATE_ENTERED",
00028     "EV_RETURN",
00029     "EV_TIMEOUT",
00030     "EV_TIMER"
00031     ]
00032 
00033 
00034 addtoh('''/**
00035  * @file
00036  * Automatically generated definition of events.
00037  * @warning DO NOT EDIT!!! Instead modify %(fn)s.py.
00038  */
00039 #ifndef _%(fn)s_h
00040 #define _%(fn)s_h
00041 #include <fsm_common_events.h>
00042 ''' % {"fn":output_file_name})
00043 
00044 addtoc('''/**
00045  * @file
00046  * Automatically generated code for printing event names.
00047  * @warning DO NOT EDIT!!! Instead modify %(fn)s.py.
00048  */
00049 #include <fsm.h>
00050 #include "%(fn)s.h"
00051 
00052 const char *fsm_event_str(int ev)
00053 {
00054         const char *ret = fsm_common_event_str(ev);
00055         if (ret) return ret;
00056 
00057         switch (ev) {'''%{"fn":output_file_name})
00058 
00059 fsm_num = 0
00060 for fsm_name, fsm_events in definition.events.iteritems():
00061     fsm_num += 1
00062     fsm_enum = "int"                    # If there is no event, the type fallbacks to int
00063     fsm_enum = "enum fsm_events_%s" % fsm_name
00064     event_num = fsm_num * 100
00065     addtoh("/** Definition of events, which can be sent to %s FSM. */" % fsm_name.upper())
00066     addtoh("%s {" % fsm_enum )
00067     for ev, comment in fsm_events.iteritems():
00068         event = "__%(fsm)s_%(ev)s = %(num)d," % { "fsm":fsm_name.upper(), "ev":ev, "num":event_num}
00069         if comment:
00070             addtoh("        %(event)-40s /**< %(comment)s */" % {"event":event, "comment":comment})
00071         else:
00072             addtoh("        %s" % event)
00073         event_num += 1
00074     for ev in common_events:
00075         event = "__%(fsm)s_COMMON_%(ev)s = __COMMON_%(ev)s," % { "fsm":fsm_name.upper(), "ev":ev}
00076         addtoh("        %s" % event)
00077     addtoh("}; /* end fsm_events_%s */" % fsm_name)
00078     addtoh("""
00079 #ifdef FSM_%(fu)s
00080   #ifdef __FSM_ALIASES_DEFINED
00081   #error Multiple FSM_<ID> macros defined
00082   #else
00083   #define __FSM_ALIASES_DEFINED
00084   #endif
00085   #define __FSM_EVENT_ENUM %(enum)s
00086 """ % { "fu":fsm_name.upper(), "enum":fsm_enum} )
00087     for e in fsm_events:
00088         addtoh("  #define %(event)-33s __%(fsm)s_%(event)s" % { "fsm":fsm_name.upper(), "event":e })
00089     for e in common_events:
00090         addtoh("  #define %(event)-33s __%(fsm)s_COMMON_%(event)s" % { "fsm":fsm_name.upper(), "event":e })
00091     addtoh("#endif /* FSM_%s */" % fsm_name.upper())
00092     addtoh("")
00093 
00094     for e in fsm_events:
00095         addtoc("\tcase __%(fsm)s_%(e)s: return \"%(e)s\";" % {"fsm":fsm_name.upper(), "e":e})
00096 
00097 
00098 addtoc('''\tdefault: return "undefined event!!!";
00099         }
00100 }''')
00101 
00102 addtoh("#endif")
00103 
00104 f = open(output_file_name+".h", "w")
00105 for l in header_file: f.write(l+"\n")
00106 f = open(output_file_name+".c", "w")
00107 for l in c_file: f.write(l+"\n");

Generated on Thu Sep 13 11:28:28 2007 for DCE-Eurobot by  doxygen 1.5.3