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