X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fcan%2Fcan-message.cpp;h=af0d3f38b82441b5e9adb93a0a018c8bfd010d0e;hb=7b336475a398d37c4d5c4a534c87919263ae4b01;hp=71e487929c4f4a776ecd6043d44dd9610887c6a6;hpb=89e072c41f3417e0a80cf95be3cf88326df32777;p=apps%2Fagl-service-can-low-level.git diff --git a/src/can/can-message.cpp b/src/can/can-message.cpp index 71e48792..af0d3f38 100644 --- a/src/can/can-message.cpp +++ b/src/can/can-message.cpp @@ -15,118 +15,109 @@ * limitations under the License. */ -#include "can/can-message.hpp" +#include "can-message.hpp" #include -#include "low-can-binding.hpp" +#include "../low-can-binding.hpp" -/******************************************************************************** -* -* CanMessage method implementation -* -*********************************************************************************/ -/** -* @brief Class constructor -* -* Constructor about can_message_t class. -*/ +/// +/// @brief Class constructor +/// +/// Constructor about can_message_t class. +/// can_message_t::can_message_t() - : id_{0}, rtr_flag_{false}, length_{0}, flags_{0}, format_{CanMessageFormat::ERROR} + : maxdlen_{0}, id_{0}, length_{0}, format_{can_message_format_t::ERROR}, rtr_flag_{false}, flags_{0} {} -/** -* @brief Retrieve id_ member value. -* -* @return uint32_t id_ class member -*/ +can_message_t::can_message_t(uint8_t maxdlen, + uint32_t id, + uint8_t length, + can_message_format_t format, + bool rtr_flag, + uint8_t flags, + std::vector data) + : maxdlen_{maxdlen}, + id_{id}, + length_{length}, + format_{format}, + rtr_flag_{rtr_flag}, + flags_{flags}, + data_{data} +{} + +/// +/// @brief Retrieve id_ member value. +/// +/// @return id_ class member +/// uint32_t can_message_t::get_id() const { return id_; } -/** -* @brief Retrieve RTR flag member. -* -* @return bool rtr_flags_ class member -*/ +/// +/// @brief Retrieve RTR flag member. +/// +/// @return rtr_flags_ class member +/// bool can_message_t::get_rtr_flag_() const { return rtr_flag_; } -/** -* @brief Retrieve format_ member value. -* -* @return CanMessageFormat format_ class member -*/ -int can_message_t::get_format() const +/// +/// @brief Retrieve format_ member value. +/// +/// @return format_ class member +/// +can_message_format_t can_message_t::get_format() const { - if (format_ != CanMessageFormat::STANDARD || format_ != CanMessageFormat::EXTENDED) - return CanMessageFormat::ERROR; + if (format_ != can_message_format_t::STANDARD || format_ != can_message_format_t::EXTENDED) + return can_message_format_t::ERROR; return format_; } -/** -* @brief Retrieve format_ member value. -* -* @return CanMessageFormat format_ class member -*/ +/// +/// @brief Retrieve flags_ member value. +/// +/// @return flags_ class member +/// uint8_t can_message_t::get_flags() const { return flags_; } -/** -* @brief Retrieve data_ member value. -* -* @return uint8_t data_ pointer to the first element -* of class member data_ -*/ +/// +/// @brief Retrieve data_ member value. +/// +/// @return pointer to the first element +/// of class member data_ +/// const uint8_t* can_message_t::get_data() const { return data_.data(); } -/** -* @brief Retrieve length_ member value. -* -* @return uint8_t length_ class member -*/ +/// +/// @brief Retrieve length_ member value. +/// +/// @return length_ class member +/// uint8_t can_message_t::get_length() const { return length_; } -void can_message_t::set_max_data_length(size_t nbytes) -{ - maxdlen_ = 0; - - switch(nbytes) - { - case CANFD_MTU: - DEBUG(binder_interface, "set_max_data_length: Got an CAN FD frame"); - maxdlen_ = CANFD_MAX_DLEN; - break; - case CAN_MTU: - DEBUG(binder_interface, "set_max_data_length: Got a legacy CAN frame"); - maxdlen_ = CAN_MAX_DLEN; - break; - default: - ERROR(binder_interface, "set_max_data_length: unsupported CAN frame"); - break; - } -} - -/** -* @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... -*/ +/// +/// @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. +/// bool can_message_t::is_correct_to_send() { - if (id_ != 0 && length_ != 0 && format_ != CanMessageFormat::ERROR) + if (id_ != 0 && length_ != 0 && format_ != can_message_format_t::ERROR) { int i; for(i=0;i data; -/** -* @brief Set format_ member value. -* -* Preferred way to initialize these members by using -* convert_from_canfd_frame method. -* -* @param CanMessageFormat format_ class member -*/ -void can_message_t::set_flags(const uint8_t flags) -{ - flags_ = flags & 0xF; -} + switch(nbytes) + { + case CANFD_MTU: + DEBUG(binder_interface, "set_max_data_length: Got an CAN FD frame"); + maxdlen = CANFD_MAX_DLEN; + break; + case CAN_MTU: + DEBUG(binder_interface, "set_max_data_length: Got a legacy CAN frame"); + maxdlen = CAN_MAX_DLEN; + break; + default: + ERROR(binder_interface, "set_max_data_length: unsupported CAN frame"); + break; + } -/** -* @brief Set length_ member value. -* -* Preferred way to initialize these members by using -* convert_from_canfd_frame method. -* -* @param uint8_t length_ array with a max size of 8 elements. -*/ -void can_message_t::set_length(const uint8_t new_length) -{ - if(rtr_flag_) - length_ = new_length & 0xF; + if (frame.can_id & CAN_ERR_FLAG) + format = can_message_format_t::ERROR; + else if (frame.can_id & CAN_EFF_FLAG) + format = can_message_format_t::EXTENDED; else + format = can_message_format_t::STANDARD; + + switch(format) { - length_ = (new_length > maxdlen_) ? maxdlen_ : new_length; + case can_message_format_t::STANDARD: + id = frame.can_id & CAN_SFF_MASK; + break; + case can_message_format_t::EXTENDED: + id = frame.can_id & CAN_EFF_MASK; + break; + case can_message_format_t::ERROR: + id = frame.can_id & (CAN_ERR_MASK|CAN_ERR_FLAG); + break; + default: + ERROR(binder_interface, "ERROR: Can set id, not a compatible format or format not set prior to set id."); + break; } -} -/** -* @brief Set data_ member value. -* -* Preferred way to initialize these members by using -* convert_from_canfd_frame method. -* -* @param uint8_t data_ array with a max size of 8 elements. -*/ -void can_message_t::set_data(const __u8* new_data) -{ - int i; - - data_.clear(); - /* maxdlen_ is now set at CAN_MAX_DLEN or CANFD_MAX_DLEN, respectively 8 and 64 bytes*/ - for(i=0;iargs) -{ - // May be it's overkill to assign member of the pair... May be it will change... - struct canfd_frame frame = args.first; - size_t nbytes = args.second; - set_max_data_length(nbytes); - set_length(frame.len); - set_id_and_format(frame.can_id); - - /* Overwrite lenght_ if RTR flags is detected. + /* 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; + rtr_flag = true; if(frame.len && frame.len <= CAN_MAX_DLC) - set_length(frame.len); - return; + { + if(rtr_flag) + length = frame.len& 0xF; + else + { + length = (frame.len > maxdlen) ? maxdlen : frame.len; + } + } } + else + { + length = (frame.len > maxdlen) ? maxdlen : frame.len; + + /* Flags field only present for CAN FD frames*/ + if(maxdlen == CANFD_MAX_DLEN) + flags = frame.flags & 0xF; - /* Flags field only present for CAN FD frames*/ - if(maxdlen_ == CANFD_MAX_DLEN) - set_flags(frame.flags); + if (data.capacity() < maxdlen) + data.reserve(maxdlen); + int i; - if ( data_.capacity() < maxdlen_) - data_.reserve(maxdlen_); - set_data(frame.data); + data.clear(); + /* maxdlen_ is now set at CAN_MAX_DLEN or CANFD_MAX_DLEN, respectively 8 and 64 bytes*/ + for(i=0;i