Skip to content

Commit 840c024

Browse files
committed
fix #7: fix a bug when working in API escaped mode
Signed-off-by: Ruben Moral <ruben.moral@digi.com>
1 parent f420d87 commit 840c024

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

digi/xbee/packets/base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class XBeePacket:
8888
__metaclass__ = ABCMeta
8989
__ESCAPE_BYTES = [i.value for i in SpecialByte]
9090
__ESCAPE_FACTOR = 0x20
91-
__ESCAPE_BYTE = SpecialByte.ESCAPE_BYTE.code
91+
ESCAPE_BYTE = SpecialByte.ESCAPE_BYTE.code
9292

9393
def __init__(self):
9494
"""
@@ -242,10 +242,10 @@ def _unescape_data(data):
242242
new_data = bytearray(0)
243243
des_escape = False
244244
for byte in data:
245-
if byte == XBeePacket.__ESCAPE_BYTE:
245+
if byte == XBeePacket.ESCAPE_BYTE:
246246
des_escape = True
247247
else:
248-
new_data += chr(byte ^ 0x20 if des_escape else byte)
248+
new_data.append(byte ^ 0x20 if des_escape else byte)
249249
des_escape = False
250250
return new_data
251251

digi/xbee/reader.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
from digi.xbee.models.address import XBee64BitAddress, XBee16BitAddress
2323
from digi.xbee.models.message import XBeeMessage, ExplicitXBeeMessage, IPMessage, \
2424
SMSMessage
25+
from digi.xbee.models.mode import OperatingMode
2526
from digi.xbee.models.options import ReceiveOptions
2627
from digi.xbee.models.protocol import XBeeProtocol
2728
from digi.xbee.packets import factory
2829
from digi.xbee.packets.aft import ApiFrameType
30+
from digi.xbee.packets.base import XBeePacket
2931
from digi.xbee.packets.common import ReceivePacket
3032
from digi.xbee.packets.raw import RX64Packet, RX16Packet
3133
from digi.xbee.util import utils
@@ -294,7 +296,7 @@ def run(self):
294296
self.__stop = False
295297
while not self.__stop:
296298
# Try to read a packet.
297-
raw_packet = self.__try_read_packet()
299+
raw_packet = self.__try_read_packet(self.__xbee_device.operating_mode)
298300

299301
if raw_packet is not None:
300302
# 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):
623625
sender=str(xbee_packet.phone_number),
624626
more_data=xbee_packet.data))
625627

626-
def __try_read_packet(self):
628+
def __try_read_packet(self, operating_mode=OperatingMode.API_MODE):
627629
"""
628630
Reads the next packet. Starts to read when finds the start delimiter.
629631
The last byte read is the checksum.
@@ -639,13 +641,22 @@ def __try_read_packet(self):
639641
"""
640642
try:
641643
xbee_packet = bytearray(1)
644+
# Add packet delimiter.
642645
xbee_packet[0] = self.__serial_port.read_byte()
643646
while xbee_packet[0] != SpecialByte.HEADER_BYTE.value:
644647
xbee_packet[0] = self.__serial_port.read_byte()
645648
packet_length = self.__serial_port.read_bytes(2)
649+
# Add packet length.
646650
xbee_packet += packet_length
647651
length = utils.length_to_int(packet_length)
648-
xbee_packet += self.__serial_port.read_bytes(length)
652+
# Add packet payload.
653+
for _ in range(0, length):
654+
read_byte = self.__serial_port.read_byte()
655+
xbee_packet.append(read_byte)
656+
# Read escaped bytes in API escaped mode.
657+
if operating_mode == OperatingMode.ESCAPED_API_MODE and read_byte == XBeePacket.ESCAPE_BYTE:
658+
xbee_packet.append(self.__serial_port.read_byte())
659+
# Add packet checksum.
649660
xbee_packet.append(self.__serial_port.read_byte())
650661
return xbee_packet
651662
except TimeoutException:

0 commit comments

Comments
 (0)