7 Represents an API frame for communicating with an XBee
13 Represents a frame of data to be sent to or which was received
21 ESCAPE_BYTES = (START_BYTE, ESCAPE_BYTE, XON_BYTE, XOFF_BYTE)
31 checksum: None -> single checksum byte
33 checksum adds all bytes of the binary, unescaped data in the
34 frame, saves the last byte of the result, and subtracts it from
35 0xFF. The final result is the checksum
40 for byte
in self.
data:
47 return chr(0xFF - total)
51 verify: 1 byte -> boolean
53 verify checksums the frame, adds the expected checksum, and
54 determines whether the result is correct. The result should
60 for byte
in self.
data:
74 len_data: None -> (MSB, LSB) 16-bit integer length, two bytes
76 len_bytes counts the number of bytes to be sent and encodes the
77 data length in two bytes, big-endian (most significant first).
79 count = len(self.
data)
80 return struct.pack(
"> h", count)
84 output: None -> valid API frame (binary data)
86 output will produce a valid API frame for transmission to an
96 self.
raw_data = APIFrame.escape(data)
102 return APIFrame.START_BYTE + data
107 escape: byte string -> byte string
109 When a 'special' byte is encountered in the given data string,
110 it is preceded by an escape byte and XORed with 0x20.
115 if byte
in APIFrame.ESCAPE_BYTES:
116 escaped_data += APIFrame.ESCAPE_BYTE
117 escaped_data += chr(0x20 ^ ord(byte))
127 Adds the given raw byte to this APIFrame. If this APIFrame is marked
128 as escaped and this byte is an escape byte, the next byte in a call
129 to fill() will be unescaped.
133 byte = chr(ord(byte) ^ 0x20)
135 elif self.
escaped and byte == APIFrame.ESCAPE_BYTE:
147 data_len = struct.unpack(
"> h", raw_len)[0]
149 remaining += data_len
154 return remaining - len(self.
raw_data)
160 Given a valid API frame, parse extracts the data contained
161 inside it and verifies it against its checksum
164 ValueError(
"parse() may only be called on a frame containing at least 3 bytes of raw data (see fill())")
170 data_len = struct.unpack(
"> h", raw_len)[0]
173 data = self.
raw_data[3:3 + data_len]
178 if not self.
verify(chksum):
179 raise ValueError(
"Invalid checksum")