56 lines
1.1 KiB
Python
56 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from enum import Enum
|
|
from typing import Optional
|
|
|
|
from .protocol import BusMessageFlags
|
|
|
|
|
|
class MessageDirection(str, Enum):
|
|
RX = "rx"
|
|
TX = "tx"
|
|
UNKNOWN = "unknown"
|
|
|
|
|
|
@dataclass
|
|
class CanMessage:
|
|
can_id: int
|
|
data: bytes = b""
|
|
extended: bool = False
|
|
rtr: bool = False
|
|
fd: bool = False
|
|
brs: bool = False
|
|
timestamp_us: int = 0
|
|
|
|
@property
|
|
def dlc(self) -> int:
|
|
return len(self.data)
|
|
|
|
@classmethod
|
|
def from_bus_payload(
|
|
cls,
|
|
*,
|
|
flags: BusMessageFlags,
|
|
timestamp_us: int,
|
|
can_id: int,
|
|
dlc: int,
|
|
data: bytes,
|
|
) -> "CanMessage":
|
|
extended = bool(flags & BusMessageFlags.EXTID)
|
|
rtr = bool(flags & BusMessageFlags.RTR)
|
|
fd = bool(flags & BusMessageFlags.FDF)
|
|
brs = bool(flags & BusMessageFlags.BRS)
|
|
|
|
payload = data[:dlc]
|
|
|
|
return cls(
|
|
can_id=can_id,
|
|
data=payload,
|
|
extended=extended,
|
|
rtr=rtr,
|
|
fd=fd,
|
|
brs=brs,
|
|
timestamp_us=timestamp_us,
|
|
)
|