libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
can.cpp
1#include "can.hpp"
2
3using namespace LibXR;
4
7
8void CAN::Register(Callback cb, Type type, FilterMode mode, uint32_t start_id_mask,
9 uint32_t end_id_mask)
10{
11 ASSERT(type < Type::TYPE_NUM);
12
13 auto node = new (std::align_val_t(LIBXR_CACHE_LINE_SIZE))
14 LockFreeList::Node<Filter>(Filter{mode, start_id_mask, end_id_mask, type, cb});
15 subscriber_list_[static_cast<uint8_t>(type)].Add(*node);
16}
17
18void CAN::OnMessage(const ClassicPack &pack, bool in_isr)
19{
20 ASSERT(pack.type < Type::TYPE_NUM);
21 subscriber_list_[static_cast<uint8_t>(pack.type)].Foreach<Filter>(
22 [&](Filter &node)
23 {
24 switch (node.mode)
25 {
27 if ((pack.id & node.start_id_mask) == node.end_id_mask)
28 {
29 node.cb.Run(in_isr, pack);
30 }
31 break;
33 if (pack.id >= node.start_id_mask && pack.id <= node.end_id_mask)
34 {
35 node.cb.Run(in_isr, pack);
36 }
37 break;
38 }
39
40 return ErrorCode::OK;
41 });
42}
43
44void FDCAN::Register(CallbackFD cb, Type type, FilterMode mode, uint32_t start_id_mask,
45 uint32_t end_id_mask)
46{
47 ASSERT(type < Type::REMOTE_STANDARD);
48
49 auto node = new (std::align_val_t(LIBXR_CACHE_LINE_SIZE))
50 LockFreeList::Node<Filter>(Filter{mode, start_id_mask, end_id_mask, type, cb});
51 subscriber_list_fd_[static_cast<uint8_t>(type)].Add(*node);
52}
53
54void FDCAN::OnMessage(const FDPack &pack, bool in_isr)
55{
56 ASSERT(pack.type < Type::TYPE_NUM);
57 subscriber_list_fd_[static_cast<uint8_t>(pack.type)].Foreach<Filter>(
58 [&](Filter &node)
59 {
60 switch (node.mode)
61 {
62 case FilterMode::ID_MASK:
63 if ((pack.id & node.start_id_mask) == node.end_id_mask)
64 {
65 node.cb.Run(in_isr, pack);
66 }
67 break;
68 case FilterMode::ID_RANGE:
69 if (pack.id >= node.start_id_mask && pack.id <= node.end_id_mask)
70 {
71 node.cb.Run(in_isr, pack);
72 }
73 break;
74 }
75
76 return ErrorCode::OK;
77 });
78}
Type
CAN 消息类型。CAN frame type.
Definition can.hpp:23
@ REMOTE_STANDARD
标准远程帧。Standard remote frame.
@ TYPE_NUM
类型数量上界。Number of frame types.
void OnMessage(const ClassicPack &pack, bool in_isr)
分发接收到的经典 CAN 帧。 Dispatch a received classic CAN frame.
Definition can.cpp:18
void Register(Callback cb, Type type, FilterMode mode=FilterMode::ID_RANGE, uint32_t start_id_mask=0, uint32_t end_id_mask=UINT32_MAX)
注册经典 CAN 消息回调。 Register classic CAN message callback.
Definition can.cpp:8
LockFreeList subscriber_list_[static_cast< uint8_t >(Type::TYPE_NUM)]
按帧类型划分的订阅者链表数组。Subscriber lists per frame type.
Definition can.hpp:238
FilterMode
CAN 过滤器模式。CAN filter mode.
Definition can.hpp:187
提供一个通用的回调包装,支持动态参数传递。 Provides a generic callback wrapper, supporting dynamic argument passing.
Definition libxr_cb.hpp:124
void Run(bool in_isr, PassArgs &&...args) const
执行回调函数,并传递参数。 Executes the callback function, passing the arguments.
Definition libxr_cb.hpp:210
LockFreeList subscriber_list_fd_[static_cast< uint8_t >(Type::REMOTE_STANDARD)]
按帧类型划分的 FD 订阅者链表数组。FD subscriber lists per frame type.
Definition can.hpp:381
void OnMessage(const FDPack &pack, bool in_isr)
分发接收到的 FD CAN 帧。 Dispatch a received FD CAN frame.
Definition can.cpp:54
void Register(CallbackFD cb, Type type, FilterMode mode=FilterMode::ID_RANGE, uint32_t start_id_mask=0, uint32_t end_id_mask=UINT32_MAX)
注册 FDCAN FD 帧回调。 Register FDCAN FD frame callback.
Definition can.cpp:44
数据节点模板,继承自 BaseNode,用于存储具体数据类型。 Template data node that inherits from BaseNode to store specific data...
LibXR 命名空间
经典 CAN 帧数据结构。Classic CAN frame structure.
Definition can.hpp:129
Type type
帧类型。Frame type.
Definition can.hpp:131
uint32_t id
CAN ID(11/29 bit 或 ErrorID)。CAN ID (11/29 bits or ErrorID).
Definition can.hpp:130
经典 CAN 订阅过滤器。Classic CAN subscription filter.
Definition can.hpp:199
uint32_t start_id_mask
起始 ID 或掩码。Start ID or mask.
Definition can.hpp:201
uint32_t end_id_mask
结束 ID 或匹配值。End ID or match value.
Definition can.hpp:202
Callback cb
回调函数。Callback function.
Definition can.hpp:204
FilterMode mode
过滤模式。Filter mode.
Definition can.hpp:200
CAN FD 帧数据结构。CAN FD frame structure.
Definition can.hpp:265
Type type
帧类型。Frame type.
Definition can.hpp:267
uint32_t id
CAN ID。CAN ID.
Definition can.hpp:266
FDCAN 订阅过滤器。FDCAN subscription filter.
Definition can.hpp:285
FilterMode mode
过滤模式。Filter mode.
Definition can.hpp:286
uint32_t start_id_mask
起始 ID 或掩码。Start ID or mask.
Definition can.hpp:287
CallbackFD cb
回调函数。Callback function.
Definition can.hpp:290
uint32_t end_id_mask
结束 ID 或匹配值。End ID or match value.
Definition can.hpp:288