diff -r ae068232859c -r 64a8c24b61a5 objdictgen/gen_cfile.py --- a/objdictgen/gen_cfile.py Fri Mar 14 10:55:34 2008 +0100 +++ b/objdictgen/gen_cfile.py Wed Mar 19 16:08:12 2008 +0100 @@ -38,6 +38,7 @@ generated_tag = """\n/* File generated by gen_cfile.py. Should not be modified. */\n""" internal_types = {} +default_string_size = 10 # Format a string for making a C++ variable def FormatName(name): @@ -45,7 +46,7 @@ return "_".join(wordlist) # Extract the informations from a given type name -def GetValidTypeInfos(typename): +def GetValidTypeInfos(typename, items=[]): if typename in internal_types: return internal_types[typename] else: @@ -53,20 +54,22 @@ if result: values = result.groups() if values[0] == "UNSIGNED" and int(values[1]) in [i * 8 for i in xrange(1, 9)]: - typeinfos = ("UNS%s"%values[1], "", "uint%s"%values[1], True) + typeinfos = ("UNS%s"%values[1], None, "uint%s"%values[1], True) elif values[0] == "INTEGER" and int(values[1]) in [i * 8 for i in xrange(1, 9)]: - typeinfos = ("INTEGER%s"%values[1], "", "int%s"%values[1], False) + typeinfos = ("INTEGER%s"%values[1], None, "int%s"%values[1], False) elif values[0] == "REAL" and int(values[1]) in (32, 64): - typeinfos = ("%s%s"%(values[0], values[1]), "", "real%s"%values[1], False) + typeinfos = ("%s%s"%(values[0], values[1]), None, "real%s"%values[1], False) elif values[0] == "VISIBLE_STRING": - if values[1] == "": - typeinfos = ("UNS8", "[10]", "visible_string", False) - else: - typeinfos = ("UNS8", "[%s]"%values[1], "visible_string", False) + size = default_string_size + for item in items: + size = max(size, len(item)) + if values[1] != "": + size = max(size, int(values[1])) + typeinfos = ("UNS8", size, "visible_string", False) elif values[0] == "DOMAIN": - typeinfos = ("UNS8*", "", "domain", True) + typeinfos = ("UNS8*", None, "domain", False) elif values[0] == "BOOLEAN": - typeinfos = ("UNS8", "", "boolean", True) + typeinfos = ("UNS8", None, "boolean", False) else: raise ValueError, """!!! %s isn't a valid type for CanFestival."""%typename internal_types[typename] = typeinfos @@ -82,6 +85,8 @@ def GenerateFileContent(Node, headerfilepath): global type global internal_types + global default_string_size + texts = {} texts["maxPDOtransmit"] = 0 texts["NodeName"] = Node.GetNodeName() @@ -92,6 +97,8 @@ if (texts["NodeType"] == "slave"): texts["iam_a_slave"] = 1 + default_string_size = Node.GetDefaultStringSize() + # Compiling lists of indexes rangelist = [idx for idx in Node.GetIndexes() if 0 <= idx <= 0x260] listIndex = [idx for idx in Node.GetIndexes() if 0x1000 <= idx <= 0xFFFF] @@ -162,9 +169,12 @@ if type(values) != ListType: subentry_infos = Node.GetSubentryInfos(index, 0) typename = Node.GetTypeName(subentry_infos["type"]) - typeinfos = GetValidTypeInfos(typename) + typeinfos = GetValidTypeInfos(typename, [values]) texts["subIndexType"] = typeinfos[0] - texts["suffixe"] = typeinfos[1] + if typeinfos[1] is not None: + texts["suffixe"] = "[%d]"%typeinfos[1] + else: + texts["suffixe"] = "" if typeinfos[2] == "visible_string": texts["value"] = "\"%s\""%values texts["comment"] = "" @@ -198,9 +208,12 @@ if entry_infos["struct"] & OD_IdenticalSubindexes: subentry_infos = Node.GetSubentryInfos(index, 1) typename = Node.GetTypeName(subentry_infos["type"]) - typeinfos = GetValidTypeInfos(typename) + typeinfos = GetValidTypeInfos(typename, values[1:]) texts["subIndexType"] = typeinfos[0] - texts["suffixe"] = typeinfos[1] + if typeinfos[1] is not None: + texts["suffixe"] = "[%d]"%typeinfos[1] + else: + texts["suffixe"] = "" texts["length"] = values[0] if index in variablelist: texts["name"] = FormatName(entry_infos["name"]) @@ -249,9 +262,12 @@ if subIndex > 0: subentry_infos = Node.GetSubentryInfos(index, subIndex) typename = Node.GetTypeName(subentry_infos["type"]) - typeinfos = GetValidTypeInfos(typename) + typeinfos = GetValidTypeInfos(typename, [values[subIndex]]) texts["subIndexType"] = typeinfos[0] - texts["suffixe"] = typeinfos[1] + if typeinfos[1] is not None: + texts["suffixe"] = "[%d]"%typeinfos[1] + else: + texts["suffixe"] = "" if typeinfos[2] == "visible_string": texts["value"] = "\"%s\""%value texts["comment"] = "" @@ -291,7 +307,10 @@ else: sep = "" typename = Node.GetTypeName(subentry_infos["type"]) - typeinfos = GetValidTypeInfos(typename) + if entry_infos["struct"] & OD_IdenticalSubindexes: + typeinfos = GetValidTypeInfos(typename, values) + else: + typeinfos = GetValidTypeInfos(typename, [values[subIndex]]) if subIndex == 0: if index == 0x1003: typeinfos = GetValidTypeInfos("valueRange_EMC") @@ -312,7 +331,7 @@ else: name = "%s_obj%04X_%s"%(texts["NodeName"], texts["index"], FormatName(subentry_infos["name"])) if typeinfos[2] in ["visible_string", "domain"]: - sizeof = str(len(values[subIndex])) + sizeof = typeinfos[1] else: sizeof = "sizeof (%s)"%typeinfos[0] params = Node.GetParamsEntry(index, subIndex)