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);
|
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:
|
private:
|
||||||
void receiveThreadFunc();
|
void receiveThreadFunc();
|
||||||
bool applyFilters(); // 应用当前filters_
|
|
||||||
|
|
||||||
int sockfd = -1;
|
int sockfd = -1;
|
||||||
std::atomic<bool> running{false};
|
std::atomic<bool> running{false};
|
||||||
std::thread receiveThread;
|
std::thread receiveThread;
|
||||||
ReceiveCallback callback;
|
ReceiveCallback callback;
|
||||||
void *userData = nullptr;
|
void *userData = nullptr;
|
||||||
std::vector<can_filter> filters_; // 当前所有过滤器
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CAN_DRIVER_H
|
#endif // CAN_DRIVER_H
|
||||||
|
|||||||
@ -60,6 +60,13 @@ bool CANDriver::open(const std::string &interface)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (VCI_ClearBuffer(deviceType, deviceIndex, channelIndex) != 1)
|
||||||
|
{
|
||||||
|
std::cerr << "VCI_ClearBuffer failed" << std::endl;
|
||||||
|
VCI_CloseDevice(deviceType, deviceIndex);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
running = true;
|
running = true;
|
||||||
receiveThread = std::thread(&CANDriver::receiveThreadFunc, this);
|
receiveThread = std::thread(&CANDriver::receiveThreadFunc, this);
|
||||||
return true;
|
return true;
|
||||||
@ -74,6 +81,9 @@ void CANDriver::close()
|
|||||||
if (receiveThread.joinable())
|
if (receiveThread.joinable())
|
||||||
receiveThread.join();
|
receiveThread.join();
|
||||||
|
|
||||||
|
// 先清空缓冲区,防止缓冲区残留数据导致重复接收
|
||||||
|
VCI_ClearBuffer(deviceType, deviceIndex, channelIndex);
|
||||||
|
|
||||||
VCI_ResetCAN(deviceType, deviceIndex, channelIndex);
|
VCI_ResetCAN(deviceType, deviceIndex, channelIndex);
|
||||||
VCI_CloseDevice(deviceType, deviceIndex);
|
VCI_CloseDevice(deviceType, deviceIndex);
|
||||||
}
|
}
|
||||||
@ -106,48 +116,6 @@ void CANDriver::setReceiveCallback(ReceiveCallback callback, void *userData)
|
|||||||
this->userData = 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()
|
void CANDriver::receiveThreadFunc()
|
||||||
{
|
{
|
||||||
while (running)
|
while (running)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user