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