PMCUCalculatedParameter.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import re
  2. from pimonitor.cu.PMCUParameter import PMCUParameter
  3. from pimonitor.cu.PMCUStandardParameter import PMCUStandardParameter
  4. __author__ = 'citan'
  5. class PMCUCalculatedParameter(PMCUStandardParameter):
  6. def __init__(self, pid, name, desc, target):
  7. PMCUStandardParameter.__init__(self, pid, name, desc, PMCUParameter.CU_INVALID_BYTE_INDEX(),
  8. PMCUParameter.CU_INVALID_BIT_INDEX(), target)
  9. self._cu_type = PMCUParameter.CU_TYPE_CALCULATED_PARAMETER()
  10. self._dependencies = []
  11. def add_dependency(self, parameter):
  12. self._dependencies.append(parameter)
  13. def fill_dependencies(self, supported_parameters):
  14. parameters = []
  15. for dependency in self._dependencies:
  16. for parameter in supported_parameters:
  17. if parameter.get_id() == dependency:
  18. parameters.append(parameter)
  19. break
  20. self._dependencies = parameters
  21. def get_dependencies(self):
  22. return self._dependencies
  23. def get_calculated_value(self, packets, unit=None):
  24. value = ""
  25. local_vars = locals()
  26. if len(self._conversions) > 0 and unit is None:
  27. unit = self._conversions[0].get_unit()
  28. for conversion in self._conversions:
  29. curr_unit = conversion.get_unit()
  30. expr = conversion.get_expr()
  31. value_format = conversion.get_format()
  32. conversion_map = {}
  33. if unit == curr_unit:
  34. param_pairs = re.findall(r'\[([^]]*)\]', expr)
  35. for pair in param_pairs:
  36. attributes = pair.split(":")
  37. key = attributes[0]
  38. unit = attributes[1]
  39. expr = expr.replace("[" + key + ":" + unit + "]", key)
  40. conversion_map.update({key: unit})
  41. param_no = 0
  42. for param in self._dependencies:
  43. if param.get_id() in conversion_map:
  44. conversion_unit = conversion_map[param.get_id()]
  45. else:
  46. conversion_unit = None
  47. if param.get_cu_type() == PMCUParameter.CU_TYPE_CALCULATED_PARAMETER():
  48. return "ERROR DEPS" #param.get_calculated_value(packets, conversion_unit)
  49. else:
  50. value = param.get_value(packets[param_no], conversion_unit)
  51. local_vars[param.get_id()] = float(value)
  52. param_no += 1
  53. try:
  54. value = eval(expr)
  55. except (SyntaxError, ZeroDivisionError, NameError):
  56. return "ERROR EVAL"
  57. format_tokens = value_format.split(".")
  58. output_format = "%.0f"
  59. if len(format_tokens) > 1:
  60. output_format = "%." + str(len(format_tokens[1])) + "f"
  61. value = output_format % value
  62. return value
  63. def is_supported(self, parameters):
  64. param_ids = [p.get_id() for p in parameters]
  65. for dependency in self._dependencies:
  66. if dependency not in param_ids:
  67. return False
  68. return True
  69. def to_string(self):
  70. return "id=" + self._id + "\nname=" + self._name + "\ndesc=" + self._desc + "\ntarget=" + str(
  71. self._target) + "\nconversion:\n\t" + '%s' % ',\n\t'.join(x.to_string() for x in self._conversions) + \
  72. '\ndependency: ' + '%s' % ', '.join(x for x in self._dependencies)