// 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 #include 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