def import_epf(epf):
"""Import an EPF file.
:param epf:
Either a path to an EPF-file, a file-like object, or an instance of
:class:`xml.etree.ElementTree.Element`.
:returns:
The Object Dictionary.
:rtype: canopen.ObjectDictionary
"""
od = objectdictionary.ObjectDictionary()
if etree.iselement(epf):
tree = epf
else:
tree = etree.parse(epf).getroot()
# Find and set default bitrate
can_config = tree.find("Configuration/CANopen")
if can_config is not None:
bitrate = can_config.get("BitRate", "250")
bitrate = bitrate.replace("U", "")
od.bitrate = int(bitrate) * 1000
# Parse Object Dictionary
for group_tree in tree.iterfind("Dictionary/Parameters/Group"):
name = group_tree.get("SymbolName")
parameters = group_tree.findall("Parameter")
index = int(parameters[0].get("Index"), 0)
if len(parameters) == 1:
# Simple variable
var = build_variable(parameters[0])
# Use top level index name instead
var.name = name
od.add_object(var)
elif len(parameters) == 2 and parameters[1].get("ObjectType") == "ARRAY":
# Array
arr = objectdictionary.Array(name, index)
for par_tree in parameters:
var = build_variable(par_tree)
arr.add_member(var)
description = group_tree.find("Description")
if description is not None:
arr.description = description.text
od.add_object(arr)
else:
# Complex record
record = objectdictionary.Record(name, index)
for par_tree in parameters:
var = build_variable(par_tree)
record.add_member(var)
description = group_tree.find("Description")
if description is not None:
record.description = description.text
od.add_object(record)
return od
评论列表
文章目录