diff options
author | Romain Forlot <romain.forlot@iot.bzh> | 2017-03-08 18:37:43 +0100 |
---|---|---|
committer | Romain Forlot <romain.forlot@iot.bzh> | 2017-03-16 17:10:40 +0100 |
commit | 8cc56c40c96a63b157ee11ac7fd2494ffa63357d (patch) | |
tree | 9ac7b4dc84455c9dc2d8880f5e5959ac6e86da6b /src | |
parent | 966a1cd8e6bea71ebadc20a38b1d46482d5cff2a (diff) |
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 <romain.forlot@iot.bzh>
Diffstat (limited to 'src')
-rw-r--r-- | src/can/can-message.cpp | 208 | ||||
-rw-r--r-- | 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 @@ -137,34 +117,6 @@ bool can_message_t::is_correct_to_send() } /** -* @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. * * Preferred way to initialize these members by using @@ -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<maxdlen_;i++) - { - data_.push_back(new_data[i]); - } -} - -/** -* @brief Take a canfd_frame struct to initialize class members -* -* This is the preferred way to initialize class members. -* -* @param[in] args - struct read from can bus device. -*/ -void can_message_t::convert_from_canfd_frame(const std::pair<struct canfd_frame&, size_t> 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;i<maxdlen_;i++) + { + data_.push_back(frame.data[i]); + }; + + 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]); + } } /** @@ -310,4 +245,3 @@ canfd_frame can_message_t::convert_to_canfd_frame() return frame; } - diff --git a/src/can/can-message.hpp b/src/can/can-message.hpp index b88a177..5d796cd 100644 --- a/src/can/can-message.hpp +++ b/src/can/can-message.hpp @@ -31,19 +31,11 @@ * @enum CanMessageFormat * @brief The ID format for a CAN message. */ -enum CanMessageFormat { +class enum CanMessageFormat { STANDARD, /*!< STANDARD - standard 11-bit CAN arbitration ID. */ EXTENDED, /*!< EXTENDED - an extended frame, with a 29-bit arbitration ID. */ ERROR, /*!< ERROR - ERROR code used at initialization to signify that it isn't usable'*/ }; -typedef enum CanMessageFormat CanMessageFormat; - -/** - * @class can_message_t - * - * @brief A compact representation of a single CAN message, meant to be used in in/out - * buffers. - */ /************************* * old CanMessage struct * @@ -56,6 +48,13 @@ struct CanMessage { }; typedef struct CanMessage CanMessage; */ + +/** + * @class can_message_t + * + * @brief A compact representation of a single CAN message, meant to be used in in/out + * buffers. + */ class can_message_t { private: uint32_t id_; /*!< id_ - The ID of the message. */ @@ -77,17 +76,11 @@ class can_message_t { const uint8_t* get_data() const; uint8_t get_length() const; - void set_max_data_length(size_t nbytes); - void set_id_and_format(const uint32_t new_id); void set_format(const CanMessageFormat new_format); - void set_format(const uint32_t can_id); - void set_flags(const uint8_t flags); - void set_data(const __u8* new_data); - void set_length(const uint8_t new_length); bool is_correct_to_send(); - void convert_from_canfd_frame(const std::pair<struct canfd_frame&, size_t>args); + static can_message_t convert_to_canfd_frame(const struct canfd_frame& frame, size_t nbytes); canfd_frame convert_to_canfd_frame(); }; |