Source code for magician.message
[docs]
class Message:
def __init__(self, b=None):
if b is None:
self.header = bytes([0xAA, 0xAA])
self.len = 0x00
self.ctrl = 0x00
self.params = bytes([])
self.checksum = None
else:
self.header = b[0:2]
self.len = b[2]
self.id = b[3]
self.ctrl = b[4]
self.params = b[5:-1]
self.checksum = b[-1:][0]
def __repr__(self):
return "Message()"
def __str__(self):
self.refresh()
hexHeader = " ".join("%02x" % b for b in self.header)
hexParams = " ".join("%02x" % b for b in self.params)
ret = "%s:%d:%d:%d:%s:%s" % (hexHeader, self.len, self.id, self.ctrl, hexParams, self.checksum)
return ret.upper()
[docs]
def refresh(self):
if self.checksum is None:
self.checksum = self.id + self.ctrl
for i in range(len(self.params)):
if isinstance(self.params[i], int):
self.checksum += self.params[i]
else:
self.checksum += int(self.params[i].encode('hex'), 16)
self.checksum = self.checksum % 256
self.checksum = 2 ** 8 - self.checksum
self.checksum = self.checksum % 256
self.len = 0x02 + len(self.params)
[docs]
def bytes(self):
self.refresh()
if len(self.params) > 0:
command = bytearray([0xAA, 0xAA, self.len, self.id, self.ctrl])
command.extend(self.params)
command.append(self.checksum)
else:
command = bytes([0xAA, 0xAA, self.len, self.id, self.ctrl, self.checksum])
return command