def get_payload(self): payload_bits = BitArray(length=8 * 8) # 8 Byte Message field_index = 0 for fieldConfig in sorted(self.field_config['Fields'], key=lambda f: f['Order']): logger.debug(fieldConfig) length = fieldConfig['BitLength'] offset = fieldConfig['BitOffset'] signed = fieldConfig['Signed'] start = fieldConfig['BitStart'] if fieldConfig['BitStart'] == 0: if length < 8: position = offset + 8 - length else: position = offset else: position = offset - start logger.debug("Field {name} starts at: {position}".format( name=fieldConfig['Name'], position=position)) logger.debug("Field {name} length is: {length}".format( name=fieldConfig['Name'], length=length)) try: resolution = fieldConfig['Resolution'] except KeyError: resolution = None value = self.field_data[field_index] logger.debug("Value before conversion is: %s" % value) if value is not None: if resolution is not None: value = int(float(value) / float(resolution)) if not signed: logger.debug("Field {name} is unsigned".format( name=fieldConfig['Name'])) value = Bits(uint=value, length=length) else: logger.debug("Field {name} is signed".format( name=fieldConfig['Name'])) value = Bits(int=value, length=length) else: value = BitArray(length=length) value.invert() if signed: value[0] = False value = Bits(value) logger.debug("Field {name} value post conversion: {value}".format( name=fieldConfig['Name'], value=value)) if length % 8 == 0: value = Bits(bytes=reversed(value.bytes)) payload_bits.overwrite(value, position) field_index += 1 pad = 8 * 8 - len(payload_bits) if (pad > 0): payload_bits.append(Bits(length=pad)) data = list(payload_bits.bytes) logger.debug("Payload data is: %s" % data) return data