Source code for uds.addressing.abstract_addressing_information
"""Definition of UDS Addressing Information for storing Client/Server Addresses."""
__all__ = ["AbstractAddressingInformation"]
from abc import ABC, abstractmethod
from types import MappingProxyType
from typing import Any, Dict, Mapping, Optional
from uds.utilities import ReassignmentError
from .addressing_type import AddressingType
[docs]
class AbstractAddressingInformation(ABC):
"""Storage for addressing related parameters for any UDS entity."""
ADDRESSING_TYPE_NAME: str = "addressing_type"
"""Name of :ref:`Addressing Type <knowledge-base-addressing>` parameter in Addressing Information."""
def __init__(self,
rx_physical_params: Mapping[str, Any],
tx_physical_params: Mapping[str, Any],
rx_functional_params: Mapping[str, Any],
tx_functional_params: Mapping[str, Any]) -> None:
"""
Configure Addresses of UDS Entity (either a server or a client).
:param rx_physical_params: Addressing parameters for incoming physically addressed communication.
:param tx_physical_params: Addressing parameters for outgoing physically addressed communication.
:param rx_functional_params: Addressing parameters for incoming functionally addressed communication.
:param tx_functional_params: Addressing parameters for outgoing functionally addressed communication.
"""
self.rx_physical_params = rx_physical_params
self.tx_physical_params = tx_physical_params
self.rx_functional_params = rx_functional_params
self.tx_functional_params = tx_functional_params
self._validate_addressing_information()
[docs]
def __eq__(self, other: Any) -> bool:
"""
Compare with other object.
:param other: Object to compare.
:return: True if other object has the same type and carries the same Addressing Information, otherwise False.
"""
if not isinstance(other, AbstractAddressingInformation):
return False
return (self.rx_physical_params == other.rx_physical_params
and self.tx_physical_params == other.tx_physical_params
and self.rx_functional_params == other.rx_functional_params
and self.tx_functional_params == other.tx_functional_params)
@property
def rx_physical_params(self) -> Mapping[str, Any]:
"""Get addressing parameters for incoming physically addressed communication."""
return self.__rx_physical_params
@rx_physical_params.setter
def rx_physical_params(self, addressing_params: Mapping[str, Any]) -> None:
"""
Set addressing parameters for incoming physically addressed communication.
:param addressing_params: Addressing parameters to set.
:raise ReassignmentError: An attempt to change the value after object creation.
"""
if hasattr(self, "_AbstractAddressingInformation__rx_physical_params"):
raise ReassignmentError("Value of 'rx_physical_params' attribute cannot be changed once assigned.")
params = dict(addressing_params)
params[self.ADDRESSING_TYPE_NAME] = AddressingType.PHYSICAL
self.__rx_physical_params: MappingProxyType[str, Any] \
= MappingProxyType(self.validate_addressing_params(**params))
@property
def tx_physical_params(self) -> Mapping[str, Any]:
"""Get addressing parameters for outgoing physically addressed communication."""
return self.__tx_physical_params
@tx_physical_params.setter
def tx_physical_params(self, addressing_params: Mapping[str, Any]) -> None:
"""
Set addressing parameters for outgoing physically addressed communication.
:param addressing_params: Addressing parameters to set.
:raise ReassignmentError: An attempt to change the value after object creation.
"""
if hasattr(self, "_AbstractAddressingInformation__tx_physical_params"):
raise ReassignmentError("Value of 'tx_physical_params' attribute cannot be changed once assigned.")
params = dict(addressing_params)
params[self.ADDRESSING_TYPE_NAME] = AddressingType.PHYSICAL
self.__tx_physical_params: MappingProxyType[str, Any] \
= MappingProxyType(self.validate_addressing_params(**params))
@property
def rx_functional_params(self) -> Mapping[str, Any]:
"""Get addressing parameters for incoming functionally addressed communication."""
return self.__rx_functional_params
@rx_functional_params.setter
def rx_functional_params(self, addressing_params: Mapping[str, Any]) -> None:
"""
Set addressing parameters for incoming functionally addressed communication.
:param addressing_params: Addressing parameters to set.
:raise ReassignmentError: An attempt to change the value after object creation.
"""
if hasattr(self, "_AbstractAddressingInformation__rx_functional_params"):
raise ReassignmentError("Value of 'rx_functional_params' attribute cannot be changed once assigned.")
params = dict(addressing_params)
params[self.ADDRESSING_TYPE_NAME] = AddressingType.FUNCTIONAL
self.__rx_functional_params: MappingProxyType[str, Any] \
= MappingProxyType(self.validate_addressing_params(**params))
@property
def tx_functional_params(self) -> Mapping[str, Any]:
"""Get addressing parameters for outgoing functionally addressed communication."""
return self.__tx_functional_params
@tx_functional_params.setter
def tx_functional_params(self, addressing_params: Mapping[str, Any]) -> None:
"""
Set addressing parameters for outgoing functionally addressed communication.
:param addressing_params: Addressing parameters to set.
:raise ReassignmentError: An attempt to change the value after object creation.
"""
if hasattr(self, "_AbstractAddressingInformation__tx_functional_params"):
raise ReassignmentError("Value of 'tx_functional_params' attribute cannot be changed once assigned.")
params = dict(addressing_params)
params[self.ADDRESSING_TYPE_NAME] = AddressingType.FUNCTIONAL
self.__tx_functional_params: MappingProxyType[str, Any] \
= MappingProxyType(self.validate_addressing_params(**params))
[docs]
@abstractmethod
def _validate_addressing_information(self) -> None:
"""Check whether the provided addressing information are valid."""
[docs]
@abstractmethod
def validate_addressing_params(self, **addressing_params: Any) -> Dict[str, Any]:
"""Check whether the provided parameters are complete and correct."""
[docs]
@abstractmethod
def is_input_packet(self, **frame_attributes: Any) -> Optional[AddressingType]: # noqa: vulture
"""
Check if a frame with provided attributes is an input packet for this UDS Entity.
:param frame_attributes: Attributes of a frame to be checked.
:return: Addressing Type used for transmission of this packet, None otherwise.
"""
[docs]
def get_other_end(self) -> "AbstractAddressingInformation":
"""
Get Addressing Information of UDS entity on the other end of UDS communication.
:return: UDS Addressing Information of a UDS entity that this one communicates with.
"""
return self.__class__(rx_physical_params=self.tx_physical_params,
tx_physical_params=self.rx_physical_params,
rx_functional_params=self.tx_functional_params,
tx_functional_params=self.rx_functional_params)