PMParameter.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. '''
  2. Created on 29-03-2013
  3. @author: citan
  4. '''
  5. import re
  6. class PMParameter(object):
  7. '''
  8. classdocs
  9. '''
  10. def __init__(self, pid, name, desc, byte_index, bit_index, target):
  11. '''
  12. Constructor
  13. '''
  14. self._id = pid
  15. self._name = name
  16. self._desc = desc
  17. self._byte_index = byte_index
  18. self._bit_index = bit_index
  19. self._target = target
  20. self._conversions = []
  21. self._dependencies = []
  22. self._parameters = []
  23. self._address = 0
  24. self._address_length = 0
  25. def get_id(self):
  26. return self._id;
  27. def set_address(self, address, length):
  28. self._address = address
  29. self._address_length = length
  30. def get_address(self):
  31. return self._address
  32. def get_address_length(self):
  33. return self._address_length
  34. def get_target(self):
  35. return self._target
  36. def get_name(self):
  37. return self._name
  38. def add_conversion(self, conversion):
  39. self._conversions.append(conversion)
  40. def add_dependency(self, dependency):
  41. self._dependencies.append(dependency)
  42. def get_dependencies(self):
  43. return self._dependencies
  44. def add_parameter(self, parameter):
  45. self._parameters.append(parameter)
  46. def get_parameters(self):
  47. return self._parameters
  48. def get_calculated_value(self, packets, unit=None):
  49. value = ""
  50. local_vars = locals()
  51. if len(self._conversions) > 0 and unit == None:
  52. unit = self._conversions[0][0]
  53. for conversion in self._conversions:
  54. currunit = conversion[0]
  55. expr = conversion[1]
  56. value_format = conversion[2]
  57. conversion_map = {}
  58. if unit == currunit:
  59. param_pairs = re.findall(r'\[([^]]*)\]',expr)
  60. for pair in param_pairs:
  61. attributes = pair.split(":")
  62. key = attributes[0]
  63. unit = attributes[1]
  64. expr = expr.replace("[" + key + ":" + unit + "]", key)
  65. conversion_map.update({key:unit})
  66. param_no = 0
  67. for packet in packets:
  68. param = self._parameters[param_no];
  69. if param.get_id() in conversion_map:
  70. conversion_unit = conversion_map[param.get_id()]
  71. else:
  72. conversion_unit = None
  73. value = param.get_value(packet, conversion_unit);
  74. local_vars[param.get_id()] = float(value)
  75. param_no += 1
  76. try:
  77. value = eval(expr)
  78. except:
  79. value = 0.0
  80. format_tokens = value_format.split(".")
  81. output_format = "%.0f"
  82. if len(format_tokens) > 1:
  83. output_format = "%." + str(len(format_tokens[1])) + "f"
  84. value = output_format % value
  85. return value
  86. def get_value(self, packet, unit=None):
  87. value = ""
  88. if len(self._conversions) > 0 and unit == None:
  89. unit = self._conversions[0][0]
  90. for conversion in self._conversions:
  91. currunit = conversion[0]
  92. expr = conversion[1]
  93. value_format = conversion[2]
  94. if unit == currunit:
  95. # ignore 0xe8
  96. index = 1
  97. x = 0
  98. value_bytes = packet.get_data()[index:index + self._address_length]
  99. if self._address_length == 1:
  100. x = value_bytes[0]
  101. if self._address_length == 2:
  102. x = (value_bytes[0] << 8) | value_bytes[1]
  103. x = float(x)
  104. try:
  105. value = eval(expr)
  106. except:
  107. value = 0.0
  108. format_tokens = value_format.split(".")
  109. output_format = "%.0f"
  110. if len(format_tokens) > 1:
  111. output_format = "%." + str(len(format_tokens[1])) + "f"
  112. value = output_format % value
  113. return value
  114. def get_default_unit(self):
  115. if len(self._conversions) > 0:
  116. return self._conversions[0][0]
  117. return ""
  118. def is_supported(self, data):
  119. if self._byte_index != "none" and self._bit_index != "none" and len(data) > self._byte_index:
  120. cubyte = data[self._byte_index]
  121. bitmask = 1 << self._bit_index
  122. return cubyte & bitmask == bitmask
  123. else:
  124. return False
  125. def to_string(self):
  126. return "Param: id=" + self._id + ", name=" + self._name + ", desc=" + self._desc + ", byte=" + str(self._byte_index) + \
  127. ", bit=" + str(self._bit_index) + ", target=" + str(self._target) + ", conversions=" + '[%s]' % ', '.join(map(str, self._conversions)) + \
  128. ", address=" + hex(self._address) + "[" + str(self._address_length) + "]"