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
def import_eds(source, node_id): eds = ConfigParser() if hasattr(source, "read"): fp = source else: fp = open(source) try: # Python 3 eds.read_file(fp) except AttributeError: # Python 2 eds.readfp(fp) fp.close() od = objectdictionary.ObjectDictionary() if eds.has_section("DeviceComissioning"): od.bitrate = int(eds.get("DeviceComissioning", "Baudrate")) * 1000 od.node_id = int(eds.get("DeviceComissioning", "NodeID")) for section in eds.sections(): # Match indexes match = re.match(r"^[0-9A-Fa-f]{4}$", section) if match is not None: index = int(section, 16) name = eds.get(section, "ParameterName") object_type = int(eds.get(section, "ObjectType"), 0) if object_type == VAR: var = build_variable(eds, section, index) od.add_object(var) elif object_type == ARR and eds.has_option(section, "CompactSubObj"): arr = objectdictionary.Array(name, index) last_subindex = objectdictionary.Variable( "Number of entries", index, 0) last_subindex.data_type = objectdictionary.UNSIGNED8 arr.add_member(last_subindex) arr.add_member(build_variable(eds, section, index, 1)) od.add_object(arr) elif object_type == ARR: arr = objectdictionary.Array(name, index) od.add_object(arr) elif object_type == RECORD: record = objectdictionary.Record(name, index) od.add_object(record) continue # Match subindexes match = re.match(r"^([0-9A-Fa-f]{4})sub([0-9A-Fa-f]+)$", section) if match is not None: index = int(match.group(1), 16) subindex = int(match.group(2), 16) entry = od[index] if isinstance(entry, (objectdictionary.Record, objectdictionary.Array)): var = build_variable(eds, section, index, subindex) entry.add_member(var) return od
def test_add_record(self): test_od = od.ObjectDictionary() record = od.Record("Test Record", 0x1001) var = od.Variable("Test Subindex", 0x1001, 1) record.add_member(var) test_od.add_object(record) self.assertEqual(test_od["Test Record"], record) self.assertEqual(test_od[0x1001], record) self.assertEqual(test_od["Test Record"]["Test Subindex"], var)
def _convert_eds(eds, node_id): od = objectdictionary.ObjectDictionary() if eds.has_section("DeviceComissioning"): od.bitrate = int(eds.get("DeviceComissioning", "Baudrate")) * 1000 od.node_id = int(eds.get("DeviceComissioning", "NodeID")) for section in eds.sections(): # Match indexes match = re.match(r"^[0-9A-Fa-f]{4}$", section) if match is not None: index = int(section, 16) name = eds.get(section, "ParameterName") object_type = int(eds.get(section, "ObjectType"), 0) if object_type == VAR: var = build_variable(eds, section, index) od.add_object(var) elif object_type == ARR and eds.has_option(section, "CompactSubObj"): arr = objectdictionary.Array(name, index) last_subindex = objectdictionary.Variable( "Number of entries", index, 0) last_subindex.data_type = objectdictionary.UNSIGNED8 arr.add_member(last_subindex) arr.add_member(build_variable(eds, section, index, 1)) od.add_object(arr) elif object_type == ARR: arr = objectdictionary.Array(name, index) od.add_object(arr) elif object_type == RECORD: record = objectdictionary.Record(name, index) od.add_object(record) continue # Match subindexes match = re.match(r"^([0-9A-Fa-f]{4})sub([0-9A-Fa-f]+)$", section) if match is not None: index = int(match.group(1), 16) subindex = int(match.group(2), 16) entry = od[index] if isinstance(entry, (objectdictionary.Record, objectdictionary.Array)): var = build_variable(eds, section, index, subindex) entry.add_member(var) return od
def import_eds(filename): od = objectdictionary.ObjectDictionary() eds = ConfigParser() eds.read(filename) for section in eds.sections(): # Match indexes match = re.match(r"^[0-9A-Fa-f]{4}$", section) if match is not None: index = int(section, 16) name = eds.get(section, "ParameterName") object_type = int(eds.get(section, "ObjectType"), 0) if object_type == VAR: var = build_variable(eds, section, index) od.add_object(var) elif object_type == ARR and eds.has_option(section, "CompactSubObj"): arr = objectdictionary.Array(name, index) arr.template = build_variable(eds, section, index, 1) arr.length = int(eds.get(section, "CompactSubObj"), 0) od.add_object(arr) elif object_type == ARR: arr = objectdictionary.Array(name, index) arr.last_subindex = build_variable(eds, section + "sub0", index, 0) arr.template = build_variable(eds, section + "sub1", index, 1) od.add_object(arr) elif object_type == RECORD: record = objectdictionary.Record(name, index) od.add_object(record) continue # Match subindexes match = re.match(r"^([0-9A-Fa-f]{4})sub([0-9A-Fa-f]+)$", section) if match is not None: index = int(match.group(1), 16) subindex = int(match.group(2), 16) entry = od[index] if isinstance(entry, objectdictionary.Record): var = build_variable(eds, section, index, subindex) entry.add_member(var) return od
def import_epf(filename): od = objectdictionary.ObjectDictionary() tree = etree.parse(filename).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]) od.add_object(var) elif len(parameters) == 2 and parameters[1].get( "ObjectType") == "ARRAY": # Array arr = objectdictionary.Array(name, index) arr.last_subindex = build_variable(parameters[0]) arr.template = build_variable(parameters[1]) 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) od.add_object(record) return od
def import_eds(source, node_id): eds = RawConfigParser() if hasattr(source, "read"): fp = source else: fp = open(source) try: # Python 3 eds.read_file(fp) except AttributeError: # Python 2 eds.readfp(fp) fp.close() od = objectdictionary.ObjectDictionary() if eds.has_section("DeviceComissioning"): od.bitrate = int(eds.get("DeviceComissioning", "Baudrate")) * 1000 od.node_id = int(eds.get("DeviceComissioning", "NodeID")) for section in eds.sections(): # Match dummy definitions match = re.match(r"^[Dd]ummy[Uu]sage$", section) if match is not None: for i in range(1, 8): key = "Dummy%04d" % i if eds.getint(section, key) == 1: var = objectdictionary.Variable(key, i, 0) var.data_type = i var.access_type = "const" od.add_object(var) # Match indexes match = re.match(r"^[0-9A-Fa-f]{4}$", section) if match is not None: index = int(section, 16) name = eds.get(section, "ParameterName") try: object_type = int(eds.get(section, "ObjectType"), 0) except NoOptionError: # DS306 4.6.3.2 object description # If the keyword ObjectType is missing, this is regarded as # "ObjectType=0x7" (=VAR). object_type = VAR if object_type in (VAR, DOMAIN): var = build_variable(eds, section, node_id, index) od.add_object(var) elif object_type == ARR and eds.has_option(section, "CompactSubObj"): arr = objectdictionary.Array(name, index) last_subindex = objectdictionary.Variable( "Number of entries", index, 0) last_subindex.data_type = objectdictionary.UNSIGNED8 arr.add_member(last_subindex) arr.add_member(build_variable(eds, section, node_id, index, 1)) od.add_object(arr) elif object_type == ARR: arr = objectdictionary.Array(name, index) od.add_object(arr) elif object_type == RECORD: record = objectdictionary.Record(name, index) od.add_object(record) continue # Match subindexes match = re.match(r"^([0-9A-Fa-f]{4})[S|s]ub([0-9A-Fa-f]+)$", section) if match is not None: index = int(match.group(1), 16) subindex = int(match.group(2), 16) entry = od[index] if isinstance(entry, (objectdictionary.Record, objectdictionary.Array)): var = build_variable(eds, section, node_id, index, subindex) entry.add_member(var) # Match [index]Name match = re.match(r"^([0-9A-Fa-f]{4})Name", section) if match is not None: index = int(match.group(1), 16) num_of_entries = int(eds.get(section, "NrOfEntries")) entry = od[index] # For CompactSubObj index 1 is were we find the variable src_var = od[index][1] for subindex in range(1, num_of_entries + 1): var = copy_variable(eds, section, subindex, src_var) if var is not None: entry.add_member(var) return od
def import_eds(source, node_id): eds = RawConfigParser() eds.optionxform = str if hasattr(source, "read"): fp = source else: fp = open(source) try: # Python 3 eds.read_file(fp) except AttributeError: # Python 2 eds.readfp(fp) fp.close() od = objectdictionary.ObjectDictionary() if eds.has_section("FileInfo"): od.__edsFileInfo = { opt: eds.get("FileInfo", opt) for opt in eds.options("FileInfo") } if eds.has_section("Comments"): linecount = int(eds.get("Comments", "Lines"), 0) od.comments = '\n'.join([ eds.get("Comments", "Line%i" % line) for line in range(1, linecount + 1) ]) if not eds.has_section("DeviceInfo"): logger.warn( "eds file does not have a DeviceInfo section. This section is mandatory" ) else: for rate in [10, 20, 50, 125, 250, 500, 800, 1000]: baudPossible = int( eds.get("DeviceInfo", "BaudRate_%i" % rate, fallback='0'), 0) if baudPossible != 0: od.device_information.allowed_baudrates.add(rate * 1000) for t, eprop, odprop in [ (str, "VendorName", "vendor_name"), (int, "VendorNumber", "vendor_number"), (str, "ProductName", "product_name"), (int, "ProductNumber", "product_number"), (int, "RevisionNumber", "revision_number"), (str, "OrderCode", "order_code"), (bool, "SimpleBootUpMaster", "simple_boot_up_master"), (bool, "SimpleBootUpSlave", "simple_boot_up_slave"), (bool, "Granularity", "granularity"), (bool, "DynamicChannelsSupported", "dynamic_channels_supported"), (bool, "GroupMessaging", "group_messaging"), (int, "NrOfRXPDO", "nr_of_RXPDO"), (int, "NrOfTXPDO", "nr_of_TXPDO"), (bool, "LSS_Supported", "LSS_supported"), ]: try: if t in (int, bool): setattr(od.device_information, odprop, t(int(eds.get("DeviceInfo", eprop), 0))) elif t is str: setattr(od.device_information, odprop, eds.get("DeviceInfo", eprop)) except NoOptionError: pass if eds.has_section("DeviceComissioning"): od.bitrate = int(eds.get("DeviceComissioning", "BaudRate")) * 1000 od.node_id = int(eds.get("DeviceComissioning", "NodeID"), 0) for section in eds.sections(): # Match dummy definitions match = re.match(r"^[Dd]ummy[Uu]sage$", section) if match is not None: for i in range(1, 8): key = "Dummy%04d" % i if eds.getint(section, key) == 1: var = objectdictionary.Variable(key, i, 0) var.data_type = i var.access_type = "const" od.add_object(var) # Match indexes match = re.match(r"^[0-9A-Fa-f]{4}$", section) if match is not None: index = int(section, 16) name = eds.get(section, "ParameterName") try: object_type = int(eds.get(section, "ObjectType"), 0) except NoOptionError: # DS306 4.6.3.2 object description # If the keyword ObjectType is missing, this is regarded as # "ObjectType=0x7" (=VAR). object_type = VAR try: storage_location = eds.get(section, "StorageLocation") except NoOptionError: storage_location = None if object_type in (VAR, DOMAIN): var = build_variable(eds, section, node_id, index) od.add_object(var) elif object_type == ARR and eds.has_option(section, "CompactSubObj"): arr = objectdictionary.Array(name, index) last_subindex = objectdictionary.Variable( "Number of entries", index, 0) last_subindex.data_type = objectdictionary.UNSIGNED8 arr.add_member(last_subindex) arr.add_member(build_variable(eds, section, node_id, index, 1)) arr.storage_location = storage_location od.add_object(arr) elif object_type == ARR: arr = objectdictionary.Array(name, index) arr.storage_location = storage_location od.add_object(arr) elif object_type == RECORD: record = objectdictionary.Record(name, index) record.storage_location = storage_location od.add_object(record) continue # Match subindexes match = re.match(r"^([0-9A-Fa-f]{4})[S|s]ub([0-9A-Fa-f]+)$", section) if match is not None: index = int(match.group(1), 16) subindex = int(match.group(2), 16) entry = od[index] if isinstance(entry, (objectdictionary.Record, objectdictionary.Array)): var = build_variable(eds, section, node_id, index, subindex) entry.add_member(var) # Match [index]Name match = re.match(r"^([0-9A-Fa-f]{4})Name", section) if match is not None: index = int(match.group(1), 16) num_of_entries = int(eds.get(section, "NrOfEntries")) entry = od[index] # For CompactSubObj index 1 is were we find the variable src_var = od[index][1] for subindex in range(1, num_of_entries + 1): var = copy_variable(eds, section, subindex, src_var) if var is not None: entry.add_member(var) return od