Exemple #1
0
    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