55 lines
1.7 KiB
C++
55 lines
1.7 KiB
C++
// can_comm.h - USBCANFD CAN/CANFD 收发封装
|
|
//
|
|
// 整合自 vision-anti-pinch_bak/main.cpp 的 CAN 模块, 提供:
|
|
// can_start() - 打开设备, 初始化并启动双通道接收线程
|
|
// can_stop() - 停止接收并关闭设备
|
|
// can_send() - 发送一帧 CAN (8 字节)
|
|
// canfd_send() - 发送一帧 CANFD (64 字节)
|
|
//
|
|
// 依赖 zcan.h (include/) 和 libusbcanfd.so + libusb-1.0.so (lib/)
|
|
|
|
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
|
|
namespace CanComm {
|
|
|
|
// 初始化并启动 CAN 收发(双通道, 仲裁域 500kbps / 数据域 2000kbps)。
|
|
// 返回 true 成功; false 失败(主流程可继续仅取图)。
|
|
bool can_start();
|
|
|
|
// 停止 CAN 接收线程并关闭设备。
|
|
void can_stop();
|
|
|
|
// 注册报文解析回调。收到每帧 CAN/CANFD 数据帧时调用。
|
|
// time: 时间戳(us)
|
|
// msg_id: CAN-ID
|
|
// data: 数据指针(回调内有效, 不要保存)
|
|
// len: 数据长度
|
|
// 传 nullptr 取消注册。
|
|
using MsgCallback = void (*)(int64_t time, uint32_t msg_id, const uint8_t *data, uint32_t len);
|
|
void set_msg_callback(MsgCallback cb);
|
|
|
|
// 发送一帧 CAN2.0 数据帧(8 字节)。
|
|
// chn_idx: 通道号 0/1
|
|
// id: CAN-ID
|
|
// data: 8 字节数据(不足补 0, 超出截断)
|
|
// 返回实际发送帧数(0 失败)。
|
|
uint32_t can_send(int chn_idx, uint32_t id, const uint8_t data[8]);
|
|
|
|
// 发送一帧 CANFD 数据帧(64 字节, 扩展帧+加速)。
|
|
// chn_idx: 通道号 0/1
|
|
// id: CAN-ID
|
|
// data: 64 字节数据(不足补 0, 超出截断)
|
|
// 返回实际发送帧数(0 失败)。
|
|
uint32_t canfd_send(int chn_idx, uint32_t id, const uint8_t data[64]);
|
|
|
|
// 是否已打开并运行
|
|
bool is_open();
|
|
|
|
// 累计接收帧数(线程安全)
|
|
int receive_count();
|
|
|
|
} // namespace CanComm
|