Subversion Repositories HomeAutomation

Rev

Rev 752 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. ###########################################################
  2. #
  3. # This class represents a can packet which should be
  4. # identifiable by its type and contents
  5. #
  6. ###########################################################
  7. import logging as log
  8.  
  9. class CanPkt:
  10.    
  11.     STANDARD_ID_MASK = 0x1FF
  12.     EXTENDED_ID_MASK = 0x1FFFFFFF
  13.     DATA_MASK = 0xFF
  14.     DATA_LENGTH = 8
  15.    
  16.     nodeId = 0
  17.     extended = True
  18.     remote = False
  19.     data = []
  20.  
  21.     def __init__( self, id, data, extended = True, remote = False ):
  22.         if extended:
  23.             self.nodeId = id & self.EXTENDED_ID_MASK
  24.         else:
  25.             self.nodeId = id & self.STANDARD_ID_MASK
  26.         self.data = [val & self.DATA_MASK for val in data[:self.DATA_LENGTH]]
  27.         self.extended = extended
  28.         self.remote = remote
  29.  
  30.     def toString(self):
  31.         strpkt = 'PKT ' + '%08X' % self.nodeId
  32.         if self.extended:
  33.             strpkt += ' 1'
  34.         else:
  35.             strpkt += ' 0'
  36.         if self.remote:
  37.             strpkt += ' 1'
  38.         else:
  39.             strpkt += ' 0'
  40.         bytestrings = ''
  41.         for byte in self.data:
  42.             bytestrings = bytestrings + ' %02x' % byte
  43.         return (strpkt + bytestrings)
  44.    
  45.     @staticmethod
  46.     def stringToCanPkt(self, str):
  47.         """ Converts can message string to CanPkt class """
  48.         if len(str) > 40:
  49.             str = str[:40]
  50.             log.debug('WARNING: Oversized string packet truncated to: ' + str)
  51.  
  52.         strbyteslist = str.split(' ')
  53.         nodeid = int('0x'+strbyteslist[1], 16)
  54.         intvalues = [int(val, 16) for val in strbyteslist[2:]]
  55.         extended = (intvalues[0] == 1)
  56.         remote = (intvalues[1] == 1)
  57.         pkt = CanPkt(nodeid, intvalues[2:], extended, remote)
  58.         return pkt
  59.  
  60.