48 enum class FilterMode : uint8_t
57 uint32_t start_id_mask;
58 uint32_t end_id_match;
73 uint32_t start_id_mask = 0, uint32_t end_id_match = UINT32_MAX)
75 ASSERT(type < Type::TYPE_NUM);
77 auto node =
new (std::align_val_t(LIBXR_CACHE_LINE_SIZE))
79 subscriber_list_[
static_cast<uint8_t
>(type)].Add(*node);
87 virtual ErrorCode
AddMessage(
const ClassicPack &pack) = 0;
90 void OnMessage(
const ClassicPack &pack,
bool in_isr)
92 ASSERT(pack.type < Type::TYPE_NUM);
93 subscriber_list_[
static_cast<uint8_t
>(pack.type)].Foreach<Filter>(
98 case FilterMode::ID_MASK:
99 if ((pack.id & node.start_id_mask) == node.end_id_match)
101 node.cb.
Run(in_isr, pack);
104 case FilterMode::ID_RANGE:
105 if (pack.id >= node.start_id_mask && pack.id <= node.end_id_match)
107 node.cb.
Run(in_isr, pack);
112 return ErrorCode::OK;
117 LockFreeList subscriber_list_[
static_cast<uint8_t
>(Type::TYPE_NUM)];
149 using CAN::FilterMode;
150 using CAN::OnMessage;
157 uint32_t start_id_mask;
158 uint32_t end_id_mask;
173 uint32_t start_id_mask = 0, uint32_t end_id_mask = UINT32_MAX)
175 ASSERT(type < Type::TYPE_NUM);
176 auto node =
new (std::align_val_t(LIBXR_CACHE_LINE_SIZE))
178 subscriber_list_fd_[
static_cast<uint8_t
>(type)].Add(*node);
189 void OnMessage(
const FDPack &pack,
bool in_isr)
191 ASSERT(pack.type < Type::TYPE_NUM);
192 subscriber_list_fd_[
static_cast<uint8_t
>(pack.type)].Foreach<Filter>(
195 if (pack.id >= node.start_id_mask && pack.id <= node.end_id_mask)
197 node.cb.
Run(in_isr, pack);
200 return ErrorCode::OK;
205 LockFreeList subscriber_list_fd_[
static_cast<uint8_t
>(Type::TYPE_NUM)];
CAN通信接口,定义标准CAN通信结构,支持不同类型的消息 (CAN communication interface that defines a standard CAN structure supp...
void Register(Callback cb, Type type, FilterMode mode=FilterMode::ID_RANGE, uint32_t start_id_mask=0, uint32_t end_id_match=UINT32_MAX)
注册回调函数 Registers a callback function
Type
CAN 消息类型 (Enumeration of CAN message types).
@ EXTENDED
扩展 CAN 消息 (Extended CAN message).
@ REMOTE_EXTENDED
远程扩展 CAN 消息 (Remote extended CAN message).
@ STANDARD
标准 CAN 消息 (Standard CAN message).
@ REMOTE_STANDARD
远程标准 CAN 消息 (Remote standard CAN message).
virtual ErrorCode AddMessage(const ClassicPack &pack)=0
添加 CAN 消息到系统 (Adds a CAN message to the system).
struct __attribute__((packed))
经典 CAN 消息结构 (Structure representing a classic CAN message).
CAN()
构造 CAN 对象,可指定主题名称和通信域 (Constructs a CAN object with an optional topic name and domain).
提供一个通用的回调包装,支持动态参数传递。 Provides a generic callback wrapper, supporting dynamic argument passing.
void Run(bool in_isr, PassArgs &&...args) const
执行回调函数,并传递参数。 Executes the callback function, passing the arguments.
FDCAN 通信接口,扩展 CAN 功能,支持灵活数据速率(FD)CAN 消息 (FDCAN communication interface that extends CAN functionality...
struct __attribute__((packed))
FD CAN 消息结构 (Structure representing an FD CAN message).
FDCAN()
构造 FDCAN 对象,可指定主题名称和通信域 (Constructs an FDCAN object with optional topic names and domain).
void Register(CallbackFD cb, Type type, FilterMode mode=FilterMode::ID_RANGE, uint32_t start_id_mask=0, uint32_t end_id_mask=UINT32_MAX)
注册回调函数 Registers a callback function
virtual ErrorCode AddMessage(const FDPack &pack)=0
添加 FD CAN 消息到系统 (Adds an FD CAN message to the system).
数据节点模板,继承自 BaseNode,用于存储具体数据类型。 Template data node that inherits from BaseNode to store specific data...
链表实现,用于存储和管理数据节点。 A linked list implementation for storing and managing data nodes.