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