libxr
Embedded C++ framework for bare-metal, RTOS and Linux
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::CONCURRENCY_ALIGNMENT))
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::CONCURRENCY_ALIGNMENT))
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 // FD 帧没有远程帧,订阅表只有 STANDARD 和 EXTENDED 两项。
57 // FD frames have no remote form; the subscriber table holds only STANDARD and EXTENDED.
58 ASSERT(pack.type < Type::REMOTE_STANDARD);
59 subscriber_list_fd_[static_cast<uint8_t>(pack.type)].Foreach<Filter>(
60 [&](Filter& node)
61 {
62 switch (node.mode)
63 {
64 case FilterMode::ID_MASK:
65 if ((pack.id & node.start_id_mask) == node.end_id_mask)
66 {
67 node.cb.Run(in_isr, pack);
68 }
69 break;
70 case FilterMode::ID_RANGE:
71 if (pack.id >= node.start_id_mask && pack.id <= node.end_id_mask)
72 {
73 node.cb.Run(in_isr, pack);
74 }
75 break;
76 }
77
78 return ErrorCode::OK;
79 });
80}
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
FilterMode
CAN 过滤器模式 / CAN filter mode.
Definition can.hpp:188
通用回调包装,支持动态参数传递 / Generic callback wrapper supporting dynamic argument passing
Definition libxr_cb.hpp:143
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 命名空间 / LibXR namespace.
Definition ch32_can.hpp:14
@ OK
操作成功 / Operation successful
constexpr size_t CONCURRENCY_ALIGNMENT
并发结构对齐粒度(用于降低多核伪共享) / Alignment policy used by concurrency-oriented structures
Definition libxr_def.hpp:61
经典 CAN 帧数据结构 / Classic CAN frame structure.
Definition can.hpp:129
Type type
帧类型 / Frame type.
Definition can.hpp:132
经典 CAN 订阅过滤器 / Classic CAN subscription filter.
Definition can.hpp:200
uint32_t start_id_mask
起始 ID 或掩码 / Start ID or mask.
Definition can.hpp:202
uint32_t end_id_mask
结束 ID 或匹配值 / End ID or match value.
Definition can.hpp:203
Callback cb
回调函数 / Callback function.
Definition can.hpp:205
FilterMode mode
过滤模式 / Filter mode.
Definition can.hpp:201
CAN FD 帧数据结构 / CAN FD frame structure.
Definition can.hpp:266
Type type
帧类型 / Frame type.
Definition can.hpp:268
uint32_t id
CAN ID / CAN ID.
Definition can.hpp:267
FDCAN 订阅过滤器 / FDCAN subscription filter.
Definition can.hpp:286
FilterMode mode
过滤模式 / Filter mode.
Definition can.hpp:287
uint32_t start_id_mask
起始 ID 或掩码 / Start ID or mask.
Definition can.hpp:288
CallbackFD cb
回调函数 / Callback function.
Definition can.hpp:291
uint32_t end_id_mask
结束 ID 或匹配值 / End ID or match value.
Definition can.hpp:289