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