Browse Source

add SocketCan

disinfection_machine
zhaohe 2 years ago
parent
commit
5bcf536387
  1. 2
      core/driver/socketcan/socket_can.cpp
  2. 21
      core/driver/socketcan/socket_can.hpp
  3. 39
      core/driver/socketcan/socket_can_frame.cpp
  4. 17
      core/driver/socketcan/socket_can_frame.hpp

2
core/driver/socketcan/socket_can.cpp

@ -250,8 +250,6 @@ int SocketCan::dumpCanDriverInfo(string canDevice, int baudrate) {
can_filter_t zerofilter = {0};
int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */
int localloop = 0;
size_t optlen;
can_err_mask_t err_mask = 0;
int ret = 0;
fd_set readfds, readFileDescriptors;
timeval waitTime;

21
core/driver/socketcan/socket_can.hpp

@ -97,6 +97,27 @@ class SocketCan : public enable_shared_from_this<SocketCan> {
kOvertime,
} SocketCanError_t;
static string SocketCanError_t2Str(SocketCanError_t error) {
switch (error) {
case kSuccess:
return "kSuccess";
case kErrorFrameFormat:
return "kErrorFrameFormat";
case kCANFDNotSupported:
return "kCANFDNotSupported";
case kWriteError:
return "kWriteError";
case kParamError:
return "kParamError";
case kDeviceBusy:
return "kDeviceBusy";
case kOvertime:
return "kOvertime";
default:
return "Unknown";
}
}
public:
nod::signal<void(shared_ptr<SocketCanFrame>)> onSocketCanFrame;

39
core/driver/socketcan/socket_can_frame.cpp

@ -7,8 +7,8 @@ shared_ptr<SocketCanFrame> SocketCanFrame::createExtDataFrame(uint32_t id, uint8
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
if (len > 8) len = 8;
canframe->m_id = id;
canframe->m_canIdentifier = kextFrame;
canframe->m_canFrameType = kdataframe;
canframe->m_canIdentifier = socketcan::kextFrame;
canframe->m_canFrameType = socketcan::kdataframe;
canframe->m_dlc = len;
memcpy(canframe->m_data, data, len);
return canframe;
@ -18,8 +18,8 @@ shared_ptr<SocketCanFrame> SocketCanFrame::createStdDataFrame(uint32_t id, uint8
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
if (len > 8) len = 8;
canframe->m_id = id;
canframe->m_canIdentifier = kstdFrame;
canframe->m_canFrameType = kdataframe;
canframe->m_canIdentifier = socketcan::kstdFrame;
canframe->m_canFrameType = socketcan::kdataframe;
canframe->m_dlc = len;
memcpy(canframe->m_data, data, len);
return canframe;
@ -28,56 +28,59 @@ shared_ptr<SocketCanFrame> SocketCanFrame::createStdDataFrame(uint32_t id, uint8
shared_ptr<SocketCanFrame> SocketCanFrame::createExtRemoteFrame(uint32_t id) {
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
canframe->m_id = id;
canframe->m_canIdentifier = kextFrame;
canframe->m_canFrameType = kremoteframe;
canframe->m_canIdentifier = socketcan::kextFrame;
canframe->m_canFrameType = socketcan::kremoteframe;
canframe->m_dlc = 0;
return canframe;
}
shared_ptr<SocketCanFrame> SocketCanFrame::createStdRemoteFrame(uint32_t id) {
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
canframe->m_id = id;
canframe->m_canIdentifier = kstdFrame;
canframe->m_canFrameType = kremoteframe;
canframe->m_canIdentifier = socketcan::kstdFrame;
canframe->m_canFrameType = socketcan::kremoteframe;
canframe->m_dlc = 0;
return canframe;
}
shared_ptr<SocketCanFrame> SocketCanFrame::createFrame(canfd_frame_t frame) {
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
canframe->m_id = frame.can_id & ~CAN_EFF_FLAG & ~CAN_RTR_FLAG & ~CAN_ERR_FLAG;
canframe->m_canIdentifier = frame.can_id & CAN_EFF_FLAG ? kextFrame : kstdFrame;
canframe->m_canFrameType = frame.can_id & CAN_RTR_FLAG ? kremoteframe : kdataframe;
canframe->m_canIdentifier = frame.can_id & CAN_EFF_FLAG ? socketcan::kextFrame : socketcan::kstdFrame;
canframe->m_canFrameType = frame.can_id & CAN_RTR_FLAG ? socketcan::kremoteframe : socketcan::kdataframe;
canframe->m_dlc = frame.len;
memcpy(canframe->m_data, frame.data, frame.len);
return canframe;
}
void SocketCanFrame::setCanIdentifier(can_identifier_t canIdentifier) { this->m_canIdentifier = canIdentifier; }
void SocketCanFrame::setFanFrameType(can_frame_type_t fanFrameType) { this->m_canFrameType = fanFrameType; }
void SocketCanFrame::setCanIdentifier(socketcan::can_identifier_t canIdentifier) { this->m_canIdentifier = canIdentifier; }
void SocketCanFrame::setFanFrameType(socketcan::can_frame_type_t fanFrameType) { this->m_canFrameType = fanFrameType; }
void SocketCanFrame::setId(uint32_t id) { this->m_id = id; }
uint32_t SocketCanFrame::getId() { return m_id; }
can_identifier_t SocketCanFrame::getCanIdentifier() { return m_canIdentifier; }
can_frame_type_t SocketCanFrame::getFanFrameType() { return m_canFrameType; }
socketcan::can_identifier_t SocketCanFrame::getCanIdentifier() { return m_canIdentifier; }
socketcan::can_frame_type_t SocketCanFrame::getFanFrameType() { return m_canFrameType; }
string SocketCanFrame::toString() { //
return fmt::format("|{:0>8x}|{:>6}|{}|{}({})|", getId(), //
getFanFrameType() == kdataframe ? "data" : "remote", //
getCanIdentifier() == kextFrame ? "ext" : "std", //
getFanFrameType() == socketcan::kdataframe ? "data" : "remote", //
getCanIdentifier() == socketcan::kextFrame ? "ext" : "std", //
StringUtils().bytesToString(m_data, m_dlc), m_dlc);
}
uint8_t *SocketCanFrame::getData() { return m_data; }
uint8_t SocketCanFrame::getDlc() { return m_dlc; }
canfd_frame_t SocketCanFrame::getCanFrame() {
canfd_frame_t frame;
memset(&frame, 0, sizeof(frame));
if (m_canIdentifier == kstdFrame) {
if (m_canIdentifier == socketcan::kstdFrame) {
frame.can_id = (m_id & CAN_SFF_MASK);
} else {
frame.can_id = (m_id & CAN_EFF_MASK) | CAN_EFF_FLAG;
}
if (m_canFrameType == kremoteframe) {
if (m_canFrameType == socketcan::kremoteframe) {
frame.can_id |= CAN_RTR_FLAG;
frame.len = m_dlc;
} else {

17
core/driver/socketcan/socket_can_frame.hpp

@ -34,6 +34,7 @@ using namespace core;
typedef struct can_filter can_filter_t;
typedef struct canfd_frame canfd_frame_t;
namespace socketcan {
typedef enum {
kstdFrame,
kextFrame,
@ -43,12 +44,13 @@ typedef enum {
kdataframe,
kremoteframe,
} can_frame_type_t;
} // namespace socketcan
class SocketCanFrame {
private:
uint32_t m_id = 0;
can_identifier_t m_canIdentifier = kstdFrame;
can_frame_type_t m_canFrameType = kdataframe;
socketcan::can_identifier_t m_canIdentifier = socketcan::kstdFrame;
socketcan::can_frame_type_t m_canFrameType = socketcan::kdataframe;
uint8_t m_data[8] = {0};
uint8_t m_dlc = 0;
@ -61,10 +63,13 @@ class SocketCanFrame {
void setId(uint32_t id);
uint32_t getId();
can_frame_type_t getFanFrameType();
void setFanFrameType(can_frame_type_t fanFrameType);
can_identifier_t getCanIdentifier();
void setCanIdentifier(can_identifier_t canIdentifier);
socketcan::can_frame_type_t getFanFrameType();
void setFanFrameType(socketcan::can_frame_type_t fanFrameType);
socketcan::can_identifier_t getCanIdentifier();
void setCanIdentifier(socketcan::can_identifier_t canIdentifier);
uint8_t *getData();
uint8_t getDlc();
canfd_frame_t getCanFrame();

Loading…
Cancel
Save