Source code for nixnet.database._dbc_signal_value_table

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import collections
import six
import typing  # NOQA: F401

from nixnet import _funcs
from nixnet import constants


[docs]class DbcSignalValueTable(collections.Mapping): """Collection for accessing a DBC signal value table.""" def __init__(self, handle): # type: (int) -> None self._handle = handle def __repr__(self): return '{}(handle={})'.format(type(self).__name__, self._handle) def __eq__(self, other): if isinstance(other, self.__class__): return self._handle == typing.cast(DbcSignalValueTable, other)._handle else: return NotImplemented def __ne__(self, other): result = self.__eq__(other) if result is NotImplemented: return result else: return not result def __hash__(self): return hash(self._handle) def __len__(self): return len(self._value_table) def __iter__(self): return self.keys() def __getitem__(self, key): # type: (typing.Text) -> int """Return the value. Args: Value description. Returns: Value """ if isinstance(key, six.string_types): return self._value_table[key] else: raise TypeError(key)
[docs] def keys(self): """Return all value descriptions in the collection. Yields: An iterator to all value descriptions in the collection. """ return iter(self._value_table.keys())
[docs] def values(self): """Return all values in the collection. Yields: An iterator to all values in the collection. """ return iter(self._value_table.values())
[docs] def items(self): """Return all value descriptions and values in the collection. Yields: An iterator to tuple pairs of value descriptions and values in the collection. """ return iter(self._value_table.items())
@property def _value_table(self): # type: () -> typing.Dict[typing.Text, int] mode = constants.GetDbcAttributeMode.VALUE_TABLE_LIST attribute_size = _funcs.nxdb_get_dbc_attribute_size(self._handle, mode, '') attribute_info = _funcs.nxdb_get_dbc_attribute(self._handle, mode, '', attribute_size) table_string = attribute_info[0] if not table_string: return {} table_list = table_string.split(',') if len(table_list) % 2: raise ValueError('Value tables require an even number of items: %s' % table_list) # table_string is of the format 'value1, key1, value2, key2, ...' # convert to a dict: { 'key1': int('value1'), 'key2': int('value2'), ... } table_dict = dict( (key, int(value)) for value, key in zip(table_list[0::2], table_list[1::2])) return table_dict