00001
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
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"
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");