X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fcan%2Fcan-message.cpp;h=6b40d912435e764ff30130770c476a107f26bd80;hb=53cd923a034162273fea2f4fb045b28686f51df5;hp=ad0320212c757548761ca42727121f5aa4d91597;hpb=de8fb10e1d8e98a85dfba6fc8966266dbf5e42c6;p=apps%2Flow-level-can-service.git diff --git a/src/can/can-message.cpp b/src/can/can-message.cpp index ad03202..6b40d91 100644 --- a/src/can/can-message.cpp +++ b/src/can/can-message.cpp @@ -19,26 +19,25 @@ #include -#include "low-can-binding.hpp" +#include "../low-can-binding.hpp" -/******************************************************************************** -* -* CanMessage method implementation -* -*********************************************************************************/ /** * @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} +{} + +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 uint32_t id_ class member +* @return id_ class member */ uint32_t can_message_t::get_id() const { @@ -48,7 +47,7 @@ uint32_t can_message_t::get_id() const /** * @brief Retrieve RTR flag member. * -* @return bool rtr_flags_ class member +* @return rtr_flags_ class member */ bool can_message_t::get_rtr_flag_() const { @@ -58,19 +57,19 @@ bool can_message_t::get_rtr_flag_() const /** * @brief Retrieve format_ member value. * -* @return CanMessageFormat format_ class member +* @return format_ class member */ -int can_message_t::get_format() const +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. +* @brief Retrieve flags_ member value. * -* @return CanMessageFormat format_ class member +* @return flags_ class member */ uint8_t can_message_t::get_flags() const { @@ -80,7 +79,7 @@ uint8_t can_message_t::get_flags() const /** * @brief Retrieve data_ member value. * -* @return uint8_t data_ pointer to the first element +* @return pointer to the first element * of class member data_ */ const uint8_t* can_message_t::get_data() const @@ -91,42 +90,22 @@ const uint8_t* can_message_t::get_data() const /** * @brief Retrieve length_ member value. * -* @return uint8_t length_ class member +* @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... +* @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 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; - else + switch(nbytes) { - length_ = (new_length > maxdlen_) ? maxdlen_ : new_length; + 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 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); + 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) + { + 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; + } - /* 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; + + if (data.capacity() < maxdlen) + data.reserve(maxdlen); + int i; - /* Flags field only present for CAN FD frames*/ - if(maxdlen_ == CANFD_MAX_DLEN) - set_flags(frame.flags); + data.clear(); + /* maxdlen_ is now set at CAN_MAX_DLEN or CANFD_MAX_DLEN, respectively 8 and 64 bytes*/ + for(i=0;i