Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
736 olof 1
###########################################################
2
#
3
# This class represents a can packet which should be
4
# identifiable by its type and contents
5
#
6
###########################################################
752 olof 7
import logging as log
736 olof 8
 
9
class CanPkt:
738 olof 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):
746 olof 31
        strpkt = 'PKT ' + '%08X' % self.nodeId
738 olof 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:
746 olof 42
            bytestrings = bytestrings + ' %02x' % byte
738 olof 43
        return (strpkt + bytestrings)
44
 
45
    @staticmethod
46
    def stringToCanPkt(self, str):
47
        """ Converts can message string to CanPkt class """
752 olof 48
        if len(str) > 40:
49
            str = str[:40]
50
            log.debug('WARNING: Oversized string packet truncated to: ' + str)
51
 
738 olof 52
        strbyteslist = str.split(' ')
53
        nodeid = int('0x'+strbyteslist[1], 16)
746 olof 54
        intvalues = [int(val, 16) for val in strbyteslist[2:]]
738 olof 55
        extended = (intvalues[0] == 1)
56
        remote = (intvalues[1] == 1)
57
        pkt = CanPkt(nodeid, intvalues[2:], extended, remote)
58
        return pkt
59