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