PMXmlParser.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. '''
  2. Created on 29-03-2013
  3. @author: citan
  4. '''
  5. import xml.sax
  6. import os.path
  7. from pimonitor.PM import PM
  8. from pimonitor.PMParameter import PMParameter
  9. # TODO: dependencies
  10. # TODO: ecuparams
  11. class PMXmlParser(xml.sax.ContentHandler):
  12. '''
  13. classdocs
  14. '''
  15. def __init__(self):
  16. '''
  17. Constructor
  18. '''
  19. xml.sax.ContentHandler.__init__(self)
  20. def parse(self, file_name):
  21. self._parameters = set()
  22. self._parameter = None
  23. self._element_no = 0
  24. self._message = "Parsing XML data"
  25. self._log_id = PM.log(self._message)
  26. source = open(os.path.join("data", file_name))
  27. xml.sax.parse(source, self)
  28. PM.log(self._message + " [DONE]", self._log_id)
  29. return self._parameters
  30. def startElement(self, name, attrs):
  31. if name == "parameter":
  32. # set optional arguments
  33. byte_index = "none"
  34. bit_index = "none"
  35. for (k,v) in attrs.items():
  36. if k == "id":
  37. pid = v
  38. if k == "name":
  39. name = v
  40. if k == "desc":
  41. desc = v
  42. if k == "ecubyteindex":
  43. byte_index = int(v)
  44. if k == "ecubit":
  45. bit_index = int(v)
  46. if k == "target":
  47. target = int(v)
  48. self._parameter = PMParameter(pid, name, desc, byte_index, bit_index, target)
  49. if name == "address":
  50. self._addrlen = 1
  51. for (k,v) in attrs.items():
  52. if k == "length":
  53. self._addrlen = int(v)
  54. if name == "depends":
  55. self._addrlen = 0
  56. if name == "ref":
  57. for (k,v) in attrs.items():
  58. if k == "parameter":
  59. self._parameter.add_dependency(v)
  60. if name == "conversion" and self._parameter != None:
  61. for (k,v) in attrs.items():
  62. if k == "units":
  63. units = v
  64. if k == "expr":
  65. expr = v
  66. if k == "format":
  67. value_format = v
  68. if self._parameter != None:
  69. self._parameter.add_conversion([units, expr, value_format])
  70. self._name = name
  71. def characters(self, content):
  72. if len(content.strip()) > 0 and self._name == "address" and self._parameter != None:
  73. self._parameter.set_address(int(content, 16), self._addrlen)
  74. def endElement(self, name):
  75. if name == "parameter":
  76. self._parameters.add(self._parameter)
  77. self._parameter = None
  78. self._addrlen = None
  79. if name == "address":
  80. self._addrlen = 0
  81. if name == "depends":
  82. pass
  83. self._name = ""
  84. self._element_no += 1
  85. if self._element_no % 1000 == 0:
  86. PM.log(self._message + " " + str(self._element_no) + " elements", self._log_id)