xref: /xnu-10002.81.5/tools/lldbmacros/usertaskdebugging/rsprotocol.py (revision 5e3eaea39dcf651e66cb99ba7d70e32cc4a99587)
1from __future__ import absolute_import
2
3from builtins import object
4
5import logging
6
7
8class Message(object):
9    """represents a message of Remote serial protocol"""
10    def __init__(self, data):
11        super(Message, self).__init__()
12        self.data = data
13
14    def __str__(self):
15        return "Message: %s" % (self.data)
16
17    def getData(self):
18        #TODO need to parse data and unescape
19        return self.data
20
21    def getRSPByteData(self):
22        retval = ''.join(['$',self.data,'#'])
23        checksum = 0
24        for i in self.data:
25            checksum += ord(i)
26        checksum = checksum % 0x100
27        checksum_str = "{:02x}".format(checksum)
28        retval += checksum_str
29        return retval
30
31    @classmethod
32    def fromRSPByteData(cls, bytedata):
33        data_begin = 0
34        data_end = 0
35        try:
36            data_begin = bytedata.index('$')
37            data_end = bytedata.index('#')
38        except ValueError as e:
39            logging.error('Invalid bytedata considered as message %s' % bytedata)
40            return None
41
42        #validate the data
43        if data_begin + 1 >= data_end:
44            logging.debug("empty message %s"%bytedata)
45            data_begin -= 1
46
47        data_begin += 1
48        logging.debug("Creating message from data %s" % bytedata[data_begin:data_end])
49        ret_obj = cls(bytedata[data_begin:data_end])
50        return ret_obj
51
52class ProtocolAcknowledgement(Message):
53    """Ack Messages"""
54    def __init__(self, ack_str):
55        super(ProtocolAcknowledgement, self).__init__(ack_str)
56        self.data = ack_str
57
58    def getRSPByteData(self):
59        return self.data
60
61
62OKMessage = Message('OK')
63
64AckMessage = ProtocolAcknowledgement('+')
65NAckMessage = ProtocolAcknowledgement('-')
66UnSupportedMessage = Message('')
67