X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fcan%2Fcan-message.cpp;h=8221e303e6a1b194ee2d43f112223079445450f9;hb=2a4abf5bd6440e9cd5b98b70453d74ae3d1b8cfa;hp=f61de67e40194ef9ac17bf7c392fdb642a41aa04;hpb=9e444ade872bc436cf12bc12d03c3a5d51ac0b9e;p=apps%2Fagl-service-can-low-level.git diff --git a/low-can-binding/can/can-message.cpp b/low-can-binding/can/can-message.cpp index f61de67e..8221e303 100644 --- a/low-can-binding/can/can-message.cpp +++ b/low-can-binding/can/can-message.cpp @@ -19,7 +19,7 @@ #include -#include "../low-can-binding.hpp" +#include "../binding/low-can-hat.hpp" /// /// @brief Class constructor @@ -27,7 +27,14 @@ /// Constructor about can_message_t class. /// can_message_t::can_message_t() - : maxdlen_{0}, id_{0}, length_{0}, format_{can_message_format_t::ERROR}, rtr_flag_{false}, flags_{0} + : maxdlen_{0}, + id_{0}, + length_{0}, + format_{can_message_format_t::INVALID}, + rtr_flag_{false}, + flags_{0}, + timestamp_{0}, + sub_id_{-1} {} can_message_t::can_message_t(uint8_t maxdlen, @@ -36,14 +43,17 @@ can_message_t::can_message_t(uint8_t maxdlen, can_message_format_t format, bool rtr_flag, uint8_t flags, - std::vector data) + std::vector& data, + uint64_t timestamp) : maxdlen_{maxdlen}, id_{id}, length_{length}, format_{format}, rtr_flag_{rtr_flag}, flags_{flags}, - data_{data} + data_{data}, + timestamp_{timestamp}, + sub_id_{-1} {} /// @@ -56,6 +66,11 @@ uint32_t can_message_t::get_id() const return id_; } +int can_message_t::get_sub_id() const +{ + return sub_id_; +} + /// /// @brief Retrieve RTR flag member. /// @@ -69,12 +84,12 @@ bool can_message_t::get_rtr_flag_() const /// /// @brief Retrieve format_ member value. /// -/// @return format_ class member +/// @return format_ class member. Default to INVALID. /// can_message_format_t can_message_t::get_format() const { if (format_ != can_message_format_t::STANDARD || format_ != can_message_format_t::EXTENDED) - return can_message_format_t::ERROR; + return can_message_format_t::INVALID; return format_; } @@ -99,6 +114,16 @@ const uint8_t* can_message_t::get_data() const return data_.data(); } +/// +/// @brief Retrieve data_ member whole vector +/// +/// @return the vector as is +/// +const std::vector can_message_t::get_data_vector() const +{ + return data_; +} + /// /// @brief Retrieve length_ member value. /// @@ -109,15 +134,28 @@ uint8_t can_message_t::get_length() const return length_; } -/// +void can_message_t::set_sub_id(int sub_id) +{ + sub_id_ = sub_id; +} + +uint64_t can_message_t::get_timestamp() const +{ + return timestamp_; +} + +void can_message_t::set_timestamp(uint64_t timestamp) +{ + timestamp_ = timestamp; +} + /// @brief Control whether the object is correctly initialized /// to be sent over the CAN bus /// -/// @return true if object correctly initialized and false if not. -/// +/// @return True if object correctly initialized and false if not. bool can_message_t::is_correct_to_send() { - if (id_ != 0 && length_ != 0 && format_ != can_message_format_t::ERROR) + if (id_ != 0 && length_ != 0 && format_ != can_message_format_t::INVALID) { int i; for(i=0;i data; + + if(nbytes <= CAN_MTU) + { + AFB_DEBUG("Got a legacy CAN frame"); + maxdlen = CAN_MAX_DLEN; + } + else + { + AFB_ERROR("unsupported CAN frame"); + } + + if (frame.can_id & CAN_ERR_FLAG) + { + format = can_message_format_t::INVALID; + id = frame.can_id & (CAN_ERR_MASK|CAN_ERR_FLAG); + } + else if (frame.can_id & CAN_EFF_FLAG) + { + format = can_message_format_t::EXTENDED; + id = frame.can_id & CAN_EFF_MASK; + } + else + { + format = can_message_format_t::STANDARD; + id = frame.can_id & CAN_SFF_MASK; + } + + /* Overwrite length_ if RTR flags is detected. + * standard CAN frames may have RTR enabled. There are no ERR frames with RTR */ + if (frame.can_id & CAN_RTR_FLAG) + { + rtr_flag = true; + if(frame.can_dlc && frame.can_dlc <= CAN_MAX_DLC) + { + if(rtr_flag) + length = frame.can_dlc& 0xF; + else + { + length = (frame.can_dlc > maxdlen) ? maxdlen : frame.can_dlc; + } + } + } + else + { + length = (frame.can_dlc > maxdlen) ? maxdlen : frame.can_dlc; + + if (data.capacity() < maxdlen) + data.reserve(maxdlen); + int i; + + data.clear(); + /* maxdlen_ is now set at CAN_MAX_DLEN or CANFD_MAX_DLEN, respectively 8 and 64 bytes*/ + for(i=0;i