Source code for udsoncan.common.AddressAndLengthFormatIdentifier

import struct

__all__ = ['AddressAndLengthFormatIdentifier']


[docs]class AddressAndLengthFormatIdentifier: """ This class defines how many bytes of a memorylocation, composed of an address and a memorysize, should be encoded when sent over the underlying protocol. Mainly used by :ref:`ReadMemoryByAddress<ReadMemoryByAddress>`, :ref:`WriteMemoryByAddress<WriteMemoryByAddress>`, :ref:`RequestDownload<RequestDownload>` and :ref:`RequestUpload<RequestUpload>` services Defined by ISO-14229:2020, Annex H :param address_format: The number of bits on which an address should be encoded. Possible values are 8, 16, 24, 32, 40, 48, 56, 64 :type address_format: int :param memorysize_format: The number of bits on which a memory size should be encoded. Possible values are 8, 16, 24, 32, 40, 48, 56, 64 :type memorysize_format: int """ address_map = { 8: 1, 16: 2, 24: 3, 32: 4, 40: 5, 48: 6, 56: 7, 64: 8 } memsize_map = { 8: 1, 16: 2, 24: 3, 32: 4, 40: 5, 48: 6, 56: 7, 64: 8 } memorysize_format: int address_format: int def __init__(self, address_format: int, memorysize_format: int): if address_format not in self.address_map: raise ValueError('address_format must ba an integer selected from : %s ' % (self.address_map.keys())) if not isinstance(memorysize_format, int) or not isinstance(address_format, int): raise ValueError('memorysize_format and address_format must be integers') if memorysize_format not in self.memsize_map: raise ValueError('memorysize_format must be an integer selected from : %s' % (self.memsize_map.keys())) self.memorysize_format = memorysize_format self.address_format = address_format def get_byte_as_int(self) -> int: return ((self.memsize_map[self.memorysize_format] << 4) | (self.address_map[self.address_format])) & 0xFF # Byte given alongside a memory address and a length so that they are decoded properly. def get_byte(self) -> bytes: return struct.pack('B', self.get_byte_as_int())