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
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])
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])
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