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. 45
      core/driver/socketcan/socket_can_frame.cpp
  4. 27
      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}; can_filter_t zerofilter = {0};
int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */ int recv_own_msgs = 0; /* 0 = disabled (default), 1 = enabled */
int localloop = 0; int localloop = 0;
size_t optlen;
can_err_mask_t err_mask = 0;
int ret = 0; int ret = 0;
fd_set readfds, readFileDescriptors; fd_set readfds, readFileDescriptors;
timeval waitTime; timeval waitTime;

21
core/driver/socketcan/socket_can.hpp

@ -97,6 +97,27 @@ class SocketCan : public enable_shared_from_this<SocketCan> {
kOvertime, kOvertime,
} SocketCanError_t; } 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: public:
nod::signal<void(shared_ptr<SocketCanFrame>)> onSocketCanFrame; nod::signal<void(shared_ptr<SocketCanFrame>)> onSocketCanFrame;

45
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>(); shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
if (len > 8) len = 8; if (len > 8) len = 8;
canframe->m_id = id; 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; canframe->m_dlc = len;
memcpy(canframe->m_data, data, len); memcpy(canframe->m_data, data, len);
return canframe; return canframe;
@ -18,8 +18,8 @@ shared_ptr<SocketCanFrame> SocketCanFrame::createStdDataFrame(uint32_t id, uint8
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>(); shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
if (len > 8) len = 8; if (len > 8) len = 8;
canframe->m_id = id; 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; canframe->m_dlc = len;
memcpy(canframe->m_data, data, len); memcpy(canframe->m_data, data, len);
return canframe; 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> SocketCanFrame::createExtRemoteFrame(uint32_t id) {
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>(); shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
canframe->m_id = id; 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; canframe->m_dlc = 0;
return canframe; return canframe;
} }
shared_ptr<SocketCanFrame> SocketCanFrame::createStdRemoteFrame(uint32_t id) { shared_ptr<SocketCanFrame> SocketCanFrame::createStdRemoteFrame(uint32_t id) {
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>(); shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
canframe->m_id = id; 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; canframe->m_dlc = 0;
return canframe; return canframe;
} }
shared_ptr<SocketCanFrame> SocketCanFrame::createFrame(canfd_frame_t frame) { shared_ptr<SocketCanFrame> SocketCanFrame::createFrame(canfd_frame_t frame) {
shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>(); shared_ptr<SocketCanFrame> canframe = make_shared<SocketCanFrame>();
canframe->m_id = frame.can_id & ~CAN_EFF_FLAG & ~CAN_RTR_FLAG & ~CAN_ERR_FLAG; 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; canframe->m_dlc = frame.len;
memcpy(canframe->m_data, frame.data, frame.len); memcpy(canframe->m_data, frame.data, frame.len);
return canframe; 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; } 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; }
uint32_t SocketCanFrame::getId() { return m_id; }
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", //
string SocketCanFrame::toString() { //
return fmt::format("|{:0>8x}|{:>6}|{}|{}({})|", getId(), //
getFanFrameType() == socketcan::kdataframe ? "data" : "remote", //
getCanIdentifier() == socketcan::kextFrame ? "ext" : "std", //
StringUtils().bytesToString(m_data, m_dlc), m_dlc); 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 SocketCanFrame::getCanFrame() {
canfd_frame_t frame; canfd_frame_t frame;
memset(&frame, 0, sizeof(frame)); memset(&frame, 0, sizeof(frame));
if (m_canIdentifier == kstdFrame) {
if (m_canIdentifier == socketcan::kstdFrame) {
frame.can_id = (m_id & CAN_SFF_MASK); frame.can_id = (m_id & CAN_SFF_MASK);
} else { } else {
frame.can_id = (m_id & CAN_EFF_MASK) | CAN_EFF_FLAG; 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.can_id |= CAN_RTR_FLAG;
frame.len = m_dlc; frame.len = m_dlc;
} else { } else {

27
core/driver/socketcan/socket_can_frame.hpp

@ -34,6 +34,7 @@ using namespace core;
typedef struct can_filter can_filter_t; typedef struct can_filter can_filter_t;
typedef struct canfd_frame canfd_frame_t; typedef struct canfd_frame canfd_frame_t;
namespace socketcan {
typedef enum { typedef enum {
kstdFrame, kstdFrame,
kextFrame, kextFrame,
@ -43,14 +44,15 @@ typedef enum {
kdataframe, kdataframe,
kremoteframe, kremoteframe,
} can_frame_type_t; } can_frame_type_t;
} // namespace socketcan
class SocketCanFrame { class SocketCanFrame {
private: private:
uint32_t m_id = 0;
can_identifier_t m_canIdentifier = kstdFrame;
can_frame_type_t m_canFrameType = kdataframe;
uint8_t m_data[8] = {0};
uint8_t m_dlc = 0;
uint32_t m_id = 0;
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;
public: public:
static shared_ptr<SocketCanFrame> createExtDataFrame(uint32_t id, uint8_t *data, size_t len); static shared_ptr<SocketCanFrame> createExtDataFrame(uint32_t id, uint8_t *data, size_t len);
@ -59,12 +61,15 @@ class SocketCanFrame {
static shared_ptr<SocketCanFrame> createStdRemoteFrame(uint32_t id); static shared_ptr<SocketCanFrame> createStdRemoteFrame(uint32_t id);
static shared_ptr<SocketCanFrame> createFrame(canfd_frame_t frame); static shared_ptr<SocketCanFrame> createFrame(canfd_frame_t frame);
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);
void setId(uint32_t id);
uint32_t getId();
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(); canfd_frame_t getCanFrame();

Loading…
Cancel
Save