Source code for ingenialink.canopen.registers

from enum import Enum

from .._ingenialink import lib

from .._utils import *
from ..registers import REG_DTYPE, REG_ACCESS, REG_PHY


[docs]class Register(object): """ Register. Args: identifier (str): Identifier. units (str): Units. address (int): Address. dtype (REG_DTYPE): Data type. access (REG_ACCESS): Access type. phy (REG_PHY, optional): Physical units. subnode (int): Subnode storage (any, optional): Storage. range (tuple, optional): Range (min, max). labels (dict, optional): Register labels. cat_id (str, optional): Category ID. scat_id (str, optional): Sub-category ID. internal_use (int, optional): Internal use. Raises: TypeError: If any of the parameters has invalid type. ILValueError: If the register is invalid. ILAccessError: Register with wrong access type. """ def __init__(self, identifier, units, cyclic, idx, subidx, dtype, access, phy=REG_PHY.NONE, subnode=1, storage=None, range=(None, None), labels={}, enums=[], enums_count=0, cat_id=None, scat_id=None, internal_use=0): if not isinstance(dtype, REG_DTYPE): raise_err(lib.IL_EINVAL, 'Invalid data type') if not isinstance(access, REG_ACCESS): raise_err(lib.IL_EACCESS, 'Invalid access type') if not isinstance(phy, REG_PHY): raise_err(lib.IL_EINVAL, 'Invalid physical units type') # Initialize register self.__identifier = identifier self.__units = units self.__idx = idx self.__subidx = subidx self.__subnode = subnode self.__cyclic = cyclic self.__dtype = dtype.value self.__access = access.value self.__phy = phy.value self.__internal_use = internal_use self.__storage = storage self.__storage_valid = 0 if not storage else 1 self.__range = (None, None) if not range else range if dtype == REG_DTYPE.S8: if storage: self.__storage = int(storage) range_min = (range[0] if range[0] else INT_SIZES.S8_MIN.value) range_max = (range[1] if range[1] else INT_SIZES.S8_MAX.value) self.__range = (int(range_min), int(range_max)) elif dtype == REG_DTYPE.U8: if storage: self.__storage = int(storage) range_min = range[0] if range[0] else 0 range_max = (range[1] if range[1] else INT_SIZES.U8_MAX.value) self.__range = (int(range_min), int(range_max)) if dtype == REG_DTYPE.S16: if storage: self.__storage = int(storage) range_min = (range[0] if range[0] else INT_SIZES.S16_MIN.value) range_max = (range[1] if range[1] else INT_SIZES.S16_MAX.value) self.__range = (int(range_min), int(range_max)) elif dtype == REG_DTYPE.U16: if storage: self.__storage = int(storage) range_min = range[0] if range[0] else 0 range_max = (range[1] if range[1] else INT_SIZES.U16_MAX.value) self.__range = (int(range_min), int(range_max)) if dtype == REG_DTYPE.S32: if storage: self.__storage = int(storage) range_min = (range[0] if range[0] else INT_SIZES.S32_MIN.value) range_max = (range[1] if range[1] else INT_SIZES.S32_MAX.value) self.__range = (int(range_min), int(range_max)) elif dtype == REG_DTYPE.U32: if storage: self.__storage = int(storage) range_min = range[0] if range[0] else 0 range_max = (range[1] if range[1] else INT_SIZES.U32_MAX.value) self.__range = (int(range_min), int(range_max)) if dtype == REG_DTYPE.S64: if storage: self.__storage = int(storage) range_min = (range[0] if range[0] else INT_SIZES.S64_MIN.value) range_max = (range[1] if range[1] else INT_SIZES.S64_MAX.value) self.__range = (int(range_min), int(range_max)) elif dtype == REG_DTYPE.U64: if storage: self.__storage = int(storage) range_min = range[0] if range[0] else 0 range_max = (range[1] if range[1] else INT_SIZES.U64_MAX.value) self.__range = (int(range_min), int(range_max)) elif dtype == REG_DTYPE.FLOAT: if storage: self.__storage = float(storage) range_min = (range[0] if range[0] else INT_SIZES.S32_MIN.value) range_max = (range[1] if range[1] else INT_SIZES.S32_MAX.value) self.__range = (float(range_min), float(range_max)) else: self.__storage_valid = 0 self.__labels = labels self.__enums = [] self.__enums_count = enums_count for enum in enums: for key, value in enum.items(): dictionary = { 'label': value, 'value': int(key) } self.__enums.append(dictionary) self.__cat_id = cat_id self.__scat_id = scat_id @property def identifier(self): """ str: Register identifier """ return self.__identifier @property def units(self): """ str: Register units """ return self.__units @property def idx(self): """ int: Register index. """ return self.__idx @property def subidx(self): """ int: Register subindex. """ return self.__subidx @property def subnode(self): """ int: Register subnode. """ return self.__subnode @property def cyclic(self): """ str: Register cyclic type. """ return self.__cyclic @property def dtype(self): """ int: Register data type. """ return REG_DTYPE(self.__dtype) @property def access(self): """ int: Register access type. """ return REG_ACCESS(self.__access) @property def phy(self): """ int: Register physical units. """ return REG_PHY(self.__phy) @property def storage(self): """ Register storage. """ if not self.__storage_valid: return None if self.dtype == REG_DTYPE.S8: return self.__storage elif self.dtype == REG_DTYPE.U8: return self.__storage if self.dtype == REG_DTYPE.S16: return self.__storage elif self.dtype == REG_DTYPE.U16: return self.__storage if self.dtype == REG_DTYPE.S32: return self.__storage elif self.dtype == REG_DTYPE.U32: return self.__storage if self.dtype == REG_DTYPE.S64: return self.__storage elif self.dtype == REG_DTYPE.U64: return self.__storage elif self.dtype == REG_DTYPE.FLOAT: return self.__storage else: return None @storage.setter def storage(self, value): self.__storage = value @property def storage_valid(self): """ int: If storage is valid """ return self.__storage_valid @storage_valid.setter def storage_valid(self, value): self.__storage_valid = value @property def range(self): """ tuple: Register range (min, max), None if undefined. """ if self.__range: return (self.__range[0], self.__range[1]) return None @property def labels(self): """ LabelsDictionary: Labels dictionary. """ return self.__labels @property def enums(self): """ Enumerations list. """ return self.__enums @property def enums_count(self): """ int: Register Enumerations count. """ return self.__enums_count @property def cat_id(self): """ Category ID.""" return self.__cat_id @property def scat_id(self): """ Sub-category ID.""" return self.__scat_id @property def internal_use(self): """ int: Register internal_use. """ return self.__internal_use