Auto commit at 2025-06-12 16:05:24
This commit is contained in:
parent
50f316a5f2
commit
db9f0d75ca
@ -42,25 +42,13 @@ public:
|
||||
// 设置接收回调
|
||||
void setReceiveCallback(ReceiveCallback callback, void *userData = nullptr);
|
||||
|
||||
// 设置硬件过滤规则
|
||||
bool setFilter(const std::vector<can_filter> &filters);
|
||||
|
||||
// 追加一个过滤器
|
||||
bool addFilter(const can_filter &filter);
|
||||
|
||||
// 追加一组过滤器
|
||||
bool addFilters(const std::vector<can_filter> &filters);
|
||||
|
||||
private:
|
||||
void receiveThreadFunc();
|
||||
bool applyFilters(); // 应用当前filters_
|
||||
|
||||
int sockfd = -1;
|
||||
std::atomic<bool> running{false};
|
||||
std::thread receiveThread;
|
||||
ReceiveCallback callback;
|
||||
void *userData = nullptr;
|
||||
std::vector<can_filter> filters_; // 当前所有过滤器
|
||||
};
|
||||
|
||||
#endif // CAN_DRIVER_H
|
||||
|
||||
@ -60,6 +60,13 @@ bool CANDriver::open(const std::string &interface)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (VCI_ClearBuffer(deviceType, deviceIndex, channelIndex) != 1)
|
||||
{
|
||||
std::cerr << "VCI_ClearBuffer failed" << std::endl;
|
||||
VCI_CloseDevice(deviceType, deviceIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
running = true;
|
||||
receiveThread = std::thread(&CANDriver::receiveThreadFunc, this);
|
||||
return true;
|
||||
@ -74,6 +81,9 @@ void CANDriver::close()
|
||||
if (receiveThread.joinable())
|
||||
receiveThread.join();
|
||||
|
||||
// 先清空缓冲区,防止缓冲区残留数据导致重复接收
|
||||
VCI_ClearBuffer(deviceType, deviceIndex, channelIndex);
|
||||
|
||||
VCI_ResetCAN(deviceType, deviceIndex, channelIndex);
|
||||
VCI_CloseDevice(deviceType, deviceIndex);
|
||||
}
|
||||
@ -106,48 +116,6 @@ void CANDriver::setReceiveCallback(ReceiveCallback callback, void *userData)
|
||||
this->userData = userData;
|
||||
}
|
||||
|
||||
bool CANDriver::setFilter(const std::vector<can_filter> &filters)
|
||||
{
|
||||
if (!running)
|
||||
return false;
|
||||
|
||||
filters_ = filters;
|
||||
return applyFilters();
|
||||
}
|
||||
|
||||
bool CANDriver::addFilter(const can_filter &filter)
|
||||
{
|
||||
filters_.push_back(filter);
|
||||
return applyFilters();
|
||||
}
|
||||
|
||||
bool CANDriver::addFilters(const std::vector<can_filter> &filters)
|
||||
{
|
||||
filters_.insert(filters_.end(), filters.begin(), filters.end());
|
||||
return applyFilters();
|
||||
}
|
||||
|
||||
bool CANDriver::applyFilters()
|
||||
{
|
||||
if (!running)
|
||||
return false;
|
||||
|
||||
if (filters_.empty())
|
||||
{
|
||||
setsockopt(sockfd, SOL_CAN_RAW, CAN_RAW_FILTER, nullptr, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (setsockopt(sockfd, SOL_CAN_RAW, CAN_RAW_FILTER,
|
||||
filters_.data(), filters_.size() * sizeof(can_filter)) < 0)
|
||||
{
|
||||
perror("setsockopt");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CANDriver::receiveThreadFunc()
|
||||
{
|
||||
while (running)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user