Пример #1
0
    def wait_for_frame(self, operating_mode):
        """
        Reads the next packet. Starts to read when finds the start delimiter.
        The last byte read is the checksum.

        If there is something in the COM buffer after the
        start delimiter, this method discards it.

        If the method can't read a complete and correct packet,
        it will return `None`.

        Args:
            operating_mode (:class:`.OperatingMode`): The operating mode in
                which the packet should be read.

        Returns:
            Bytearray: The read packet as bytearray if a packet is read, `None`
                otherwise.
        """
        self._is_reading = True

        try:
            xbee_packet = bytearray(1)
            # Add packet delimiter.
            xbee_packet[0] = self.read_byte()
            while xbee_packet[0] != SpecialByte.HEADER_BYTE.value:
                # May be set to false by self.quit_reading() as a stop reading
                # request.
                if not self._is_reading:
                    return None
                xbee_packet[0] = self.read_byte()

            # Add packet length.
            packet_length_byte = bytearray()
            for _ in range(2):
                packet_length_byte += self.__read_next_byte(operating_mode)
            xbee_packet += packet_length_byte
            # Length needs to be un-escaped in API escaped mode to obtain its
            # integer equivalent.
            if operating_mode == OperatingMode.ESCAPED_API_MODE:
                length = utils.length_to_int(
                    XBeeAPIPacket.unescape_data(packet_length_byte))
            else:
                length = utils.length_to_int(packet_length_byte)

            # Add packet payload.
            for _ in range(length):
                xbee_packet += self.__read_next_byte(operating_mode)

            # Add packet checksum.
            xbee_packet += self.__read_next_byte(operating_mode)

            # Return the packet unescaped.
            if operating_mode == OperatingMode.ESCAPED_API_MODE:
                return XBeeAPIPacket.unescape_data(xbee_packet)

            return xbee_packet
        except digi.xbee.exception.TimeoutException:
            return None
Пример #2
0
    def __try_read_packet(self, operating_mode=OperatingMode.API_MODE):
        """
        Reads the next packet. Starts to read when finds the start delimiter.
        The last byte read is the checksum.

        If there is something in the COM buffer after the
        start delimiter, this method discards it.

        If the method can't read a complete and correct packet,
        it will return ``None``.

        Args:
            operating_mode (:class:`.OperatingMode`): the operating mode in which the packet should be read.

        Returns:
            Bytearray: the read packet as bytearray if a packet is read, ``None`` otherwise.
        """
        try:
            xbee_packet = bytearray(1)
            # Add packet delimiter.
            xbee_packet[0] = self.__serial_port.read_byte()
            while xbee_packet[0] != SpecialByte.HEADER_BYTE.value:
                xbee_packet[0] = self.__serial_port.read_byte()

            # Add packet length.
            packet_length_byte = bytearray()
            for _ in range(0, 2):
                packet_length_byte += self.__read_next_byte(operating_mode)
            xbee_packet += packet_length_byte
            # Length needs to be un-escaped in API escaped mode to obtain its integer equivalent.
            if operating_mode == OperatingMode.ESCAPED_API_MODE:
                length = utils.length_to_int(
                    XBeeAPIPacket.unescape_data(packet_length_byte))
            else:
                length = utils.length_to_int(packet_length_byte)

            # Add packet payload.
            for _ in range(0, length):
                xbee_packet += self.__read_next_byte(operating_mode)

            # Add packet checksum.
            for _ in range(0, 1):
                xbee_packet += self.__read_next_byte(operating_mode)

            # Return the packet unescaped.
            if operating_mode == OperatingMode.ESCAPED_API_MODE:
                return XBeeAPIPacket.unescape_data(xbee_packet)
            else:
                return xbee_packet
        except TimeoutException:
            return None