objdictgen/gen_cfile.py
changeset 418 64a8c24b61a5
parent 366 47763dd15e00
child 420 a42335b39bf4
equal deleted inserted replaced
417:ae068232859c 418:64a8c24b61a5
    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])
   289             if subIndex < len(values) - 1:
   305             if subIndex < len(values) - 1:
   290                 sep = ","
   306                 sep = ","
   291             else:
   307             else:
   292                 sep = ""
   308                 sep = ""
   293             typename = Node.GetTypeName(subentry_infos["type"])
   309             typename = Node.GetTypeName(subentry_infos["type"])
   294             typeinfos = GetValidTypeInfos(typename)
   310             if entry_infos["struct"] & OD_IdenticalSubindexes:
       
   311                 typeinfos = GetValidTypeInfos(typename, values)
       
   312             else:
       
   313                 typeinfos = GetValidTypeInfos(typename, [values[subIndex]])
   295             if subIndex == 0:
   314             if subIndex == 0:
   296                 if index == 0x1003:
   315                 if index == 0x1003:
   297                     typeinfos = GetValidTypeInfos("valueRange_EMC")
   316                     typeinfos = GetValidTypeInfos("valueRange_EMC")
   298                 if entry_infos["struct"] & OD_MultipleSubindexes:
   317                 if entry_infos["struct"] & OD_MultipleSubindexes:
   299                     name = "%(NodeName)s_highestSubIndex_obj%(index)04X"%texts
   318                     name = "%(NodeName)s_highestSubIndex_obj%(index)04X"%texts
   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"