From 8cc56c40c96a63b157ee11ac7fd2494ffa63357d Mon Sep 17 00:00:00 2001 From: Romain Forlot Date: Wed, 8 Mar 2017 18:37:43 +0100 Subject: Make convert method static to get called at the return statement of read. Also clean unsafe function, that can't be called separatly because they need to get called in a certain order. Change-Id: I5670f0cd1c0fdea4f228045b9124ecd60097ebb2 Signed-off-by: Romain Forlot --- src/can/can-message.cpp | 208 +++++++++++++++++------------------------------- src/can/can-message.hpp | 25 +++--- 2 files changed, 80 insertions(+), 153 deletions(-) diff --git a/src/can/can-message.cpp b/src/can/can-message.cpp index 68279e2..eec19d9 100644 --- a/src/can/can-message.cpp +++ b/src/can/can-message.cpp @@ -32,7 +32,7 @@ * Constructor about can_message_t class. */ can_message_t::can_message_t() - : id_{0}, rtr_flag_{false}, length_{0}, flags_{0}, format_{CanMessageFormat::ERROR} + : id_{0}, rtr_flag_{false}, length_{0}, flags_{0}, format_{CanMessageFormat::ERROR}, maxdlen_{0} {} /** @@ -98,26 +98,6 @@ 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 @@ -136,34 +116,6 @@ bool can_message_t::is_correct_to_send() return false; } -/** -* @brief Set id_ member value. -* -* Preferred way to initialize these members by using -* convert_from_canfd_frame method. -* -* @param[in] id_ class member -*/ -void can_message_t::set_id_and_format(const uint32_t new_id) -{ - set_format(new_id); - switch(format_) - { - case CanMessageFormat::STANDARD: - id_ = new_id & CAN_SFF_MASK; - break; - case CanMessageFormat::EXTENDED: - id_ = new_id & CAN_EFF_MASK; - break; - case CanMessageFormat::ERROR: - id_ = new_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 format_ member value. * @@ -181,111 +133,94 @@ void can_message_t::set_format(const CanMessageFormat new_format) } /** -* @brief Set format_ member value. Deduced from the can_id -* of a canfd_frame. +* @brief Take a canfd_frame struct to initialize class members * -* Preferred way to initialize these members by using -* convert_from_canfd_frame method. +* This is the preferred way to initialize class members. * -* @param[in] can_id - integer from a canfd_frame +* @param[in] args - struct read from can bus device. */ -void can_message_t::set_format(const uint32_t can_id) +can_message_t can_message_t::convert_to_canfd_frame(const struct canfd_frame& frame, size_t nbytes) { - if (can_id & CAN_ERR_FLAG) + 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; + } + + if(rtr_flag_) + length_ = frame.len& 0xF; + else + { + length_ = (frame.len > maxdlen_) ? maxdlen_ : frame.len; + } + + if (frame.can_id & CAN_ERR_FLAG) format_ = CanMessageFormat::ERROR; - else if (can_id & CAN_EFF_FLAG) + else if (frame.can_id & CAN_EFF_FLAG) format_ = CanMessageFormat::EXTENDED; else format_ = CanMessageFormat::STANDARD; -} - -/** -* @brief Set format_ member value. -* -* Preferred way to initialize these members by using -* convert_from_canfd_frame method. -* -* @param[in] format_ - class member -*/ -void can_message_t::set_flags(const uint8_t flags) -{ - flags_ = flags & 0xF; -} - -/** -* @brief Set length_ member value. -* -* Preferred way to initialize these members by using -* convert_from_canfd_frame method. -* -* @param[in] new_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(format_) { - length_ = (new_length > maxdlen_) ? maxdlen_ : new_length; + case CanMessageFormat::STANDARD: + id_ = frame.can_id & CAN_SFF_MASK; + break; + case CanMessageFormat::EXTENDED: + id_ = frame.can_id & CAN_EFF_MASK; + break; + case CanMessageFormat::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[in] new_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;i args) -{ - // 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. * 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.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 + { + /* 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); - - if ( data_.capacity() < maxdlen_) - data_.reserve(maxdlen_); - set_data(frame.data); - - DEBUG(binder_interface, "convert_from_canfd_frame: Found id: %X, format: %X, length: %X, data %02X%02X%02X%02X%02X%02X%02X%02X", id_, format_, length_, - data_[0], data_[1], data_[2], data_[3], data_[4], data_[5], data_[6], data_[7]); + data_.clear(); + /* maxdlen_ is now set at CAN_MAX_DLEN or CANFD_MAX_DLEN, respectively 8 and 64 bytes*/ + for(i=0;iargs); + static can_message_t convert_to_canfd_frame(const struct canfd_frame& frame, size_t nbytes); canfd_frame convert_to_canfd_frame(); }; -- cgit 1.2.3-korg