123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- '''
- Created on 29-03-2013
- @author: citan
- '''
- import xml.sax
- import os.path
- from pimonitor.PM import PM
- from pimonitor.PMParameter import PMParameter
- # TODO: dependencies
- # TODO: ecuparams
- class PMXmlParser(xml.sax.ContentHandler):
- '''
- classdocs
- '''
- def __init__(self):
- '''
- Constructor
- '''
- xml.sax.ContentHandler.__init__(self)
-
- def parse(self, file_name):
- self._parameters = set()
- self._parameter = None
- self._element_no = 0
-
- self._message = "Parsing XML data"
- self._log_id = PM.log(self._message)
- source = open(os.path.join("data", file_name))
- xml.sax.parse(source, self)
- PM.log(self._message + " [DONE]", self._log_id)
-
- return self._parameters
- def startElement(self, name, attrs):
- if name == "parameter":
- # set optional arguments
- byte_index = "none"
- bit_index = "none"
- for (k,v) in attrs.items():
- if k == "id":
- pid = v
- if k == "name":
- name = v
- if k == "desc":
- desc = v
- if k == "ecubyteindex":
- byte_index = int(v)
- if k == "ecubit":
- bit_index = int(v)
- if k == "target":
- target = int(v)
- self._parameter = PMParameter(pid, name, desc, byte_index, bit_index, target)
-
- if name == "address":
- self._addrlen = 1
- for (k,v) in attrs.items():
- if k == "length":
- self._addrlen = int(v)
-
- if name == "depends":
- self._addrlen = 0
- if name == "ref":
- for (k,v) in attrs.items():
- if k == "parameter":
- self._parameter.add_dependency(v)
-
- if name == "conversion" and self._parameter != None:
- for (k,v) in attrs.items():
- if k == "units":
- units = v
- if k == "expr":
- expr = v
- if k == "format":
- value_format = v
-
- if self._parameter != None:
- self._parameter.add_conversion([units, expr, value_format])
-
- self._name = name
- def characters(self, content):
- if len(content.strip()) > 0 and self._name == "address" and self._parameter != None:
- self._parameter.set_address(int(content, 16), self._addrlen)
-
- def endElement(self, name):
- if name == "parameter":
- self._parameters.add(self._parameter)
- self._parameter = None
- self._addrlen = None
-
- if name == "address":
- self._addrlen = 0
- if name == "depends":
- pass
- self._name = ""
-
- self._element_no += 1
-
- if self._element_no % 1000 == 0:
- PM.log(self._message + " " + str(self._element_no) + " elements", self._log_id)
|