size = max(size, int(values[1]))
typeinfos = ("UNS8", size, "visible_string", False)
elif values[0] == "DOMAIN":
- typeinfos = ("UNS8*", None, "domain", False)
+ size = 0
+ for item in items:
+ size = max(size, len(item))
+ typeinfos = ("UNS8", size, "domain", False)
elif values[0] == "BOOLEAN":
typeinfos = ("UNS8", None, "boolean", False)
else:
raise ValueError, """!!! %s isn't a valid type for CanFestival."""%typename
- internal_types[typename] = typeinfos
+ if typeinfos[2] not in ["visible_string", "domain"]:
+ internal_types[typename] = typeinfos
else:
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)
cfile.close()
-def GenerateFileContent(Node, headerfilepath):
+def GenerateFileContent(Node, headerfilepath, pointers_dict = {}):
+ """
+ pointers_dict = {(Idx,Sidx):"VariableName",...}
+ """
global type
global internal_types
global default_string_size
#-------------------------------------------------------------------------------
mappedVariableContent = ""
+ pointedVariableContent = ""
strDeclareHeader = ""
strDeclareCallback = ""
indexContents = {}
strIndex += "\n/* index 0x%(index)04X : %(EntryName)s. */\n"%texts
# Entry type is VAR
- if type(values) != ListType:
+ if not isinstance(values, ListType):
subentry_infos = Node.GetSubentryInfos(index, 0)
typename = Node.GetTypeName(subentry_infos["type"])
typeinfos = GetValidTypeInfos(typename, [values])
+ if typename is "DOMAIN" and index in variablelist:
+ if not typeinfos[1]:
+ raise ValueError("\nDomain variable not initialized\nindex : 0x%04X\nsubindex 0x00"%index)
texts["subIndexType"] = typeinfos[0]
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"] = ""
- elif typeinfos[2] == "domain":
- texts["value"] = "\"%s\""%''.join(["\\x%2.2x"%ord(char) for char in value])
- texts["comment"] = ""
- else:
- texts["value"] = "0x%X"%values
- texts["comment"] = "\t/* %s */"%str(values)
+ 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
texts["subIndexType"] = typeinfos[0]
if typeinfos[1] is not None:
texts["suffixe"] = "[%d]"%typeinfos[1]
+ texts["type_suffixe"] = "*"
else:
texts["suffixe"] = ""
+ texts["type_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
+ texts["values_count"] = str(len(values)-1)
+ strDeclareHeader += "extern %(subIndexType)s%(type_suffixe)s %(name)s[%(values_count)s];\t\t/* Mapped at index 0x%(index)04X, subindex 0x01 - 0x%(length)02X */\n"%texts
+ mappedVariableContent += "%(subIndexType)s%(type_suffixe)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)
+ if len(value) is 2 and typename is "DOMAIN":
+ raise ValueError("\nDomain variable not initialized\nindex : 0x%04X\nsubindex 0x%02X"%(index, subIndex))
mappedVariableContent += " %s%s%s\n"%(value, sep, comment)
mappedVariableContent += " };\n"
else:
- strIndex += " %(subIndexType)s %(NodeName)s_obj%(index)04X[] = \n {\n"%texts
+ strIndex += " %(subIndexType)s%(type_suffixe)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:
texts["suffixe"] = "[%d]"%typeinfos[1]
else:
texts["suffixe"] = ""
- 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"] = ""
- else:
- texts["value"] = "0x%X"%value
- texts["comment"] = "\t/* %s */"%str(value)
+ 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:
sep = ""
typename = Node.GetTypeName(subentry_infos["type"])
if entry_infos["struct"] & OD_IdenticalSubindexes:
- typeinfos = GetValidTypeInfos(typename, values)
+ typeinfos = GetValidTypeInfos(typename, values[1:])
else:
typeinfos = GetValidTypeInfos(typename, [values[subIndex]])
if subIndex == 0:
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"]:
- sizeof = typeinfos[1]
+ 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]
params = Node.GetParamsEntry(index, subIndex)
else:
save = ""
strIndex += " { %s%s, %s, %s, (void*)&%s }%s\n"%(subentry_infos["access"].upper(),save,typeinfos[2],sizeof,name,sep)
+ pointer_name = pointers_dict.get((index, subIndex), None)
+ if pointer_name is not None:
+ pointedVariableContent += "%s* %s = &%s;\n"%(typeinfos[0], pointer_name, name)
strIndex += " };\n"
indexContents[index] = strIndex
-
+
#-------------------------------------------------------------------------------
# Declaration of Particular Parameters
#-------------------------------------------------------------------------------
entry_infos = Node.GetEntryInfos(0x1014)
texts["EntryName"] = entry_infos["name"]
indexContents[0x1014] = """\n/* index 0x1014 : %(EntryName)s */
- UNS32 %(NodeName)s_obj1014 = 0x0; /* 0 */
+ UNS32 %(NodeName)s_obj1014 = 0x80 + 0x%(NodeID)02X; /* 128 + NodeID */
"""%texts
if 0x1016 in communicationlist:
maxPDOtransmit += 1
texts["maxPDOtransmit"] = max(1, maxPDOtransmit)
for index_cat in index_categories:
- strQuickIndex += "\nquick_index %s_%s = {\n"%(texts["NodeName"], index_cat)
+ strQuickIndex += "\nconst quick_index %s_%s = {\n"%(texts["NodeName"], index_cat)
sep = ","
for i, (cat, idx_min, idx_max) in enumerate(categories):
if i == len(categories) - 1:
fileContent += """
/**************************************************************************/
-/* Declaration of the mapped variables */
+/* Declaration of mapped variables */
/**************************************************************************/
""" + mappedVariableContent
fileContent += """
/**************************************************************************/
-/* Declaration of the value range types */
+/* Declaration of value range types */
/**************************************************************************/
""" + valueRangeContent
"""%texts
if texts["heartBeatTimers_number"] > 0:
- fileContent += "TIMER_HANDLE %(NodeName)s_heartBeatTimers[%(heartBeatTimers_number)d] = {TIMER_NONE,};\n"%texts
+ 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
for index in contentlist:
fileContent += indexContents[index]
+ fileContent += """
+/**************************************************************************/
+/* Declaration of pointed variables */
+/**************************************************************************/
+""" + pointedVariableContent
+
fileContent += """
const indextable %(NodeName)s_objdict[] =
{
fileContent += strQuickIndex
fileContent += """
-UNS16 %(NodeName)s_ObjdictSize = sizeof(%(NodeName)s_objdict)/sizeof(%(NodeName)s_objdict[0]);
+const UNS16 %(NodeName)s_ObjdictSize = sizeof(%(NodeName)s_objdict)/sizeof(%(NodeName)s_objdict[0]);
CO_Data %(NodeName)s_Data = CANOPEN_NODE_DATA_INITIALIZER(%(NodeName)s);
# Main Function
#-------------------------------------------------------------------------------
-def GenerateFile(filepath, node):
+def GenerateFile(filepath, node, pointers_dict = {}):
try:
headerfilepath = os.path.splitext(filepath)[0]+".h"
- content, header = GenerateFileContent(node, os.path.split(headerfilepath)[1])
+ content, header = GenerateFileContent(node, os.path.split(headerfilepath)[1], pointers_dict)
WriteFile(filepath, content)
WriteFile(headerfilepath, header)
return None