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