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