1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- import re
- from pimonitor.cu.PMCUParameter import PMCUParameter
- from pimonitor.cu.PMCUStandardParameter import PMCUStandardParameter
- __author__ = 'citan'
- class PMCUCalculatedParameter(PMCUStandardParameter):
- def __init__(self, pid, name, desc, target):
- PMCUStandardParameter.__init__(self, pid, name, desc, PMCUParameter.CU_INVALID_BYTE_INDEX(),
- PMCUParameter.CU_INVALID_BIT_INDEX(), target)
- self._cu_type = PMCUParameter.CU_TYPE_CALCULATED_PARAMETER()
- self._dependencies = []
- def add_dependency(self, parameter):
- self._dependencies.append(parameter)
- def fill_dependencies(self, supported_parameters):
- parameters = []
- for dependency in self._dependencies:
- for parameter in supported_parameters:
- if parameter.get_id() == dependency:
- parameters.append(parameter)
- break
- self._dependencies = parameters
- def get_dependencies(self):
- return self._dependencies
- def get_calculated_value(self, packets, unit=None):
- value = ""
- local_vars = locals()
- if len(self._conversions) > 0 and unit is None:
- unit = self._conversions[0].get_unit()
- for conversion in self._conversions:
- curr_unit = conversion.get_unit()
- expr = conversion.get_expr()
- value_format = conversion.get_format()
- conversion_map = {}
- if unit == curr_unit:
- param_pairs = re.findall(r'\[([^]]*)\]', expr)
- for pair in param_pairs:
- attributes = pair.split(":")
- key = attributes[0]
- unit = attributes[1]
- expr = expr.replace("[" + key + ":" + unit + "]", key)
- conversion_map.update({key: unit})
- param_no = 0
- for param in self._dependencies:
- if param.get_id() in conversion_map:
- conversion_unit = conversion_map[param.get_id()]
- else:
- conversion_unit = None
- if param.get_cu_type() == PMCUParameter.CU_TYPE_CALCULATED_PARAMETER():
- return "ERROR DEPS" #param.get_calculated_value(packets, conversion_unit)
- else:
- value = param.get_value(packets[param_no], conversion_unit)
- local_vars[param.get_id()] = float(value)
- param_no += 1
- try:
- value = eval(expr)
- except (SyntaxError, ZeroDivisionError, NameError):
- return "ERROR EVAL"
- format_tokens = value_format.split(".")
- output_format = "%.0f"
- if len(format_tokens) > 1:
- output_format = "%." + str(len(format_tokens[1])) + "f"
- value = output_format % value
- return value
- def is_supported(self, parameters):
- param_ids = [p.get_id() for p in parameters]
- for dependency in self._dependencies:
- if dependency not in param_ids:
- return False
- return True
- def to_string(self):
- return "id=" + self._id + "\nname=" + self._name + "\ndesc=" + self._desc + "\ntarget=" + str(
- self._target) + "\nconversion:\n\t" + '%s' % ',\n\t'.join(x.to_string() for x in self._conversions) + \
- '\ndependency: ' + '%s' % ', '.join(x for x in self._dependencies)
|