]> rtime.felk.cvut.cz Git - eurobot/public.git/blob - src/fsm/eventgen.py
Remove patches
[eurobot/public.git] / src / fsm / eventgen.py
1 #!/usr/bin/env python
2 ## @file eventgen.py
3 # Script to compile definition of additional FSM events to .c and .h sources.
4 import sys
5 import os
6 import os.path
7
8 try:
9     (input_file_name, ext) = os.path.splitext(sys.argv[1])
10     (input_dir, output_file_name) = os.path.split(input_file_name) # Output goes to the current directory
11 except:
12     sys.stderr.write("Output file name is not specified\n");
13     sys.exit(1)
14
15 sys.path.insert(0, input_dir)
16 definition = __import__(output_file_name)
17
18 header_file = []
19 c_file = []
20
21 def addtoh(line):
22     header_file.append(line)
23
24 def addtoc(line):
25     c_file.append(line)
26
27 common_events = [
28     #"EV_NOEVENT",
29     "EV_ENTRY",
30     "EV_EXIT",
31     "EV_RETURN",
32     "EV_TIMER"
33     ]
34
35
36 addtoh('''/**
37  * @file
38  * Automatically generated definition of events.
39  * @warning DO NOT EDIT!!! Instead modify %(fn)s.py.
40  */
41 #ifndef _%(fn)s_h
42 #define _%(fn)s_h
43 #include <fsm_common_events.h>
44 ''' % {"fn":output_file_name})
45
46 addtoc('''/**
47  * @file
48  * Automatically generated code for printing event names.
49  * @warning DO NOT EDIT!!! Instead modify %(fn)s.py.
50  */
51 #include <fsm.h>
52 #include "%(fn)s.h"
53
54 const char *fsm_event_str(fsm_event ev)
55 {
56         const char *ret = fsm_common_event_str(ev);
57         if (ret) return ret;
58
59         switch (ev.id) {'''%{"fn":output_file_name})
60
61 fsm_num = 0
62 for fsm_name, fsm_events in definition.events.iteritems():
63     fsm_num += 1
64     fsm_enum = "int"                    # If there is no event, the type fallbacks to int
65     fsm_enum = "enum fsm_events_%s" % fsm_name
66     event_num = fsm_num * 100
67     addtoh("/** Definition of events, which can be sent to %s FSM. */" % fsm_name.upper())
68     addtoh("%s {" % fsm_enum )
69     for ev, comment in fsm_events.iteritems():
70         event = "__%(fsm)s_%(ev)s = %(num)d," % { "fsm":fsm_name.upper(), "ev":ev, "num":event_num}
71         if comment:
72             addtoh("        %(event)-40s /**< %(comment)s */" % {"event":event, "comment":comment})
73         else:
74             addtoh("        %s" % event)
75         event_num += 1
76     for ev in common_events:
77         event = "__%(fsm)s_COMMON_%(ev)s = __COMMON_%(ev)s," % { "fsm":fsm_name.upper(), "ev":ev}
78         addtoh("        %s" % event)
79     addtoh("}; /* end fsm_events_%s */" % fsm_name)
80     addtoh("""
81 #ifdef FSM_%(fu)s
82   #ifdef __robofsm__
83   #error This header must be included before fsm.h
84   #endif
85
86   #ifdef __FSM_ALIASES_DEFINED
87   #error Multiple FSM_<ID> macros defined
88   #else
89   #define __FSM_ALIASES_DEFINED
90   #endif
91
92   #define __FSM_EVENT_ENUM %(enum)s
93   #define __FSM_NAME %(fl)s
94 """ % { "fu":fsm_name.upper(), "enum":fsm_enum, "fl":fsm_name.lower()} )
95     for e in fsm_events:
96         addtoh("  #define %(event)-33s __%(fsm)s_%(event)s" % { "fsm":fsm_name.upper(), "event":e })
97     for e in common_events:
98         addtoh("  #define %(event)-33s __%(fsm)s_COMMON_%(event)s" % { "fsm":fsm_name.upper(), "event":e })
99     addtoh("#endif /* FSM_%s */" % fsm_name.upper())
100     addtoh("")
101
102     for e in fsm_events:
103         addtoc("\tcase __%(fsm)s_%(e)s: return \"%(e)s\";" % {"fsm":fsm_name.upper(), "e":e})
104
105
106 addtoc('''\tdefault: return "undefined event!!!";
107         }
108 }''')
109
110 addtoh("#endif")
111
112 f = open(output_file_name+".h", "w")
113 for l in header_file: f.write(l+"\n")
114 f = open(output_file_name+".c", "w")
115 for l in c_file: f.write(l+"\n");