36 index_categories = ["firstIndex", "lastIndex"] |
36 index_categories = ["firstIndex", "lastIndex"] |
37 |
37 |
38 generated_tag = """\n/* File generated by gen_cfile.py. Should not be modified. */\n""" |
38 generated_tag = """\n/* File generated by gen_cfile.py. Should not be modified. */\n""" |
39 |
39 |
40 internal_types = {} |
40 internal_types = {} |
|
41 default_string_size = 10 |
41 |
42 |
42 # Format a string for making a C++ variable |
43 # Format a string for making a C++ variable |
43 def FormatName(name): |
44 def FormatName(name): |
44 wordlist = [word for word in word_model.findall(name) if word != ''] |
45 wordlist = [word for word in word_model.findall(name) if word != ''] |
45 return "_".join(wordlist) |
46 return "_".join(wordlist) |
46 |
47 |
47 # Extract the informations from a given type name |
48 # Extract the informations from a given type name |
48 def GetValidTypeInfos(typename): |
49 def GetValidTypeInfos(typename, items=[]): |
49 if typename in internal_types: |
50 if typename in internal_types: |
50 return internal_types[typename] |
51 return internal_types[typename] |
51 else: |
52 else: |
52 result = type_model.match(typename) |
53 result = type_model.match(typename) |
53 if result: |
54 if result: |
54 values = result.groups() |
55 values = result.groups() |
55 if values[0] == "UNSIGNED" and int(values[1]) in [i * 8 for i in xrange(1, 9)]: |
56 if values[0] == "UNSIGNED" and int(values[1]) in [i * 8 for i in xrange(1, 9)]: |
56 typeinfos = ("UNS%s"%values[1], "", "uint%s"%values[1], True) |
57 typeinfos = ("UNS%s"%values[1], None, "uint%s"%values[1], True) |
57 elif values[0] == "INTEGER" and int(values[1]) in [i * 8 for i in xrange(1, 9)]: |
58 elif values[0] == "INTEGER" and int(values[1]) in [i * 8 for i in xrange(1, 9)]: |
58 typeinfos = ("INTEGER%s"%values[1], "", "int%s"%values[1], False) |
59 typeinfos = ("INTEGER%s"%values[1], None, "int%s"%values[1], False) |
59 elif values[0] == "REAL" and int(values[1]) in (32, 64): |
60 elif values[0] == "REAL" and int(values[1]) in (32, 64): |
60 typeinfos = ("%s%s"%(values[0], values[1]), "", "real%s"%values[1], False) |
61 typeinfos = ("%s%s"%(values[0], values[1]), None, "real%s"%values[1], False) |
61 elif values[0] == "VISIBLE_STRING": |
62 elif values[0] == "VISIBLE_STRING": |
62 if values[1] == "": |
63 size = default_string_size |
63 typeinfos = ("UNS8", "[10]", "visible_string", False) |
64 for item in items: |
64 else: |
65 size = max(size, len(item)) |
65 typeinfos = ("UNS8", "[%s]"%values[1], "visible_string", False) |
66 if values[1] != "": |
|
67 size = max(size, int(values[1])) |
|
68 typeinfos = ("UNS8", size, "visible_string", False) |
66 elif values[0] == "DOMAIN": |
69 elif values[0] == "DOMAIN": |
67 typeinfos = ("UNS8*", "", "domain", True) |
70 typeinfos = ("UNS8*", None, "domain", False) |
68 elif values[0] == "BOOLEAN": |
71 elif values[0] == "BOOLEAN": |
69 typeinfos = ("UNS8", "", "boolean", True) |
72 typeinfos = ("UNS8", None, "boolean", False) |
70 else: |
73 else: |
71 raise ValueError, """!!! %s isn't a valid type for CanFestival."""%typename |
74 raise ValueError, """!!! %s isn't a valid type for CanFestival."""%typename |
72 internal_types[typename] = typeinfos |
75 internal_types[typename] = typeinfos |
73 else: |
76 else: |
74 raise ValueError, """!!! %s isn't a valid type for CanFestival."""%typename |
77 raise ValueError, """!!! %s isn't a valid type for CanFestival."""%typename |
80 cfile.close() |
83 cfile.close() |
81 |
84 |
82 def GenerateFileContent(Node, headerfilepath): |
85 def GenerateFileContent(Node, headerfilepath): |
83 global type |
86 global type |
84 global internal_types |
87 global internal_types |
|
88 global default_string_size |
|
89 |
85 texts = {} |
90 texts = {} |
86 texts["maxPDOtransmit"] = 0 |
91 texts["maxPDOtransmit"] = 0 |
87 texts["NodeName"] = Node.GetNodeName() |
92 texts["NodeName"] = Node.GetNodeName() |
88 texts["NodeID"] = Node.GetNodeID() |
93 texts["NodeID"] = Node.GetNodeID() |
89 texts["NodeType"] = Node.GetNodeType() |
94 texts["NodeType"] = Node.GetNodeType() |
90 texts["Description"] = Node.GetNodeDescription() |
95 texts["Description"] = Node.GetNodeDescription() |
91 texts["iam_a_slave"] = 0 |
96 texts["iam_a_slave"] = 0 |
92 if (texts["NodeType"] == "slave"): |
97 if (texts["NodeType"] == "slave"): |
93 texts["iam_a_slave"] = 1 |
98 texts["iam_a_slave"] = 1 |
|
99 |
|
100 default_string_size = Node.GetDefaultStringSize() |
94 |
101 |
95 # Compiling lists of indexes |
102 # Compiling lists of indexes |
96 rangelist = [idx for idx in Node.GetIndexes() if 0 <= idx <= 0x260] |
103 rangelist = [idx for idx in Node.GetIndexes() if 0 <= idx <= 0x260] |
97 listIndex = [idx for idx in Node.GetIndexes() if 0x1000 <= idx <= 0xFFFF] |
104 listIndex = [idx for idx in Node.GetIndexes() if 0x1000 <= idx <= 0xFFFF] |
98 communicationlist = [idx for idx in Node.GetIndexes() if 0x1000 <= idx <= 0x11FF] |
105 communicationlist = [idx for idx in Node.GetIndexes() if 0x1000 <= idx <= 0x11FF] |
160 |
167 |
161 # Entry type is VAR |
168 # Entry type is VAR |
162 if type(values) != ListType: |
169 if type(values) != ListType: |
163 subentry_infos = Node.GetSubentryInfos(index, 0) |
170 subentry_infos = Node.GetSubentryInfos(index, 0) |
164 typename = Node.GetTypeName(subentry_infos["type"]) |
171 typename = Node.GetTypeName(subentry_infos["type"]) |
165 typeinfos = GetValidTypeInfos(typename) |
172 typeinfos = GetValidTypeInfos(typename, [values]) |
166 texts["subIndexType"] = typeinfos[0] |
173 texts["subIndexType"] = typeinfos[0] |
167 texts["suffixe"] = typeinfos[1] |
174 if typeinfos[1] is not None: |
|
175 texts["suffixe"] = "[%d]"%typeinfos[1] |
|
176 else: |
|
177 texts["suffixe"] = "" |
168 if typeinfos[2] == "visible_string": |
178 if typeinfos[2] == "visible_string": |
169 texts["value"] = "\"%s\""%values |
179 texts["value"] = "\"%s\""%values |
170 texts["comment"] = "" |
180 texts["comment"] = "" |
171 elif typeinfos[2] == "domain": |
181 elif typeinfos[2] == "domain": |
172 texts["value"] = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value]) |
182 texts["value"] = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value]) |
196 |
206 |
197 # Entry type is RECORD |
207 # Entry type is RECORD |
198 if entry_infos["struct"] & OD_IdenticalSubindexes: |
208 if entry_infos["struct"] & OD_IdenticalSubindexes: |
199 subentry_infos = Node.GetSubentryInfos(index, 1) |
209 subentry_infos = Node.GetSubentryInfos(index, 1) |
200 typename = Node.GetTypeName(subentry_infos["type"]) |
210 typename = Node.GetTypeName(subentry_infos["type"]) |
201 typeinfos = GetValidTypeInfos(typename) |
211 typeinfos = GetValidTypeInfos(typename, values[1:]) |
202 texts["subIndexType"] = typeinfos[0] |
212 texts["subIndexType"] = typeinfos[0] |
203 texts["suffixe"] = typeinfos[1] |
213 if typeinfos[1] is not None: |
|
214 texts["suffixe"] = "[%d]"%typeinfos[1] |
|
215 else: |
|
216 texts["suffixe"] = "" |
204 texts["length"] = values[0] |
217 texts["length"] = values[0] |
205 if index in variablelist: |
218 if index in variablelist: |
206 texts["name"] = FormatName(entry_infos["name"]) |
219 texts["name"] = FormatName(entry_infos["name"]) |
207 strDeclareHeader += "extern %(subIndexType)s %(name)s[%(length)d]%(suffixe)s;\t\t/* Mapped at index 0x%(index)04X, subindex 0x01 - 0x%(length)02X */\n"%texts |
220 strDeclareHeader += "extern %(subIndexType)s %(name)s[%(length)d]%(suffixe)s;\t\t/* Mapped at index 0x%(index)04X, subindex 0x01 - 0x%(length)02X */\n"%texts |
208 if callbacks: |
221 if callbacks: |
247 for subIndex, value in enumerate(values): |
260 for subIndex, value in enumerate(values): |
248 texts["subIndex"] = subIndex |
261 texts["subIndex"] = subIndex |
249 if subIndex > 0: |
262 if subIndex > 0: |
250 subentry_infos = Node.GetSubentryInfos(index, subIndex) |
263 subentry_infos = Node.GetSubentryInfos(index, subIndex) |
251 typename = Node.GetTypeName(subentry_infos["type"]) |
264 typename = Node.GetTypeName(subentry_infos["type"]) |
252 typeinfos = GetValidTypeInfos(typename) |
265 typeinfos = GetValidTypeInfos(typename, [values[subIndex]]) |
253 texts["subIndexType"] = typeinfos[0] |
266 texts["subIndexType"] = typeinfos[0] |
254 texts["suffixe"] = typeinfos[1] |
267 if typeinfos[1] is not None: |
|
268 texts["suffixe"] = "[%d]"%typeinfos[1] |
|
269 else: |
|
270 texts["suffixe"] = "" |
255 if typeinfos[2] == "visible_string": |
271 if typeinfos[2] == "visible_string": |
256 texts["value"] = "\"%s\""%value |
272 texts["value"] = "\"%s\""%value |
257 texts["comment"] = "" |
273 texts["comment"] = "" |
258 elif typeinfos[2] == "domain": |
274 elif typeinfos[2] == "domain": |
259 texts["value"] = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value]) |
275 texts["value"] = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value]) |
310 if index in variablelist: |
329 if index in variablelist: |
311 name = FormatName("%s_%s"%(entry_infos["name"],subentry_infos["name"])) |
330 name = FormatName("%s_%s"%(entry_infos["name"],subentry_infos["name"])) |
312 else: |
331 else: |
313 name = "%s_obj%04X_%s"%(texts["NodeName"], texts["index"], FormatName(subentry_infos["name"])) |
332 name = "%s_obj%04X_%s"%(texts["NodeName"], texts["index"], FormatName(subentry_infos["name"])) |
314 if typeinfos[2] in ["visible_string", "domain"]: |
333 if typeinfos[2] in ["visible_string", "domain"]: |
315 sizeof = str(len(values[subIndex])) |
334 sizeof = typeinfos[1] |
316 else: |
335 else: |
317 sizeof = "sizeof (%s)"%typeinfos[0] |
336 sizeof = "sizeof (%s)"%typeinfos[0] |
318 params = Node.GetParamsEntry(index, subIndex) |
337 params = Node.GetParamsEntry(index, subIndex) |
319 if params["save"]: |
338 if params["save"]: |
320 save = "|TO_BE_SAVE" |
339 save = "|TO_BE_SAVE" |