Exemplo n.º 1
0
    def decode(self, packet):
        """ Decodes a the response

        :param packet: The packet data to decode
        """
        count, self.records = 1, []

        self.frame = packet
        ########################################################
        # Do not include DLE STX and DLE ETX CRC in calcualtion
        ########################################################
        data = packet[2:-4]

        #############################################
        # Calculate CRC after removing escaped DLE's
        #############################################
        crc, = struct.unpack(">H", packet[-2:])
        if utilities.checkCRC(data, crc) != True:
            raise CRCException("Error in CRC : %d" % crc)

        ############################
        # Packet Header Information
        ############################
        self.dest, self.src, self.command, self.sts, self.transaction_id = struct.unpack(">BBBBH", data[0:6])
        data = data[6:]

        #####################################
        # Packet data Information
        # Use Little Endian format for data
        #####################################
        self.records = ()
        if len(data) > 0:
            if self.Address.subElement > 0:
                elementSize = SUBELEMENT_SIZE[self.Address.fileType]
                formatStr = "<" + SUBELEMENT_STRUCT[self.Address.fileType]
            else:
                elementSize = ELEMENT_SIZE[self.Address.fileType]
                formatStr = "<" + ELEMENT_STRUCT[self.Address.fileType]

            for i in range(0, len(data), elementSize):
                if self.Address.bitNumber != None:
                    register, = struct.unpack(formatStr, data[i : i + elementSize])
                    if register & 2 ** self.Address.bitNumber:
                        self.records += (1,)
                    else:
                        self.records += (0,)
                else:
                    if self.Address.fileType == 0x8D:
                        record, = struct.unpack(formatStr, data[i : i + elementSize])
                        size, = struct.unpack("<h", record[0:2])
                        newRecord = ""
                        for i in range(2, elementSize, 2):
                            newRecord += record[i + 1] + record[i]
                        self.records += (newRecord[0:size],)
                    else:
                        self.records += struct.unpack(formatStr, data[i : i + elementSize])

            self.records = utilities.flatten(self.records)
        else:
            self.records = None
Exemplo n.º 2
0
    def decode(self, packet):
        ''' Decode a register request packet

        :param packet: The packet to decode
        '''

        #############################################
        # Calculate CRC after removing stx/etx words
        #############################################
        data = packet[2:-3]
        packetCRC = packet[-2:]
        if (utilities.checkCRC(data, packetCRC) != True):
            raise CRCException

        ############################
        # Packet Header Information
        ############################
        self.dest, self.src, self.cmd, self.sts, self.transaction_id = struct.unpack(
            '>BBBBH', data[0:6])
        self.function, self.size = struct.unpack('>BB', packet[6:8])
        data = data[8:]

        ###################################################
        # Packet Address Information
        # Note: Use Little Endian format if using 2 bytes
        ###################################################
        self.Address.fileNumber = struct.unpack('>B', data[0])
        data = data[1:]
        if (self.Address.fileNumber == '\xFF'):
            self.Address.fileNumber = struct.unpack('<H', data[0:2])
            data = data[2:]

        self.Address.fileType = struct.unpack('>B', data[0])
        data = data[1:]

        self.Address.eleNumber = struct.unpack('>B', data[0])
        data = data[1:]
        if (self.Address.eleNumber == '\xFF'):
            self.Address.eleNumber = struct.unpack('<H', packet[0:2])
            data = data[2:]

        self.Address.subElement = struct.unpack('>B', data[0])
        data = data[1:]
        if (self.Address.subElement == '\xFF'):
            self.Address.subElement = struct.unpack('<H', packet[0:2])
Exemplo n.º 3
0
    def decode(self, packet):
        """ Decode a register request packet

        :param packet: The packet to decode
        """

        #############################################
        # Calculate CRC after removing stx/etx words
        #############################################
        data = packet[2:-3]
        packetCRC = packet[-2:]
        if utilities.checkCRC(data, packetCRC) != True:
            raise CRCException

        ############################
        # Packet Header Information
        ############################
        self.dest, self.src, self.cmd, self.sts, self.transaction_id = struct.unpack(">BBBBH", data[0:6])
        self.function, self.size = struct.unpack(">BB", packet[6:8])
        data = data[8:]

        ###################################################
        # Packet Address Information
        # Note: Use Little Endian format if using 2 bytes
        ###################################################
        self.Address.fileNumber = struct.unpack(">B", data[0])
        data = data[1:]
        if self.Address.fileNumber == "\xFF":
            self.Address.fileNumber = struct.unpack("<H", data[0:2])
            data = data[2:]

        self.Address.fileType = struct.unpack(">B", data[0])
        data = data[1:]

        self.Address.eleNumber = struct.unpack(">B", data[0])
        data = data[1:]
        if self.Address.eleNumber == "\xFF":
            self.Address.eleNumber = struct.unpack("<H", packet[0:2])
            data = data[2:]

        self.Address.subElement = struct.unpack(">B", data[0])
        data = data[1:]
        if self.Address.subElement == "\xFF":
            self.Address.subElement = struct.unpack("<H", packet[0:2])
Exemplo n.º 4
0
    def decode(self, packet):
        ''' Decodes a the response

        :param packet: The packet data to decode
        '''
        count, self.records = 1, []

        self.frame = packet
        ########################################################
        # Do not include DLE STX and DLE ETX CRC in calcualtion
        ########################################################
        data = packet[2:-4]

        #############################################
        # Calculate CRC after removing escaped DLE's
        #############################################
        crc, = struct.unpack('>H', packet[-2:])
        if (utilities.checkCRC(data, crc) != True):
            raise CRCException("Error in CRC : %d" % crc)

        ############################
        # Packet Header Information
        ############################
        self.dest, self.src, self.command, self.sts, self.transaction_id = struct.unpack(
            '>BBBBH', data[0:6])
        data = data[6:]

        #####################################
        # Packet data Information
        # Use Little Endian format for data
        #####################################
        self.records = ()
        if len(data) > 0:
            if (self.Address.subElement > 0):
                elementSize = SUBELEMENT_SIZE[self.Address.fileType]
                formatStr = '<' + SUBELEMENT_STRUCT[self.Address.fileType]
            else:
                elementSize = ELEMENT_SIZE[self.Address.fileType]
                formatStr = '<' + ELEMENT_STRUCT[self.Address.fileType]

            for i in range(0, len(data), elementSize):
                if (self.Address.bitNumber != None):
                    register, = struct.unpack(formatStr,
                                              data[i:i + elementSize])
                    if (register & 2**self.Address.bitNumber):
                        self.records += (1, )
                    else:
                        self.records += (0, )
                else:
                    if (self.Address.fileType == 0x8D):
                        record, = struct.unpack(formatStr,
                                                data[i:i + elementSize])
                        size, = struct.unpack('<h', record[0:2])
                        newRecord = ""
                        for i in range(2, elementSize, 2):
                            newRecord += record[i + 1] + record[i]
                        self.records += (newRecord[0:size], )
                    else:
                        self.records += struct.unpack(formatStr,
                                                      data[i:i + elementSize])

            self.records = utilities.flatten(self.records)
        else:
            self.records = None