def _receive_packet(self, quiet=False): if self.software_only: return True header = 0 while True: ch = self.ser.read(1) if len(ch) < 1: if not quiet: log.error("receive packet: response timeout") return (PACKET_ACK_TIMEOUT, "") if (ord(ch) == 0xFF): header += 1 else: header = 0 if header == 2: break ack = PACKET_ACK_OK raw_packet = self.ser.read(RAW_PACKET_SIZE) if len(raw_packet) != RAW_PACKET_SIZE: if not quiet: log.error("receive packet: timeout") ack = PACKET_ACK_TIMEOUT if ack == PACKET_ACK_OK: packet = pack7.unpack_7bit(raw_packet) if len(packet) != PACKET_SIZE: ack = PACKET_ACK_INVALID if not quiet: log.error("receive_packet: Unpacked length incorrect") if ack == PACKET_ACK_OK: received_crc = unpack("<H", packet[6:8])[0] packet = packet[0:6] crc = 0 for ch in packet: crc = crc16_update(crc, ord(ch)) if received_crc != crc: if not quiet: log.error("receive_packet: CRC fail") ack = PACKET_ACK_CRC_FAIL # Send the response back to the dispenser if self.ser.write(chr(ack)) != 1: if not quiet: log.error("receive_packet: Send ack timeout!") ack = PACKET_ACK_TIMEOUT if ack == PACKET_ACK_OK: return (ack, packet) else: return (ack, "")