File: arbitrationid.py

package info (click to toggle)
python-can 1.5.2-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 644 kB
  • ctags: 1,184
  • sloc: python: 4,373; makefile: 14
file content (60 lines) | stat: -rw-r--r-- 1,728 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from can.protocols.j1939.pgn import PGN


class ArbitrationID(object):

    def __init__(self, priority=7, pgn=None, source_address=0):
        """
        :param int priority:
            Between 0 and 7, where 0 is highest priority.

        :param :class:`can.protocols.j1939.PGN`/int pgn:
            The parameter group number.

        :param int source_address:
            Between 0 and 255.
        """
        self.priority = priority
        self.pgn = pgn
        self.source_address = source_address

    @property
    def can_id(self):
        return (self.source_address + (self.pgn.value << 8) + (self.priority << 26))

    @can_id.setter
    def can_id(self, value):
        """
        Int between 0 and (2**29) - 1
        """
        self.priority = (value & 0x1C000000) >> 26
        self.pgn.value = (value & 0x03FFFF00) >> 8
        self.source_address = value & 0x000000FF

    @property
    def destination_address(self):
        if self.pgn.is_destination_specific:
            return self.pgn.pdu_specific
        else:
            return None

    @property
    def pgn(self):
        return self._pgn

    @pgn.setter
    def pgn(self, other):
        if other is None:
            self._pgn = PGN()
        elif not isinstance(other, PGN):
            self._pgn = PGN.from_value(other)
        else:
            self._pgn = other

    def __str__(self):
        if self.destination_address is not None:
            retval = "PRI=%d PGN=%6s DST=0x%.2x SRC=0x%.2x" % (
                self.priority, self.pgn, self.destination_address, self.source_address)
        else:
            retval = "PRI=%d PGN=%6s          SRC=0x%.2x" % (self.priority, self.pgn, self.source_address)
        return retval