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