Source code for lories.data.converters.io.analog

# -*- coding: utf-8 -*-
"""
lories.data.converters.io.analog
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


"""

from __future__ import annotations

from typing import Any, Optional

from lories.core import ConfigurationError
from lories.core.typing import Configurations
from lories.data.converters import ConversionError, register_converter_type
from lories.data.converters.converter import FloatConverter


[docs] @register_converter_type("analog_input") class AnalogInput(FloatConverter): INPUT_KEY: str = "input" _input_max: float _input_min: float _input_zero: float _invert: bool _factor: float _divisor: float max: float min: float def configure(self, configs: Configurations) -> None: super().configure(configs) self.min = configs.get_float("value_min", default=0.0) self.max = configs.get_float("value_max") if self.max <= self.min: raise ConfigurationError( f"Invalid value boundaries for '{self.id}' with min ({self.min}) > max ({self.max})" ) self._configure_input(configs) self._assert_input(self._input_min, self._input_max, self._input_zero) self._invert = configs.get_bool("invert", default=False) self._factor = configs.get_float("factor", default=1) self._divisor = (self._input_max - self._input_min) / (self.max - self.min) def _configure_input( self, configs: Configurations, default_max: float = None, default_min: float = 0.0, ) -> None: self._input_max = configs.get_float(f"{self.INPUT_KEY}_max", default=default_max) self._input_min = configs.get_float(f"{self.INPUT_KEY}_min", default=default_min) self._input_zero = configs.get_float(f"{self.INPUT_KEY}_zero", default=self._input_min) # noinspection PyShadowingBuiltins def _assert_input(self, min: float, max: float, zero: float) -> None: if min is None: raise ConfigurationError(f"Missing input minimum for '{self.id}'") if max is None: raise ConfigurationError(f"Missing input maximum for '{self.id}'") if max <= min: raise ConfigurationError(f"Invalid input boundaries for '{self.id}' with min ({min}) > max ({max})") if zero is None: raise ConfigurationError(f"Missing input zero point for '{self.id}'") if min > zero > max: raise ConfigurationError(f"Invalid input zero point for '{self.id}': {zero}") def convert(self, value: Any, **kwargs) -> Optional[float]: if self._input_min > value > self._input_max: raise ConversionError( f"Invalid input signal out of limit ({self._input_min} to {self._input_max}): " + str(value) ) _value = (value * self._factor - self._input_zero) / self._divisor if self._invert: _value = self.max - _value return _value