From 840c024aeb8d0b5083d4243056cbaa6e70bac8f0 Mon Sep 17 00:00:00 2001 From: Ruben Moral Date: Fri, 1 Dec 2017 12:20:36 +0100 Subject: [PATCH] fix #7: fix a bug when working in API escaped mode Signed-off-by: Ruben Moral --- digi/xbee/packets/base.py | 6 +++--- digi/xbee/reader.py | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/digi/xbee/packets/base.py b/digi/xbee/packets/base.py index 9a7e17e..71f3f31 100644 --- a/digi/xbee/packets/base.py +++ b/digi/xbee/packets/base.py @@ -88,7 +88,7 @@ class XBeePacket: __metaclass__ = ABCMeta __ESCAPE_BYTES = [i.value for i in SpecialByte] __ESCAPE_FACTOR = 0x20 - __ESCAPE_BYTE = SpecialByte.ESCAPE_BYTE.code + ESCAPE_BYTE = SpecialByte.ESCAPE_BYTE.code def __init__(self): """ @@ -242,10 +242,10 @@ def _unescape_data(data): new_data = bytearray(0) des_escape = False for byte in data: - if byte == XBeePacket.__ESCAPE_BYTE: + if byte == XBeePacket.ESCAPE_BYTE: des_escape = True else: - new_data += chr(byte ^ 0x20 if des_escape else byte) + new_data.append(byte ^ 0x20 if des_escape else byte) des_escape = False return new_data diff --git a/digi/xbee/reader.py b/digi/xbee/reader.py index c56f315..2f71fe4 100644 --- a/digi/xbee/reader.py +++ b/digi/xbee/reader.py @@ -22,10 +22,12 @@ from digi.xbee.models.address import XBee64BitAddress, XBee16BitAddress from digi.xbee.models.message import XBeeMessage, ExplicitXBeeMessage, IPMessage, \ SMSMessage +from digi.xbee.models.mode import OperatingMode from digi.xbee.models.options import ReceiveOptions from digi.xbee.models.protocol import XBeeProtocol from digi.xbee.packets import factory from digi.xbee.packets.aft import ApiFrameType +from digi.xbee.packets.base import XBeePacket from digi.xbee.packets.common import ReceivePacket from digi.xbee.packets.raw import RX64Packet, RX16Packet from digi.xbee.util import utils @@ -294,7 +296,7 @@ def run(self): self.__stop = False while not self.__stop: # Try to read a packet. - raw_packet = self.__try_read_packet() + raw_packet = self.__try_read_packet(self.__xbee_device.operating_mode) if raw_packet is not None: # If the current protocol is 802.15.4, the packet may have to be discarded. @@ -623,7 +625,7 @@ def __execute_user_callbacks(self, xbee_packet, remote=None): sender=str(xbee_packet.phone_number), more_data=xbee_packet.data)) - def __try_read_packet(self): + 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. @@ -639,13 +641,22 @@ def __try_read_packet(self): """ 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() packet_length = self.__serial_port.read_bytes(2) + # Add packet length. xbee_packet += packet_length length = utils.length_to_int(packet_length) - xbee_packet += self.__serial_port.read_bytes(length) + # Add packet payload. + for _ in range(0, length): + read_byte = self.__serial_port.read_byte() + xbee_packet.append(read_byte) + # Read escaped bytes in API escaped mode. + if operating_mode == OperatingMode.ESCAPED_API_MODE and read_byte == XBeePacket.ESCAPE_BYTE: + xbee_packet.append(self.__serial_port.read_byte()) + # Add packet checksum. xbee_packet.append(self.__serial_port.read_byte()) return xbee_packet except TimeoutException: