fp@914: #!/usr/bin/python fp@914: fp@914: #----------------------------------------------------------------------------- fp@914: # fp@914: # $Id$ fp@914: # fp@914: # Convert a slave information file to a slave description Xml. fp@914: # fp@914: #----------------------------------------------------------------------------- fp@914: fp@914: from xml.dom.minidom import Document fp@914: import sys fp@914: import re fp@914: import os fp@914: import getopt fp@914: fp@914: #----------------------------------------------------------------------------- fp@914: fp@914: infoFileName = 'info' fp@914: fp@914: #----------------------------------------------------------------------------- fp@914: fp@914: class PdoEntry: fp@914: def __init__(self, index, subindex, name, bitlength): fp@914: self.index = index fp@914: self.subindex = subindex fp@914: self.name = name fp@914: self.bitlength = bitlength fp@914: fp@914: def toXml(self, doc, element): fp@914: entryElement = doc.createElement('Entry') fp@914: fp@914: indexElement = doc.createElement('Index') fp@914: indexText = doc.createTextNode('#x%04x' % self.index) fp@914: indexElement.appendChild(indexText) fp@914: entryElement.appendChild(indexElement) fp@914: fp@914: if (self.index != 0): fp@914: subIndexElement = doc.createElement('SubIndex') fp@914: subIndexText = doc.createTextNode(str(self.subindex)) fp@914: subIndexElement.appendChild(subIndexText) fp@914: entryElement.appendChild(subIndexElement) fp@914: fp@914: lengthElement = doc.createElement('BitLen') fp@914: lengthText = doc.createTextNode(str(self.bitlength)) fp@914: lengthElement.appendChild(lengthText) fp@914: entryElement.appendChild(lengthElement) fp@914: fp@914: if (self.index != 0): fp@914: nameElement = doc.createElement('Name') fp@914: nameText = doc.createTextNode(self.name) fp@914: nameElement.appendChild(nameText) fp@914: entryElement.appendChild(nameElement) fp@914: fp@914: dataTypeElement = doc.createElement('DataType') fp@914: dataTypeText = doc.createTextNode(self.dataType()) fp@914: dataTypeElement.appendChild(dataTypeText) fp@914: entryElement.appendChild(dataTypeElement) fp@914: fp@914: element.appendChild(entryElement) fp@914: fp@914: def dataType(self): fp@914: if self.bitlength == 1: fp@914: return 'BOOL' fp@914: elif self.bitlength % 8 == 0: fp@914: if self.bitlength <= 64: fp@914: return 'UINT%u' % self.bitlength fp@914: else: fp@914: return 'STRING(%u)' % (self.bitlength / 8) fp@914: else: fp@914: assert False, 'Invalid bit length %u' % self.bitlength fp@914: fp@914: #----------------------------------------------------------------------------- fp@914: fp@914: class Pdo: fp@914: def __init__(self, dir, index): fp@914: self.dir = dir fp@914: self.index = index fp@914: self.entries = [] fp@914: fp@914: def appendEntry(self, entry): fp@914: self.entries.append(entry) fp@914: fp@914: def toXml(self, doc, element): fp@914: pdoElement = doc.createElement('%sxPdo' % self.dir) fp@914: fp@914: indexElement = doc.createElement('Index') fp@914: indexText = doc.createTextNode('#x%04x' % self.index) fp@914: indexElement.appendChild(indexText) fp@914: pdoElement.appendChild(indexElement) fp@914: fp@914: nameElement = doc.createElement('Name') fp@914: pdoElement.appendChild(nameElement) fp@914: fp@914: for e in self.entries: fp@914: e.toXml(doc, pdoElement) fp@914: fp@914: element.appendChild(pdoElement) fp@914: fp@914: #----------------------------------------------------------------------------- fp@914: fp@914: class Device: fp@914: def __init__(self): fp@914: self.vendor = 0 fp@914: self.product = 0 fp@914: self.revision = 0 fp@914: self.pdos = [] fp@914: fp@914: def parseInfoFile(self, fileName): fp@914: reVendor = re.compile('Vendor ID:.*\((\d+)\)') fp@914: reProduct = re.compile('Product code:.*\((\d+)\)') fp@914: reRevision = re.compile('Revision number:.*\((\d+)\)') fp@914: rePdo = re.compile('([RT])xPdo\s+0x([0-9A-F]+)') fp@914: rePdoEntry = \ fp@937: re.compile('0x([0-9A-F]+):([0-9A-F]+),\s+(\d+) bit,\s+"([^"]*)"') fp@914: pdo = None fp@914: f = open(fileName, 'r') fp@914: while True: fp@914: line = f.readline() fp@914: if not line: break fp@914: fp@914: match = reVendor.search(line) fp@914: if match: fp@914: self.vendor = int(match.group(1)) fp@914: fp@914: match = reProduct.search(line) fp@914: if match: fp@914: self.product = int(match.group(1)) fp@914: fp@914: match = reRevision.search(line) fp@914: if match: fp@914: self.revision = int(match.group(1)) fp@914: fp@914: match = rePdo.search(line) fp@914: if match: fp@914: pdo = Pdo(match.group(1), int(match.group(2), 16)) fp@914: self.pdos.append(pdo) fp@914: fp@914: match = rePdoEntry.search(line) fp@914: if match: fp@914: pdoEntry = PdoEntry(int(match.group(1), 16), \ fp@937: int(match.group(2), 16), match.group(4), \ fp@937: int(match.group(3))) fp@914: pdo.appendEntry(pdoEntry) fp@914: fp@914: f.close() fp@914: fp@914: def toXmlDocument(self): fp@914: doc = Document() fp@914: fp@914: rootElement = doc.createElement('EtherCATInfo') fp@914: doc.appendChild(rootElement) fp@914: fp@914: vendorElement = doc.createElement('Vendor') fp@914: rootElement.appendChild(vendorElement) fp@914: fp@914: vendorIdElement = doc.createElement('Id') fp@914: fp@914: idText = doc.createTextNode(str(self.vendor)) fp@914: vendorIdElement.appendChild(idText) fp@914: fp@914: vendorElement.appendChild(vendorIdElement) fp@914: fp@914: descriptionsElement = doc.createElement('Descriptions') fp@914: rootElement.appendChild(descriptionsElement) fp@914: fp@914: devicesElement = doc.createElement('Devices') fp@914: descriptionsElement.appendChild(devicesElement) fp@914: fp@914: deviceElement = doc.createElement('Device') fp@914: devicesElement.appendChild(deviceElement) fp@914: fp@914: typeElement = doc.createElement('Type') fp@914: typeElement.setAttribute('ProductCode', '#x%08x' % self.product) fp@915: typeElement.setAttribute('RevisionNo', '#x%08x' % self.revision) fp@914: deviceElement.appendChild(typeElement) fp@914: fp@914: for p in self.pdos: fp@914: p.toXml(doc, deviceElement) fp@914: fp@914: return doc fp@914: fp@914: #----------------------------------------------------------------------------- fp@914: fp@914: def usage(): fp@914: print """slaveinfo2xml.py [OPTIONS] [FILE] fp@914: File defaults to 'info'. fp@914: Options: fp@914: -h Print this help.""" fp@914: fp@914: #----------------------------------------------------------------------------- fp@914: fp@914: try: fp@914: opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) fp@914: except getopt.GetoptError, err: fp@914: print str(err) fp@914: usage() fp@914: sys.exit(2) fp@914: fp@914: if len(args) > 1: fp@914: print "Only one argument allowed!" fp@914: usage() fp@914: sys.exit(2) fp@914: elif len(args) == 1: fp@914: infoFileName = args[0] fp@914: fp@914: for o, a in opts: fp@914: if o in ("-h", "--help"): fp@914: usage() fp@914: sys.exit() fp@914: else: fp@914: assert False, "unhandled option" fp@914: fp@914: d = Device() fp@914: d.parseInfoFile(infoFileName) fp@914: doc = d.toXmlDocument() fp@914: fp@914: # Print our newly created XML fp@914: print doc.toprettyxml(indent=' ') fp@914: fp@914: #----------------------------------------------------------------------------- fp@914: