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