|
|
@ -124,7 +124,7 @@ bool SocketCan::initialize(string canName, int bitrate, vector<can_filter_t> fil |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
setCanBitrate(canName, bitrate); |
|
|
|
// setCanBitrate(canName, bitrate);
|
|
|
|
|
|
|
|
m_canfd = socket(PF_CAN, SOCK_RAW, CAN_RAW); |
|
|
|
if (m_canfd < 0) { |
|
|
@ -136,6 +136,12 @@ bool SocketCan::initialize(string canName, int bitrate, vector<can_filter_t> fil |
|
|
|
strcpy(ifr.ifr_name, canName.c_str()); |
|
|
|
ioctl(m_canfd, SIOCGIFINDEX, &ifr); |
|
|
|
|
|
|
|
const int bufsize = 0; |
|
|
|
if (setsockopt(m_canfd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)) != 0) { |
|
|
|
logger->error("setsockopt SO_SNDBUF fail,{}", strerror(errno)); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
struct sockaddr_can addr = {0}; |
|
|
|
addr.can_family = AF_CAN; |
|
|
|
addr.can_ifindex = ifr.ifr_ifindex; |
|
|
@ -181,37 +187,50 @@ int SocketCan::sendFrame(shared_ptr<CanFrame> frame) { |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
#if 0
|
|
|
|
struct canfd_frame { |
|
|
|
canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ |
|
|
|
__u8 len; /* frame payload length in byte */ |
|
|
|
__u8 flags; /* additional flags for CAN FD */ |
|
|
|
__u8 __res0; /* reserved / padding */ |
|
|
|
__u8 __res1; /* reserved / padding */ |
|
|
|
__u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); |
|
|
|
}; |
|
|
|
#endif
|
|
|
|
|
|
|
|
void SocketCan::startListen() { |
|
|
|
m_thread.reset( //
|
|
|
|
new Thread(fmt::format("SocketCan_{}_ListenThread", m_canName), //
|
|
|
|
[this]() { |
|
|
|
ThisThread thisThread; |
|
|
|
fd_set readFileDescriptors; |
|
|
|
|
|
|
|
timeval waitTime; |
|
|
|
waitTime.tv_sec = 3; |
|
|
|
waitTime.tv_usec = 0; |
|
|
|
|
|
|
|
fd_set readfds, readFileDescriptors; |
|
|
|
FD_ZERO(&readFileDescriptors); |
|
|
|
FD_SET(m_canfd, &readFileDescriptors); |
|
|
|
|
|
|
|
while (!thisThread.getExitFlag()) { |
|
|
|
canfd_frame_t canframe; |
|
|
|
canfd_frame_t canframe; |
|
|
|
struct canfd_frame frame; |
|
|
|
|
|
|
|
timeval waitTime; |
|
|
|
waitTime.tv_sec = 3; |
|
|
|
waitTime.tv_usec = 0; |
|
|
|
|
|
|
|
logger->info("select...."); |
|
|
|
size_t n = select(m_canfd + 1, &readFileDescriptors, 0, 0, &waitTime); |
|
|
|
readfds = readFileDescriptors; |
|
|
|
|
|
|
|
int n = select(m_canfd + 1, &readfds, 0, 0, &waitTime); |
|
|
|
logger->info("select.... {}", n); |
|
|
|
if (n <= 0) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
memset(&canframe, 0x00, sizeof(canframe)); |
|
|
|
int ret = read(m_canfd, &canframe, sizeof(canframe)); |
|
|
|
if (ret != sizeof(canframe)) { |
|
|
|
logger->error("read fail,{}", strerror(errno)); |
|
|
|
continue; |
|
|
|
} |
|
|
|
// if (ret != sizeof(canframe)) {
|
|
|
|
// logger->error("read fail,{}", strerror(errno));
|
|
|
|
// continue;
|
|
|
|
// }
|
|
|
|
|
|
|
|
logger->info("RX:{}", StringUtils().bytesToString((uint8_t *)&canframe, sizeof(canframe))); |
|
|
|
logger->info("RX({}):{}", ret, StringUtils().bytesToString((uint8_t *)&canframe, ret)); |
|
|
|
} |
|
|
|
})); |
|
|
|
} |
|
|
|