X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=CAN-binder%2Flow-can-binding%2Futils%2Fsocketcan.hpp;h=3c02a4fa535b49f860cbc003a2d389241235d2db;hb=7679cd97dc4c20103f8afb364437dbcfd359befc;hp=2c79036467888a2e22549529aa23253f97c2d384;hpb=901a27b0631909647137f49ccf12f4e9bfe38817;p=apps%2Fagl-service-can-low-level.git diff --git a/CAN-binder/low-can-binding/utils/socketcan.hpp b/CAN-binder/low-can-binding/utils/socketcan.hpp index 2c790364..3c02a4fa 100644 --- a/CAN-binder/low-can-binding/utils/socketcan.hpp +++ b/CAN-binder/low-can-binding/utils/socketcan.hpp @@ -17,51 +17,40 @@ * limitations under the License. */ +#include + #include #include +#include -#include +#include "../can/can-message.hpp" +#include "../low-can-binding.hpp" #define INVALID_SOCKET -1 namespace utils { - - template - struct basic_bcm_msg - { - bcm_msg_head msg_head; - std::vector frames; - }; - - struct canfd_bcm_msg : public basic_bcm_msg - { - canfd_bcm_msg() { msg_head.flags |= CAN_FD_FRAME; } - }; - class socketcan_t { public: socketcan_t(); - socketcan_t(const socketcan_t&) = delete; + socketcan_t(const socketcan_t&); socketcan_t(socketcan_t&&); - ~socketcan_t(); + virtual ~socketcan_t(); const struct sockaddr_can& get_tx_address() const; explicit operator bool() const; int socket() const; - int open(std::string device_name); + virtual int open(std::string device_name) = 0; int setopt(int level, int optname, const void* optval, socklen_t optlen); int close(); - private: + protected: int socket_; struct sockaddr_can tx_address_; int open(int domain, int type, int protocol); - int bind(const struct sockaddr* addr, socklen_t len); - int connect(const struct sockaddr* addr, socklen_t len); }; template @@ -72,9 +61,13 @@ namespace utils return s; } - socketcan_t& operator<<(socketcan_t& s, const canfd_frame& frame); - socketcan_t& operator<<(socketcan_t& s, const can_frame& frame); - socketcan_t& operator<<(socketcan_t& s, const struct basic_bcm_msg& obj); - socketcan_t& operator<<(socketcan_t& s, const struct canfd_bcm_msg& obj); - socketcan_t& operator<<(socketcan_t& s, const struct bcm_msg_head& obj); + template + socketcan_t& operator<<(socketcan_t& s, const T& obj) + { + if (::sendto(s.socket(), &obj, sizeof(obj), 0, (const struct sockaddr*)&s.get_tx_address(), sizeof(s.get_tx_address())) < 0) + ERROR(binder_interface, "%s: Error sending : %i %s", __FUNCTION__, errno, ::strerror(errno)); + return s; + } + + socketcan_t& operator>>(socketcan_t& s, can_message_t& cm); }