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):
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:
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])
+ 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])
+ 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])
+ 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")
- else:
- typeinfos = ("UNS8", "[%s]"%values[1], "visible_string")
+ 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")
+ size = 0
+ for item in items:
+ size = max(size, len(item))
+ typeinfos = ("UNS8*", size, "domain", False)
elif values[0] == "BOOLEAN":
- typeinfos = ("UNS8", "", "boolean")
+ typeinfos = ("UNS8", None, "boolean", False)
else:
raise ValueError, """!!! %s isn't a valid type for CanFestival."""%typename
internal_types[typename] = typeinfos
raise ValueError, """!!! %s isn't a valid type for CanFestival."""%typename
return typeinfos
+def ComputeValue(type, value):
+ if type == "visible_string":
+ return "\"%s\""%value, ""
+ elif type == "domain":
+ return "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value]), ""
+ elif type.startswith("real"):
+ return "%f"%value, ""
+ else:
+ return "0x%X"%value, "\t/* %s */"%str(value)
+
def WriteFile(filepath, content):
cfile = open(filepath,"w")
cfile.write(content)
def GenerateFileContent(Node, headerfilepath):
global type
global internal_types
+ global default_string_size
+
texts = {}
texts["maxPDOtransmit"] = 0
texts["NodeName"] = Node.GetNodeName()
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]
valueRangeContent = ""
strDefine = "\n#define valueRange_EMC 0x9F /* Type for index 0x1003 subindex 0x00 (only set of value 0 is possible) */"
strSwitch = """ case valueRange_EMC:
- if (*(UNS8*)value < (UNS8)0) return OD_VALUE_TOO_LOW;
- if (*(UNS8*)value > (UNS8)0) return OD_VALUE_TOO_HIGH;
+ if (*(UNS8*)value != (UNS8)0) return OD_VALUE_RANGE_EXCEEDED;
break;\n"""
- internal_types["valueRange_EMC"] = ("UNS8", "", "valueRange_EMC")
+ internal_types["valueRange_EMC"] = ("UNS8", "", "valueRange_EMC", True)
num = 0
for index in rangelist:
rangename = Node.GetEntryName(index)
typename = Node.GetTypeName(typeindex)
typeinfos = GetValidTypeInfos(typename)
internal_types[rangename] = (typeinfos[0], typeinfos[1], "valueRange_%d"%num)
- minvalue = str(Node.GetEntry(index, 2))
- maxvalue = str(Node.GetEntry(index, 3))
- strDefine += "\n#define valueRange_%d 0x%02X /* Type %s, %s < value < %s */"%(num,index,typeinfos[0],minvalue,maxvalue)
- strSwitch += """ case valueRange_%d:
- if (*(%s*)value < (%s)%s) return OD_VALUE_TOO_LOW;
- if (*(%s*)value > (%s)%s) return OD_VALUE_TOO_HIGH;
- break;\n"""%(num,typeinfos[0],typeinfos[0],minvalue,typeinfos[0],typeinfos[0],maxvalue)
+ minvalue = Node.GetEntry(index, 2)
+ maxvalue = Node.GetEntry(index, 3)
+ strDefine += "\n#define valueRange_%d 0x%02X /* Type %s, %s < value < %s */"%(num,index,typeinfos[0],str(minvalue),str(maxvalue))
+ strSwitch += " case valueRange_%d:\n"%(num)
+ if typeinfos[3] and minvalue <= 0:
+ strSwitch += " /* Negative or null low limit ignored because of unsigned type */;\n"
+ else:
+ strSwitch += " if (*(%s*)value < (%s)%s) return OD_VALUE_TOO_LOW;\n"%(typeinfos[0],typeinfos[0],str(minvalue))
+ strSwitch += " if (*(%s*)value > (%s)%s) return OD_VALUE_TOO_HIGH;\n"%(typeinfos[0],typeinfos[0],str(maxvalue))
+ strSwitch += " break;\n"
valueRangeContent += strDefine
valueRangeContent += "\nUNS32 %(NodeName)s_valueRangeTest (UNS8 typeValue, void * value)\n{"%texts
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[2] == "visible_string":
- texts["value"] = "\"%s\""%values
- texts["comment"] = ""
- elif typeinfos[2] == "domain":
- texts["value"] = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value])
- texts["comment"] = ""
+ if typeinfos[1] is not None:
+ texts["suffixe"] = "[%d]"%typeinfos[1]
else:
- texts["value"] = "0x%X"%values
- texts["comment"] = "\t/* %s */"%str(values)
+ texts["suffixe"] = ""
+ texts["value"], texts["comment"] = ComputeValue(typeinfos[2], values)
if index in variablelist:
texts["name"] = FormatName(subentry_infos["name"])
strDeclareHeader += "extern %(subIndexType)s %(name)s%(suffixe)s;\t\t/* Mapped at index 0x%(index)04X, subindex 0x00*/\n"%texts
- if callbacks:
- strDeclareHeader += "extern ODCallback_t %(name)s_callbacks[];\t\t/* Callbacks of index0x%(index)04X */\n"%texts
mappedVariableContent += "%(subIndexType)s %(name)s%(suffixe)s = %(value)s;\t\t/* Mapped at index 0x%(index)04X, subindex 0x00 */\n"%texts
else:
strIndex += " %(subIndexType)s %(NodeName)s_obj%(index)04X%(suffixe)s = %(value)s;%(comment)s\n"%texts
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"])
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
- if callbacks:
- strDeclareHeader += "extern ODCallback_t %(name)s_callbacks[];\t\t/* Callbacks of index0x%(index)04X */\n"%texts
mappedVariableContent += "%(subIndexType)s %(name)s[] =\t\t/* Mapped at index 0x%(index)04X, subindex 0x01 - 0x%(length)02X */\n {\n"%texts
for subIndex, value in enumerate(values):
sep = ","
- comment = ""
if subIndex > 0:
if subIndex == len(values)-1:
sep = ""
- if typeinfos[2] == "visible_string":
- value = "\"%s\""%value
- elif typeinfos[2] == "domain":
- value = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value])
- else:
- comment = "\t/* %s */"%str(value)
- value = "0x%X"%value
+ value, comment = ComputeValue(typeinfos[2], value)
mappedVariableContent += " %s%s%s\n"%(value, sep, comment)
mappedVariableContent += " };\n"
else:
strIndex += " %(subIndexType)s %(NodeName)s_obj%(index)04X[] = \n {\n"%texts
for subIndex, value in enumerate(values):
sep = ","
- comment = ""
if subIndex > 0:
if subIndex == len(values)-1:
sep = ""
- if typeinfos[2] == "visible_string":
- value = "\"%s\""%value
- elif typeinfos[2] == "domain":
- value = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value])
- else:
- comment = "\t/* %s */"%str(value)
- value = "0x%X"%value
+ value, comment = ComputeValue(typeinfos[2], value)
strIndex += " %s%s%s\n"%(value, sep, comment)
strIndex += " };\n"
else:
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[2] == "visible_string":
- texts["value"] = "\"%s\""%value
- texts["comment"] = ""
- elif typeinfos[2] == "domain":
- texts["value"] = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value])
- texts["comment"] = ""
+ if typeinfos[1] is not None:
+ texts["suffixe"] = "[%d]"%typeinfos[1]
else:
- texts["value"] = "0x%X"%value
- texts["comment"] = "\t/* %s */"%str(value)
+ texts["suffixe"] = ""
+ texts["value"], texts["comment"] = ComputeValue(typeinfos[2], value)
texts["name"] = FormatName(subentry_infos["name"])
if index in variablelist:
strDeclareHeader += "extern %(subIndexType)s %(parent)s_%(name)s%(suffixe)s;\t\t/* Mapped at index 0x%(index)04X, subindex 0x%(subIndex)02X */\n"%texts
mappedVariableContent += "%(subIndexType)s %(parent)s_%(name)s%(suffixe)s = %(value)s;\t\t/* Mapped at index 0x%(index)04X, subindex 0x%(subIndex)02X */\n"%texts
else:
strIndex += " %(subIndexType)s %(NodeName)s_obj%(index)04X_%(name)s%(suffixe)s = %(value)s;%(comment)s\n"%texts
- if callbacks:
- strDeclareHeader += "extern ODCallback_t %(parent)s_callbacks[];\t\t/* Callbacks of index0x%(index)04X */\n"%texts
# Generating Dictionary C++ entry
if callbacks:
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")
name = FormatName("%s_%s"%(entry_infos["name"],subentry_infos["name"]))
else:
name = "%s_obj%04X_%s"%(texts["NodeName"], texts["index"], FormatName(subentry_infos["name"]))
- if typeinfos[2] in ["visible_string", "domain"]:
+ if typeinfos[2] == "visible_string":
+ sizeof = str(max(len(values[subIndex]), default_string_size))
+ elif typeinfos[2] == "domain":
sizeof = str(len(values[subIndex]))
else:
sizeof = "sizeof (%s)"%typeinfos[0]
UNS32 %(NodeName)s_obj1006 = 0x0; /* 0 */
"""%texts
+ if 0x1014 not in communicationlist:
+ entry_infos = Node.GetEntryInfos(0x1014)
+ texts["EntryName"] = entry_infos["name"]
+ indexContents[0x1014] = """\n/* index 0x1014 : %(EntryName)s */
+ UNS32 %(NodeName)s_obj1014 = 0x0; /* 0 */
+"""%texts
+
if 0x1016 in communicationlist:
- texts["nombre"] = Node.GetEntry(0x1016, 0)
+ texts["heartBeatTimers_number"] = Node.GetEntry(0x1016, 0)
else:
- texts["nombre"] = 0
+ texts["heartBeatTimers_number"] = 0
entry_infos = Node.GetEntryInfos(0x1016)
texts["EntryName"] = entry_infos["name"]
indexContents[0x1016] = """\n/* index 0x1016 : %(EntryName)s */
UNS8 %(NodeName)s_highestSubIndex_obj1016 = 0;
UNS32 %(NodeName)s_obj1016[]={0};
"""%texts
- if texts["nombre"] > 0:
- strTimers = "TIMER_HANDLE %(NodeName)s_heartBeatTimers[%(nombre)d] = {TIMER_NONE,};\n"%texts
- else:
- strTimers = "TIMER_HANDLE %(NodeName)s_heartBeatTimers[1];\n"%texts
-
+
if 0x1017 not in communicationlist:
entry_infos = Node.GetEntryInfos(0x1017)
texts["EntryName"] = entry_infos["name"]
const UNS8 %(NodeName)s_iam_a_slave = %(iam_a_slave)d;
"""%texts
- fileContent += strTimers
+ if texts["heartBeatTimers_number"] > 0:
+ declaration = "TIMER_HANDLE %(NodeName)s_heartBeatTimers[%(heartBeatTimers_number)d]"%texts
+ initializer = "{TIMER_NONE" + ",TIMER_NONE" * (texts["heartBeatTimers_number"] - 1) + "}"
+ fileContent += declaration + " = " + initializer + ";\n"
+ else:
+ fileContent += "TIMER_HANDLE %(NodeName)s_heartBeatTimers[1];\n"%texts
fileContent += """
/*
*/
s_PDO_status %(NodeName)s_PDO_status[%(maxPDOtransmit)d] = {"""%texts
- fileContent += ",".join(["s_PDO_staus_Initializer"]*texts["maxPDOtransmit"]) + """};
+ fileContent += ",".join(["s_PDO_status_Initializer"]*texts["maxPDOtransmit"]) + """};
"""
fileContent += strQuickIndex