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